@lickle/lock 0.0.1-alpha.1 → 0.0.1-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/README.md +182 -76
  2. package/cjs.js +57 -57
  3. package/dist/cjs/core/guard.d.ts +50 -0
  4. package/dist/cjs/core/guard.d.ts.map +1 -0
  5. package/dist/cjs/{backend → core}/guard.js +43 -11
  6. package/dist/cjs/core/guard.js.map +1 -0
  7. package/dist/cjs/core/index.d.ts +8 -0
  8. package/dist/cjs/core/index.d.ts.map +1 -0
  9. package/dist/cjs/core/index.js +41 -0
  10. package/dist/cjs/core/index.js.map +1 -0
  11. package/dist/cjs/core/locking.d.ts +23 -0
  12. package/dist/cjs/core/locking.d.ts.map +1 -0
  13. package/dist/cjs/core/locking.js +93 -0
  14. package/dist/cjs/core/locking.js.map +1 -0
  15. package/dist/cjs/core/node.d.ts +19 -0
  16. package/dist/cjs/core/node.d.ts.map +1 -0
  17. package/dist/cjs/core/node.js +69 -0
  18. package/dist/cjs/core/node.js.map +1 -0
  19. package/dist/cjs/core/types.d.ts +49 -0
  20. package/dist/cjs/core/types.d.ts.map +1 -0
  21. package/dist/cjs/core/types.js +13 -0
  22. package/dist/cjs/core/types.js.map +1 -0
  23. package/dist/cjs/index.d.ts +43 -34
  24. package/dist/cjs/index.d.ts.map +1 -1
  25. package/dist/cjs/index.js +59 -39
  26. package/dist/cjs/index.js.map +1 -1
  27. package/dist/esm/core/guard.d.ts +50 -0
  28. package/dist/esm/core/guard.d.ts.map +1 -0
  29. package/dist/esm/{backend → core}/guard.js +40 -9
  30. package/dist/esm/core/guard.js.map +1 -0
  31. package/dist/esm/core/index.d.ts +8 -0
  32. package/dist/esm/core/index.d.ts.map +1 -0
  33. package/dist/esm/core/index.js +21 -0
  34. package/dist/esm/core/index.js.map +1 -0
  35. package/dist/esm/core/locking.d.ts +23 -0
  36. package/dist/esm/core/locking.d.ts.map +1 -0
  37. package/dist/esm/core/locking.js +56 -0
  38. package/dist/esm/core/locking.js.map +1 -0
  39. package/dist/esm/core/node.d.ts +19 -0
  40. package/dist/esm/core/node.d.ts.map +1 -0
  41. package/dist/esm/core/node.js +61 -0
  42. package/dist/esm/core/node.js.map +1 -0
  43. package/dist/esm/core/types.d.ts +49 -0
  44. package/dist/esm/core/types.d.ts.map +1 -0
  45. package/dist/esm/core/types.js +9 -0
  46. package/dist/esm/core/types.js.map +1 -0
  47. package/dist/esm/index.d.ts +43 -34
  48. package/dist/esm/index.d.ts.map +1 -1
  49. package/dist/esm/index.js +53 -34
  50. package/dist/esm/index.js.map +1 -1
  51. package/esm.js +58 -58
  52. package/index.d.ts +32 -8
  53. package/package.json +6 -6
  54. package/dist/cjs/backend/guard.d.ts +0 -31
  55. package/dist/cjs/backend/guard.d.ts.map +0 -1
  56. package/dist/cjs/backend/guard.js.map +0 -1
  57. package/dist/cjs/backend/index.d.ts +0 -8
  58. package/dist/cjs/backend/index.d.ts.map +0 -1
  59. package/dist/cjs/backend/index.js +0 -31
  60. package/dist/cjs/backend/index.js.map +0 -1
  61. package/dist/cjs/backend/lockable.d.ts +0 -15
  62. package/dist/cjs/backend/lockable.d.ts.map +0 -1
  63. package/dist/cjs/backend/lockable.js +0 -76
  64. package/dist/cjs/backend/lockable.js.map +0 -1
  65. package/dist/cjs/backend/node.d.ts +0 -36
  66. package/dist/cjs/backend/node.d.ts.map +0 -1
  67. package/dist/cjs/backend/node.js +0 -118
  68. package/dist/cjs/backend/node.js.map +0 -1
  69. package/dist/cjs/backend/types.d.ts +0 -36
  70. package/dist/cjs/backend/types.d.ts.map +0 -1
  71. package/dist/cjs/backend/types.js +0 -3
  72. package/dist/cjs/backend/types.js.map +0 -1
  73. package/dist/esm/backend/guard.d.ts +0 -31
  74. package/dist/esm/backend/guard.d.ts.map +0 -1
  75. package/dist/esm/backend/guard.js.map +0 -1
  76. package/dist/esm/backend/index.d.ts +0 -8
  77. package/dist/esm/backend/index.d.ts.map +0 -1
  78. package/dist/esm/backend/index.js +0 -13
  79. package/dist/esm/backend/index.js.map +0 -1
  80. package/dist/esm/backend/lockable.d.ts +0 -15
  81. package/dist/esm/backend/lockable.d.ts.map +0 -1
  82. package/dist/esm/backend/lockable.js +0 -39
  83. package/dist/esm/backend/lockable.js.map +0 -1
  84. package/dist/esm/backend/node.d.ts +0 -36
  85. package/dist/esm/backend/node.d.ts.map +0 -1
  86. package/dist/esm/backend/node.js +0 -109
  87. package/dist/esm/backend/node.js.map +0 -1
  88. package/dist/esm/backend/types.d.ts +0 -36
  89. package/dist/esm/backend/types.d.ts.map +0 -1
  90. package/dist/esm/backend/types.js +0 -2
  91. package/dist/esm/backend/types.js.map +0 -1
