@zukhruf/mutex 0.3.3 → 0.3.4
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
CHANGED
|
@@ -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;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;
|
|
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;CA2G9D"}
|
|
@@ -6,8 +6,8 @@ import { PROTOCOL_VERSION, greet } from "./handshake.js";
|
|
|
6
6
|
import { ProtocolVersionError } from "./protocol-version-error.js";
|
|
7
7
|
import { SocketConnection } from "./socket-connection.js";
|
|
8
8
|
/**
|
|
9
|
-
* How long a leader
|
|
10
|
-
* that stops ends
|
|
9
|
+
* How long a leader may keep its term while it hangs up on every hello. One
|
|
10
|
+
* that stops ends its term within moments; one from before the handshake keeps it.
|
|
11
11
|
*/
|
|
12
12
|
const HANDSHAKE_PATIENCE = 1000;
|
|
13
13
|
/**
|
|
@@ -21,55 +21,80 @@ export class ElectingConnector {
|
|
|
21
21
|
this.#options = options;
|
|
22
22
|
}
|
|
23
23
|
async connect(signal) {
|
|
24
|
-
const { socketPath,
|
|
24
|
+
const { socketPath, pollInterval } = this.#options;
|
|
25
25
|
for (;;) {
|
|
26
26
|
const leader = await reachUnlessAborted(socketPath, signal);
|
|
27
27
|
if (leader) {
|
|
28
|
-
const connection = await this.#follow(leader, signal)
|
|
28
|
+
const connection = (await this.#follow(leader, signal)) ??
|
|
29
|
+
(await this.#outlastHangUp(signal));
|
|
29
30
|
if (connection)
|
|
30
31
|
return connection;
|
|
31
32
|
}
|
|
32
|
-
const leadership = await
|
|
33
|
-
timeout: leader ? HANDSHAKE_PATIENCE : pollInterval,
|
|
34
|
-
});
|
|
35
|
-
if (signal.aborted)
|
|
36
|
-
await leadership?.resign();
|
|
37
|
-
signal.throwIfAborted();
|
|
33
|
+
const leadership = await this.#campaign(pollInterval, signal);
|
|
38
34
|
if (leadership) {
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
}
|
|
35
|
+
const own = await this.#lead(leadership, signal);
|
|
36
|
+
if (own)
|
|
37
|
+
return own;
|
|
67
38
|
}
|
|
68
39
|
else {
|
|
69
40
|
await delay(pollInterval, undefined, { signal });
|
|
70
41
|
}
|
|
71
42
|
}
|
|
72
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* After a leader hung up on the hello: a leader that stops frees its term
|
|
46
|
+
* within moments, so this process leads or follows the successor soon
|
|
47
|
+
* enough to reassert its keys in the successor's grace window. A leader from
|
|
48
|
+
* before the handshake keeps its term and hangs up on every hello, which
|
|
49
|
+
* fails the connect after HANDSHAKE_PATIENCE. Resolves `undefined` once
|
|
50
|
+
* nothing listens.
|
|
51
|
+
*/
|
|
52
|
+
async #outlastHangUp(signal) {
|
|
53
|
+
const { socketPath, pollInterval } = this.#options;
|
|
54
|
+
const deadline = performance.now() + HANDSHAKE_PATIENCE;
|
|
55
|
+
for (;;) {
|
|
56
|
+
const leadership = await this.#campaign(0, signal);
|
|
57
|
+
if (leadership)
|
|
58
|
+
return this.#lead(leadership, signal);
|
|
59
|
+
const again = await reachUnlessAborted(socketPath, signal);
|
|
60
|
+
if (!again)
|
|
61
|
+
return undefined;
|
|
62
|
+
const connection = await this.#follow(again, signal);
|
|
63
|
+
if (connection)
|
|
64
|
+
return connection;
|
|
65
|
+
if (performance.now() >= deadline) {
|
|
66
|
+
throw new ProtocolVersionError(PROTOCOL_VERSION, undefined);
|
|
67
|
+
}
|
|
68
|
+
await delay(pollInterval, undefined, { signal });
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/** Campaigns until `timeout`; a term won after `signal` aborted is resigned. */
|
|
72
|
+
async #campaign(timeout, signal) {
|
|
73
|
+
const leadership = await this.#options.election.campaign({ timeout });
|
|
74
|
+
if (signal.aborted)
|
|
75
|
+
await leadership?.resign();
|
|
76
|
+
signal.throwIfAborted();
|
|
77
|
+
return leadership;
|
|
78
|
+
}
|
|
79
|
+
/** Serves the term this process just won, and reaches its own server without following anyone. */
|
|
80
|
+
async #lead(leadership, signal) {
|
|
81
|
+
try {
|
|
82
|
+
await this.#options.serve(leadership);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
// A term that nothing serves would stop every other candidate from leading.
|
|
86
|
+
await leadership.resign();
|
|
87
|
+
throw error;
|
|
88
|
+
}
|
|
89
|
+
const own = await reachUnlessAborted(this.#options.socketPath, signal);
|
|
90
|
+
if (!own)
|
|
91
|
+
return undefined;
|
|
92
|
+
if ((await greetUnlessAborted(own, signal)).kind === 'welcome') {
|
|
93
|
+
return new SocketConnection(own, isLockResponse);
|
|
94
|
+
}
|
|
95
|
+
own.destroy();
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
73
98
|
/** Follows the leader on `socket` if it speaks this protocol; `undefined` when it hung up on the hello. */
|
|
74
99
|
async #follow(socket, signal) {
|
|
75
100
|
const greeting = await greetUnlessAborted(socket, signal);
|
|
@@ -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;AAI3D,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,OAAO,EAGL,cAAc,GACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAiB,gBAAgB,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;;GAGG;AACH,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAahC;;;;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,
|
|
1
|
+
{"version":3,"file":"electing-connector.js","sourceRoot":"","sources":["../../../src/lock-stores/socket/electing-connector.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED