@@ -10,6 +10,7 @@ var https = require('https');
10
10
var path = require ( 'path' ) ;
11
11
var url = require ( 'url' ) ;
12
12
var zlib = require ( 'zlib' ) ;
13
+ var readline = require ( 'readline' ) ;
13
14
14
15
fs . existsSync = fs . existsSync || path . existsSync ;
15
16
@@ -340,9 +341,9 @@ function processLookupCountry(src, cb){
340
341
} ) ;
341
342
}
342
343
343
- function processCountryData ( src , dest , cb ) {
344
+ async function processCountryData ( src , dest ) {
344
345
var lines = 0 ;
345
- function processLine ( line ) {
346
+ async function processLine ( line ) {
346
347
var fields = CSVtoArray ( line ) ;
347
348
348
349
if ( ! fields || fields . length < 6 ) {
@@ -389,12 +390,18 @@ function processCountryData(src, dest, cb) {
389
390
}
390
391
391
392
b . write ( cc , bsz - 2 ) ;
392
-
393
- fs . writeSync ( datFile , b , 0 , bsz , null ) ;
394
393
if ( Date . now ( ) - tstart > 5000 ) {
395
394
tstart = Date . now ( ) ;
396
395
process . stdout . write ( '\nStill working (' + lines + ') ...' ) ;
397
396
}
397
+
398
+ if ( datFile . _writableState . needDrain ) {
399
+ return new Promise ( ( resolve ) => {
400
+ datFile . write ( b , resolve ) ;
401
+ } ) ;
402
+ } else {
403
+ return datFile . write ( b ) ;
404
+ }
398
405
}
399
406
}
400
407
@@ -406,24 +413,25 @@ function processCountryData(src, dest, cb) {
406
413
407
414
process . stdout . write ( 'Processing Data (may take a moment) ...' ) ;
408
415
var tstart = Date . now ( ) ;
409
- var datFile = fs . openSync ( dataFile , "w" ) ;
416
+ var datFile = fs . createWriteStream ( dataFile ) ;
410
417
411
- lazy ( fs . createReadStream ( tmpDataFile ) )
412
- . lines
413
- . map ( function ( byteArray ) {
414
- return iconv . decode ( byteArray , 'latin1' ) ;
415
- } )
416
- . skip ( 1 )
417
- . map ( processLine )
418
- . on ( 'pipe' , function ( ) {
419
- console . log ( chalk . green ( ' DONE' ) ) ;
420
- cb ( ) ;
421
- } ) ;
418
+ var rl = readline . createInterface ( {
419
+ input : fs . createReadStream ( tmpDataFile ) ,
420
+ crlfDelay : Infinity
421
+ } ) ;
422
+ var i = 0 ;
423
+ for await ( var line of rl ) {
424
+ i ++ ;
425
+ if ( i == 1 ) continue ;
426
+ await processLine ( line ) ;
427
+ }
428
+ datFile . close ( ) ;
429
+ console . log ( ' DONE' . green ) ;
422
430
}
423
431
424
- function processCityData ( src , dest , cb ) {
432
+ async function processCityData ( src , dest ) {
425
433
var lines = 0 ;
426
- function processLine ( line ) {
434
+ async function processLine ( line ) {
427
435
if ( line . match ( / ^ C o p y r i g h t / ) || ! line . match ( / \d / ) ) {
428
436
return ;
429
437
}
@@ -500,11 +508,18 @@ function processCityData(src, dest, cb) {
500
508
b . writeInt32BE ( area , 20 ) ;
501
509
}
502
510
503
- fs . writeSync ( datFile , b , 0 , b . length , null ) ;
504
511
if ( Date . now ( ) - tstart > 5000 ) {
505
512
tstart = Date . now ( ) ;
506
513
process . stdout . write ( '\nStill working (' + lines + ') ...' ) ;
507
514
}
515
+
516
+ if ( datFile . _writableState . needDrain ) {
517
+ return new Promise ( ( resolve ) => {
518
+ datFile . write ( b , resolve ) ;
519
+ } ) ;
520
+ } else {
521
+ return datFile . write ( b ) ;
522
+ }
508
523
}
509
524
510
525
var dataFile = path . join ( dataPath , dest ) ;
@@ -514,16 +529,19 @@ function processCityData(src, dest, cb) {
514
529
515
530
process . stdout . write ( 'Processing Data (may take a moment) ...' ) ;
516
531
var tstart = Date . now ( ) ;
517
- var datFile = fs . openSync ( dataFile , "w" ) ;
532
+ var datFile = fs . createWriteStream ( dataFile ) ;
518
533
519
- lazy ( fs . createReadStream ( tmpDataFile ) )
520
- . lines
521
- . map ( function ( byteArray ) {
522
- return iconv . decode ( byteArray , 'latin1' ) ;
523
- } )
524
- . skip ( 1 )
525
- . map ( processLine )
526
- . on ( 'pipe' , cb ) ;
534
+ var rl = readline . createInterface ( {
535
+ input : fs . createReadStream ( tmpDataFile ) ,
536
+ crlfDelay : Infinity
537
+ } ) ;
538
+ var i = 0 ;
539
+ for await ( var line of rl ) {
540
+ i ++ ;
541
+ if ( i == 1 ) continue ;
542
+ await processLine ( line ) ;
543
+ }
544
+ datFile . close ( ) ;
527
545
}
528
546
529
547
function processCityDataNames ( src , dest , cb ) {
@@ -599,10 +617,10 @@ function processData(database, cb) {
599
617
if ( type === 'country' ) {
600
618
if ( Array . isArray ( src ) ) {
601
619
processLookupCountry ( src [ 0 ] , function ( ) {
602
- processCountryData ( src [ 1 ] , dest [ 1 ] , function ( ) {
603
- processCountryData ( src [ 2 ] , dest [ 2 ] , function ( ) {
604
- cb ( null , database ) ;
605
- } ) ;
620
+ processCountryData ( src [ 1 ] , dest [ 1 ] ) . then ( ( ) => {
621
+ return processCountryData ( src [ 2 ] , dest [ 2 ] ) ;
622
+ } ) . then ( ( ) => {
623
+ cb ( null , database ) ;
606
624
} ) ;
607
625
} ) ;
608
626
}
@@ -613,12 +631,12 @@ function processData(database, cb) {
613
631
}
614
632
} else if ( type === 'city' ) {
615
633
processCityDataNames ( src [ 0 ] , dest [ 0 ] , function ( ) {
616
- processCityData ( src [ 1 ] , dest [ 1 ] , function ( ) {
634
+ processCityData ( src [ 1 ] , dest [ 1 ] ) . then ( ( ) => {
617
635
console . log ( "city data processed" ) ;
618
- processCityData ( src [ 2 ] , dest [ 2 ] , function ( ) {
619
- console . log ( chalk . green ( ' DONE' ) ) ;
620
- cb ( null , database ) ;
621
- } ) ;
636
+ return processCityData ( src [ 2 ] , dest [ 2 ] ) ;
637
+ } ) . then ( ( ) => {
638
+ console . log ( chalk . green ( ' DONE' ) ) ;
639
+ cb ( null , database ) ;
622
640
} ) ;
623
641
} ) ;
624
642
}
0 commit comments