/
index.js
56 lines (49 loc) · 1.27 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
const fs = require('fs');
const flockSync = require('fs-ext').flockSync;
const dirname = require('path').dirname;
module.exports = function(options) {
const dir = dirname(require.main.filename);
options = options || {};
const dataFile = options.json || (dir + '/data.json');
const lockFile = dataFile + '.lock';
let data;
let lockFd;
// Prevent race conditions
lock();
load();
process.on('exit', function() {
save();
unlock();
});
return data;
function lock() {
lockFd = fs.openSync(lockFile, 'a');
flockSync(lockFd, 'ex');
}
function unlock() {
flockSync(lockFd, 'un');
try {
fs.closeSync(lockFd);
// We do NOT delete the lockfile. That can cause
// race conditions.
} catch (e) {
// Another instance may have jumped on the file,
// but as we've already unlocked, we don't
// care anymore
}
}
function load() {
if (!fs.existsSync(dataFile)) {
data = {};
return;
}
const content = fs.readFileSync(dataFile);
data = JSON.parse(content);
}
function save() {
// For data integrity, don't overwrite the old file until
// we're sure it worked
fs.writeFileSync(dataFile + '.tmp', JSON.stringify(data));
fs.renameSync(dataFile + '.tmp', dataFile);
}
};