@@ -153,7 +153,10 @@ const config = {
153
153
async preload ( page ) {
154
154
'use strict' ;
155
155
if ( ! config . last ) {
156
- return page . evaluate ( async ( ) => Promise . resolve ( M . require ( 'chat' ) ) ) ;
156
+ return page . evaluate ( async ( ) => {
157
+ const files = [ 'chat' , 'rewind' , 's4' ] ;
158
+ return Promise . all ( files . map ( n => M . require ( n ) ) ) ;
159
+ } ) ;
157
160
}
158
161
} ,
159
162
parser ( blobs ) {
@@ -167,7 +170,7 @@ const config = {
167
170
type = null ;
168
171
switch ( content [ 1 ] ) {
169
172
case ' * sjcl.js' :
170
- if ( String ( content [ 6 ] ) . includes ( 'embedplayer.js' ) ) {
173
+ if ( String ( content [ 8 ] ) . includes ( 'embedplayer.js' ) ) {
171
174
type = 'embed' ;
172
175
}
173
176
else if ( String ( content ) . includes ( 'the mobile web site' ) ) {
@@ -180,13 +183,23 @@ const config = {
180
183
case ' * var handler = {' :
181
184
type = 'chat' ;
182
185
break ;
186
+ case '/** @property s4.ui */' :
187
+ type = 's4' ;
188
+ break ;
189
+ case `lazy(mega, 'rewind', () => {` :
190
+ type = 'rewind' ;
191
+ break ;
183
192
default : {
184
193
const exclude = / ^ e s 6 s | c s s \/ / . test ( content . slice ( 0 , 2 ) )
185
194
|| String ( content ) . slice ( 35 ) . startsWith ( 'IllegalStateError' ) ;
186
195
187
196
if ( exclude ) {
188
197
continue ;
189
198
}
199
+
200
+ if ( content [ 1 ] . includes ( 'var buildVersion = {' ) ) {
201
+ type = 'boot' ;
202
+ }
190
203
}
191
204
}
192
205
@@ -211,7 +224,7 @@ async function getSiteBlobs(page) {
211
224
return page . evaluate ( async ( ) => {
212
225
const result = [ ] ;
213
226
214
- for ( const elm of document . querySelectorAll ( 'script[src^="blob:"]' ) ) {
227
+ for ( const elm of document . querySelectorAll ( 'script[src^="blob:"], script[src*="secureboot"] ' ) ) {
215
228
const { src} = elm ;
216
229
const response = await fetch ( src ) . catch ( console . error ) ;
217
230
@@ -290,7 +303,7 @@ async function siteHandler(domain, page, target, options) {
290
303
for ( let i = files . length ; i -- ; ) {
291
304
const [ name , content ] = files [ i ] ;
292
305
293
- if ( ! FS . write ( path . join ( target , name ) , content . join ( '\n' ) , config . COMPRESS ) ) {
306
+ if ( ! FS . write ( path . join ( target , name ) , content . join ( '\n' ) , config . COMPRESS , true ) ) {
294
307
return null ;
295
308
}
296
309
}
@@ -376,6 +389,17 @@ function getArchivedFile(ver = 'last', domain = 'meganz', type = 'main') {
376
389
}
377
390
}
378
391
392
+ if ( type === '*' ) {
393
+ const vp = path . join ( config . ARCHIVE_PATH , version ) ;
394
+ const rv = Object . create ( null ) ;
395
+ const ls = fs . readdirSync ( vp ) ;
396
+
397
+ for ( let i = ls . length ; i -- ; ) {
398
+ rv [ ls [ i ] ] = FS . read ( path . join ( vp , ls [ i ] ) ) ;
399
+ }
400
+ return rv ;
401
+ }
402
+
379
403
const data = FS . read ( path . join ( config . ARCHIVE_PATH , version , `${ domain } .${ type } .js` ) ) ;
380
404
if ( ! data ) {
381
405
process . exit ( 1 ) ;
@@ -387,6 +411,14 @@ function printCodeAt(data, ln, bc = 0, ac = 0) {
387
411
const n = ln - 1 ;
388
412
const c = Math . max ( 0 , n - bc ) ;
389
413
414
+ if ( typeof data === 'object' ) {
415
+ for ( const fn in data ) {
416
+ stdout ( `\n: ${ fn } ` ) ;
417
+ printCodeAt ( data [ fn ] , ln , bc , ac ) ;
418
+ }
419
+ return ;
420
+ }
421
+
390
422
String ( data ) . split ( '\n' )
391
423
. slice ( c , 1 + c + bc + ac )
392
424
. forEach ( ( x , i ) => {
@@ -405,6 +437,7 @@ OPTIONS:
405
437
-f, --file <name> Locate exception under specific bundle name (default: main)
406
438
-v, --version <tag> Find code on specific version (default: last archived)
407
439
-n, --line <n> Print code at specified source line number.
440
+ -s, --scan [p] Find source line numbers from stadin given a pattern.
408
441
-B, --before <n> Show N lines of leading code (default: 9)
409
442
-A, --after <n> Show N lines of trailing code (default: 4)
410
443
-t, --dump Parse stack-trace dump from stdin.
@@ -445,11 +478,18 @@ for (let i = 0; i < argv.length; ++i) {
445
478
case 'f' :
446
479
case 'file' :
447
480
argv . file = word ( argv [ ++ i ] ) ;
481
+ if ( argv . file === 'a' ) {
482
+ argv . file = '*' ;
483
+ }
448
484
break ;
449
485
case 'n' :
450
486
case 'line' :
451
487
argv . ln = parseInt ( argv [ ++ i ] ) ;
452
488
break ;
489
+ case 's' :
490
+ case 'scan' :
491
+ argv . scan = JSON . parse ( argv [ i + 1 ] && argv [ i + 1 ] [ 0 ] !== '-' ? argv [ ++ i ] : '["\\n","\\n@"]' ) ;
492
+ break ;
453
493
case 'v' :
454
494
case 'version' :
455
495
argv . ver = String ( argv [ ++ i ] ) . replace ( / [ ^ \d . ] + / g, '' ) . replace ( / \. + / g, '.' ) ;
@@ -529,11 +569,30 @@ for (let i = 0; i < argv.length; ++i) {
529
569
if ( argv . ln > 0 ) {
530
570
printCodeAt ( getArchivedFile ( argv . ver , argv . domain , argv . file ) , argv . ln , argv . bc , argv . ac ) ;
531
571
}
572
+ else if ( argv . scan ) {
573
+ const input = await FS . readStream ( process . stdin , RegExp ( `\x18\\s*$` ) ) . catch ( stderr ) ;
574
+ if ( input ) {
575
+ const [ pp , sep , ml = 10 ] = argv . scan ;
576
+ const file = getArchivedFile ( argv . ver , argv . domain , argv . file ) ;
577
+
578
+ String ( input ) . split ( sep ) . forEach ( ( val , idx , obj ) => {
579
+ if ( idx > 0 ) {
580
+ const ln = parseInt ( val ) ;
581
+ if ( ln > ml ) {
582
+ const pl = obj [ idx - 1 ] . split ( pp ) . pop ( ) ;
583
+
584
+ stdout ( `\n\r\n\n${ pl } ` ) ;
585
+ printCodeAt ( file , ln , argv . bc , argv . ac ) ;
586
+ }
587
+ }
588
+ } ) ;
589
+ }
590
+ }
532
591
else if ( argv . dump ) {
533
592
const file = getArchivedFile ( argv . ver , argv . domain , argv . file ) ;
534
593
const input = String ( await FS . prompt ( 'Paste stack-trace (^C to quit):' ) . catch ( stderr ) ) . split ( '\n' ) ;
535
594
536
- input . map ( ( line ) => String ( line . split ( / \s \( | @ / ) [ 1 ] ) . replace ( / (?: b l o b : ) ? h t t p s ? : / , '' ) . split ( ':' ) [ 1 ] )
595
+ input . map ( ( line ) => String ( line . split ( / \s \( | @ | \s \. \. / ) [ 1 ] ) . replace ( / (?: b l o b : ) ? h t t p s ? : / , '' ) . split ( ':' ) [ 1 ] )
537
596
. forEach ( ( ln , idx ) => {
538
597
if ( parseInt ( ln ) > 0 ) {
539
598
stdout ( `\n: ${ input [ idx ] . trim ( ) } ` ) ;
0 commit comments