Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Showing
with
198 additions
and 110 deletions.
- +28 −35 lib/lockfile.js
- +55 −0 lib/mtime-precision.js
- +1 −1 test/check.test.js
- +105 −62 test/lock.test.js
- +9 −12 test/unlock.test.js
@@ -0,0 +1,55 @@ | ||
'use strict'; | ||
|
||
const cacheSymbol = Symbol(); | ||
|
||
function probe(file, fs, callback) { | ||
const cachedPrecision = fs[cacheSymbol]; | ||
|
||
if (cachedPrecision) { | ||
return fs.stat(file, (err, stat) => { | ||
/* istanbul ignore if */ | ||
if (err) { | ||
return callback(err); | ||
} | ||
|
||
callback(null, stat.mtime, cachedPrecision); | ||
}); | ||
} | ||
|
||
// Set mtime by ceiling Date.now() to seconds + 5ms so that it's "not on the second" | ||
const mtime = new Date((Math.ceil(Date.now() / 1000) * 1000) + 5); | ||
|
||
fs.utimes(file, mtime, mtime, (err) => { | ||
/* istanbul ignore if */ | ||
if (err) { | ||
return callback(err); | ||
} | ||
|
||
fs.stat(file, (err, stat) => { | ||
/* istanbul ignore if */ | ||
if (err) { | ||
return callback(err); | ||
} | ||
|
||
const precision = stat.mtime.getTime() % 1000 === 0 ? 's' : 'ms'; | ||
|
||
// Cache the precision in a non-enumerable way | ||
Object.defineProperty(fs, cacheSymbol, { value: precision }); | ||
|
||
callback(null, stat.mtime, precision); | ||
}); | ||
}); | ||
} | ||
|
||
function getMtime(precision) { | ||
let now = Date.now(); | ||
|
||
if (precision === 's') { | ||
now = Math.ceil(now / 1000) * 1000; | ||
} | ||
|
||
return new Date(now); | ||
} | ||
|
||
module.exports.probe = probe; | ||
module.exports.getMtime = getMtime; |
Oops, something went wrong.