@dxos/lock-file 0.8.4-main.1da679c → 0.8.4-main.1f223c7
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.
- package/dist/lib/node-esm/index.mjs +23 -103
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/lock-file.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -5
- package/src/lock-file.node.test.ts +43 -110
- package/src/lock-file.ts +24 -22
- package/dist/types/src/locker-subprocess.d.ts +0 -2
- package/dist/types/src/locker-subprocess.d.ts.map +0 -1
- package/dist/types/src/sys.d.ts +0 -10
- package/dist/types/src/sys.d.ts.map +0 -1
- package/src/locker-subprocess.ts +0 -22
- package/src/sys.ts +0 -84
|
@@ -3,113 +3,33 @@ import { createRequire } from 'node:module';const require = createRequire(import
|
|
|
3
3
|
// src/lock-file.ts
|
|
4
4
|
import { existsSync } from "node:fs";
|
|
5
5
|
import { constants, open } from "node:fs/promises";
|
|
6
|
-
|
|
7
|
-
// src/sys.ts
|
|
8
|
-
import { platform } from "node:os";
|
|
9
|
-
function _define_property(obj, key, value) {
|
|
10
|
-
if (key in obj) {
|
|
11
|
-
Object.defineProperty(obj, key, {
|
|
12
|
-
value,
|
|
13
|
-
enumerable: true,
|
|
14
|
-
configurable: true,
|
|
15
|
-
writable: true
|
|
16
|
-
});
|
|
17
|
-
} else {
|
|
18
|
-
obj[key] = value;
|
|
19
|
-
}
|
|
20
|
-
return obj;
|
|
21
|
-
}
|
|
22
|
-
var LOCK_SH = 1;
|
|
23
|
-
var LOCK_EX = 2;
|
|
24
|
-
var LOCK_NB = 4;
|
|
25
|
-
var LOCK_UN = 8;
|
|
26
|
-
var LockfileSys = class {
|
|
27
|
-
async init() {
|
|
28
|
-
await (this._init ?? (this._init = this._runInit()));
|
|
29
|
-
}
|
|
30
|
-
async _runInit() {
|
|
31
|
-
this._koffi = await import("koffi");
|
|
32
|
-
switch (platform()) {
|
|
33
|
-
case "darwin":
|
|
34
|
-
this._libc = this._koffi.load("libc.dylib");
|
|
35
|
-
break;
|
|
36
|
-
case "linux":
|
|
37
|
-
this._libc = this._koffi.load("libc.so.6");
|
|
38
|
-
break;
|
|
39
|
-
default:
|
|
40
|
-
throw new Error(`Unsupported platform: ${platform()}`);
|
|
41
|
-
}
|
|
42
|
-
this._flockNative = this._libc.func("flock", "int", [
|
|
43
|
-
"int",
|
|
44
|
-
"int"
|
|
45
|
-
]);
|
|
46
|
-
}
|
|
47
|
-
flock(fd, operation) {
|
|
48
|
-
if (!this._flockNative) {
|
|
49
|
-
throw new Error("flock not initialized");
|
|
50
|
-
}
|
|
51
|
-
let op = 0;
|
|
52
|
-
switch (operation) {
|
|
53
|
-
case "ex":
|
|
54
|
-
op = LOCK_EX;
|
|
55
|
-
break;
|
|
56
|
-
case "exnb":
|
|
57
|
-
op = LOCK_EX | LOCK_NB;
|
|
58
|
-
break;
|
|
59
|
-
case "sh":
|
|
60
|
-
op = LOCK_SH;
|
|
61
|
-
break;
|
|
62
|
-
case "shnb":
|
|
63
|
-
op = LOCK_SH | LOCK_NB;
|
|
64
|
-
break;
|
|
65
|
-
case "un":
|
|
66
|
-
op = LOCK_UN;
|
|
67
|
-
break;
|
|
68
|
-
default:
|
|
69
|
-
throw new Error(`Invalid flock operation: ${operation}`);
|
|
70
|
-
}
|
|
71
|
-
const result = this._flockNative(fd, op);
|
|
72
|
-
if (result !== 0) {
|
|
73
|
-
const errno = this._koffi.errno();
|
|
74
|
-
const errorMessages = {
|
|
75
|
-
11: "Resource temporarily unavailable (EAGAIN/EWOULDBLOCK)",
|
|
76
|
-
13: "Permission denied (EACCES)",
|
|
77
|
-
22: "Invalid argument (EINVAL)",
|
|
78
|
-
9: "Bad file descriptor (EBADF)",
|
|
79
|
-
35: "Resource temporarily unavailable (EAGAIN on macOS)"
|
|
80
|
-
};
|
|
81
|
-
const errorMessage = errorMessages[errno] || `Unknown error (errno: ${errno})`;
|
|
82
|
-
throw new Error(`flock failed: ${errorMessage}`);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
constructor() {
|
|
86
|
-
_define_property(this, "_init", null);
|
|
87
|
-
_define_property(this, "_koffi", null);
|
|
88
|
-
_define_property(this, "_libc", null);
|
|
89
|
-
_define_property(this, "_flockNative", null);
|
|
90
|
-
}
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
// src/lock-file.ts
|
|
94
|
-
var sys = new LockfileSys();
|
|
6
|
+
import { flock } from "fs-ext";
|
|
95
7
|
var LockFile = class _LockFile {
|
|
96
8
|
static async acquire(filename) {
|
|
97
|
-
await
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
9
|
+
const handle = await open(filename, constants.O_CREAT);
|
|
10
|
+
await new Promise((resolve, reject) => {
|
|
11
|
+
flock(handle.fd, "exnb", async (err) => {
|
|
12
|
+
if (err) {
|
|
13
|
+
reject(err);
|
|
14
|
+
await handle.close();
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
resolve();
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
return handle;
|
|
106
21
|
}
|
|
107
22
|
static async release(handle) {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
23
|
+
await new Promise((resolve, reject) => {
|
|
24
|
+
flock(handle.fd, "un", (err) => {
|
|
25
|
+
if (err) {
|
|
26
|
+
reject(err);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
resolve();
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
await handle.close();
|
|
113
33
|
}
|
|
114
34
|
static async isLocked(filename) {
|
|
115
35
|
if (!existsSync(filename)) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../src/lock-file.ts"
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { existsSync } from 'node:fs';\nimport { type FileHandle, constants, open } from 'node:fs/promises';\n\nimport {
|
|
5
|
-
"mappings": ";;;AAIA,SAASA,kBAAkB;AAC3B,SAA0BC,WAAWC,YAAY
|
|
6
|
-
"names": ["existsSync", "constants", "open", "
|
|
3
|
+
"sources": ["../../../src/lock-file.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { existsSync } from 'node:fs';\nimport { type FileHandle, constants, open } from 'node:fs/promises';\n\nimport { flock } from 'fs-ext';\n\nexport class LockFile {\n static async acquire(filename: string): Promise<FileHandle> {\n const handle = await open(filename, constants.O_CREAT);\n await new Promise<void>((resolve, reject) => {\n flock(handle.fd, 'exnb', async (err) => {\n if (err) {\n reject(err);\n await handle.close();\n return;\n }\n resolve();\n });\n });\n return handle;\n }\n\n static async release(handle: FileHandle): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n flock(handle.fd, 'un', (err) => {\n if (err) {\n reject(err);\n return;\n }\n resolve();\n });\n });\n await handle.close();\n }\n\n static async isLocked(filename: string): Promise<boolean> {\n if (!existsSync(filename)) {\n return false;\n }\n try {\n const handle = await LockFile.acquire(filename);\n await LockFile.release(handle);\n\n return false;\n } catch (e) {\n return true;\n }\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;AAIA,SAASA,kBAAkB;AAC3B,SAA0BC,WAAWC,YAAY;AAEjD,SAASC,aAAa;AAEf,IAAMC,WAAN,MAAMA,UAAAA;EACX,aAAaC,QAAQC,UAAuC;AAC1D,UAAMC,SAAS,MAAMC,KAAKF,UAAUG,UAAUC,OAAO;AACrD,UAAM,IAAIC,QAAc,CAACC,SAASC,WAAAA;AAChCC,YAAMP,OAAOQ,IAAI,QAAQ,OAAOC,QAAAA;AAC9B,YAAIA,KAAK;AACPH,iBAAOG,GAAAA;AACP,gBAAMT,OAAOU,MAAK;AAClB;QACF;AACAL,gBAAAA;MACF,CAAA;IACF,CAAA;AACA,WAAOL;EACT;EAEA,aAAaW,QAAQX,QAAmC;AACtD,UAAM,IAAII,QAAc,CAACC,SAASC,WAAAA;AAChCC,YAAMP,OAAOQ,IAAI,MAAM,CAACC,QAAAA;AACtB,YAAIA,KAAK;AACPH,iBAAOG,GAAAA;AACP;QACF;AACAJ,gBAAAA;MACF,CAAA;IACF,CAAA;AACA,UAAML,OAAOU,MAAK;EACpB;EAEA,aAAaE,SAASb,UAAoC;AACxD,QAAI,CAACc,WAAWd,QAAAA,GAAW;AACzB,aAAO;IACT;AACA,QAAI;AACF,YAAMC,SAAS,MAAMH,UAASC,QAAQC,QAAAA;AACtC,YAAMF,UAASc,QAAQX,MAAAA;AAEvB,aAAO;IACT,SAASc,GAAG;AACV,aAAO;IACT;EACF;AACF;",
|
|
6
|
+
"names": ["existsSync", "constants", "open", "flock", "LockFile", "acquire", "filename", "handle", "open", "constants", "O_CREAT", "Promise", "resolve", "reject", "flock", "fd", "err", "close", "release", "isLocked", "existsSync", "e"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"src/
|
|
1
|
+
{"inputs":{"src/lock-file.ts":{"bytes":4402,"imports":[{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"fs-ext","kind":"import-statement","external":true}],"format":"esm"},"src/index.ts":{"bytes":457,"imports":[{"path":"src/lock-file.ts","kind":"import-statement","original":"./lock-file"}],"format":"esm"}},"outputs":{"dist/lib/node-esm/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":2341},"dist/lib/node-esm/index.mjs":{"imports":[{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true},{"path":"fs-ext","kind":"import-statement","external":true}],"exports":["LockFile"],"entryPoint":"src/index.ts","inputs":{"src/lock-file.ts":{"bytesInOutput":1030},"src/index.ts":{"bytesInOutput":0}},"bytes":1201}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lock-file.d.ts","sourceRoot":"","sources":["../../../src/lock-file.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,UAAU,EAAmB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"lock-file.d.ts","sourceRoot":"","sources":["../../../src/lock-file.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,UAAU,EAAmB,MAAM,kBAAkB,CAAC;AAIpE,qBAAa,QAAQ;WACN,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;WAe9C,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;WAa1C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAa1D"}
|