ssh-mcp-pro 1.1.5 → 1.2.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.
- package/CHANGELOG.md +29 -0
- package/README.md +47 -7
- package/SECURITY.md +4 -0
- package/SECURITY_DECISIONS.md +32 -1
- package/dist/agent-bin.js +0 -0
- package/dist/connector-profile.d.ts +3 -0
- package/dist/connector-profile.d.ts.map +1 -1
- package/dist/connector-profile.js +36 -14
- package/dist/connector-profile.js.map +1 -1
- package/dist/http-security.d.ts.map +1 -1
- package/dist/http-security.js +19 -4
- package/dist/http-security.js.map +1 -1
- package/dist/http-server-lifecycle.d.ts +17 -0
- package/dist/http-server-lifecycle.d.ts.map +1 -0
- package/dist/http-server-lifecycle.js +122 -0
- package/dist/http-server-lifecycle.js.map +1 -0
- package/dist/http-server-router.d.ts +28 -0
- package/dist/http-server-router.d.ts.map +1 -0
- package/dist/http-server-router.js +108 -0
- package/dist/http-server-router.js.map +1 -0
- package/dist/http-server-runtime.d.ts +21 -0
- package/dist/http-server-runtime.d.ts.map +1 -0
- package/dist/http-server-runtime.js +415 -0
- package/dist/http-server-runtime.js.map +1 -0
- package/dist/http-session-registry.d.ts.map +1 -1
- package/dist/http-session-registry.js.map +1 -1
- package/dist/index.js +12 -5
- package/dist/index.js.map +1 -1
- package/dist/mcp.d.ts +1 -1
- package/dist/mcp.js +1 -1
- package/dist/prompts.d.ts.map +1 -1
- package/dist/prompts.js +8 -1
- package/dist/prompts.js.map +1 -1
- package/dist/remote/agent-cli.d.ts.map +1 -1
- package/dist/remote/agent-cli.js +20 -1
- package/dist/remote/agent-cli.js.map +1 -1
- package/dist/remote/agent-connection-lifecycle.d.ts +47 -0
- package/dist/remote/agent-connection-lifecycle.d.ts.map +1 -0
- package/dist/remote/agent-connection-lifecycle.js +304 -0
- package/dist/remote/agent-connection-lifecycle.js.map +1 -0
- package/dist/remote/agent-executor.d.ts.map +1 -1
- package/dist/remote/agent-executor.js +93 -68
- package/dist/remote/agent-executor.js.map +1 -1
- package/dist/remote/agent-handler.d.ts +22 -8
- package/dist/remote/agent-handler.d.ts.map +1 -1
- package/dist/remote/agent-handler.js +151 -98
- package/dist/remote/agent-handler.js.map +1 -1
- package/dist/remote/config.d.ts.map +1 -1
- package/dist/remote/config.js +14 -0
- package/dist/remote/config.js.map +1 -1
- package/dist/remote/control-plane.d.ts.map +1 -1
- package/dist/remote/control-plane.js +3 -0
- package/dist/remote/control-plane.js.map +1 -1
- package/dist/remote/policy-update-guard.d.ts +14 -0
- package/dist/remote/policy-update-guard.d.ts.map +1 -0
- package/dist/remote/policy-update-guard.js +27 -0
- package/dist/remote/policy-update-guard.js.map +1 -0
- package/dist/remote/policy.d.ts.map +1 -1
- package/dist/remote/policy.js +13 -2
- package/dist/remote/policy.js.map +1 -1
- package/dist/remote/safe-file.d.ts +5 -0
- package/dist/remote/safe-file.d.ts.map +1 -0
- package/dist/remote/safe-file.js +194 -0
- package/dist/remote/safe-file.js.map +1 -0
- package/dist/remote/store.d.ts.map +1 -1
- package/dist/remote/store.js.map +1 -1
- package/dist/remote/types.d.ts +5 -0
- package/dist/remote/types.d.ts.map +1 -1
- package/dist/remote/websocket.d.ts +38 -13
- package/dist/remote/websocket.d.ts.map +1 -1
- package/dist/remote/websocket.js +90 -126
- package/dist/remote/websocket.js.map +1 -1
- package/dist/render-http.js +2 -1
- package/dist/render-http.js.map +1 -1
- package/dist/retry.d.ts.map +1 -1
- package/dist/retry.js +4 -2
- package/dist/retry.js.map +1 -1
- package/dist/server-http.d.ts +1 -1
- package/dist/server-http.d.ts.map +1 -1
- package/dist/server-http.js +1 -421
- package/dist/server-http.js.map +1 -1
- package/dist/tools/connector.provider.d.ts.map +1 -1
- package/dist/tools/connector.provider.js +2 -1
- package/dist/tools/connector.provider.js.map +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/docs/agent-runtime-config.md +34 -0
- package/docs/development/api-stability.md +44 -0
- package/docs/development/coding-standards.md +35 -0
- package/docs/development/commit-conventions.md +35 -0
- package/docs/development/dependency-management.md +60 -0
- package/docs/development/deprecation-policy.md +29 -0
- package/docs/development/local-setup.md +46 -0
- package/docs/development/release-process.md +57 -0
- package/docs/development/testing-policy.md +47 -0
- package/docs/explanation/architecture.md +44 -0
- package/docs/how-to/README.md +14 -0
- package/docs/how-to/configure-ssh-policy.md +50 -0
- package/docs/openssf-evidence.md +75 -0
- package/docs/openssf-gap-analysis.md +63 -0
- package/docs/openssf-proposal-links.md +37 -0
- package/docs/professionalization-plan.md +81 -0
- package/docs/reference/README.md +21 -0
- package/docs/reference/cli.md +41 -0
- package/docs/reference/compatibility.md +46 -0
- package/docs/reference/configuration.md +72 -0
- package/docs/remote-mcp-hardening.md +10 -0
- package/docs/repo-maturity-report.md +565 -0
- package/docs/security/assurance-case.md +58 -0
- package/docs/security/dependency-audit-exceptions.json +4 -0
- package/docs/security/dependency-audit-exceptions.md +15 -0
- package/docs/security/input-validation.md +54 -0
- package/docs/security/release-integrity.md +28 -0
- package/docs/security/scanning-policy.md +50 -0
- package/docs/security/secrets-management.md +49 -0
- package/docs/security/threat-model.md +65 -0
- package/docs/testing.md +24 -0
- package/docs/troubleshooting.md +56 -0
- package/docs/tutorials/getting-started.md +84 -0
- package/mcp.json +1 -1
- package/package.json +82 -68
- package/registry/ssh-mcp-pro/mcp.json +1 -1
- package/server.json +3 -3
package/dist/remote/websocket.js
CHANGED
|
@@ -1,139 +1,108 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import WebSocket, { WebSocketServer } from "ws";
|
|
2
|
+
export const MAX_AGENT_WEBSOCKET_MESSAGE_BYTES = 1_048_576;
|
|
3
|
+
const upgradeServer = new WebSocketServer({
|
|
4
|
+
noServer: true,
|
|
5
|
+
clientTracking: false,
|
|
6
|
+
maxPayload: MAX_AGENT_WEBSOCKET_MESSAGE_BYTES,
|
|
7
|
+
perMessageDeflate: false,
|
|
8
|
+
});
|
|
9
|
+
upgradeServer.on("wsClientError", (_error, socket) => {
|
|
10
|
+
socket.destroy();
|
|
11
|
+
});
|
|
12
|
+
/**
|
|
13
|
+
* Small application-facing adapter around the maintained `ws` protocol implementation.
|
|
14
|
+
*
|
|
15
|
+
* `ws` owns RFC 6455 framing, masking, fragmentation, UTF-8 validation, control-frame
|
|
16
|
+
* validation, close-code validation, and payload limits. This adapter intentionally exposes
|
|
17
|
+
* only the text-message and lifecycle operations needed by the remote agent control plane.
|
|
18
|
+
*/
|
|
2
19
|
export class MinimalWebSocketConnection {
|
|
3
|
-
|
|
4
|
-
static MAX_FRAME_BYTES = 1_048_576;
|
|
5
|
-
buffer = Buffer.alloc(0);
|
|
6
|
-
closed = false;
|
|
20
|
+
websocket;
|
|
7
21
|
closeNotified = false;
|
|
22
|
+
closeCode = 1006;
|
|
23
|
+
closeReason = "";
|
|
8
24
|
textHandlers = new Set();
|
|
9
25
|
closeHandlers = new Set();
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
26
|
+
pongHandlers = new Set();
|
|
27
|
+
constructor(websocket) {
|
|
28
|
+
this.websocket = websocket;
|
|
29
|
+
websocket.on("message", (data, isBinary) => this.handleMessage(data, isBinary));
|
|
30
|
+
websocket.on("pong", () => {
|
|
31
|
+
for (const handler of this.pongHandlers) {
|
|
32
|
+
handler();
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
websocket.on("close", (code, reason) => {
|
|
36
|
+
this.closeCode = code;
|
|
37
|
+
this.closeReason = reason.toString("utf8");
|
|
38
|
+
this.notifyClose();
|
|
39
|
+
});
|
|
40
|
+
websocket.on("error", () => {
|
|
41
|
+
if (websocket.readyState === WebSocket.CLOSED) {
|
|
42
|
+
this.notifyClose();
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
get isOpen() {
|
|
47
|
+
return this.websocket.readyState === WebSocket.OPEN;
|
|
48
|
+
}
|
|
49
|
+
get isClosed() {
|
|
50
|
+
return this.websocket.readyState === WebSocket.CLOSED;
|
|
22
51
|
}
|
|
23
52
|
onText(handler) {
|
|
24
53
|
this.textHandlers.add(handler);
|
|
25
|
-
this.drainFrames();
|
|
26
54
|
}
|
|
27
55
|
onClose(handler) {
|
|
28
56
|
this.closeHandlers.add(handler);
|
|
57
|
+
if (this.closeNotified) {
|
|
58
|
+
handler(this.closeCode, this.closeReason);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
onPong(handler) {
|
|
62
|
+
this.pongHandlers.add(handler);
|
|
29
63
|
}
|
|
30
64
|
sendJson(value) {
|
|
31
65
|
this.sendText(JSON.stringify(value));
|
|
32
66
|
}
|
|
33
67
|
sendText(value) {
|
|
34
|
-
if (this.
|
|
68
|
+
if (!this.isOpen) {
|
|
35
69
|
return;
|
|
36
70
|
}
|
|
37
71
|
const payload = Buffer.from(value, "utf8");
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
close() {
|
|
42
|
-
if (this.closed) {
|
|
72
|
+
if (payload.length > MAX_AGENT_WEBSOCKET_MESSAGE_BYTES) {
|
|
73
|
+
this.close(1009, "message too large");
|
|
43
74
|
return;
|
|
44
75
|
}
|
|
45
|
-
this.
|
|
46
|
-
this.socket.end(Buffer.from([0x88, 0x00]));
|
|
47
|
-
this.notifyClose();
|
|
76
|
+
this.websocket.send(payload, { binary: false });
|
|
48
77
|
}
|
|
49
|
-
|
|
50
|
-
if (this.
|
|
51
|
-
this.
|
|
78
|
+
ping() {
|
|
79
|
+
if (this.isOpen) {
|
|
80
|
+
this.websocket.ping();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
close(code = 1000, reason = "") {
|
|
84
|
+
if (this.websocket.readyState === WebSocket.CONNECTING) {
|
|
85
|
+
this.websocket.terminate();
|
|
52
86
|
return;
|
|
53
87
|
}
|
|
54
|
-
this.
|
|
55
|
-
|
|
88
|
+
if (this.websocket.readyState === WebSocket.OPEN) {
|
|
89
|
+
this.websocket.close(code, reason);
|
|
90
|
+
}
|
|
56
91
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
const second = this.buffer[1] ?? 0;
|
|
61
|
-
const opcode = first & 0x0f;
|
|
62
|
-
const masked = (second & 0x80) !== 0;
|
|
63
|
-
let length = second & 0x7f;
|
|
64
|
-
let offset = 2;
|
|
65
|
-
if (length === 126) {
|
|
66
|
-
if (this.buffer.length < 4) {
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
length = this.buffer.readUInt16BE(2);
|
|
70
|
-
offset = 4;
|
|
71
|
-
}
|
|
72
|
-
else if (length === 127) {
|
|
73
|
-
if (this.buffer.length < 10) {
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
const longLength = this.buffer.readBigUInt64BE(2);
|
|
77
|
-
if (longLength > BigInt(Number.MAX_SAFE_INTEGER)) {
|
|
78
|
-
this.close();
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
length = Number(longLength);
|
|
82
|
-
offset = 10;
|
|
83
|
-
}
|
|
84
|
-
if (length > MinimalWebSocketConnection.MAX_FRAME_BYTES) {
|
|
85
|
-
this.close();
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
const maskLength = masked ? 4 : 0;
|
|
89
|
-
if (this.buffer.length < offset + maskLength + length) {
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
const mask = masked ? this.buffer.subarray(offset, offset + 4) : undefined;
|
|
93
|
-
offset += maskLength;
|
|
94
|
-
const payload = Buffer.from(this.buffer.subarray(offset, offset + length));
|
|
95
|
-
this.buffer = this.buffer.subarray(offset + length);
|
|
96
|
-
if (mask) {
|
|
97
|
-
for (let index = 0; index < payload.length; index++) {
|
|
98
|
-
payload[index] = (payload[index] ?? 0) ^ (mask[index % 4] ?? 0);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
if (opcode === 0x8) {
|
|
102
|
-
this.close();
|
|
103
|
-
return;
|
|
104
|
-
}
|
|
105
|
-
if (opcode === 0x9) {
|
|
106
|
-
this.socket.write(Buffer.concat([this.createFrameHeader(payload.length, 0x0a), payload]));
|
|
107
|
-
continue;
|
|
108
|
-
}
|
|
109
|
-
if (opcode === 0x1) {
|
|
110
|
-
const message = payload.toString("utf8");
|
|
111
|
-
for (const handler of this.textHandlers) {
|
|
112
|
-
handler(message);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
92
|
+
terminate() {
|
|
93
|
+
if (!this.isClosed) {
|
|
94
|
+
this.websocket.terminate();
|
|
115
95
|
}
|
|
116
96
|
}
|
|
117
|
-
|
|
118
|
-
if (
|
|
119
|
-
|
|
97
|
+
handleMessage(data, isBinary) {
|
|
98
|
+
if (isBinary) {
|
|
99
|
+
this.close(1003, "text messages required");
|
|
100
|
+
return;
|
|
120
101
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
header[1] = 126;
|
|
125
|
-
header.writeUInt16BE(length, 2);
|
|
126
|
-
return header;
|
|
102
|
+
const message = rawDataToBuffer(data).toString("utf8");
|
|
103
|
+
for (const handler of this.textHandlers) {
|
|
104
|
+
handler(message);
|
|
127
105
|
}
|
|
128
|
-
const header = Buffer.alloc(10);
|
|
129
|
-
header[0] = 0x80 | opcode;
|
|
130
|
-
header[1] = 127;
|
|
131
|
-
header.writeBigUInt64BE(BigInt(length), 2);
|
|
132
|
-
return header;
|
|
133
|
-
}
|
|
134
|
-
handleClose() {
|
|
135
|
-
this.closed = true;
|
|
136
|
-
this.notifyClose();
|
|
137
106
|
}
|
|
138
107
|
notifyClose() {
|
|
139
108
|
if (this.closeNotified) {
|
|
@@ -141,27 +110,22 @@ export class MinimalWebSocketConnection {
|
|
|
141
110
|
}
|
|
142
111
|
this.closeNotified = true;
|
|
143
112
|
for (const handler of this.closeHandlers) {
|
|
144
|
-
handler();
|
|
113
|
+
handler(this.closeCode, this.closeReason);
|
|
145
114
|
}
|
|
146
115
|
}
|
|
147
116
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
117
|
+
function rawDataToBuffer(data) {
|
|
118
|
+
if (Buffer.isBuffer(data)) {
|
|
119
|
+
return data;
|
|
120
|
+
}
|
|
121
|
+
if (data instanceof ArrayBuffer) {
|
|
122
|
+
return Buffer.from(data);
|
|
153
123
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
socket.
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
"Connection: Upgrade",
|
|
161
|
-
`Sec-WebSocket-Accept: ${accept}`,
|
|
162
|
-
"",
|
|
163
|
-
"",
|
|
164
|
-
].join("\r\n"));
|
|
165
|
-
return new MinimalWebSocketConnection(socket, head);
|
|
124
|
+
return Buffer.concat(data);
|
|
125
|
+
}
|
|
126
|
+
export function acceptWebSocketUpgrade(req, socket, head, onAccepted) {
|
|
127
|
+
upgradeServer.handleUpgrade(req, socket, Buffer.from(head), (websocket) => {
|
|
128
|
+
onAccepted(new MinimalWebSocketConnection(websocket));
|
|
129
|
+
});
|
|
166
130
|
}
|
|
167
131
|
//# sourceMappingURL=websocket.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/remote/websocket.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/remote/websocket.ts"],"names":[],"mappings":"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"}
|
package/dist/render-http.js
CHANGED
|
@@ -10,5 +10,6 @@ if (bearerToken && !process.env.SSH_MCP_HTTP_BEARER_TOKEN_FILE) {
|
|
|
10
10
|
chmodSync(tokenPath, 0o600);
|
|
11
11
|
process.env.SSH_MCP_HTTP_BEARER_TOKEN_FILE = tokenPath;
|
|
12
12
|
}
|
|
13
|
-
await import("./server-http.js");
|
|
13
|
+
const { startHttpServer } = await import("./server-http.js");
|
|
14
|
+
await startHttpServer({ registerSignalHandlers: true });
|
|
14
15
|
//# sourceMappingURL=render-http.js.map
|
package/dist/render-http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-http.js","sourceRoot":"","sources":["../src/render-http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,IAAI,EAAE,CAAC;AAElE,IAAI,WAAW,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,CAAC;IAC/D,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;IAC7D,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IACjD,aAAa,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACzE,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,8BAA8B,GAAG,SAAS,CAAC;AACzD,CAAC;AAED,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"render-http.js","sourceRoot":"","sources":["../src/render-http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,IAAI,EAAE,CAAC;AAElE,IAAI,WAAW,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,CAAC;IAC/D,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;IAC7D,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IACjD,aAAa,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACzE,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,8BAA8B,GAAG,SAAS,CAAC;AACzD,CAAC;AAED,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAC7D,MAAM,eAAe,CAAC,EAAE,sBAAsB,EAAE,IAAI,EAAE,CAAC,CAAC"}
|
package/dist/retry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,cAAc,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,sCAAsC;IACtC,MAAM,EAAE,OAAO,CAAC;IAChB,kDAAkD;IAClD,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;IAC1C,qCAAqC;IACrC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACtE;AAED;;GAEG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,CAAC,CAAC;IACX,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,KAAK,oBAAoB,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAwDrE;;;GAGG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,OAAO,CAAC,YAAY,CAAM,GAClC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CA+CzB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,GAAE,OAAO,CAAC,YAAY,CAAM,IAEzD,SAAS,MAAM,EACf,cAAc,MAAM,EACpB,YAAY,uBAAuB,CAAC,oBAAoB,CAAC,mDAmB5D;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,CAAC,EAC3B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,OAAO,CAAC,YAAY,CAAM,GAClC,OAAO,CAAC,CAAC,CAAC,CAQZ"}
|
package/dist/retry.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { randomInt } from "node:crypto";
|
|
1
2
|
import { logger } from "./logging.js";
|
|
2
3
|
const DEFAULT_OPTIONS = {
|
|
3
4
|
maxAttempts: 3,
|
|
@@ -30,9 +31,10 @@ function calculateDelay(attempt, options) {
|
|
|
30
31
|
const exponentialDelay = options.initialDelayMs * Math.pow(options.backoffMultiplier, attempt - 1);
|
|
31
32
|
const cappedDelay = Math.min(exponentialDelay, options.maxDelayMs);
|
|
32
33
|
if (options.jitter) {
|
|
33
|
-
// Add random jitter: ±25% of the delay
|
|
34
|
+
// Add random jitter: ±25% of the delay using CSPRNG
|
|
34
35
|
const jitterRange = cappedDelay * 0.25;
|
|
35
|
-
const
|
|
36
|
+
const jitterUnit = randomInt(10001);
|
|
37
|
+
const jitter = ((jitterUnit / 10000) * 2 - 1) * jitterRange;
|
|
36
38
|
return Math.max(0, cappedDelay + jitter);
|
|
37
39
|
}
|
|
38
40
|
return cappedDelay;
|
package/dist/retry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAmCtC,MAAM,eAAe,GAAiB;IACpC,WAAW,EAAE,CAAC;IACd,cAAc,EAAE,IAAI;IACpB,UAAU,EAAE,KAAK;IACjB,iBAAiB,EAAE,CAAC;IACpB,MAAM,EAAE,IAAI;CACb,CAAC;AAEF;;GAEG;AACH,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAC5C,4BAA4B;QAC5B,OAAO,CACL,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;YAC9B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;YAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;YACzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC3B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CACnC,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,OAAe,EAAE,OAAqB;IAC5D,MAAM,gBAAgB,GACpB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;IAC5E,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAEnE,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"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"}
|
package/dist/server-http.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export
|
|
1
|
+
export * from "./http-server-runtime.js";
|
|
2
2
|
//# sourceMappingURL=server-http.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-http.d.ts","sourceRoot":"","sources":["../src/server-http.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"server-http.d.ts","sourceRoot":"","sources":["../src/server-http.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC"}
|