eslint-seatbelt
Version:
Gradually tighten ESLint rules in your codebase
1 lines • 2.41 kB
Source Map (JSON)
{"version":3,"sources":["../src/FileLock.ts"],"sourcesContent":["import { openSync, writeSync, closeSync, constants, rmSync } from \"node:fs\"\nimport { isErrno } from \"./errorHanding\"\nconst { O_CREAT, O_EXCL, O_RDWR } = constants\n\nconst waitBuffer = new Int32Array(new SharedArrayBuffer(4))\n\n/** Uses posix open(2) O_EXCL to implement a multi-process mutual exclusion lock. */\nexport class FileLock {\n private fd: number | undefined\n constructor(public readonly filename: string) {}\n\n tryLock() {\n this.assertNotLocked()\n try {\n this.fd = openSync(this.filename, O_CREAT | O_EXCL | O_RDWR)\n return true\n } catch (e) {\n if (isErrno(e, \"EEXIST\")) {\n return false\n }\n throw e\n }\n }\n\n waitLock(timeoutMs: number) {\n const deadline = Date.now() + timeoutMs\n while (!this.tryLock()) {\n if (Date.now() > deadline) {\n throw new Error(`Timed out waiting for lock on ${this.filename}`)\n }\n Atomics.wait(waitBuffer, 0, 0, 1)\n }\n }\n\n isLocked() {\n return this.fd !== undefined\n }\n\n unlock() {\n if (this.fd !== undefined) {\n closeSync(this.fd)\n rmSync(this.filename)\n this.fd = undefined\n }\n }\n\n assertNotLocked() {\n if (this.fd !== undefined) {\n throw new Error(\n `FileLock \"${this.filename}\" is already locked by this process [pid ${process.pid}]`,\n )\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,UAAqB,WAAW,WAAW,cAAc;AAElE,IAAM,EAAE,SAAS,QAAQ,OAAO,IAAI;AAEpC,IAAM,aAAa,IAAI,WAAW,IAAI,kBAAkB,CAAC,CAAC;AAGnD,IAAM,WAAN,MAAe;AAAA,EAEpB,YAA4B,UAAkB;AAAlB;AAAA,EAAmB;AAAA,EADvC;AAAA,EAGR,UAAU;AACR,SAAK,gBAAgB;AACrB,QAAI;AACF,WAAK,KAAK,SAAS,KAAK,UAAU,UAAU,SAAS,MAAM;AAC3D,aAAO;AAAA,IACT,SAAS,GAAG;AACV,UAAI,QAAQ,GAAG,QAAQ,GAAG;AACxB,eAAO;AAAA,MACT;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,SAAS,WAAmB;AAC1B,UAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,WAAO,CAAC,KAAK,QAAQ,GAAG;AACtB,UAAI,KAAK,IAAI,IAAI,UAAU;AACzB,cAAM,IAAI,MAAM,iCAAiC,KAAK,QAAQ,EAAE;AAAA,MAClE;AACA,cAAQ,KAAK,YAAY,GAAG,GAAG,CAAC;AAAA,IAClC;AAAA,EACF;AAAA,EAEA,WAAW;AACT,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,SAAS;AACP,QAAI,KAAK,OAAO,QAAW;AACzB,gBAAU,KAAK,EAAE;AACjB,aAAO,KAAK,QAAQ;AACpB,WAAK,KAAK;AAAA,IACZ;AAAA,EACF;AAAA,EAEA,kBAAkB;AAChB,QAAI,KAAK,OAAO,QAAW;AACzB,YAAM,IAAI;AAAA,QACR,aAAa,KAAK,QAAQ,4CAA4C,QAAQ,GAAG;AAAA,MACnF;AAAA,IACF;AAAA,EACF;AACF;","names":[]}