UNPKG

@x5e/gink

Version:

an eventually consistent database

59 lines 1.86 kB
"use strict"; 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