@x5e/gink
Version:
an eventually consistent database
37 lines • 1.65 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.LockableLog = void 0;
const utils_1 = require("./utils");
const builders_1 = require("./builders");
const LockableFile_1 = require("./LockableFile");
class LockableLog extends LockableFile_1.LockableFile {
async writeMagicNumber() {
(0, utils_1.ensure)(this.fileLocked);
const size = await this.getFileLength();
if (size !== 0)
throw new Error("file not empty!");
const logFragment = new builders_1.LogFileBuilder();
logFragment.setMagicNumber(1263421767);
return await this.writeLogFragment(logFragment, true);
}
async writeLogFragment(fragment, sync) {
(0, utils_1.ensure)(this.fileLocked);
const bytes = fragment.serializeBinary();
await this.fileHandle.writeFile(bytes);
if (sync)
await this.fileHandle.sync();
return bytes.byteLength;
}
async getLogContents(start = 0, finish) {
// I could imagine replacing this with a async iterator that only reads fragments of the
// file, though that would only be worth the trouble if the file gets large enough that
// the memory required to read the whole thing is an expensive resource.
finish = finish ?? (await this.getFileLength());
const needToReed = finish - start;
const uint8Array = new Uint8Array(needToReed);
await this.fileHandle.read(uint8Array, 0, needToReed, start);
return builders_1.LogFileBuilder.deserializeBinary(uint8Array);
}
}
exports.LockableLog = LockableLog;
//# sourceMappingURL=LockableLog.js.map