@@ -1,118 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.NodeLockHooks = exports.NodeFileHandle = exports.createNodeBackend = void 0;
7
- const node_worker_threads_1 = require("node:worker_threads");
8
- const node_fs_1 = __importDefault(require("node:fs"));
9
- const lockable_js_1 = require("./lockable.js");
10
- /**
11
- * Create the default Node.js backend using native OS locks (flock on Unix, LockFileEx on Windows).
12
- * Registers cleanup hooks for process exit, signals, and GC.
13
- *
14
- * @example
15
- * const backend = createNodeBackend()
16
- * await exclusive('/tmp/my.lock', { backend })
17
- */
18
- const createNodeBackend = () => {
19
- const hooks = new NodeLockHooks();
20
- return {
21
- async open(file) {
22
- const handle = await node_fs_1.default.promises.open(file, node_fs_1.default.constants.O_CREAT | node_fs_1.default.constants.O_RDWR);
23
- return new NodeFileHandle(handle, file);
24
- },
25
- ...(0, lockable_js_1.createLockable)(hooks),
26
- };
27
- };
28
- exports.createNodeBackend = createNodeBackend;
29
- /** Wraps a Node.js `fs.promises.FileHandle` to satisfy the `FileHandle` interface. */
30
- class NodeFileHandle {
31
- handle;
32
- path;
33
- constructor(handle, path) {
34
- this.handle = handle;
35
- this.path = path;
36
- }
37
- get fd() {
38
- return this.handle.fd;
39
- }
40
- close() {
41
- return this.handle.close();
42
- }
43
- }
44
- exports.NodeFileHandle = NodeFileHandle;
45
- /**
46
- * Track active locks and ensure they are released on process exit,
47
- * SIGINT, SIGTERM, and GC finalization.
48
- */
49
- class NodeLockHooks {
50
- _active = new Set();
51
- _handlingSignal = false;
52
- _finalizer = new FinalizationRegistry((held) => {
53
- try {
54
- node_fs_1.default.closeSync(held.fd);
55
- }
56
- catch {
57
- // EBADF (Bad file descriptor) is expected if the user or Node already closed it
58
- }
59
- });
60
- async register(handle) {
61
- if (this._active.size === 0)
62
- this._listen();
63
- this._active.add(handle.fd);
64
- this._finalizer.register(handle, { fd: handle.fd, path: handle.path }, handle);
65
- }
66
- async unregister(handle) {
67
- this._finalizer.unregister(handle);
68
- this._active.delete(handle.fd);
69
- if (this._active.size === 0)
70
- this._unlisten();
71
- }
72
- _listen() {
73
- if (node_worker_threads_1.isMainThread) {
74
- process.on('exit', this._onExit);
75
- process.on('SIGINT', this._onSignal);
76
- process.on('SIGTERM', this._onSignal);
77
- }
78
- else {
79
- node_worker_threads_1.parentPort?.on('close', this._onExit);
80
- }
81
- }
82
- _unlisten() {
83
- if (node_worker_threads_1.isMainThread) {
84
- process.off('exit', this._onExit);
85
- process.off('SIGINT', this._onSignal);
86
- process.off('SIGTERM', this._onSignal);
87
- }
88
- else {
89
- node_worker_threads_1.parentPort?.off('close', this._onExit);
90
- }
91
- }
92
- _onExit = () => {
93
- for (const fd of Array.from(this._active.values()).reverse()) {
94
- try {
95
- node_fs_1.default.closeSync(fd);
96
- }
97
- catch {
98
- // EBADF (Bad file descriptor) is expected if the user or Node already closed it
99
- }
100
- }
101
- this._active.clear();
102
- };
103
- _onSignal = (signal) => {
104
- if (this._handlingSignal)
105
- return;
106
- this._handlingSignal = true;
107
- this._unlisten();
108
- this._onExit();
109
- try {
110
- process.kill(process.pid, signal);
111
- }
112
- catch {
113
- process.exit(1);
114
- }
115
- };
116
- }
117
- exports.NodeLockHooks = NodeLockHooks;
118
- //# sourceMappingURL=node.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"node.js","sourceRoot":"","sources":["../../../lib/backend/node.ts"],"names":[],"mappings":"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"}
@@ -1,36 +0,0 @@
1
- /**
2
- * Backend for file operations.
3
- *
4
- * @example Customize file open:
5
- * ```ts
6
- * import { createLockable } from '@lickle/lock'
7
- * const backend = {
8
- * open: async (file: string) => your open logic,
9
- * ...createLockable(),
10
- * }
11
- * ```
12
- */
13
- export interface Backend<H extends FileHandle> extends Lockable<H> {
14
- /** Open (or create) the lock file and return a handle. */
15
- open(file: string): Promise<H>;
16
- }
17
- /** Lock/unlock operations, separated from file opening for composability. */
18
- export interface Lockable<H extends FileHandle> {
19
- /** Acquire a lock, polling until available or timeout is reached. */
20
- lock: (handle: H, mode: 'exclusive' | 'shared', options?: {
21
- pollMs?: number;
22
- timeout?: number;
23
- }) => Promise<void>;
24
- /** Try to acquire a lock without waiting. Return true if acquired. */
25
- tryLock: (handle: H, mode: 'exclusive' | 'shared') => Promise<boolean>;
26
- /** Release a previously acquired lock. */
27
- unlock: (handle: H) => Promise<void>;
28
- }
29
- /** Represents an open file descriptor with its path. */
30
- export interface FileHandle {
31
- readonly fd: number;
32
- readonly path: string;
33
- close(): Promise<void>;
34
- handle: any;
35
- }
36
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../lib/backend/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,OAAO,CAAC,CAAC,SAAS,UAAU,CAAE,SAAQ,QAAQ,CAAC,CAAC,CAAC;IAChE,0DAA0D;IAC1D,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CAC/B;AAED,6EAA6E;AAC7E,MAAM,WAAW,QAAQ,CAAC,CAAC,SAAS,UAAU;IAC5C,qEAAqE;IACrE,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,GAAG,QAAQ,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACjH,sEAAsE;IACtE,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,GAAG,QAAQ,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IACtE,0CAA0C;IAC1C,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACrC;AAED,wDAAwD;AACxD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,MAAM,EAAE,GAAG,CAAA;CACZ"}
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../lib/backend/types.ts"],"names":[],"mappings":""}
@@ -1,31 +0,0 @@
1
- import type { Backend, FileHandle } from './index.js';
2
- /**
3
- * RAII guard that holds a file lock. Unlocks and closes the file on drop.
4
- * Supports `await using` via `Symbol.asyncDispose`.
5
- *
6
- * @example
7
- * await using guard = await exclusive('/tmp/my.lock')
8
- * // lock is released when guard goes out of scope
9
- *
10
- * @example
11
- * const guard = await exclusive('/tmp/my.lock')
12
- * try { /* work *\/ } finally { await guard.drop() }
13
- */
14
- export declare class FileGuard<H extends FileHandle> {
15
- private backend;
16
- private hndl;
17
- private _dropped;
18
- /** The lock file path. */
19
- readonly path: string;
20
- /** The file descriptor number. */
21
- readonly fd: number;
22
- constructor(backend: Backend<H>, hndl: H);
23
- /** The underlying file handle. Throws if the guard has been dropped. */
24
- get handle(): H['handle'];
25
- /** True if the lock has been released. */
26
- get dropped(): boolean;
27
- /** Release the lock and close the file. Safe to call multiple times. */
28
- drop(): Promise<void>;
29
- [Symbol.asyncDispose](): Promise<void>;
30
- }
31
- //# sourceMappingURL=guard.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../../lib/backend/guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAErD;;;;;;;;;;;GAWG;AACH,qBAAa,SAAS,CAAC,CAAC,SAAS,UAAU;IAQvC,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,IAAI;IARd,OAAO,CAAC,QAAQ,CAA2B;IAC3C,0BAA0B;IAC1B,SAAgB,IAAI,EAAE,MAAM,CAAA;IAC5B,kCAAkC;IAClC,SAAgB,EAAE,EAAE,MAAM,CAAA;gBAGhB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,IAAI,EAAE,CAAC;IAMjB,wEAAwE;IACxE,IAAI,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,CAGxB;IAED,0CAA0C;IAC1C,IAAI,OAAO,YAEV;IAED,wEAAwE;IACxE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAarB,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;CAGvC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"guard.js","sourceRoot":"","sources":["../../../lib/backend/guard.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,SAAS;IAQV;IACA;IARF,QAAQ,CAA2B;IAC3C,0BAA0B;IACV,IAAI,CAAQ;IAC5B,kCAAkC;IAClB,EAAE,CAAQ;IAE1B,YACU,OAAmB,EACnB,IAAO;QADP,YAAO,GAAP,OAAO,CAAY;QACnB,SAAI,GAAJ,IAAI,CAAG;QAEf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QACrB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAA;IACnB,CAAC;IAED,wEAAwE;IACxE,IAAI,MAAM;QACR,IAAI,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAA;QAChE,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAA;IACzB,CAAC;IAED,0CAA0C;IAC1C,IAAI,OAAO;QACT,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAA;IACxB,CAAC;IAED,wEAAwE;IACxE,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,GAAG,CAAC,KAAK,IAAI,EAAE;gBAC1B,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACtC,CAAC;wBAAS,CAAC;oBACT,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA;gBACzB,CAAC;YACH,CAAC,CAAC,EAAE,CAAA;QACN,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAED,CAAC,MAAM,CAAC,YAAY,CAAC;QACnB,OAAO,IAAI,CAAC,IAAI,EAAE,CAAA;IACpB,CAAC;CACF"}
@@ -1,8 +0,0 @@
1
- import { NodeFileHandle } from './node.js';
2
- import { type Backend } from './types.js';
3
- export * from './lockable.js';
4
- export * from './types.js';
5
- export * from './guard.js';
6
- export * from './node.js';
7
- export declare const defaultBackend: () => Backend<NodeFileHandle>;
8
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/backend/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,cAAc,EAAE,MAAM,WAAW,CAAA;AAC7D,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,YAAY,CAAA;AAEzC,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AAIzB,eAAO,MAAM,cAAc,+BAG1B,CAAA"}
@@ -1,13 +0,0 @@
1
- import { createNodeBackend } from './node.js';
2
- export * from './lockable.js';
3
- export * from './types.js';
4
- export * from './guard.js';
5
- export * from './node.js';
6
- /** Return the shared default Node backend singleton. */
7
- let _defaultBackend;
8
- export const defaultBackend = () => {
9
- if (!_defaultBackend)
10
- _defaultBackend = createNodeBackend();
11
- return _defaultBackend;
12
- };
13
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/backend/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAkB,MAAM,WAAW,CAAA;AAG7D,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AAEzB,wDAAwD;AACxD,IAAI,eAAoD,CAAA;AACxD,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE;IACjC,IAAI,CAAC,eAAe;QAAE,eAAe,GAAG,iBAAiB,EAAE,CAAA;IAC3D,OAAO,eAAe,CAAA;AACxB,CAAC,CAAA"}
@@ -1,15 +0,0 @@
1
- import type { FileHandle, Lockable } from '../index.js';
2
- /** Lifecycle hooks called when locks are acquired and released. */
3
- export interface LockHooks<H extends FileHandle> {
4
- register: (handle: H) => Promise<void>;
5
- unregister: (handle: H) => Promise<void>;
6
- }
7
- /**
8
- * Create a `Lockable` using native OS lock bindings (flock on Unix, LockFileEx on Windows).
9
- * Optional hooks are notified on lock/unlock for cleanup tracking.
10
- *
11
- * @example
12
- * const lockable = createLockable(myHooks)
13
- */
14
- export declare const createLockable: <H extends FileHandle>(hooks?: LockHooks<H>) => Lockable<H>;
15
- //# sourceMappingURL=lockable.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lockable.d.ts","sourceRoot":"","sources":["../../../lib/backend/lockable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAIvD,mEAAmE;AACnE,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,UAAU;IAC7C,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACtC,UAAU,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACzC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,GAAI,CAAC,SAAS,UAAU,EAAE,QAAQ,SAAS,CAAC,CAAC,CAAC,KAAG,QAAQ,CAAC,CAAC,CA0BrF,CAAA"}
@@ -1,39 +0,0 @@
1
- import * as native from '#native';
2
- /**
3
- * Create a `Lockable` using native OS lock bindings (flock on Unix, LockFileEx on Windows).
4
- * Optional hooks are notified on lock/unlock for cleanup tracking.
5
- *
6
- * @example
7
- * const lockable = createLockable(myHooks)
8
- */
9
- export const createLockable = (hooks) => {
10
- const lock = (handle, mode, options) => {
11
- if (mode === 'exclusive')
12
- return native.exclusive(handle.fd, options);
13
- else
14
- return native.shared(handle.fd, options);
15
- };
16
- const tryLock = (handle, mode) => {
17
- if (mode === 'exclusive')
18
- return native.tryExclusive(handle.fd);
19
- else
20
- return native.tryShared(handle.fd);
21
- };
22
- return {
23
- async lock(handle, mode, options) {
24
- await lock(handle, mode, options);
25
- await hooks?.register(handle);
26
- },
27
- async tryLock(handle, mode) {
28
- const locked = await tryLock(handle, mode);
29
- if (locked)
30
- await hooks?.register(handle);
31
- return locked;
32
- },
33
- async unlock(handle) {
34
- await hooks?.unregister(handle);
35
- await native.unlock(handle.fd);
36
- },
37
- };
38
- };
39
- //# sourceMappingURL=lockable.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lockable.js","sourceRoot":"","sources":["../../../lib/backend/lockable.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,MAAM,SAAS,CAAA;AAQjC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAuB,KAAoB,EAAe,EAAE;IACxF,MAAM,IAAI,GAAG,CAAC,MAAS,EAAE,IAA4B,EAAE,OAAiC,EAAiB,EAAE;QACzG,IAAI,IAAI,KAAK,WAAW;YAAE,OAAO,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;;YAChE,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IAC/C,CAAC,CAAA;IAED,MAAM,OAAO,GAAG,CAAC,MAAS,EAAE,IAA4B,EAAoB,EAAE;QAC5E,IAAI,IAAI,KAAK,WAAW;YAAE,OAAO,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;;YAC1D,OAAO,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACzC,CAAC,CAAA;IAED,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,MAAS,EAAE,IAA4B,EAAE,OAAiC;YACnF,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;YACjC,MAAM,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;QAC/B,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,MAAS,EAAE,IAA4B;YACnD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YAC1C,IAAI,MAAM;gBAAE,MAAM,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;YACzC,OAAO,MAAM,CAAA;QACf,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,MAAS;YACpB,MAAM,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,CAAA;YAC/B,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAChC,CAAC;KACF,CAAA;AACH,CAAC,CAAA"}
@@ -1,36 +0,0 @@
1
- import fs from 'node:fs';
2
- import { type LockHooks } from './lockable.js';
3
- import type { Backend, FileHandle } from './types.js';
4
- /**
5
- * Create the default Node.js backend using native OS locks (flock on Unix, LockFileEx on Windows).
6
- * Registers cleanup hooks for process exit, signals, and GC.
7
- *
8
- * @example
9
- * const backend = createNodeBackend()
10
- * await exclusive('/tmp/my.lock', { backend })
11
- */
12
- export declare const createNodeBackend: () => Backend<NodeFileHandle>;
13
- /** Wraps a Node.js `fs.promises.FileHandle` to satisfy the `FileHandle` interface. */
14
- export declare class NodeFileHandle implements FileHandle {
15
- readonly handle: fs.promises.FileHandle;
16
- readonly path: string;
17
- constructor(handle: fs.promises.FileHandle, path: string);
18
- get fd(): number;
19
- close(): Promise<void>;
20
- }
21
- /**
22
- * Track active locks and ensure they are released on process exit,
23
- * SIGINT, SIGTERM, and GC finalization.
24
- */
25
- export declare class NodeLockHooks implements LockHooks<FileHandle> {
26
- private _active;
27
- private _handlingSignal;
28
- private _finalizer;
29
- register(handle: FileHandle): Promise<void>;
30
- unregister(handle: FileHandle): Promise<void>;
31
- private _listen;
32
- private _unlisten;
33
- private _onExit;
34
- private _onSignal;
35
- }
36
- //# sourceMappingURL=node.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../lib/backend/node.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,SAAS,CAAA;AAExB,OAAO,EAAE,KAAK,SAAS,EAAkB,MAAM,eAAe,CAAA;AAC9D,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAErD;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,QAAO,OAAO,CAAC,cAAc,CAU1D,CAAA;AAED,sFAAsF;AACtF,qBAAa,cAAe,YAAW,UAAU;IAE7C,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM;gBADZ,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,EAC9B,IAAI,EAAE,MAAM;IAGvB,IAAI,EAAE,WAEL;IAED,KAAK;CAGN;AAED;;;GAGG;AACH,qBAAa,aAAc,YAAW,SAAS,CAAC,UAAU,CAAC;IACzD,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,eAAe,CAAQ;IAE/B,OAAO,CAAC,UAAU,CAMhB;IAEI,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3C,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnD,OAAO,CAAC,OAAO;IAUf,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,OAAO,CASd;IAED,OAAO,CAAC,SAAS,CAWhB;CACF"}
@@ -1,109 +0,0 @@
1
- import { isMainThread, parentPort } from 'node:worker_threads';
2
- import fs from 'node:fs';
3
- import { createLockable } from './lockable.js';
4
- /**
5
- * Create the default Node.js backend using native OS locks (flock on Unix, LockFileEx on Windows).
6
- * Registers cleanup hooks for process exit, signals, and GC.
7
- *
8
- * @example
9
- * const backend = createNodeBackend()
10
- * await exclusive('/tmp/my.lock', { backend })
11
- */
12
- export const createNodeBackend = () => {
13
- const hooks = new NodeLockHooks();
14
- return {
15
- async open(file) {
16
- const handle = await fs.promises.open(file, fs.constants.O_CREAT | fs.constants.O_RDWR);
17
- return new NodeFileHandle(handle, file);
18
- },
19
- ...createLockable(hooks),
20
- };
21
- };
22
- /** Wraps a Node.js `fs.promises.FileHandle` to satisfy the `FileHandle` interface. */
23
- export class NodeFileHandle {
24
- handle;
25
- path;
26
- constructor(handle, path) {
27
- this.handle = handle;
28
- this.path = path;
29
- }
30
- get fd() {
31
- return this.handle.fd;
32
- }
33
- close() {
34
- return this.handle.close();
35
- }
36
- }
37
- /**
38
- * Track active locks and ensure they are released on process exit,
39
- * SIGINT, SIGTERM, and GC finalization.
40
- */
41
- export class NodeLockHooks {
42
- _active = new Set();
43
- _handlingSignal = false;
44
- _finalizer = new FinalizationRegistry((held) => {
45
- try {
46
- fs.closeSync(held.fd);
47
- }
48
- catch {
49
- // EBADF (Bad file descriptor) is expected if the user or Node already closed it
50
- }
51
- });
52
- async register(handle) {
53
- if (this._active.size === 0)
54
- this._listen();
55
- this._active.add(handle.fd);
56
- this._finalizer.register(handle, { fd: handle.fd, path: handle.path }, handle);
57
- }
58
- async unregister(handle) {
59
- this._finalizer.unregister(handle);
60
- this._active.delete(handle.fd);
61
- if (this._active.size === 0)
62
- this._unlisten();
63
- }
64
- _listen() {
65
- if (isMainThread) {
66
- process.on('exit', this._onExit);
67
- process.on('SIGINT', this._onSignal);
68
- process.on('SIGTERM', this._onSignal);
69
- }
70
- else {
71
- parentPort?.on('close', this._onExit);
72
- }
73
- }
74
- _unlisten() {
75
- if (isMainThread) {
76
- process.off('exit', this._onExit);
77
- process.off('SIGINT', this._onSignal);
78
- process.off('SIGTERM', this._onSignal);
79
- }
80
- else {
81
- parentPort?.off('close', this._onExit);
82
- }
83
- }
84
- _onExit = () => {
85
- for (const fd of Array.from(this._active.values()).reverse()) {
86
- try {
87
- fs.closeSync(fd);
88
- }
89
- catch {
90
- // EBADF (Bad file descriptor) is expected if the user or Node already closed it
91
- }
92
- }
93
- this._active.clear();
94
- };
95
- _onSignal = (signal) => {
96
- if (this._handlingSignal)
97
- return;
98
- this._handlingSignal = true;
99
- this._unlisten();
100
- this._onExit();
101
- try {
102
- process.kill(process.pid, signal);
103
- }
104
- catch {
105
- process.exit(1);
106
- }
107
- };
108
- }
109
- //# sourceMappingURL=node.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"node.js","sourceRoot":"","sources":["../../../lib/backend/node.ts"],"names":[],"mappings":"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"}
@@ -1,36 +0,0 @@
1
- /**
2
- * Backend for file operations.
3
- *
4
- * @example Customize file open:
5
- * ```ts
6
- * import { createLockable } from '@lickle/lock'
7
- * const backend = {
8
- * open: async (file: string) => your open logic,
9
- * ...createLockable(),
10
- * }
11
- * ```
12
- */
13
- export interface Backend<H extends FileHandle> extends Lockable<H> {
14
- /** Open (or create) the lock file and return a handle. */
15
- open(file: string): Promise<H>;
16
- }
17
- /** Lock/unlock operations, separated from file opening for composability. */
18
- export interface Lockable<H extends FileHandle> {
19
- /** Acquire a lock, polling until available or timeout is reached. */
20
- lock: (handle: H, mode: 'exclusive' | 'shared', options?: {
21
- pollMs?: number;
22
- timeout?: number;
23
- }) => Promise<void>;
24
- /** Try to acquire a lock without waiting. Return true if acquired. */
25
- tryLock: (handle: H, mode: 'exclusive' | 'shared') => Promise<boolean>;
26
- /** Release a previously acquired lock. */
27
- unlock: (handle: H) => Promise<void>;
28
- }
29
- /** Represents an open file descriptor with its path. */
30
- export interface FileHandle {
31
- readonly fd: number;
32
- readonly path: string;
33
- close(): Promise<void>;
34
- handle: any;
35
- }
36
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../lib/backend/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,OAAO,CAAC,CAAC,SAAS,UAAU,CAAE,SAAQ,QAAQ,CAAC,CAAC,CAAC;IAChE,0DAA0D;IAC1D,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CAC/B;AAED,6EAA6E;AAC7E,MAAM,WAAW,QAAQ,CAAC,CAAC,SAAS,UAAU;IAC5C,qEAAqE;IACrE,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,GAAG,QAAQ,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACjH,sEAAsE;IACtE,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,GAAG,QAAQ,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IACtE,0CAA0C;IAC1C,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACrC;AAED,wDAAwD;AACxD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,MAAM,EAAE,GAAG,CAAA;CACZ"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../lib/backend/types.ts"],"names":[],"mappings":""}