@zukhruf/mutex 0.1.0 → 0.3.0
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/README.md +4 -2
- package/dist/fencing/file-token-source.js +2 -2
- package/dist/fencing/file-token-source.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/leader-election/index.d.ts +1 -0
- package/dist/leader-election/index.d.ts.map +1 -1
- package/dist/leader-election/index.js +1 -0
- package/dist/leader-election/index.js.map +1 -1
- package/dist/leader-election/leader-election.d.ts.map +1 -1
- package/dist/leader-election/leader-election.js +4 -2
- package/dist/leader-election/leader-election.js.map +1 -1
- package/dist/local-directory/local-directory.d.ts +7 -0
- package/dist/local-directory/local-directory.d.ts.map +1 -0
- package/dist/local-directory/local-directory.js +75 -0
- package/dist/local-directory/local-directory.js.map +1 -0
- package/dist/local-directory/network-directory-error.d.ts +8 -0
- package/dist/local-directory/network-directory-error.d.ts.map +1 -0
- package/dist/local-directory/network-directory-error.js +13 -0
- package/dist/local-directory/network-directory-error.js.map +1 -0
- package/dist/lock-stores/file-system/file-lock-store.d.ts.map +1 -1
- package/dist/lock-stores/file-system/file-lock-store.js +4 -1
- package/dist/lock-stores/file-system/file-lock-store.js.map +1 -1
- package/dist/lock-stores/file-system/lock-file-store.d.ts.map +1 -1
- package/dist/lock-stores/file-system/lock-file-store.js +9 -4
- package/dist/lock-stores/file-system/lock-file-store.js.map +1 -1
- package/dist/lock-stores/file-system/ticket-queue-file-store.d.ts.map +1 -1
- package/dist/lock-stores/file-system/ticket-queue-file-store.js +3 -2
- package/dist/lock-stores/file-system/ticket-queue-file-store.js.map +1 -1
- package/dist/lock-stores/ipc/child-process-connection.d.ts +3 -3
- package/dist/lock-stores/ipc/child-process-connection.d.ts.map +1 -1
- package/dist/lock-stores/ipc/child-process-connection.js +16 -20
- package/dist/lock-stores/ipc/child-process-connection.js.map +1 -1
- package/dist/lock-stores/ipc/ipc-store.d.ts.map +1 -1
- package/dist/lock-stores/ipc/ipc-store.js +7 -5
- package/dist/lock-stores/ipc/ipc-store.js.map +1 -1
- package/dist/lock-stores/ipc/process-channel-connection.d.ts +4 -3
- package/dist/lock-stores/ipc/process-channel-connection.d.ts.map +1 -1
- package/dist/lock-stores/ipc/process-channel-connection.js +6 -14
- package/dist/lock-stores/ipc/process-channel-connection.js.map +1 -1
- package/dist/lock-stores/memory/memory-store.d.ts +1 -1
- package/dist/lock-stores/memory/memory-store.d.ts.map +1 -1
- package/dist/lock-stores/memory/memory-store.js +13 -14
- package/dist/lock-stores/memory/memory-store.js.map +1 -1
- package/dist/lock-stores/remote/connection-supervisor.d.ts +39 -0
- package/dist/lock-stores/remote/connection-supervisor.d.ts.map +1 -0
- package/dist/lock-stores/remote/connection-supervisor.js +195 -0
- package/dist/lock-stores/remote/connection-supervisor.js.map +1 -0
- package/dist/lock-stores/remote/connection.d.ts +11 -7
- package/dist/lock-stores/remote/connection.d.ts.map +1 -1
- package/dist/lock-stores/remote/connector.d.ts +5 -2
- package/dist/lock-stores/remote/connector.d.ts.map +1 -1
- package/dist/lock-stores/remote/lock-coordinator.d.ts +2 -2
- package/dist/lock-stores/remote/lock-coordinator.d.ts.map +1 -1
- package/dist/lock-stores/remote/lock-coordinator.js +140 -69
- package/dist/lock-stores/remote/lock-coordinator.js.map +1 -1
- package/dist/lock-stores/remote/remote-lock-client.d.ts +8 -7
- package/dist/lock-stores/remote/remote-lock-client.d.ts.map +1 -1
- package/dist/lock-stores/remote/remote-lock-client.js +99 -99
- package/dist/lock-stores/remote/remote-lock-client.js.map +1 -1
- package/dist/lock-stores/socket/electing-connector.d.ts +7 -4
- package/dist/lock-stores/socket/electing-connector.d.ts.map +1 -1
- package/dist/lock-stores/socket/electing-connector.js +35 -8
- package/dist/lock-stores/socket/electing-connector.js.map +1 -1
- package/dist/lock-stores/socket/local-directory-connector.d.ts +14 -0
- package/dist/lock-stores/socket/local-directory-connector.d.ts.map +1 -0
- package/dist/lock-stores/socket/local-directory-connector.js +23 -0
- package/dist/lock-stores/socket/local-directory-connector.js.map +1 -0
- package/dist/lock-stores/socket/socket-connection.d.ts +3 -3
- package/dist/lock-stores/socket/socket-connection.d.ts.map +1 -1
- package/dist/lock-stores/socket/socket-connection.js +16 -18
- package/dist/lock-stores/socket/socket-connection.js.map +1 -1
- package/dist/lock-stores/socket/socket-store.d.ts +1 -2
- package/dist/lock-stores/socket/socket-store.d.ts.map +1 -1
- package/dist/lock-stores/socket/socket-store.js +16 -23
- package/dist/lock-stores/socket/socket-store.js.map +1 -1
- package/dist/lock-stores/thread/parent-port-connection.d.ts +4 -3
- package/dist/lock-stores/thread/parent-port-connection.d.ts.map +1 -1
- package/dist/lock-stores/thread/parent-port-connection.js +6 -13
- package/dist/lock-stores/thread/parent-port-connection.js.map +1 -1
- package/dist/lock-stores/thread/thread-store.d.ts.map +1 -1
- package/dist/lock-stores/thread/thread-store.js +5 -8
- package/dist/lock-stores/thread/thread-store.js.map +1 -1
- package/dist/lock-stores/thread/worker-connection.d.ts +3 -3
- package/dist/lock-stores/thread/worker-connection.d.ts.map +1 -1
- package/dist/lock-stores/thread/worker-connection.js +19 -23
- package/dist/lock-stores/thread/worker-connection.js.map +1 -1
- package/dist/mutex/acquire-mode.d.ts +6 -3
- package/dist/mutex/acquire-mode.d.ts.map +1 -1
- package/dist/mutex/acquire-modes/skip-if-busy-mode.d.ts +7 -3
- package/dist/mutex/acquire-modes/skip-if-busy-mode.d.ts.map +1 -1
- package/dist/mutex/acquire-modes/skip-if-busy-mode.js +7 -4
- package/dist/mutex/acquire-modes/skip-if-busy-mode.js.map +1 -1
- package/dist/mutex/acquire-modes/wait-mode.d.ts +2 -2
- package/dist/mutex/acquire-modes/wait-mode.d.ts.map +1 -1
- package/dist/mutex/acquire-modes/wait-mode.js +2 -2
- package/dist/mutex/acquire-modes/wait-mode.js.map +1 -1
- package/dist/mutex/key.d.ts +3 -2
- package/dist/mutex/key.d.ts.map +1 -1
- package/dist/mutex/key.js +3 -3
- package/dist/mutex/key.js.map +1 -1
- package/dist/mutex/mutex.d.ts +3 -3
- package/dist/mutex/mutex.d.ts.map +1 -1
- package/dist/mutex/mutex.js +28 -5
- package/dist/mutex/mutex.js.map +1 -1
- package/dist/shared/fs/atomic-write.d.ts.map +1 -1
- package/dist/shared/fs/atomic-write.js +3 -27
- package/dist/shared/fs/atomic-write.js.map +1 -1
- package/dist/shared/fs/create-exclusive.d.ts.map +1 -1
- package/dist/shared/fs/create-exclusive.js +7 -2
- package/dist/shared/fs/create-exclusive.js.map +1 -1
- package/dist/shared/fs/durable-write.d.ts +7 -0
- package/dist/shared/fs/durable-write.d.ts.map +1 -0
- package/dist/shared/fs/durable-write.js +46 -0
- package/dist/shared/fs/durable-write.js.map +1 -0
- package/dist/shared/fs/patiently.d.ts +3 -0
- package/dist/shared/fs/patiently.d.ts.map +1 -0
- package/dist/shared/fs/patiently.js +30 -0
- package/dist/shared/fs/patiently.js.map +1 -0
- package/dist/shared/fs/replace-file.d.ts +8 -0
- package/dist/shared/fs/replace-file.d.ts.map +1 -0
- package/dist/shared/fs/replace-file.js +12 -0
- package/dist/shared/fs/replace-file.js.map +1 -0
- package/dist/shared/latch.d.ts +10 -0
- package/dist/shared/latch.d.ts.map +1 -0
- package/dist/shared/latch.js +14 -0
- package/dist/shared/latch.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-lock-client.js","sourceRoot":"","sources":["../../../src/lock-stores/remote/remote-lock-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAE9D,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"remote-lock-client.js","sourceRoot":"","sources":["../../../src/lock-stores/remote/remote-lock-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +1,24 @@
|
|
|
1
1
|
import type { LeaderElection } from '../../leader-election/leader-election.ts';
|
|
2
2
|
import type { Leadership } from '../../leader-election/leadership.ts';
|
|
3
|
-
import type { ClientConnection,
|
|
3
|
+
import type { ClientConnection, ClientConnector } from '../remote/connector.ts';
|
|
4
4
|
export interface ElectingConnectorOptions {
|
|
5
5
|
socketPath: string;
|
|
6
|
-
election
|
|
6
|
+
/** The connector only campaigns, so it needs only that part of an election. */
|
|
7
|
+
election: Pick<LeaderElection, 'campaign'>;
|
|
7
8
|
pollInterval: number;
|
|
8
9
|
/** Starts serving for a term this process just won. */
|
|
9
10
|
serve(leadership: Leadership): Promise<void>;
|
|
11
|
+
/** Reached the server of another process, so this process follows it. */
|
|
10
12
|
connected(): void;
|
|
11
13
|
}
|
|
12
14
|
/**
|
|
13
15
|
* Reaches the leader's socket, and when nobody serves it, campaigns to become
|
|
14
16
|
* the leader. Never gives up: a lost leader is always replaced by a candidate.
|
|
17
|
+
* An aborted connect never starts serving: a term won after the abort is resigned.
|
|
15
18
|
*/
|
|
16
|
-
export declare class ElectingConnector implements
|
|
19
|
+
export declare class ElectingConnector implements ClientConnector {
|
|
17
20
|
#private;
|
|
18
21
|
constructor(options: ElectingConnectorOptions);
|
|
19
|
-
connect(): Promise<ClientConnection>;
|
|
22
|
+
connect(signal: AbortSignal): Promise<ClientConnection>;
|
|
20
23
|
}
|
|
21
24
|
//# sourceMappingURL=electing-connector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"electing-connector.d.ts","sourceRoot":"","sources":["../../../src/lock-stores/socket/electing-connector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAC/E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"electing-connector.d.ts","sourceRoot":"","sources":["../../../src/lock-stores/socket/electing-connector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAC/E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAQhF,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,uDAAuD;IACvD,KAAK,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,yEAAyE;IACzE,SAAS,IAAI,IAAI,CAAC;CACnB;AAED;;;;GAIG;AACH,qBAAa,iBAAkB,YAAW,eAAe;;gBAG3C,OAAO,EAAE,wBAAwB;IAIvC,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAoC9D"}
|
|
@@ -5,28 +5,55 @@ import { SocketConnection } from "./socket-connection.js";
|
|
|
5
5
|
/**
|
|
6
6
|
* Reaches the leader's socket, and when nobody serves it, campaigns to become
|
|
7
7
|
* the leader. Never gives up: a lost leader is always replaced by a candidate.
|
|
8
|
+
* An aborted connect never starts serving: a term won after the abort is resigned.
|
|
8
9
|
*/
|
|
9
10
|
export class ElectingConnector {
|
|
10
11
|
#options;
|
|
11
12
|
constructor(options) {
|
|
12
13
|
this.#options = options;
|
|
13
14
|
}
|
|
14
|
-
async connect() {
|
|
15
|
+
async connect(signal) {
|
|
15
16
|
const { socketPath, election, pollInterval, serve, connected } = this.#options;
|
|
16
17
|
for (;;) {
|
|
17
|
-
const
|
|
18
|
-
if (
|
|
18
|
+
const leader = await reachUnlessAborted(socketPath, signal);
|
|
19
|
+
if (leader) {
|
|
19
20
|
connected();
|
|
20
|
-
return new SocketConnection(
|
|
21
|
+
return new SocketConnection(leader, isLockResponse);
|
|
21
22
|
}
|
|
22
23
|
const leadership = await election.campaign({ timeout: pollInterval });
|
|
23
|
-
if (
|
|
24
|
-
await
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
if (signal.aborted)
|
|
25
|
+
await leadership?.resign();
|
|
26
|
+
signal.throwIfAborted();
|
|
27
|
+
if (leadership) {
|
|
28
|
+
try {
|
|
29
|
+
await serve(leadership);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
// A term that nothing serves would stop every other candidate from leading.
|
|
33
|
+
await leadership.resign();
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
// This process leads now, so it reaches its own server without following anyone.
|
|
37
|
+
const own = await reachUnlessAborted(socketPath, signal);
|
|
38
|
+
if (own) {
|
|
39
|
+
return new SocketConnection(own, isLockResponse);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
await delay(pollInterval, undefined, { signal });
|
|
44
|
+
}
|
|
27
45
|
}
|
|
28
46
|
}
|
|
29
47
|
}
|
|
48
|
+
/** Like `reach`, but a socket reached after `signal` aborted is destroyed, not returned. */
|
|
49
|
+
async function reachUnlessAborted(socketPath, signal) {
|
|
50
|
+
signal.throwIfAborted();
|
|
51
|
+
const socket = await reach(socketPath);
|
|
52
|
+
if (signal.aborted)
|
|
53
|
+
socket?.destroy();
|
|
54
|
+
signal.throwIfAborted();
|
|
55
|
+
return socket;
|
|
56
|
+
}
|
|
30
57
|
/** Resolves `undefined` when nothing listens yet (no file, or a dead leader's file). */
|
|
31
58
|
function reach(socketPath) {
|
|
32
59
|
return new Promise((resolve) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"electing-connector.js","sourceRoot":"","sources":["../../../src/lock-stores/socket/electing-connector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,OAAO,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAK3D,OAAO,EAGL,cAAc,GACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"electing-connector.js","sourceRoot":"","sources":["../../../src/lock-stores/socket/electing-connector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,OAAO,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAK3D,OAAO,EAGL,cAAc,GACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAa1D;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IACnB,QAAQ,CAA2B;IAE5C,YAAY,OAAiC;QAC3C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAmB;QAC/B,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,GAC5D,IAAI,CAAC,QAAQ,CAAC;QAChB,SAAS,CAAC;YACR,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAC5D,IAAI,MAAM,EAAE,CAAC;gBACX,SAAS,EAAE,CAAC;gBACZ,OAAO,IAAI,gBAAgB,CACzB,MAAM,EACN,cAAc,CACf,CAAC;YACJ,CAAC;YACD,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;YACtE,IAAI,MAAM,CAAC,OAAO;gBAAE,MAAM,UAAU,EAAE,MAAM,EAAE,CAAC;YAC/C,MAAM,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,UAAU,EAAE,CAAC;gBACf,IAAI,CAAC;oBACH,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;gBAC1B,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,4EAA4E;oBAC5E,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC;oBAC1B,MAAM,KAAK,CAAC;gBACd,CAAC;gBACD,iFAAiF;gBACjF,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;gBACzD,IAAI,GAAG,EAAE,CAAC;oBACR,OAAO,IAAI,gBAAgB,CACzB,GAAG,EACH,cAAc,CACf,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,CAAC,YAAY,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,4FAA4F;AAC5F,KAAK,UAAU,kBAAkB,CAC/B,UAAkB,EAClB,MAAmB;IAEnB,MAAM,CAAC,cAAc,EAAE,CAAC;IACxB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;IACvC,IAAI,MAAM,CAAC,OAAO;QAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACtC,MAAM,CAAC,cAAc,EAAE,CAAC;IACxB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,wFAAwF;AACxF,SAAS,KAAK,CAAC,UAAkB;IAC/B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,SAAS,CAAC,CAAC;QACrB,CAAC,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;YAC1B,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC1B,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ClientConnection, ClientConnector } from '../remote/connector.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Refuses a lock directory on a network file system before the first
|
|
4
|
+
* connection exists. Every connect asks, but a directory that passed once is
|
|
5
|
+
* remembered, so a failover never fails here and never costs a held key.
|
|
6
|
+
* Requests keep their call order, because the client queues them before it
|
|
7
|
+
* connects.
|
|
8
|
+
*/
|
|
9
|
+
export declare class LocalDirectoryConnector implements ClientConnector {
|
|
10
|
+
#private;
|
|
11
|
+
constructor(directory: string, connector: ClientConnector);
|
|
12
|
+
connect(signal: AbortSignal): Promise<ClientConnection | undefined>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=local-directory-connector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-directory-connector.d.ts","sourceRoot":"","sources":["../../../src/lock-stores/socket/local-directory-connector.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEhF;;;;;;GAMG;AACH,qBAAa,uBAAwB,YAAW,eAAe;;gBAIjD,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe;IAKnD,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;CAM1E"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { assertLocalDirectory } from "../../local-directory/local-directory.js";
|
|
2
|
+
/**
|
|
3
|
+
* Refuses a lock directory on a network file system before the first
|
|
4
|
+
* connection exists. Every connect asks, but a directory that passed once is
|
|
5
|
+
* remembered, so a failover never fails here and never costs a held key.
|
|
6
|
+
* Requests keep their call order, because the client queues them before it
|
|
7
|
+
* connects.
|
|
8
|
+
*/
|
|
9
|
+
export class LocalDirectoryConnector {
|
|
10
|
+
#directory;
|
|
11
|
+
#connector;
|
|
12
|
+
constructor(directory, connector) {
|
|
13
|
+
this.#directory = directory;
|
|
14
|
+
this.#connector = connector;
|
|
15
|
+
}
|
|
16
|
+
async connect(signal) {
|
|
17
|
+
signal.throwIfAborted();
|
|
18
|
+
await assertLocalDirectory(this.#directory);
|
|
19
|
+
signal.throwIfAborted();
|
|
20
|
+
return this.#connector.connect(signal);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=local-directory-connector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-directory-connector.js","sourceRoot":"","sources":["../../../src/lock-stores/socket/local-directory-connector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,0CAA0C,CAAC;AAGhF;;;;;;GAMG;AACH,MAAM,OAAO,uBAAuB;IACzB,UAAU,CAAS;IACnB,UAAU,CAAkB;IAErC,YAAY,SAAiB,EAAE,SAA0B;QACvD,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAmB;QAC/B,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,MAAM,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;CACF"}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
1
2
|
import type { Socket } from 'node:net';
|
|
2
|
-
import type { Connection,
|
|
3
|
+
import type { Connection, ConnectionEvents } from '../remote/connection.ts';
|
|
3
4
|
/**
|
|
4
5
|
* Newline-delimited JSON over a stream socket. A stream has no message
|
|
5
6
|
* boundaries (writes arrive merged and split), and JSON escapes newlines inside
|
|
6
7
|
* strings, so one line is always one message. `isIncoming` checks each message
|
|
7
8
|
* from the peer; a line that is not one closes the connection.
|
|
8
9
|
*/
|
|
9
|
-
export declare class SocketConnection<Outgoing, Incoming> implements Connection<Outgoing, Incoming> {
|
|
10
|
+
export declare class SocketConnection<Outgoing, Incoming> extends EventEmitter<ConnectionEvents<Incoming>> implements Connection<Outgoing, Incoming> {
|
|
10
11
|
#private;
|
|
11
12
|
constructor(socket: Socket, isIncoming: (message: unknown) => message is Incoming);
|
|
12
13
|
send(message: Outgoing): Promise<void>;
|
|
13
|
-
listen({ message, close }: ConnectionHandlers<Incoming>): void;
|
|
14
14
|
ref(): void;
|
|
15
15
|
unref(): void;
|
|
16
16
|
close(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket-connection.d.ts","sourceRoot":"","sources":["../../../src/lock-stores/socket/socket-connection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGvC,OAAO,KAAK,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"socket-connection.d.ts","sourceRoot":"","sources":["../../../src/lock-stores/socket/socket-connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGvC,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE5E;;;;;GAKG;AACH,qBAAa,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAC9C,SAAQ,YAAY,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAC/C,YAAW,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC;;gBAKvC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,IAAI,QAAQ;IAqBvD,IAAI,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAYtC,GAAG;IAIH,KAAK;IAIL,KAAK;CAGN"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
1
2
|
import { createInterface } from 'node:readline';
|
|
2
3
|
/**
|
|
3
4
|
* Newline-delimited JSON over a stream socket. A stream has no message
|
|
@@ -5,31 +6,19 @@ import { createInterface } from 'node:readline';
|
|
|
5
6
|
* strings, so one line is always one message. `isIncoming` checks each message
|
|
6
7
|
* from the peer; a line that is not one closes the connection.
|
|
7
8
|
*/
|
|
8
|
-
export class SocketConnection {
|
|
9
|
+
export class SocketConnection extends EventEmitter {
|
|
9
10
|
#socket;
|
|
10
|
-
#isIncoming;
|
|
11
11
|
constructor(socket, isIncoming) {
|
|
12
|
+
super();
|
|
12
13
|
this.#socket = socket;
|
|
13
|
-
this.#isIncoming = isIncoming;
|
|
14
14
|
// Every error is followed by `close`, which is where the peer's loss is handled.
|
|
15
15
|
socket.on('error', () => { });
|
|
16
|
-
|
|
17
|
-
send(message) {
|
|
18
|
-
return new Promise((resolve, reject) => {
|
|
19
|
-
if (!this.#socket.writable) {
|
|
20
|
-
reject(new Error('The socket is closed.'));
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
this.#socket.write(`${JSON.stringify(message)}\n`, (error) => error ? reject(error) : resolve());
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
listen({ message, close }) {
|
|
27
|
-
createInterface({ input: this.#socket, crlfDelay: Infinity })
|
|
16
|
+
createInterface({ input: socket, crlfDelay: Infinity })
|
|
28
17
|
.on('line', (line) => {
|
|
29
18
|
try {
|
|
30
19
|
const parsed = JSON.parse(line);
|
|
31
|
-
if (
|
|
32
|
-
message
|
|
20
|
+
if (isIncoming(parsed))
|
|
21
|
+
this.emit('message', parsed);
|
|
33
22
|
else
|
|
34
23
|
this.close();
|
|
35
24
|
}
|
|
@@ -39,7 +28,16 @@ export class SocketConnection {
|
|
|
39
28
|
})
|
|
40
29
|
// readline re-emits socket errors (e.g. EPIPE when the peer died); `close` reports the loss.
|
|
41
30
|
.on('error', () => { });
|
|
42
|
-
|
|
31
|
+
socket.once('close', () => this.emit('close'));
|
|
32
|
+
}
|
|
33
|
+
send(message) {
|
|
34
|
+
return new Promise((resolve, reject) => {
|
|
35
|
+
if (!this.#socket.writable) {
|
|
36
|
+
reject(new Error('The socket is closed.'));
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
this.#socket.write(`${JSON.stringify(message)}\n`, (error) => error ? reject(error) : resolve());
|
|
40
|
+
});
|
|
43
41
|
}
|
|
44
42
|
ref() {
|
|
45
43
|
this.#socket.ref();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket-connection.js","sourceRoot":"","sources":["../../../src/lock-stores/socket/socket-connection.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"socket-connection.js","sourceRoot":"","sources":["../../../src/lock-stores/socket/socket-connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAIhD;;;;;GAKG;AACH,MAAM,OAAO,gBACX,SAAQ,YAAwC;IAGvC,OAAO,CAAS;IAEzB,YACE,MAAc,EACd,UAAqD;QAErD,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,iFAAiF;QACjF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC7B,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;aACpD,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACnB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACzC,IAAI,UAAU,CAAC,MAAM,CAAC;oBAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;;oBAChD,IAAI,CAAC,KAAK,EAAE,CAAC;YACpB,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,CAAC;QACH,CAAC,CAAC;YACF,6FAA6F;aAC5F,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,CAAC,OAAiB;QACpB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAC3B,MAAM,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;gBAC3C,OAAO;YACT,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAC3D,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAClC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,GAAG;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IACzB,CAAC;CACF"}
|
|
@@ -26,10 +26,9 @@ export declare class SocketStore extends EventEmitter<{
|
|
|
26
26
|
}> implements LockStore, AsyncDisposable {
|
|
27
27
|
#private;
|
|
28
28
|
constructor(directory: string, { pollInterval, graceWindow }?: SocketStoreOptions);
|
|
29
|
-
/** Whether this process serves the locks, or `undefined` before it first needed one. */
|
|
30
|
-
get role(): SocketRole | undefined;
|
|
31
29
|
acquire(key: string, options?: AcquireOptions): Promise<Lease>;
|
|
32
30
|
tryAcquire(key: string): Promise<Lease | undefined>;
|
|
31
|
+
/** Stops a campaign still in progress first, so no lock server starts after disposal. */
|
|
33
32
|
[Symbol.asyncDispose](): Promise<void>;
|
|
34
33
|
}
|
|
35
34
|
//# sourceMappingURL=socket-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket-store.d.ts","sourceRoot":"","sources":["../../../src/lock-stores/socket/socket-store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"socket-store.d.ts","sourceRoot":"","sources":["../../../src/lock-stores/socket/socket-store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAU3E,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE/C,MAAM,WAAW,kBAAkB;IACjC,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,qBAAa,WACX,SAAQ,YAAY,CAAC;IAAE,IAAI,EAAE,CAAC,UAAU,CAAC,CAAA;CAAE,CAC3C,YAAW,SAAS,EAAE,eAAe;;gBAOnC,SAAS,EAAE,MAAM,EACjB,EAAE,YAAiB,EAAE,WAAiB,EAAE,GAAE,kBAAuB;IAgCnE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC;IAI9D,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;IAInD,yFAAyF;IACnF,CAAC,MAAM,CAAC,YAAY,CAAC;CAI5B"}
|
|
@@ -2,8 +2,10 @@ import { createHash } from 'node:crypto';
|
|
|
2
2
|
import { EventEmitter } from 'node:events';
|
|
3
3
|
import { join, resolve } from 'node:path';
|
|
4
4
|
import { LeaderElection } from "../../leader-election/leader-election.js";
|
|
5
|
+
import { ConnectionSupervisor } from "../remote/connection-supervisor.js";
|
|
5
6
|
import { RemoteLockClient } from "../remote/remote-lock-client.js";
|
|
6
7
|
import { ElectingConnector } from "./electing-connector.js";
|
|
8
|
+
import { LocalDirectoryConnector } from "./local-directory-connector.js";
|
|
7
9
|
import { LockServer } from "./lock-server.js";
|
|
8
10
|
/** macOS allows 104 bytes including the terminating NUL; Linux allows 108. */
|
|
9
11
|
const SOCKET_PATH_LIMIT = 103;
|
|
@@ -19,31 +21,27 @@ const SOCKET_PATH_LIMIT = 103;
|
|
|
19
21
|
*/
|
|
20
22
|
export class SocketStore extends EventEmitter {
|
|
21
23
|
#client;
|
|
22
|
-
|
|
23
|
-
#
|
|
24
|
+
/** The lock servers this process started; disposing the store closes them. */
|
|
25
|
+
#servers = new AsyncDisposableStack();
|
|
24
26
|
constructor(directory, { pollInterval = 10, graceWindow = 500 } = {}) {
|
|
25
27
|
super();
|
|
26
28
|
const socketPath = socketPathFor(directory);
|
|
27
|
-
this.#client = new RemoteLockClient(new ElectingConnector({
|
|
29
|
+
this.#client = new RemoteLockClient(new ConnectionSupervisor(new LocalDirectoryConnector(directory, new ElectingConnector({
|
|
28
30
|
socketPath,
|
|
29
31
|
election: new LeaderElection(directory, { pollInterval }),
|
|
30
32
|
pollInterval,
|
|
31
33
|
serve: async (leadership) => {
|
|
32
|
-
|
|
34
|
+
// Until serving has fully started, a failure closes the new server, so no server outlives its term.
|
|
35
|
+
await using starting = new AsyncDisposableStack();
|
|
36
|
+
starting.adopt(await LockServer.start(socketPath, leadership, {
|
|
33
37
|
// The first term of a directory has no predecessor to wait for.
|
|
34
38
|
graceWindow: leadership.epoch > 1n ? graceWindow : 0,
|
|
35
|
-
});
|
|
36
|
-
this
|
|
39
|
+
}), (started) => started.close());
|
|
40
|
+
this.emit('role', 'leader');
|
|
41
|
+
this.#servers.use(starting.move());
|
|
37
42
|
},
|
|
38
|
-
connected: () =>
|
|
39
|
-
|
|
40
|
-
this.#setRole('follower');
|
|
41
|
-
},
|
|
42
|
-
}));
|
|
43
|
-
}
|
|
44
|
-
/** Whether this process serves the locks, or `undefined` before it first needed one. */
|
|
45
|
-
get role() {
|
|
46
|
-
return this.#role;
|
|
43
|
+
connected: () => this.emit('role', 'follower'),
|
|
44
|
+
}))));
|
|
47
45
|
}
|
|
48
46
|
acquire(key, options) {
|
|
49
47
|
return this.#client.acquire(key, options);
|
|
@@ -51,15 +49,10 @@ export class SocketStore extends EventEmitter {
|
|
|
51
49
|
tryAcquire(key) {
|
|
52
50
|
return this.#client.tryAcquire(key);
|
|
53
51
|
}
|
|
52
|
+
/** Stops a campaign still in progress first, so no lock server starts after disposal. */
|
|
54
53
|
async [Symbol.asyncDispose]() {
|
|
55
|
-
this.#client.close();
|
|
56
|
-
await this.#
|
|
57
|
-
}
|
|
58
|
-
#setRole(role) {
|
|
59
|
-
if (this.#role === role)
|
|
60
|
-
return;
|
|
61
|
-
this.#role = role;
|
|
62
|
-
this.emit('role', role);
|
|
54
|
+
await this.#client.close();
|
|
55
|
+
await this.#servers.disposeAsync();
|
|
63
56
|
}
|
|
64
57
|
}
|
|
65
58
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket-store.js","sourceRoot":"","sources":["../../../src/lock-stores/socket/socket-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAG1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,8EAA8E;AAC9E,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAc9B;;;;;;;;;GASG;AACH,MAAM,OAAO,WACX,SAAQ,YAAoC;IAGnC,OAAO,CAAmB;IACnC,
|
|
1
|
+
{"version":3,"file":"socket-store.js","sourceRoot":"","sources":["../../../src/lock-stores/socket/socket-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
1
2
|
import type { MessagePort } from 'node:worker_threads';
|
|
2
|
-
import type { Connection,
|
|
3
|
+
import type { Connection, ConnectionEvents } from '../remote/connection.ts';
|
|
3
4
|
import { type LockRequest, type LockResponse } from '../remote/protocol.ts';
|
|
4
5
|
/**
|
|
5
6
|
* A worker thread's end of the message port to the thread that started it.
|
|
@@ -8,11 +9,11 @@ import { type LockRequest, type LockResponse } from '../remote/protocol.ts';
|
|
|
8
9
|
* coordinator cannot stop without its workers stopping too, so `close` is
|
|
9
10
|
* never reported.
|
|
10
11
|
*/
|
|
11
|
-
export declare class ParentPortConnection implements Connection<LockRequest, LockResponse> {
|
|
12
|
+
export declare class ParentPortConnection extends EventEmitter<ConnectionEvents<LockResponse>> implements Connection<LockRequest, LockResponse> {
|
|
12
13
|
#private;
|
|
13
14
|
constructor(port: MessagePort);
|
|
14
15
|
send(request: LockRequest): Promise<void>;
|
|
15
|
-
listen
|
|
16
|
+
/** Removes the listener before it adds it, so a second `ref` does not listen twice. */
|
|
16
17
|
ref(): void;
|
|
17
18
|
unref(): void;
|
|
18
19
|
close(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parent-port-connection.d.ts","sourceRoot":"","sources":["../../../src/lock-stores/thread/parent-port-connection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,KAAK,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"parent-port-connection.d.ts","sourceRoot":"","sources":["../../../src/lock-stores/thread/parent-port-connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE5E,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,YAAY,EAElB,MAAM,uBAAuB,CAAC;AAE/B;;;;;;GAMG;AACH,qBAAa,oBACX,SAAQ,YAAY,CAAC,gBAAgB,CAAC,YAAY,CAAC,CACnD,YAAW,UAAU,CAAC,WAAW,EAAE,YAAY,CAAC;;gBASpC,IAAI,EAAE,WAAW;IAKvB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,uFAAuF;IACvF,GAAG;IAKH,KAAK;IAIL,KAAK;CAGN"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
1
2
|
import { unwrap, wrap } from "../remote/envelope.js";
|
|
2
3
|
import { isLockResponse, } from "../remote/protocol.js";
|
|
3
4
|
/**
|
|
@@ -7,34 +8,26 @@ import { isLockResponse, } from "../remote/protocol.js";
|
|
|
7
8
|
* coordinator cannot stop without its workers stopping too, so `close` is
|
|
8
9
|
* never reported.
|
|
9
10
|
*/
|
|
10
|
-
export class ParentPortConnection {
|
|
11
|
+
export class ParentPortConnection extends EventEmitter {
|
|
11
12
|
#port;
|
|
12
|
-
#handlers;
|
|
13
|
-
#listening = false;
|
|
14
13
|
#onMessage = (envelope) => {
|
|
15
14
|
const response = unwrap(envelope);
|
|
16
15
|
if (isLockResponse(response))
|
|
17
|
-
this
|
|
16
|
+
this.emit('message', response);
|
|
18
17
|
};
|
|
19
18
|
constructor(port) {
|
|
19
|
+
super();
|
|
20
20
|
this.#port = port;
|
|
21
21
|
}
|
|
22
22
|
async send(request) {
|
|
23
23
|
this.#port.postMessage(wrap(request));
|
|
24
24
|
}
|
|
25
|
-
listen
|
|
26
|
-
this.#handlers = handlers;
|
|
27
|
-
}
|
|
25
|
+
/** Removes the listener before it adds it, so a second `ref` does not listen twice. */
|
|
28
26
|
ref() {
|
|
29
|
-
|
|
30
|
-
return;
|
|
31
|
-
this.#listening = true;
|
|
27
|
+
this.unref();
|
|
32
28
|
this.#port.on('message', this.#onMessage);
|
|
33
29
|
}
|
|
34
30
|
unref() {
|
|
35
|
-
if (!this.#listening)
|
|
36
|
-
return;
|
|
37
|
-
this.#listening = false;
|
|
38
31
|
this.#port.off('message', this.#onMessage);
|
|
39
32
|
}
|
|
40
33
|
close() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parent-port-connection.js","sourceRoot":"","sources":["../../../src/lock-stores/thread/parent-port-connection.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"parent-port-connection.js","sourceRoot":"","sources":["../../../src/lock-stores/thread/parent-port-connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAGL,cAAc,GACf,MAAM,uBAAuB,CAAC;AAE/B;;;;;;GAMG;AACH,MAAM,OAAO,oBACX,SAAQ,YAA4C;IAG3C,KAAK,CAAc;IAEnB,UAAU,GAAG,CAAC,QAAiB,EAAE,EAAE;QAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClC,IAAI,cAAc,CAAC,QAAQ,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC/D,CAAC,CAAC;IAEF,YAAY,IAAiB;QAC3B,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAoB;QAC7B,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,uFAAuF;IACvF,GAAG;QACD,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thread-store.d.ts","sourceRoot":"","sources":["../../../src/lock-stores/thread/thread-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"thread-store.d.ts","sourceRoot":"","sources":["../../../src/lock-stores/thread/thread-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAmB3E;;;GAGG;AACH,qBAAa,WAAY,YAAW,SAAS;;;IAc3C,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC;IAI9D,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;CAGpD"}
|
|
@@ -1,18 +1,15 @@
|
|
|
1
1
|
import { parentPort } from 'node:worker_threads';
|
|
2
|
+
import { ConnectionSupervisor } from "../remote/connection-supervisor.js";
|
|
2
3
|
import { RemoteLockClient } from "../remote/remote-lock-client.js";
|
|
3
4
|
import { ParentPortConnection } from "./parent-port-connection.js";
|
|
4
5
|
/** A worker has one port to its parent thread for its whole life. */
|
|
5
6
|
class ParentPortConnector {
|
|
6
|
-
#
|
|
7
|
-
#handedOut = false;
|
|
7
|
+
#connection;
|
|
8
8
|
constructor(port) {
|
|
9
|
-
this.#
|
|
9
|
+
this.#connection = [new ParentPortConnection(port)].values();
|
|
10
10
|
}
|
|
11
11
|
async connect() {
|
|
12
|
-
|
|
13
|
-
return undefined;
|
|
14
|
-
this.#handedOut = true;
|
|
15
|
-
return new ParentPortConnection(this.#port);
|
|
12
|
+
return this.#connection.next().value;
|
|
16
13
|
}
|
|
17
14
|
}
|
|
18
15
|
/**
|
|
@@ -25,7 +22,7 @@ export class ThreadStore {
|
|
|
25
22
|
if (!parentPort) {
|
|
26
23
|
throw new Error('ThreadStore runs in a worker thread; use ThreadLockCoordinator in the thread that starts the workers.');
|
|
27
24
|
}
|
|
28
|
-
this.#client = new RemoteLockClient(new ParentPortConnector(parentPort));
|
|
25
|
+
this.#client = new RemoteLockClient(new ConnectionSupervisor(new ParentPortConnector(parentPort)));
|
|
29
26
|
}
|
|
30
27
|
acquire(key, options) {
|
|
31
28
|
return this.#client.acquire(key, options);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thread-store.js","sourceRoot":"","sources":["../../../src/lock-stores/thread/thread-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,UAAU,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"thread-store.js","sourceRoot":"","sources":["../../../src/lock-stores/thread/thread-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAInE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAE1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE,qEAAqE;AACrE,MAAM,mBAAmB;IACd,WAAW,CAA4C;IAEhE,YAAY,IAAiB;QAC3B,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,OAAO;QACX,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;IACvC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,WAAW;IACb,OAAO,CAAmB;IAEnC;QACE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CACb,uGAAuG,CACxG,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,gBAAgB,CACjC,IAAI,oBAAoB,CAAC,IAAI,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAC9D,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAW,EAAE,OAAwB;QAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,UAAU,CAAC,GAAW;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;CACF"}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
1
2
|
import type { Worker } from 'node:worker_threads';
|
|
2
|
-
import type { Connection,
|
|
3
|
+
import type { Connection, ConnectionEvents } from '../remote/connection.ts';
|
|
3
4
|
import { type LockRequest, type LockResponse } from '../remote/protocol.ts';
|
|
4
5
|
/**
|
|
5
6
|
* The coordinator's end of the message port to one worker thread. `Worker`
|
|
6
7
|
* emits `exit` however the thread stops, so a terminated or crashed holder
|
|
7
8
|
* is always noticed.
|
|
8
9
|
*/
|
|
9
|
-
export declare class WorkerConnection implements Connection<LockResponse, LockRequest> {
|
|
10
|
+
export declare class WorkerConnection extends EventEmitter<ConnectionEvents<LockRequest>> implements Connection<LockResponse, LockRequest> {
|
|
10
11
|
#private;
|
|
11
12
|
constructor(worker: Worker);
|
|
12
13
|
send(response: LockResponse): Promise<void>;
|
|
13
|
-
listen({ message, close }: ConnectionHandlers<LockRequest>): void;
|
|
14
14
|
/** The running worker already keeps its starting thread alive. */
|
|
15
15
|
ref(): void;
|
|
16
16
|
unref(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-connection.d.ts","sourceRoot":"","sources":["../../../src/lock-stores/thread/worker-connection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,KAAK,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"worker-connection.d.ts","sourceRoot":"","sources":["../../../src/lock-stores/thread/worker-connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE5E,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,YAAY,EAElB,MAAM,uBAAuB,CAAC;AAE/B;;;;GAIG;AACH,qBAAa,gBACX,SAAQ,YAAY,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAClD,YAAW,UAAU,CAAC,YAAY,EAAE,WAAW,CAAC;;gBAcpC,MAAM,EAAE,MAAM;IAOpB,IAAI,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjD,kEAAkE;IAClE,GAAG;IAEH,KAAK;IAEL,KAAK;CAIN"}
|