@dxos/lock-file 0.6.13 → 0.6.14-main.2b6a0f3

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.
@@ -0,0 +1,50 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+
3
+ // packages/common/lock-file/src/lock-file.ts
4
+ import { flock } from "fs-ext";
5
+ import { existsSync } from "node:fs";
6
+ import { open, constants } from "node:fs/promises";
7
+ var LockFile = class _LockFile {
8
+ static async acquire(filename) {
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;
21
+ }
22
+ static async release(handle) {
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();
33
+ }
34
+ static async isLocked(filename) {
35
+ if (!existsSync(filename)) {
36
+ return false;
37
+ }
38
+ try {
39
+ const handle = await _LockFile.acquire(filename);
40
+ await _LockFile.release(handle);
41
+ return false;
42
+ } catch (e) {
43
+ return true;
44
+ }
45
+ }
46
+ };
47
+ export {
48
+ LockFile
49
+ };
50
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/lock-file.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { flock } from 'fs-ext';\nimport { existsSync } from 'node:fs';\nimport { open, type FileHandle, constants } from 'node:fs/promises';\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,aAAa;AACtB,SAASC,kBAAkB;AAC3B,SAASC,MAAuBC,iBAAiB;AAE1C,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": ["flock", "existsSync", "open", "constants", "LockFile", "acquire", "filename", "handle", "open", "constants", "O_CREAT", "Promise", "resolve", "reject", "flock", "fd", "err", "close", "release", "isLocked", "existsSync", "e"]
7
+ }
@@ -0,0 +1 @@
1
+ {"inputs":{"packages/common/lock-file/src/lock-file.ts":{"bytes":4499,"imports":[{"path":"fs-ext","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true}],"format":"esm"},"packages/common/lock-file/src/index.ts":{"bytes":498,"imports":[{"path":"packages/common/lock-file/src/lock-file.ts","kind":"import-statement","original":"./lock-file"}],"format":"esm"}},"outputs":{"packages/common/lock-file/dist/lib/node-esm/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":2342},"packages/common/lock-file/dist/lib/node-esm/index.mjs":{"imports":[{"path":"fs-ext","kind":"import-statement","external":true},{"path":"node:fs","kind":"import-statement","external":true},{"path":"node:fs/promises","kind":"import-statement","external":true}],"exports":["LockFile"],"entryPoint":"packages/common/lock-file/src/index.ts","inputs":{"packages/common/lock-file/src/lock-file.ts":{"bytesInOutput":1030},"packages/common/lock-file/src/index.ts":{"bytesInOutput":0}},"bytes":1227}}}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=lock-file.node.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lock-file.node.test.d.ts","sourceRoot":"","sources":["../../../src/lock-file.node.test.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,15 +1,17 @@
1
1
  {
2
2
  "name": "@dxos/lock-file",
3
- "version": "0.6.13",
3
+ "version": "0.6.14-main.2b6a0f3",
4
4
  "description": "Lock file .",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
7
7
  "license": "MIT",
8
8
  "author": "DXOS.org",
9
+ "sideEffects": false,
9
10
  "exports": {
10
11
  ".": {
11
12
  "node": {
12
- "default": "./dist/lib/node/index.cjs"
13
+ "require": "./dist/lib/node/index.cjs",
14
+ "default": "./dist/lib/node-esm/index.mjs"
13
15
  },
14
16
  "types": "./dist/types/src/index.d.ts"
15
17
  }
@@ -24,15 +26,11 @@
24
26
  ],
25
27
  "dependencies": {
26
28
  "fs-ext": "^2.0.0",
27
- "@dxos/node-std": "0.6.13",
28
- "@dxos/async": "0.6.13",
29
- "@dxos/log": "0.6.13"
29
+ "@dxos/async": "0.6.14-main.2b6a0f3",
30
+ "@dxos/node-std": "0.6.14-main.2b6a0f3"
30
31
  },
31
32
  "devDependencies": {
32
- "@types/fs-ext": "^2.0.0",
33
- "@types/node": "^18.11.9",
34
- "ts-node": "10.9.1",
35
- "typescript": "^5.5.4"
33
+ "@types/fs-ext": "^2.0.0"
36
34
  },
37
35
  "publishConfig": {
38
36
  "access": "public"
@@ -2,20 +2,15 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import chai, { expect } from 'chai';
6
- import chaiAsPromised from 'chai-as-promised';
7
5
  import { spawn } from 'node:child_process';
8
6
  import { existsSync, mkdirSync, unlinkSync } from 'node:fs';
9
7
  import { join } from 'node:path';
10
- import waitForExpect from 'wait-for-expect';
8
+ import { beforeAll, describe, expect, onTestFinished, test } from 'vitest';
11
9
 
12
10
  import { Trigger } from '@dxos/async';
13
- import { afterTest, beforeAll, describe, test } from '@dxos/test';
14
11
 
15
12
  import { LockFile } from './lock-file';
16
13
 
17
- chai.use(chaiAsPromised);
18
-
19
14
  const TEST_DIR = '/tmp/dxos/testing/lock-file';
20
15
 
21
16
  describe('LockFile', () => {
@@ -27,7 +22,7 @@ describe('LockFile', () => {
27
22
  const filename = join('/tmp', `lock-${Math.random()}.lock`);
28
23
 
29
24
  const handle = await LockFile.acquire(filename);
30
- await expect(LockFile.acquire(filename)).to.be.rejected;
25
+ await expect(LockFile.acquire(filename)).rejects.toBeInstanceOf(Error);
31
26
  await LockFile.release(handle);
32
27
 
33
28
  const handle2 = await LockFile.acquire(filename);
@@ -36,7 +31,7 @@ describe('LockFile', () => {
36
31
 
37
32
  test('released when process exits', async () => {
38
33
  const filename = join(TEST_DIR, `lock-${Math.random()}.lock`);
39
- afterTest(() => {
34
+ onTestFinished(() => {
40
35
  if (existsSync(filename)) {
41
36
  unlinkSync(filename);
42
37
  }
@@ -58,15 +53,17 @@ describe('LockFile', () => {
58
53
 
59
54
  await trigger.wait({ timeout: 1_000 });
60
55
 
61
- await expect(LockFile.acquire(filename)).to.be.rejected;
56
+ await expect(LockFile.acquire(filename)).rejects.toBeInstanceOf(Error);
62
57
 
63
58
  processHandle.stdin.write('close');
64
59
  processHandle.kill();
65
60
 
66
61
  // Wait for process to be killed
67
- await waitForExpect(async () => {
68
- expect(await LockFile.isLocked(filename)).to.be.false;
69
- });
62
+ await expect
63
+ .poll(async () => {
64
+ return await LockFile.isLocked(filename);
65
+ })
66
+ .toBe(false);
70
67
 
71
68
  const handle = await LockFile.acquire(filename);
72
69
  await LockFile.release(handle);
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=lock-file.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lock-file.test.d.ts","sourceRoot":"","sources":["../../../src/lock-file.test.ts"],"names":[],"mappings":""}