@x5e/gink
Version:
an eventually consistent database
59 lines • 1.86 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.LockableFile = void 0;
const fs_ext_1 = require("fs-ext");
const promises_1 = require("fs/promises");
class LockableFile {
constructor(filename, exclusive = false) {
this.filename = filename;
this.exclusive = exclusive;
this.fileLocked = false;
this.lockableFileReady = this.initializeLockableFile();
}
get ready() {
return this.lockableFileReady;
}
async initializeLockableFile() {
this.fileHandle = await (0, promises_1.open)(this.filename, "a+");
if (this.exclusive) {
await this.lockFile(false);
}
}
async lockFile(block) {
const thisLogBackedStore = this;
return new Promise((resolve, reject) => {
(0, fs_ext_1.flock)(this.fileHandle.fd, block ? "ex" : "exnb", (err) => {
if (err) {
return reject(err);
}
thisLogBackedStore.fileLocked = true;
resolve(true);
});
});
}
async unlockFile() {
const thisLogBackedStore = this;
return new Promise((resolve, reject) => {
(0, fs_ext_1.flock)(this.fileHandle.fd, "un", async (err) => {
if (err) {
return reject(err);
}
thisLogBackedStore.fileLocked = false;
resolve(true);
});
});
}
async getFileLength() {
let stats;
try {
stats = await this.fileHandle.stat();
}
catch (problem) {
console.error(`problem with fileHandle.stat ${problem}`);
throw problem;
}
return stats.size;
}
}
exports.LockableFile = LockableFile;
//# sourceMappingURL=LockableFile.js.map