@@ -105,19 +105,86 @@ export function getChunkName(id: string, manualChunks: string[]): string {
105
105
return VENDOR_MODULES ;
106
106
}
107
107
108
+ export class ObfuscatedFilesRegistry {
109
+ private static instance : ObfuscatedFilesRegistry ;
110
+ private obfuscatedFiles : Set < string > = new Set ( ) ;
111
+
112
+ private constructor ( ) {
113
+ }
114
+
115
+ public static getInstance ( ) : ObfuscatedFilesRegistry {
116
+ if ( ! ObfuscatedFilesRegistry . instance ) {
117
+ ObfuscatedFilesRegistry . instance = new ObfuscatedFilesRegistry ( ) ;
118
+ }
119
+ return ObfuscatedFilesRegistry . instance ;
120
+ }
121
+
122
+ public markAsObfuscated ( fileName : string ) : void {
123
+ if ( ! fileName ) return ;
124
+ this . obfuscatedFiles . add ( fileName ) ;
125
+ }
126
+
127
+ public isObfuscated ( fileName : string ) : boolean {
128
+ if ( ! fileName ) return false ;
129
+ return this . obfuscatedFiles . has ( fileName ) ;
130
+ }
131
+
132
+ public getAllObfuscatedFiles ( ) : string [ ] {
133
+ return Array . from ( this . obfuscatedFiles ) ;
134
+ }
135
+
136
+ public clear ( ) : void {
137
+ this . obfuscatedFiles . clear ( ) ;
138
+ }
139
+
140
+ public serialize ( ) : string [ ] {
141
+ return Array . from ( this . obfuscatedFiles ) ;
142
+ }
143
+
144
+ public updateFromSerialized ( serializedFiles : string [ ] ) : void {
145
+ if ( ! serializedFiles || ! Array . isArray ( serializedFiles ) ) return ;
146
+
147
+ serializedFiles . forEach ( ( file ) => {
148
+ this . obfuscatedFiles . add ( file ) ;
149
+ } ) ;
150
+ }
151
+ }
152
+
108
153
export function obfuscateBundle ( finalConfig : Config , fileName : string , bundleItem : Rollup . OutputChunk ) : string {
109
154
const _log = new Log ( finalConfig . log ) ;
155
+ const registry = ObfuscatedFilesRegistry . getInstance ( ) ;
156
+
157
+ if ( registry . isObfuscated ( fileName ) ) {
158
+ _log . info ( `skipping ${ fileName } (already in obfuscated registry)` ) ;
159
+ return bundleItem . code ;
160
+ }
161
+
110
162
_log . info ( `obfuscating ${ fileName } ...` ) ;
111
163
const obfuscatedCode = javascriptObfuscator . obfuscate ( bundleItem . code , finalConfig . options ) . getObfuscatedCode ( ) ;
112
164
_log . info ( `obfuscation complete for ${ fileName } .` ) ;
165
+
166
+ registry . markAsObfuscated ( fileName ) ;
167
+ _log . info ( `added ${ fileName } to obfuscated files registry` ) ;
168
+
113
169
return obfuscatedCode ;
114
170
}
115
171
116
172
export function obfuscateLibBundle ( finalConfig : Config , fileName : string , code : string ) : { code : string ; map : Rollup . SourceMapInput } {
117
173
const _log = new Log ( finalConfig . log ) ;
174
+ const registry = ObfuscatedFilesRegistry . getInstance ( ) ;
175
+
176
+ if ( registry . isObfuscated ( fileName ) ) {
177
+ _log . info ( `skipping ${ fileName } (already in obfuscated registry)` ) ;
178
+ return { code, map : null } ;
179
+ }
180
+
118
181
_log . info ( `obfuscating ${ fileName } ...` ) ;
119
182
const obfuscated = javascriptObfuscator . obfuscate ( code , finalConfig . options ) ;
120
183
_log . info ( `obfuscation complete for ${ fileName } .` ) ;
184
+
185
+ registry . markAsObfuscated ( fileName ) ;
186
+ _log . info ( `added ${ fileName } to obfuscated files registry` ) ;
187
+
121
188
return {
122
189
code : obfuscated . getObfuscatedCode ( ) ,
123
190
map : obfuscated . getSourceMap ( ) ,
@@ -127,15 +194,28 @@ export function obfuscateLibBundle(finalConfig: Config, fileName: string, code:
127
194
export function createWorkerTask ( finalConfig : Config , chunk : BundleList ) {
128
195
return new Promise ( ( resolve , reject ) => {
129
196
const worker = new Worker ( path . join ( __dirname , WORKER_FILE_PATH ) ) ;
130
- worker . postMessage ( { config : finalConfig , chunk } ) ;
197
+ const registry = ObfuscatedFilesRegistry . getInstance ( ) ;
198
+
199
+ worker . postMessage ( {
200
+ config : finalConfig ,
201
+ chunk,
202
+ registryState : registry . serialize ( ) ,
203
+ } ) ;
131
204
132
205
worker . on ( 'message' , ( value ) => {
133
- chunk . forEach ( ( [ fileName , bundleItem ] ) => {
134
- const result = value . find ( ( i : ObfuscationResult ) => i . fileName === fileName ) ;
135
- if ( result && result . obfuscatedCode ) {
136
- bundleItem . code = result . obfuscatedCode ;
137
- }
138
- } ) ;
206
+ if ( value . results && Array . isArray ( value . results ) ) {
207
+ chunk . forEach ( ( [ fileName , bundleItem ] ) => {
208
+ const result = value . results . find ( ( i : ObfuscationResult ) => i . fileName === fileName ) ;
209
+ if ( result && result . obfuscatedCode ) {
210
+ bundleItem . code = result . obfuscatedCode ;
211
+ }
212
+ } ) ;
213
+ }
214
+
215
+ if ( value . registryState && Array . isArray ( value . registryState ) ) {
216
+ registry . updateFromSerialized ( value . registryState ) ;
217
+ }
218
+
139
219
resolve ( value ) ;
140
220
worker . unref ( ) ;
141
221
} ) ;
0 commit comments