19
19
addChangeListener - called when tabs render or gain focus
20
20
*/
21
21
22
+ const crypto = require ( 'crypto' )
22
23
const fs = require ( 'fs' )
23
24
const os = require ( 'os' )
24
25
const path = require ( 'path' )
@@ -577,7 +578,7 @@ var initialize = (paymentsEnabled) => {
577
578
}
578
579
getStateInfo ( stateResult )
579
580
580
- syncWriter ( pathName ( statePath ) , stateResult , { flushP : true } , ( ) => { } )
581
+ atomicWriter ( pathName ( statePath ) , stateResult , { flushP : true } , ( ) => { } )
581
582
} )
582
583
}
583
584
} catch ( ex ) {
@@ -720,10 +721,10 @@ var updatePublisherInfo = () => {
720
721
721
722
if ( entries . length > 0 ) data [ publisher ] = entries
722
723
} )
723
- syncWriter ( pathName ( publisherPath ) , data , ( ) => { } )
724
- syncWriter ( pathName ( scoresPath ) , synopsis . allN ( ) , ( ) => { } )
724
+ atomicWriter ( pathName ( publisherPath ) , data , ( ) => { } )
725
+ atomicWriter ( pathName ( scoresPath ) , synopsis . allN ( ) , ( ) => { } )
725
726
726
- syncWriter ( pathName ( synopsisPath ) , synopsis , ( ) => { } )
727
+ atomicWriter ( pathName ( synopsisPath ) , synopsis , ( ) => { } )
727
728
if ( ! publisherInfo . _internal . enabled ) return
728
729
729
730
publisherInfo . synopsis = synopsisNormalizer ( )
@@ -1097,7 +1098,7 @@ var callback = (err, result, delayTime) => {
1097
1098
if ( ( i !== 0 ) && ( i !== logs . length ) ) logs = logs . slice ( i )
1098
1099
if ( result ) entries . push ( { who : 'callback' , what : result , when : underscore . now ( ) } )
1099
1100
1100
- syncWriter ( pathName ( logPath ) , entries , { flag : 'a' } , ( ) => { } )
1101
+ atomicWriter ( pathName ( logPath ) , entries , { flag : 'a' } , ( ) => { } )
1101
1102
}
1102
1103
1103
1104
if ( err ) {
@@ -1117,7 +1118,7 @@ var callback = (err, result, delayTime) => {
1117
1118
}
1118
1119
cacheRuleSet ( result . ruleset )
1119
1120
1120
- syncWriter ( pathName ( statePath ) , result , { flushP : true } , ( ) => { } )
1121
+ atomicWriter ( pathName ( statePath ) , result , { flushP : true } , ( ) => { } )
1121
1122
run ( delayTime )
1122
1123
}
1123
1124
@@ -1214,7 +1215,7 @@ var run = (delayTime) => {
1214
1215
result = client . vote ( winner )
1215
1216
if ( result ) state = result
1216
1217
} )
1217
- if ( state ) syncWriter ( pathName ( statePath ) , state , { flushP : true } , ( ) => { } )
1218
+ if ( state ) atomicWriter ( pathName ( statePath ) , state , { flushP : true } , ( ) => { } )
1218
1219
} catch ( ex ) {
1219
1220
console . log ( 'ledger client error(2): ' + ex . toString ( ) + ( ex . stack ? ( '\n' + ex . stack ) : '' ) )
1220
1221
}
@@ -1423,7 +1424,7 @@ var setPaymentInfo = (amount) => {
1423
1424
client . setBraveryProperties ( bravery , ( err , result ) => {
1424
1425
if ( err ) return console . log ( 'ledger setBraveryProperties: ' + err . toString ( ) )
1425
1426
1426
- if ( result ) syncWriter ( pathName ( statePath ) , result , { flushP : true } , ( ) => { } )
1427
+ if ( result ) atomicWriter ( pathName ( statePath ) , result , { flushP : true } , ( ) => { } )
1427
1428
} )
1428
1429
if ( ledgerInfo . created ) getPaymentInfo ( )
1429
1430
}
@@ -1473,7 +1474,9 @@ var networkConnected = underscore.debounce(() => {
1473
1474
1474
1475
var syncingP = { }
1475
1476
1476
- var syncWriter = ( path , obj , options , cb ) => {
1477
+ var atomicWriter = ( path , obj , options , cb ) => {
1478
+ var data , suffix
1479
+
1477
1480
if ( typeof options === 'function' ) {
1478
1481
cb = options
1479
1482
options = null
@@ -1488,19 +1491,28 @@ var syncWriter = (path, obj, options, cb) => {
1488
1491
}
1489
1492
syncingP [ path ] = true
1490
1493
1491
- if ( ledgerInfo . _internal . debugP ) console . log ( '\nwriting ' + path )
1492
- fs . writeFile ( path , JSON . stringify ( obj , null , 2 ) , options , ( err ) => {
1494
+ data = JSON . stringify ( obj , null , 2 )
1495
+ suffix = '-' + crypto . createHash ( 'md5' ) . update ( data ) . digest ( 'hex' )
1496
+ if ( ledgerInfo . _internal . debugP ) console . log ( '\nwriting ' + path + suffix )
1497
+ fs . writeFile ( path + suffix , data , options , ( err ) => {
1493
1498
var deferred = syncingP [ path ]
1494
1499
1495
1500
delete syncingP [ path ]
1496
1501
if ( typeof deferred === 'object' ) {
1497
1502
if ( ledgerInfo . _internal . debugP ) console . log ( '\nrestarting ' + path )
1498
- syncWriter ( path , deferred . obj , deferred . options , deferred . cb )
1503
+ atomicWriter ( path , deferred . obj , deferred . options , deferred . cb )
1499
1504
}
1500
1505
1501
- if ( err ) console . log ( 'write error: ' + err . toString ( ) )
1506
+ if ( err ) {
1507
+ console . log ( 'write error: ' + err . toString ( ) )
1508
+ return cb ( err )
1509
+ }
1502
1510
1503
- cb ( err )
1511
+ if ( ledgerInfo . _internal . debugP ) console . log ( '\nrenaming ' + path + suffix )
1512
+ fs . rename ( path + suffix , path , ( err ) => {
1513
+ if ( err ) console . log ( 'rename error: ' + err . toString ( ) )
1514
+ cb ( err )
1515
+ } )
1504
1516
} )
1505
1517
}
1506
1518
@@ -1513,7 +1525,7 @@ var doneWriter = () => {
1513
1525
delete syncingP [ path ]
1514
1526
if ( ledgerInfo . _internal . debugP ) console . log ( '\nflushing ' + path )
1515
1527
deferred . options . flushP = true
1516
- syncWriter ( path , deferred . obj , deferred . options , deferred . cb )
1528
+ atomicWriter ( path , deferred . obj , deferred . options , deferred . cb )
1517
1529
} )
1518
1530
}
1519
1531
0 commit comments