@zukhruf/mutex 0.3.6 → 0.3.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lock-stores/socket/handshake.d.ts +9 -4
- package/dist/lock-stores/socket/handshake.d.ts.map +1 -1
- package/dist/lock-stores/socket/handshake.js +35 -13
- package/dist/lock-stores/socket/handshake.js.map +1 -1
- package/dist/lock-stores/socket/lock-server.js +1 -1
- package/dist/lock-stores/socket/lock-server.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,7 +2,9 @@ import type { Socket } from 'node:net';
|
|
|
2
2
|
/**
|
|
3
3
|
* The version of the messages a socket store's processes exchange. It changes
|
|
4
4
|
* only when they change, so processes that run different package versions
|
|
5
|
-
* with the same protocol still share a directory.
|
|
5
|
+
* with the same protocol still share a directory. The `hello` and the
|
|
6
|
+
* `refused` answer keep their shape in every version: they are how two
|
|
7
|
+
* versions find out that they differ.
|
|
6
8
|
*/
|
|
7
9
|
export declare const PROTOCOL_VERSION = 1;
|
|
8
10
|
/** What a leader answered to this process's `hello`. */
|
|
@@ -19,9 +21,12 @@ export type Greeting = {
|
|
|
19
21
|
/** Says which protocol this process speaks, and reads the leader's answer. */
|
|
20
22
|
export declare function greet(socket: Socket): Promise<Greeting>;
|
|
21
23
|
/**
|
|
22
|
-
* Reads a new
|
|
23
|
-
*
|
|
24
|
-
* connection ends once that answer is written.
|
|
24
|
+
* Reads a new process's `hello`. A process that speaks this protocol is
|
|
25
|
+
* welcomed. A `hello` of another version is refused with this leader's
|
|
26
|
+
* version, and the connection ends once that answer is written. A process
|
|
27
|
+
* that opens with anything else predates the handshake: it cannot read
|
|
28
|
+
* `refused`, and it connects again at once after any hang-up. So it gets no
|
|
29
|
+
* answer, and it stays connected until it hangs up or the term ends.
|
|
25
30
|
*/
|
|
26
31
|
export declare function welcome(socket: Socket): Promise<boolean>;
|
|
27
32
|
//# sourceMappingURL=handshake.d.ts.map
|
|
@@ -1 +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
|
|
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;;;;;;GAMG;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;;;;;;;GAOG;AACH,wBAAsB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiB9D"}
|
|
@@ -2,7 +2,9 @@ import { isRecord } from "../../shared/is-record.js";
|
|
|
2
2
|
/**
|
|
3
3
|
* The version of the messages a socket store's processes exchange. It changes
|
|
4
4
|
* only when they change, so processes that run different package versions
|
|
5
|
-
* with the same protocol still share a directory.
|
|
5
|
+
* with the same protocol still share a directory. The `hello` and the
|
|
6
|
+
* `refused` answer keep their shape in every version: they are how two
|
|
7
|
+
* versions find out that they differ.
|
|
6
8
|
*/
|
|
7
9
|
export const PROTOCOL_VERSION = 1;
|
|
8
10
|
/** Says which protocol this process speaks, and reads the leader's answer. */
|
|
@@ -19,19 +21,25 @@ export async function greet(socket) {
|
|
|
19
21
|
return { kind: 'closed' };
|
|
20
22
|
}
|
|
21
23
|
/**
|
|
22
|
-
* Reads a new
|
|
23
|
-
*
|
|
24
|
-
* connection ends once that answer is written.
|
|
24
|
+
* Reads a new process's `hello`. A process that speaks this protocol is
|
|
25
|
+
* welcomed. A `hello` of another version is refused with this leader's
|
|
26
|
+
* version, and the connection ends once that answer is written. A process
|
|
27
|
+
* that opens with anything else predates the handshake: it cannot read
|
|
28
|
+
* `refused`, and it connects again at once after any hang-up. So it gets no
|
|
29
|
+
* answer, and it stays connected until it hangs up or the term ends.
|
|
25
30
|
*/
|
|
26
31
|
export async function welcome(socket) {
|
|
27
32
|
const hello = parse(await readLine(socket));
|
|
28
|
-
if (isRecord(hello)
|
|
29
|
-
|
|
30
|
-
|
|
33
|
+
if (!isRecord(hello) || hello.op !== 'hello') {
|
|
34
|
+
// Flowing with no reader drops its lines, so a close behind them still ends the socket.
|
|
35
|
+
socket.resume();
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
if (hello.version === PROTOCOL_VERSION) {
|
|
31
39
|
socket.write(`${JSON.stringify({ op: 'welcome' })}\n`);
|
|
32
40
|
return true;
|
|
33
41
|
}
|
|
34
|
-
// Destroyed once the answer is written: a paused socket would never see a silent
|
|
42
|
+
// Destroyed once the answer is written: a paused socket would never see a silent process hang up.
|
|
35
43
|
socket.end(`${JSON.stringify({ op: 'refused', version: PROTOCOL_VERSION })}\n`, () => socket.destroy());
|
|
36
44
|
return false;
|
|
37
45
|
}
|
|
@@ -45,23 +53,37 @@ function parse(line) {
|
|
|
45
53
|
return undefined;
|
|
46
54
|
}
|
|
47
55
|
}
|
|
56
|
+
/** A hello and each answer to it are one short line, so a longer first line is none of them. */
|
|
57
|
+
const FIRST_LINE_LIMIT = 1024;
|
|
48
58
|
/**
|
|
49
59
|
* Reads exactly one line and puts back whatever arrived after it, so the
|
|
50
60
|
* reader that takes over the socket next sees every later message. Resolves
|
|
51
|
-
* `undefined` when the socket closes first
|
|
61
|
+
* `undefined` when the socket closes first, or when the line grows past
|
|
62
|
+
* FIRST_LINE_LIMIT bytes: a process that never ends its line cannot fill the
|
|
63
|
+
* memory of this one.
|
|
52
64
|
*/
|
|
53
65
|
function readLine(socket) {
|
|
54
66
|
const { promise, resolve } = Promise.withResolvers();
|
|
55
67
|
const chunks = [];
|
|
68
|
+
let lineBytes = 0;
|
|
69
|
+
const stop = () => {
|
|
70
|
+
socket.off('data', onData);
|
|
71
|
+
socket.off('close', onClose);
|
|
72
|
+
socket.pause();
|
|
73
|
+
};
|
|
56
74
|
const onData = (chunk) => {
|
|
57
75
|
const end = chunk.indexOf(0x0a);
|
|
76
|
+
lineBytes += end === -1 ? chunk.length : end;
|
|
77
|
+
if (lineBytes > FIRST_LINE_LIMIT) {
|
|
78
|
+
stop();
|
|
79
|
+
resolve(undefined);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
58
82
|
if (end === -1) {
|
|
59
83
|
chunks.push(chunk);
|
|
60
84
|
return;
|
|
61
85
|
}
|
|
62
|
-
|
|
63
|
-
socket.off('close', onClose);
|
|
64
|
-
socket.pause();
|
|
86
|
+
stop();
|
|
65
87
|
const rest = chunk.subarray(end + 1);
|
|
66
88
|
if (rest.length > 0)
|
|
67
89
|
socket.unshift(rest);
|
|
@@ -71,7 +93,7 @@ function readLine(socket) {
|
|
|
71
93
|
socket.off('data', onData);
|
|
72
94
|
resolve(undefined);
|
|
73
95
|
};
|
|
74
|
-
// Every error is followed by `close`, which reports the lost
|
|
96
|
+
// Every error is followed by `close`, which reports the lost connection as no answer.
|
|
75
97
|
socket.on('error', () => { });
|
|
76
98
|
socket.on('data', onData);
|
|
77
99
|
socket.once('close', onClose);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handshake.js","sourceRoot":"","sources":["../../../src/lock-stores/socket/handshake.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAErD
|
|
1
|
+
{"version":3,"file":"handshake.js","sourceRoot":"","sources":["../../../src/lock-stores/socket/handshake.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,7 +38,7 @@ export class LockServer {
|
|
|
38
38
|
socket.unref();
|
|
39
39
|
connections.add(socket);
|
|
40
40
|
socket.once('close', () => connections.delete(socket));
|
|
41
|
-
//
|
|
41
|
+
// Only a process that speaks this protocol is served, so this coordinator never reads a message it would misread.
|
|
42
42
|
void welcome(socket).then((speaksOurs) => {
|
|
43
43
|
if (!speaksOurs)
|
|
44
44
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lock-server.js","sourceRoot":"","sources":["../../../src/lock-stores/socket/lock-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAA4B,YAAY,EAAE,MAAM,UAAU,CAAC;AAElE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAEvE,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAGL,aAAa,GACd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAO1D;;;GAGG;AACH,MAAM,OAAO,UAAU;IACZ,OAAO,CAAS;IAChB,YAAY,CAAc;IAC1B,WAAW,CAAa;IAEjC,YACE,MAAc,EACd,WAAwB,EACxB,UAAsB;QAEtB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAChC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAChC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,KAAK,CAChB,UAAkB,EAClB,UAAsB,EACtB,EAAE,WAAW,EAAqB;QAElC,iGAAiG;QACjG,sFAAsF;QACtF,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;gBAChD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC;oBAAE,MAAM,KAAK,CAAC;YAC7C,CAAC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC;YACtC,MAAM,EAAE,IAAI,gBAAgB,CAAC,UAAU,CAAC,KAAK,CAAC;YAC9C,WAAW;SACZ,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;QACtC,gHAAgH;QAChH,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,MAAM,EAAE,EAAE;YACrC,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YACvD,
|
|
1
|
+
{"version":3,"file":"lock-server.js","sourceRoot":"","sources":["../../../src/lock-stores/socket/lock-server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED