@zukhruf/mutex 0.2.0 → 0.3.1

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 (146) hide show
  1. package/README.md +5 -3
  2. package/dist/fencing/file-token-source.js +2 -2
  3. package/dist/fencing/file-token-source.js.map +1 -1
  4. package/dist/index.d.ts +2 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +2 -0
  7. package/dist/index.js.map +1 -1
  8. package/dist/leader-election/index.d.ts +1 -0
  9. package/dist/leader-election/index.d.ts.map +1 -1
  10. package/dist/leader-election/index.js +1 -0
  11. package/dist/leader-election/index.js.map +1 -1
  12. package/dist/leader-election/leader-election.d.ts.map +1 -1
  13. package/dist/leader-election/leader-election.js +4 -2
  14. package/dist/leader-election/leader-election.js.map +1 -1
  15. package/dist/local-directory/local-directory.d.ts +7 -0
  16. package/dist/local-directory/local-directory.d.ts.map +1 -0
  17. package/dist/local-directory/local-directory.js +75 -0
  18. package/dist/local-directory/local-directory.js.map +1 -0
  19. package/dist/local-directory/network-directory-error.d.ts +8 -0
  20. package/dist/local-directory/network-directory-error.d.ts.map +1 -0
  21. package/dist/local-directory/network-directory-error.js +13 -0
  22. package/dist/local-directory/network-directory-error.js.map +1 -0
  23. package/dist/lock-stores/file-system/file-lock-store.d.ts +6 -3
  24. package/dist/lock-stores/file-system/file-lock-store.d.ts.map +1 -1
  25. package/dist/lock-stores/file-system/file-lock-store.js +40 -11
  26. package/dist/lock-stores/file-system/file-lock-store.js.map +1 -1
  27. package/dist/lock-stores/file-system/lock-file-store.d.ts.map +1 -1
  28. package/dist/lock-stores/file-system/lock-file-store.js +9 -4
  29. package/dist/lock-stores/file-system/lock-file-store.js.map +1 -1
  30. package/dist/lock-stores/file-system/ticket-queue-file-store.d.ts.map +1 -1
  31. package/dist/lock-stores/file-system/ticket-queue-file-store.js +3 -2
  32. package/dist/lock-stores/file-system/ticket-queue-file-store.js.map +1 -1
  33. package/dist/lock-stores/ipc/child-process-connection.d.ts +3 -3
  34. package/dist/lock-stores/ipc/child-process-connection.d.ts.map +1 -1
  35. package/dist/lock-stores/ipc/child-process-connection.js +16 -20
  36. package/dist/lock-stores/ipc/child-process-connection.js.map +1 -1
  37. package/dist/lock-stores/ipc/ipc-store.d.ts.map +1 -1
  38. package/dist/lock-stores/ipc/ipc-store.js +7 -5
  39. package/dist/lock-stores/ipc/ipc-store.js.map +1 -1
  40. package/dist/lock-stores/ipc/process-channel-connection.d.ts +4 -3
  41. package/dist/lock-stores/ipc/process-channel-connection.d.ts.map +1 -1
  42. package/dist/lock-stores/ipc/process-channel-connection.js +6 -14
  43. package/dist/lock-stores/ipc/process-channel-connection.js.map +1 -1
  44. package/dist/lock-stores/memory/memory-store.d.ts +1 -1
  45. package/dist/lock-stores/memory/memory-store.d.ts.map +1 -1
  46. package/dist/lock-stores/memory/memory-store.js +13 -14
  47. package/dist/lock-stores/memory/memory-store.js.map +1 -1
  48. package/dist/lock-stores/remote/connection-supervisor.d.ts +39 -0
  49. package/dist/lock-stores/remote/connection-supervisor.d.ts.map +1 -0
  50. package/dist/lock-stores/remote/connection-supervisor.js +195 -0
  51. package/dist/lock-stores/remote/connection-supervisor.js.map +1 -0
  52. package/dist/lock-stores/remote/connection.d.ts +11 -7
  53. package/dist/lock-stores/remote/connection.d.ts.map +1 -1
  54. package/dist/lock-stores/remote/connector.d.ts +5 -2
  55. package/dist/lock-stores/remote/connector.d.ts.map +1 -1
  56. package/dist/lock-stores/remote/lock-coordinator.d.ts +2 -2
  57. package/dist/lock-stores/remote/lock-coordinator.d.ts.map +1 -1
  58. package/dist/lock-stores/remote/lock-coordinator.js +140 -69
  59. package/dist/lock-stores/remote/lock-coordinator.js.map +1 -1
  60. package/dist/lock-stores/remote/remote-lock-client.d.ts +8 -7
  61. package/dist/lock-stores/remote/remote-lock-client.d.ts.map +1 -1
  62. package/dist/lock-stores/remote/remote-lock-client.js +99 -99
  63. package/dist/lock-stores/remote/remote-lock-client.js.map +1 -1
  64. package/dist/lock-stores/socket/electing-connector.d.ts +7 -4
  65. package/dist/lock-stores/socket/electing-connector.d.ts.map +1 -1
  66. package/dist/lock-stores/socket/electing-connector.js +94 -11
  67. package/dist/lock-stores/socket/electing-connector.js.map +1 -1
  68. package/dist/lock-stores/socket/handshake.d.ts +27 -0
  69. package/dist/lock-stores/socket/handshake.d.ts.map +1 -0
  70. package/dist/lock-stores/socket/handshake.js +80 -0
  71. package/dist/lock-stores/socket/handshake.js.map +1 -0
  72. package/dist/lock-stores/socket/local-directory-connector.d.ts +14 -0
  73. package/dist/lock-stores/socket/local-directory-connector.d.ts.map +1 -0
  74. package/dist/lock-stores/socket/local-directory-connector.js +23 -0
  75. package/dist/lock-stores/socket/local-directory-connector.js.map +1 -0
  76. package/dist/lock-stores/socket/lock-server.d.ts.map +1 -1
  77. package/dist/lock-stores/socket/lock-server.js +7 -1
  78. package/dist/lock-stores/socket/lock-server.js.map +1 -1
  79. package/dist/lock-stores/socket/protocol-version-error.d.ts +12 -0
  80. package/dist/lock-stores/socket/protocol-version-error.d.ts.map +1 -0
  81. package/dist/lock-stores/socket/protocol-version-error.js +19 -0
  82. package/dist/lock-stores/socket/protocol-version-error.js.map +1 -0
  83. package/dist/lock-stores/socket/socket-connection.d.ts +3 -3
  84. package/dist/lock-stores/socket/socket-connection.d.ts.map +1 -1
  85. package/dist/lock-stores/socket/socket-connection.js +16 -18
  86. package/dist/lock-stores/socket/socket-connection.js.map +1 -1
  87. package/dist/lock-stores/socket/socket-store.d.ts +1 -2
  88. package/dist/lock-stores/socket/socket-store.d.ts.map +1 -1
  89. package/dist/lock-stores/socket/socket-store.js +16 -23
  90. package/dist/lock-stores/socket/socket-store.js.map +1 -1
  91. package/dist/lock-stores/thread/parent-port-connection.d.ts +4 -3
  92. package/dist/lock-stores/thread/parent-port-connection.d.ts.map +1 -1
  93. package/dist/lock-stores/thread/parent-port-connection.js +6 -13
  94. package/dist/lock-stores/thread/parent-port-connection.js.map +1 -1
  95. package/dist/lock-stores/thread/thread-store.d.ts.map +1 -1
  96. package/dist/lock-stores/thread/thread-store.js +5 -8
  97. package/dist/lock-stores/thread/thread-store.js.map +1 -1
  98. package/dist/lock-stores/thread/worker-connection.d.ts +3 -3
  99. package/dist/lock-stores/thread/worker-connection.d.ts.map +1 -1
  100. package/dist/lock-stores/thread/worker-connection.js +19 -23
  101. package/dist/lock-stores/thread/worker-connection.js.map +1 -1
  102. package/dist/mutex/acquire-mode.d.ts +6 -3
  103. package/dist/mutex/acquire-mode.d.ts.map +1 -1
  104. package/dist/mutex/acquire-modes/skip-if-busy-mode.d.ts +7 -3
  105. package/dist/mutex/acquire-modes/skip-if-busy-mode.d.ts.map +1 -1
  106. package/dist/mutex/acquire-modes/skip-if-busy-mode.js +7 -4
  107. package/dist/mutex/acquire-modes/skip-if-busy-mode.js.map +1 -1
  108. package/dist/mutex/acquire-modes/wait-mode.d.ts +2 -2
  109. package/dist/mutex/acquire-modes/wait-mode.d.ts.map +1 -1
  110. package/dist/mutex/acquire-modes/wait-mode.js +2 -2
  111. package/dist/mutex/acquire-modes/wait-mode.js.map +1 -1
  112. package/dist/mutex/key.d.ts +3 -2
  113. package/dist/mutex/key.d.ts.map +1 -1
  114. package/dist/mutex/key.js +3 -3
  115. package/dist/mutex/key.js.map +1 -1
  116. package/dist/mutex/mutex.d.ts +3 -3
  117. package/dist/mutex/mutex.d.ts.map +1 -1
  118. package/dist/mutex/mutex.js +28 -5
  119. package/dist/mutex/mutex.js.map +1 -1
  120. package/dist/shared/fs/atomic-write.d.ts.map +1 -1
  121. package/dist/shared/fs/atomic-write.js +3 -27
  122. package/dist/shared/fs/atomic-write.js.map +1 -1
  123. package/dist/shared/fs/create-exclusive.d.ts.map +1 -1
  124. package/dist/shared/fs/create-exclusive.js +7 -2
  125. package/dist/shared/fs/create-exclusive.js.map +1 -1
  126. package/dist/shared/fs/durable-write.d.ts +7 -0
  127. package/dist/shared/fs/durable-write.d.ts.map +1 -0
  128. package/dist/shared/fs/durable-write.js +46 -0
  129. package/dist/shared/fs/durable-write.js.map +1 -0
  130. package/dist/shared/fs/patiently.d.ts +3 -0
  131. package/dist/shared/fs/patiently.d.ts.map +1 -0
  132. package/dist/shared/fs/patiently.js +30 -0
  133. package/dist/shared/fs/patiently.js.map +1 -0
  134. package/dist/shared/fs/replace-file.d.ts +8 -0
  135. package/dist/shared/fs/replace-file.d.ts.map +1 -0
  136. package/dist/shared/fs/replace-file.js +12 -0
  137. package/dist/shared/fs/replace-file.js.map +1 -0
  138. package/dist/shared/latch.d.ts +10 -0
  139. package/dist/shared/latch.d.ts.map +1 -0
  140. package/dist/shared/latch.js +14 -0
  141. package/dist/shared/latch.js.map +1 -0
  142. package/dist/shared/sqlite/is-not-a-database.d.ts +3 -0
  143. package/dist/shared/sqlite/is-not-a-database.d.ts.map +1 -0
  144. package/dist/shared/sqlite/is-not-a-database.js +9 -0
  145. package/dist/shared/sqlite/is-not-a-database.js.map +1 -0
  146. 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":"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"}
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, Connector } from '../remote/connector.ts';
3
+ import type { ClientConnection, ClientConnector } from '../remote/connector.ts';
4
4
  export interface ElectingConnectorOptions {
5
5
  socketPath: string;
6
- election: LeaderElection;
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 Connector {
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,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAQ1E,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,cAAc,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,uDAAuD;IACvD,KAAK,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,SAAS,IAAI,IAAI,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,SAAS;;gBAGrC,OAAO,EAAE,wBAAwB;IAIvC,OAAO,IAAI,OAAO,CAAC,gBAAgB,CAAC;CAiB3C"}
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;AAEtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAgBhF,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;CAyE9D"}
@@ -1,32 +1,105 @@
1
1
  import { connect } from 'node:net';
2
2
  import { setTimeout as delay } from 'node:timers/promises';
3
+ import { untilAborted } from "../../shared/until-aborted.js";
3
4
  import { isLockResponse, } from "../remote/protocol.js";
5
+ import { PROTOCOL_VERSION, greet } from "./handshake.js";
6
+ import { ProtocolVersionError } from "./protocol-version-error.js";
4
7
  import { SocketConnection } from "./socket-connection.js";
8
+ /**
9
+ * How long a leader that hung up on the hello may take to end its term. One
10
+ * that stops ends it within moments; one from before the handshake keeps it.
11
+ */
12
+ const HANDSHAKE_PATIENCE = 1000;
5
13
  /**
6
14
  * Reaches the leader's socket, and when nobody serves it, campaigns to become
7
15
  * the leader. Never gives up: a lost leader is always replaced by a candidate.
16
+ * An aborted connect never starts serving: a term won after the abort is resigned.
8
17
  */
9
18
  export class ElectingConnector {
10
19
  #options;
11
20
  constructor(options) {
12
21
  this.#options = options;
13
22
  }
14
- async connect() {
15
- const { socketPath, election, pollInterval, serve, connected } = this.#options;
23
+ async connect(signal) {
24
+ const { socketPath, election, pollInterval, serve } = this.#options;
16
25
  for (;;) {
17
- const socket = await reach(socketPath);
18
- if (socket) {
19
- connected();
20
- return new SocketConnection(socket, isLockResponse);
26
+ const leader = await reachUnlessAborted(socketPath, signal);
27
+ if (leader) {
28
+ const connection = await this.#follow(leader, signal);
29
+ if (connection)
30
+ return connection;
31
+ }
32
+ const leadership = await election.campaign({
33
+ timeout: leader ? HANDSHAKE_PATIENCE : pollInterval,
34
+ });
35
+ if (signal.aborted)
36
+ await leadership?.resign();
37
+ signal.throwIfAborted();
38
+ if (leadership) {
39
+ try {
40
+ await serve(leadership);
41
+ }
42
+ catch (error) {
43
+ // A term that nothing serves would stop every other candidate from leading.
44
+ await leadership.resign();
45
+ throw error;
46
+ }
47
+ // This process leads now, so it reaches its own server without following anyone.
48
+ const own = await reachUnlessAborted(socketPath, signal);
49
+ if (own) {
50
+ if ((await greetUnlessAborted(own, signal)).kind === 'welcome') {
51
+ return new SocketConnection(own, isLockResponse);
52
+ }
53
+ own.destroy();
54
+ }
55
+ }
56
+ else if (leader) {
57
+ // The term is still held: either the leader that hung up predates the
58
+ // handshake, or a successor took over while it stopped. Only the
59
+ // successor answers a second hello.
60
+ const again = await reachUnlessAborted(socketPath, signal);
61
+ if (again) {
62
+ const connection = await this.#follow(again, signal);
63
+ if (connection)
64
+ return connection;
65
+ throw new ProtocolVersionError(PROTOCOL_VERSION, undefined);
66
+ }
67
+ }
68
+ else {
69
+ await delay(pollInterval, undefined, { signal });
70
+ }
71
+ }
72
+ }
73
+ /** Follows the leader on `socket` if it speaks this protocol; `undefined` when it hung up on the hello. */
74
+ async #follow(socket, signal) {
75
+ const greeting = await greetUnlessAborted(socket, signal);
76
+ if (greeting.kind !== 'welcome') {
77
+ socket.destroy();
78
+ if (greeting.kind === 'refused') {
79
+ throw new ProtocolVersionError(PROTOCOL_VERSION, greeting.version);
21
80
  }
22
- const leadership = await election.campaign({ timeout: pollInterval });
23
- if (leadership)
24
- await serve(leadership);
25
- else
26
- await delay(pollInterval);
81
+ return undefined;
82
+ }
83
+ try {
84
+ this.#options.connected();
85
+ }
86
+ catch (error) {
87
+ // Nobody will use this socket, and an open one would keep the process alive.
88
+ socket.destroy();
89
+ throw error;
27
90
  }
91
+ return new SocketConnection(socket, isLockResponse);
28
92
  }
29
93
  }
94
+ /** Like `reach`, but a socket reached after `signal` aborted is destroyed, not returned. */
95
+ async function reachUnlessAborted(socketPath, signal) {
96
+ signal.throwIfAborted();
97
+ const socket = await reach(socketPath);
98
+ if (signal.aborted)
99
+ socket?.destroy();
100
+ signal.throwIfAborted();
101
+ return socket;
102
+ }
30
103
  /** Resolves `undefined` when nothing listens yet (no file, or a dead leader's file). */
31
104
  function reach(socketPath) {
32
105
  return new Promise((resolve) => {
@@ -42,4 +115,14 @@ function reach(socketPath) {
42
115
  });
43
116
  });
44
117
  }
118
+ /** Greets the leader on `socket`; a store that closes meanwhile gives the socket up. */
119
+ async function greetUnlessAborted(socket, signal) {
120
+ try {
121
+ return await untilAborted(greet(socket), signal);
122
+ }
123
+ catch (error) {
124
+ socket.destroy();
125
+ throw error;
126
+ }
127
+ }
45
128
  //# sourceMappingURL=electing-connector.js.map
@@ -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;AAW1D;;;GAGG;AACH,MAAM,OAAO,iBAAiB;IACnB,QAAQ,CAA2B;IAE5C,YAAY,OAAiC;QAC3C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,OAAO;QACX,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,KAAK,CAAC,UAAU,CAAC,CAAC;YACvC,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,UAAU;gBAAE,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;;gBACnC,MAAM,KAAK,CAAC,YAAY,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;CACF;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"}
1
+ {"version":3,"file":"electing-connector.js","sourceRoot":"","sources":["../../../src/lock-stores/socket/electing-connector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { Socket } from 'node:net';
2
+ /**
3
+ * The version of the messages a socket store's processes exchange. It changes
4
+ * only when they change, so processes that run different package versions
5
+ * with the same protocol still share a directory.
6
+ */
7
+ export declare const PROTOCOL_VERSION = 1;
8
+ /** What a leader answered to this process's `hello`. */
9
+ export type Greeting = {
10
+ kind: 'welcome';
11
+ } | {
12
+ kind: 'refused';
13
+ version: number;
14
+ }
15
+ /** The leader closed the connection without an answer: it stops, or it predates the handshake. */
16
+ | {
17
+ kind: 'closed';
18
+ };
19
+ /** Says which protocol this process speaks, and reads the leader's answer. */
20
+ export declare function greet(socket: Socket): Promise<Greeting>;
21
+ /**
22
+ * Reads a new peer's `hello`. A peer that speaks this protocol is welcomed;
23
+ * any other first line is refused with this leader's version, and the
24
+ * connection ends once that answer is written.
25
+ */
26
+ export declare function welcome(socket: Socket): Promise<boolean>;
27
+ //# sourceMappingURL=handshake.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handshake.d.ts","sourceRoot":"","sources":["../../../src/lock-stores/socket/handshake.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAIvC;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,wDAAwD;AACxD,MAAM,MAAM,QAAQ,GAChB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AACtC,kGAAkG;GAChG;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEvB,8EAA8E;AAC9E,wBAAsB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAc7D;AAED;;;;GAIG;AACH,wBAAsB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAgB9D"}
@@ -0,0 +1,80 @@
1
+ import { isRecord } from "../../shared/is-record.js";
2
+ /**
3
+ * The version of the messages a socket store's processes exchange. It changes
4
+ * only when they change, so processes that run different package versions
5
+ * with the same protocol still share a directory.
6
+ */
7
+ export const PROTOCOL_VERSION = 1;
8
+ /** Says which protocol this process speaks, and reads the leader's answer. */
9
+ export async function greet(socket) {
10
+ socket.write(`${JSON.stringify({ op: 'hello', version: PROTOCOL_VERSION })}\n`);
11
+ const answer = parse(await readLine(socket));
12
+ if (isRecord(answer) && answer.op === 'welcome')
13
+ return { kind: 'welcome' };
14
+ if (isRecord(answer) &&
15
+ answer.op === 'refused' &&
16
+ typeof answer.version === 'number') {
17
+ return { kind: 'refused', version: answer.version };
18
+ }
19
+ return { kind: 'closed' };
20
+ }
21
+ /**
22
+ * Reads a new peer's `hello`. A peer that speaks this protocol is welcomed;
23
+ * any other first line is refused with this leader's version, and the
24
+ * connection ends once that answer is written.
25
+ */
26
+ export async function welcome(socket) {
27
+ const hello = parse(await readLine(socket));
28
+ if (isRecord(hello) &&
29
+ hello.op === 'hello' &&
30
+ hello.version === PROTOCOL_VERSION) {
31
+ socket.write(`${JSON.stringify({ op: 'welcome' })}\n`);
32
+ return true;
33
+ }
34
+ // Destroyed once the answer is written: a paused socket would never see a silent peer hang up.
35
+ socket.end(`${JSON.stringify({ op: 'refused', version: PROTOCOL_VERSION })}\n`, () => socket.destroy());
36
+ return false;
37
+ }
38
+ function parse(line) {
39
+ if (line === undefined)
40
+ return undefined;
41
+ try {
42
+ return JSON.parse(line);
43
+ }
44
+ catch {
45
+ return undefined;
46
+ }
47
+ }
48
+ /**
49
+ * Reads exactly one line and puts back whatever arrived after it, so the
50
+ * reader that takes over the socket next sees every later message. Resolves
51
+ * `undefined` when the socket closes first.
52
+ */
53
+ function readLine(socket) {
54
+ const { promise, resolve } = Promise.withResolvers();
55
+ const chunks = [];
56
+ const onData = (chunk) => {
57
+ const end = chunk.indexOf(0x0a);
58
+ if (end === -1) {
59
+ chunks.push(chunk);
60
+ return;
61
+ }
62
+ socket.off('data', onData);
63
+ socket.off('close', onClose);
64
+ socket.pause();
65
+ const rest = chunk.subarray(end + 1);
66
+ if (rest.length > 0)
67
+ socket.unshift(rest);
68
+ resolve(Buffer.concat([...chunks, chunk.subarray(0, end)]).toString('utf8'));
69
+ };
70
+ const onClose = () => {
71
+ socket.off('data', onData);
72
+ resolve(undefined);
73
+ };
74
+ // Every error is followed by `close`, which reports the lost peer as no answer.
75
+ socket.on('error', () => { });
76
+ socket.on('data', onData);
77
+ socket.once('close', onClose);
78
+ return promise;
79
+ }
80
+ //# sourceMappingURL=handshake.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handshake.js","sourceRoot":"","sources":["../../../src/lock-stores/socket/handshake.ts"],"names":[],"mappings":"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"}
@@ -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 +1 @@
1
- {"version":3,"file":"lock-server.d.ts","sourceRoot":"","sources":["../../../src/lock-stores/socket/lock-server.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAUtE,MAAM,WAAW,iBAAiB;IAChC,4FAA4F;IAC5F,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,qBAAa,UAAU;;IAKrB,OAAO;WAUM,KAAK,CAChB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,UAAU,EACtB,EAAE,WAAW,EAAE,EAAE,iBAAiB,GACjC,OAAO,CAAC,UAAU,CAAC;IAiCtB;;;;;;OAMG;IACG,KAAK;CAQZ"}
1
+ {"version":3,"file":"lock-server.d.ts","sourceRoot":"","sources":["../../../src/lock-stores/socket/lock-server.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAWtE,MAAM,WAAW,iBAAiB;IAChC,4FAA4F;IAC5F,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,qBAAa,UAAU;;IAKrB,OAAO;WAUM,KAAK,CAChB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,UAAU,EACtB,EAAE,WAAW,EAAE,EAAE,iBAAiB,GACjC,OAAO,CAAC,UAAU,CAAC;IAwCtB;;;;;;OAMG;IACG,KAAK;CAQZ"}
@@ -4,6 +4,7 @@ import { EpochTokenSource } from "../../fencing/epoch-token-source.js";
4
4
  import { isErrno } from "../../shared/fs/errno.js";
5
5
  import { LockCoordinator } from "../remote/lock-coordinator.js";
6
6
  import { isLockRequest, } from "../remote/protocol.js";
7
+ import { welcome } from "./handshake.js";
7
8
  import { SocketConnection } from "./socket-connection.js";
8
9
  /**
9
10
  * Serves a `LockCoordinator` on a Unix socket for one leadership term. Tokens
@@ -37,7 +38,12 @@ export class LockServer {
37
38
  socket.unref();
38
39
  connections.add(socket);
39
40
  socket.once('close', () => connections.delete(socket));
40
- coordinator.serve(new SocketConnection(socket, isLockRequest));
41
+ // A peer that speaks another protocol is refused before it can send anything this coordinator would misread.
42
+ void welcome(socket).then((speaksOurs) => {
43
+ if (!speaksOurs)
44
+ return;
45
+ coordinator.serve(new SocketConnection(socket, isLockRequest));
46
+ });
41
47
  });
42
48
  await new Promise((resolve, reject) => {
43
49
  server.once('error', reject);
@@ -1 +1 @@
1
- {"version":3,"file":"lock-server.js","sourceRoot":"","sources":["../../../src/lock-stores/socket/lock-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lock-server.js","sourceRoot":"","sources":["../../../src/lock-stores/socket/lock-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * The socket store's leader speaks another protocol, so this process cannot
3
+ * use it. Run one version of the protocol per lock directory.
4
+ */
5
+ export declare class ProtocolVersionError extends Error {
6
+ /** The protocol this process speaks. */
7
+ readonly ours: number;
8
+ /** The protocol the leader speaks, or `undefined` when it closed the handshake without saying. */
9
+ readonly theirs: number | undefined;
10
+ constructor(ours: number, theirs: number | undefined);
11
+ }
12
+ //# sourceMappingURL=protocol-version-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol-version-error.d.ts","sourceRoot":"","sources":["../../../src/lock-stores/socket/protocol-version-error.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,wCAAwC;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,kGAAkG;IAClG,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;gBAExB,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS;CAUrD"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * The socket store's leader speaks another protocol, so this process cannot
3
+ * use it. Run one version of the protocol per lock directory.
4
+ */
5
+ export class ProtocolVersionError extends Error {
6
+ /** The protocol this process speaks. */
7
+ ours;
8
+ /** The protocol the leader speaks, or `undefined` when it closed the handshake without saying. */
9
+ theirs;
10
+ constructor(ours, theirs) {
11
+ super(theirs === undefined
12
+ ? `The socket store's leader closed the handshake without an answer while it still leads, so it predates protocol version ${ours}. Stop the processes that run the older version of @zukhruf/mutex.`
13
+ : `The socket store's leader speaks protocol version ${theirs}, and this process speaks version ${ours}. Run one version per lock directory.`);
14
+ this.name = 'ProtocolVersionError';
15
+ this.ours = ours;
16
+ this.theirs = theirs;
17
+ }
18
+ }
19
+ //# sourceMappingURL=protocol-version-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol-version-error.js","sourceRoot":"","sources":["../../../src/lock-stores/socket/protocol-version-error.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7C,wCAAwC;IAC/B,IAAI,CAAS;IACtB,kGAAkG;IACzF,MAAM,CAAqB;IAEpC,YAAY,IAAY,EAAE,MAA0B;QAClD,KAAK,CACH,MAAM,KAAK,SAAS;YAClB,CAAC,CAAC,0HAA0H,IAAI,oEAAoE;YACpM,CAAC,CAAC,qDAAqD,MAAM,qCAAqC,IAAI,uCAAuC,CAChJ,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF"}
@@ -1,16 +1,16 @@
1
+ import { EventEmitter } from 'node:events';
1
2
  import type { Socket } from 'node:net';
2
- import type { Connection, ConnectionHandlers } from '../remote/connection.ts';
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,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE9E;;;;;GAKG;AACH,qBAAa,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAE,YAAW,UAAU,CACrE,QAAQ,EACR,QAAQ,CACT;;gBAKG,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,IAAI,QAAQ;IAQvD,IAAI,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAYtC,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,kBAAkB,CAAC,QAAQ,CAAC;IAgBvD,GAAG;IAIH,KAAK;IAIL,KAAK;CAGN"}
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 (this.#isIncoming(parsed))
32
- message(parsed);
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
- this.#socket.once('close', close);
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":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAIhD;;;;;GAKG;AACH,MAAM,OAAO,gBAAgB;IAIlB,OAAO,CAAS;IAChB,WAAW,CAA4C;IAEhE,YACE,MAAc,EACd,UAAqD;QAErD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,iFAAiF;QACjF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC/B,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,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAgC;QACrD,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;aAC1D,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACnB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACzC,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;oBAAE,OAAO,CAAC,MAAM,CAAC,CAAC;;oBACzC,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,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACpC,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"}
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;AAQ3E,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;IAuBnE,wFAAwF;IACxF,IAAI,IAAI,IAAI,UAAU,GAAG,SAAS,CAEjC;IAED,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;IAI7C,CAAC,MAAM,CAAC,YAAY,CAAC;CAU5B"}
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"}