@plurnk/plurnk-schemes-http 1.3.12 → 1.5.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/.env.defaults +18 -46
- package/README.md +74 -23
- package/SPEC.md +487 -124
- package/dist/Config.d.ts +3 -0
- package/dist/Config.d.ts.map +1 -0
- package/dist/Config.js +18 -0
- package/dist/Config.js.map +1 -0
- package/dist/ContentType.d.ts +2 -0
- package/dist/ContentType.d.ts.map +1 -0
- package/dist/ContentType.js +15 -0
- package/dist/ContentType.js.map +1 -0
- package/dist/ErrorDetail.d.ts +6 -0
- package/dist/ErrorDetail.d.ts.map +1 -0
- package/dist/ErrorDetail.js +19 -0
- package/dist/ErrorDetail.js.map +1 -0
- package/dist/Guard.d.ts +1 -1
- package/dist/Guard.d.ts.map +1 -1
- package/dist/Guard.js +95 -55
- package/dist/Guard.js.map +1 -1
- package/dist/Http.d.ts +3 -16
- package/dist/Http.d.ts.map +1 -1
- package/dist/Http.js +817 -331
- package/dist/Http.js.map +1 -1
- package/dist/TavilyExtract.d.ts +35 -0
- package/dist/TavilyExtract.d.ts.map +1 -0
- package/dist/TavilyExtract.js +204 -0
- package/dist/TavilyExtract.js.map +1 -0
- package/dist/WebFetcher.d.ts +88 -18
- package/dist/WebFetcher.d.ts.map +1 -1
- package/dist/WebFetcher.js +588 -70
- package/dist/WebFetcher.js.map +1 -1
- package/dist/Ws.d.ts +7 -3
- package/dist/Ws.d.ts.map +1 -1
- package/dist/Ws.js +432 -96
- package/dist/Ws.js.map +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -10
- package/dist/index.js.map +1 -1
- package/docs/http.md +108 -53
- package/docs/wss.md +39 -43
- package/package.json +14 -13
- package/dist/Browser.d.ts +0 -84
- package/dist/Browser.d.ts.map +0 -1
- package/dist/Browser.js +0 -273
- package/dist/Browser.js.map +0 -1
- package/scripts/install-browser.mjs +0 -19
package/dist/Ws.js
CHANGED
|
@@ -1,35 +1,16 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
// an http content-type (that's SSE, Http.#streamEvents), so it's its own
|
|
6
|
-
// scheme, not a branch in the fetch path.
|
|
7
|
-
//
|
|
8
|
-
// Op → socket lifecycle (SPEC §ws):
|
|
9
|
-
// READ(wss://host/path) — open the socket; inbound frames stream into the
|
|
10
|
-
// `messages` channel; the op holds until close.
|
|
11
|
-
// SEND[200](wss://...):msg: — push `msg` onto the open socket (READ it first).
|
|
12
|
-
// SEND[499](wss://...) — cancel: the engine routes to the READ's handle,
|
|
13
|
-
// which closes the socket (scheme-level no-op).
|
|
14
|
-
// KILL(wss://...) — close the open socket.
|
|
15
|
-
//
|
|
16
|
-
// Stateful exception: every other scheme is stateless per the schemes SPEC
|
|
17
|
-
// §forbidden "no state past a handler return" rule. A live socket IS per-workspace
|
|
18
|
-
// state, so this engine holds open sockets in an in-instance registry across op
|
|
19
|
-
// invocations (keyed workspace+pathname) — the ONE sanctioned exception (SPEC §ws),
|
|
20
|
-
// because that persistence is the whole point of a WebSocket. Entries live only
|
|
21
|
-
// while the socket is open; every terminal path (close/error/KILL/cancel) removes.
|
|
22
|
-
//
|
|
23
|
-
// The SSRF Guard re-checks the target before connecting (a ws into private space
|
|
24
|
-
// is the same attack as a fetch). Node ≥22 global `WebSocket` at runtime; tests
|
|
25
|
-
// inject a fake socket.
|
|
26
|
-
import { Results } from "@plurnk/plurnk-schemes";
|
|
1
|
+
// WebSocket handler. {§ws} owns its operation surface; {§ws-lifecycle} owns
|
|
2
|
+
// address claims and settlement. Retained sockets follow {§handler-lifecycle}
|
|
3
|
+
// and use the canonical network identity {§network-address}.
|
|
4
|
+
import { NetworkAddress, Results } from "@plurnk/plurnk-schemes";
|
|
27
5
|
import { readFile } from "node:fs/promises";
|
|
28
|
-
|
|
29
|
-
// The inbound-frame channel — every message the origin pushes streams here.
|
|
6
|
+
// The inbound-frame channel - every message the origin pushes streams here.
|
|
30
7
|
const MESSAGES = "messages";
|
|
31
8
|
const documentation = await readFile(new URL("../docs/wss.md", import.meta.url), "utf-8");
|
|
32
|
-
|
|
9
|
+
const SOCKET_OPEN = 1;
|
|
10
|
+
const SOCKET_CLOSE_NORMAL = 1000;
|
|
11
|
+
const SOCKET_CLOSE_UNSUPPORTED_DATA = 4003;
|
|
12
|
+
const SOCKET_CLOSE_INTERNAL_ERROR = 4011;
|
|
13
|
+
// Default: the Node 26+ global WebSocket, reached through globalThis so the lib
|
|
33
14
|
// typing is not a compile dependency (tests always inject, so this path is
|
|
34
15
|
// runtime-only). Fail-hard if the runtime lacks it.
|
|
35
16
|
const connectGlobal = (url) => new globalThis.WebSocket(url);
|
|
@@ -39,120 +20,475 @@ export default class Ws {
|
|
|
39
20
|
channels: { [MESSAGES]: "text/plain" },
|
|
40
21
|
defaultChannel: MESSAGES,
|
|
41
22
|
category: "data",
|
|
42
|
-
scope: "workspace",
|
|
43
23
|
writableBy: ["model", "client"],
|
|
44
24
|
volatile: true,
|
|
45
25
|
modelVisible: true,
|
|
46
26
|
glyph: "🔌",
|
|
47
|
-
example: "<<READ(wss://
|
|
27
|
+
example: "<<READ(wss://api.example.com/feed)::READ",
|
|
48
28
|
documentation,
|
|
49
29
|
flags: {
|
|
50
30
|
requiresWeb: true,
|
|
51
31
|
},
|
|
52
32
|
};
|
|
53
|
-
// The socket factory (injectable for tests) and the live-
|
|
54
|
-
//
|
|
55
|
-
//
|
|
33
|
+
// The socket factory (injectable for tests) and the live-owner registry.
|
|
34
|
+
// One READ owns each workspace+addressed scheme+canonical network pathname
|
|
35
|
+
// through terminal cleanup; SEND/KILL act only through that owner.
|
|
56
36
|
#connect;
|
|
57
37
|
#sockets = new Map();
|
|
58
38
|
constructor(connect = connectGlobal) {
|
|
59
39
|
this.#connect = connect;
|
|
60
40
|
}
|
|
61
|
-
//
|
|
62
|
-
//
|
|
63
|
-
// subscription
|
|
64
|
-
async
|
|
65
|
-
if (
|
|
66
|
-
return Ws.#bad(400, "
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
return Ws.#bad(403, "ssrf_blocked", `${url} is not a public ws(s):// target`);
|
|
72
|
-
}
|
|
73
|
-
const key = Ws.#key(ctx.workspaceId, pathname);
|
|
74
|
-
// Create-then-subscribe (http#3): seed the messages channel, then bind.
|
|
75
|
-
await ctx.entries.write(pathname, Ws.#seedEntry());
|
|
76
|
-
const handle = { cancel: () => this.#sockets.get(key)?.close(1000, "cancelled") };
|
|
77
|
-
const composed = await ctx.subscriptions.open(pathname, handle);
|
|
78
|
-
let socket;
|
|
79
|
-
try {
|
|
80
|
-
socket = this.#connect(url);
|
|
41
|
+
// {§ws-lifecycle} Claim and connect through native open plus durable channel
|
|
42
|
+
// activation. READ then returns 102 while the owner and its retained
|
|
43
|
+
// subscription continue to stream and settle independently.
|
|
44
|
+
async prepareRepresentation(request, ctx) {
|
|
45
|
+
if (request.target.kind !== "url") {
|
|
46
|
+
return Ws.#bad(400, "bad-target", "READ requires a ws(s):// URL target.", {
|
|
47
|
+
stage: "target-validation",
|
|
48
|
+
recovery: "Provide a ws(s):// URL target.",
|
|
49
|
+
retryable: false,
|
|
50
|
+
});
|
|
81
51
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
return
|
|
52
|
+
const address = Ws.#address(request.target);
|
|
53
|
+
if (!(address instanceof NetworkAddress))
|
|
54
|
+
return address;
|
|
55
|
+
const { url } = address;
|
|
56
|
+
const pathname = request.pathname;
|
|
57
|
+
const key = Ws.#key(ctx.workspaceId, address);
|
|
58
|
+
const existing = this.#sockets.get(key);
|
|
59
|
+
if (existing !== undefined) {
|
|
60
|
+
return { status: 200, connectionState: existing.state };
|
|
85
61
|
}
|
|
86
|
-
|
|
87
|
-
const
|
|
88
|
-
|
|
89
|
-
|
|
62
|
+
const done = Promise.withResolvers();
|
|
63
|
+
const owner = {
|
|
64
|
+
socket: null,
|
|
65
|
+
state: "claimed",
|
|
66
|
+
opened: false,
|
|
67
|
+
killRequested: false,
|
|
68
|
+
shutdownRequested: false,
|
|
69
|
+
async shutdown() { },
|
|
70
|
+
done: done.promise,
|
|
71
|
+
};
|
|
72
|
+
this.#sockets.set(key, owner);
|
|
73
|
+
let retained = false;
|
|
90
74
|
let settled = false;
|
|
91
|
-
|
|
92
|
-
|
|
75
|
+
try {
|
|
76
|
+
// {§ws-lifecycle} Seed the declared channel before subscription open.
|
|
77
|
+
const written = await ctx.entries.write(pathname, Ws.#seedEntry());
|
|
78
|
+
if (Results.isErrorStatus(written.status))
|
|
79
|
+
return Ws.#passthrough(written);
|
|
80
|
+
if (owner.shutdownRequested)
|
|
81
|
+
return Ws.#cancelled(url);
|
|
82
|
+
let requestCancel = () => { owner.shutdownRequested = true; };
|
|
83
|
+
const handle = { cancel: () => requestCancel() };
|
|
84
|
+
const subscription = await ctx.subscriptions.open(pathname, handle);
|
|
85
|
+
if (owner.shutdownRequested) {
|
|
86
|
+
const cancelled = Ws.#cancelled(url);
|
|
87
|
+
await subscription.close(cancelled, "WebSocket execution was cancelled.");
|
|
88
|
+
return cancelled;
|
|
89
|
+
}
|
|
90
|
+
let socket;
|
|
91
|
+
try {
|
|
92
|
+
socket = this.#connect(url);
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
console.error("WebSocket connection failed", { url, err });
|
|
96
|
+
const detail = `The WebSocket connection to ${url} failed.`;
|
|
97
|
+
const result = Ws.#bad(502, "connect-failed", detail, {
|
|
98
|
+
target: url,
|
|
99
|
+
stage: "connection",
|
|
100
|
+
retryable: true,
|
|
101
|
+
});
|
|
102
|
+
await subscription.close(result, detail);
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
owner.socket = socket;
|
|
106
|
+
owner.state = "connecting";
|
|
107
|
+
const acquisition = Promise.withResolvers();
|
|
108
|
+
let messages = 0;
|
|
109
|
+
let settlement = null;
|
|
110
|
+
let frameFailure = null;
|
|
111
|
+
const pending = new Set();
|
|
112
|
+
const settle = (terminal, summary, transportClose, initial = terminal) => {
|
|
93
113
|
if (settled)
|
|
94
|
-
return;
|
|
114
|
+
return settlement ?? Promise.resolve();
|
|
95
115
|
settled = true;
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
116
|
+
owner.state = "settling";
|
|
117
|
+
subscription.removeEventListener("abort", onAbort);
|
|
118
|
+
settlement = (async () => {
|
|
119
|
+
const errors = [];
|
|
120
|
+
try {
|
|
121
|
+
await Promise.allSettled([...pending]);
|
|
122
|
+
const failedFrame = frameFailure;
|
|
123
|
+
const effectiveTerminal = !Results.isErrorStatus(terminal.status) && failedFrame !== null
|
|
124
|
+
? failedFrame.result
|
|
125
|
+
: terminal;
|
|
126
|
+
const effectiveSummary = !Results.isErrorStatus(terminal.status) && failedFrame !== null
|
|
127
|
+
? failedFrame.summary
|
|
128
|
+
: typeof summary === "function" ? summary() : summary;
|
|
129
|
+
if (transportClose !== undefined) {
|
|
130
|
+
try {
|
|
131
|
+
socket.close(transportClose.code, transportClose.reason);
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
errors.push(error);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
try {
|
|
138
|
+
await subscription.close(effectiveTerminal, effectiveSummary);
|
|
139
|
+
if (!owner.opened)
|
|
140
|
+
acquisition.resolve(initial);
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
if (!owner.opened)
|
|
144
|
+
acquisition.reject(error);
|
|
145
|
+
errors.push(error);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
if (this.#sockets.get(key) === owner)
|
|
150
|
+
this.#sockets.delete(key);
|
|
151
|
+
done.resolve();
|
|
152
|
+
}
|
|
153
|
+
if (errors.length === 1)
|
|
154
|
+
throw errors[0];
|
|
155
|
+
if (errors.length > 1)
|
|
156
|
+
throw new AggregateError(errors, "WebSocket terminal cleanup failed");
|
|
157
|
+
})();
|
|
158
|
+
return settlement;
|
|
159
|
+
};
|
|
160
|
+
const reportCleanupFailure = (error) => {
|
|
161
|
+
console.error("WebSocket terminal cleanup failed", { url, error });
|
|
162
|
+
};
|
|
163
|
+
const track = (task) => {
|
|
164
|
+
pending.add(task);
|
|
165
|
+
void task.then(() => pending.delete(task), () => pending.delete(task));
|
|
166
|
+
return task;
|
|
167
|
+
};
|
|
168
|
+
const cancelled = () => Ws.#cancelled(url);
|
|
169
|
+
requestCancel = () => {
|
|
170
|
+
owner.shutdownRequested = true;
|
|
171
|
+
const result = cancelled();
|
|
172
|
+
void settle(result, "WebSocket execution was cancelled.", {
|
|
173
|
+
code: SOCKET_CLOSE_NORMAL,
|
|
174
|
+
reason: "cancelled",
|
|
175
|
+
}).catch(reportCleanupFailure);
|
|
99
176
|
};
|
|
177
|
+
owner.shutdown = () => {
|
|
178
|
+
const result = cancelled();
|
|
179
|
+
return settle(result, () => `ws closed (${SOCKET_CLOSE_NORMAL}); ${messages} messages`, {
|
|
180
|
+
code: SOCKET_CLOSE_NORMAL,
|
|
181
|
+
reason: "shutdown",
|
|
182
|
+
});
|
|
183
|
+
};
|
|
184
|
+
const onAbort = () => requestCancel();
|
|
185
|
+
subscription.addEventListener("abort", onAbort, { once: true });
|
|
186
|
+
const setChannelState = ctx.channels.setState.bind(ctx.channels);
|
|
187
|
+
const streamEvent = ctx.notify.streamEvent.bind(ctx.notify);
|
|
188
|
+
let nativeOpened = false;
|
|
189
|
+
let activation = Promise.resolve();
|
|
190
|
+
let persistenceTail = Promise.resolve();
|
|
191
|
+
socket.addEventListener("open", () => {
|
|
192
|
+
if (owner.state !== "connecting")
|
|
193
|
+
return;
|
|
194
|
+
nativeOpened = true;
|
|
195
|
+
activation = track((async () => {
|
|
196
|
+
try {
|
|
197
|
+
const activated = await setChannelState(pathname, MESSAGES, "active");
|
|
198
|
+
if (Results.isErrorStatus(activated.status)) {
|
|
199
|
+
const result = Ws.#passthrough(activated);
|
|
200
|
+
void settle(result, result.problem?.detail ?? "WebSocket channel activation failed.", { code: SOCKET_CLOSE_INTERNAL_ERROR, reason: "activation failed" }).catch(reportCleanupFailure);
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
if (owner.state !== "connecting")
|
|
204
|
+
return;
|
|
205
|
+
streamEvent(pathname, MESSAGES, "active", 0);
|
|
206
|
+
owner.opened = true;
|
|
207
|
+
owner.state = "open";
|
|
208
|
+
acquisition.resolve({ shape: "passthrough", status: 102 });
|
|
209
|
+
}
|
|
210
|
+
catch (err) {
|
|
211
|
+
console.error("WebSocket channel activation failed", { url, err });
|
|
212
|
+
const result = Ws.#bad(500, "channel-activation-failed", "The WebSocket message channel could not enter its active state.", {
|
|
213
|
+
target: url,
|
|
214
|
+
stage: "persistence",
|
|
215
|
+
retryable: false,
|
|
216
|
+
});
|
|
217
|
+
void settle(result, result.problem?.detail ?? "WebSocket channel activation failed.", { code: SOCKET_CLOSE_INTERNAL_ERROR, reason: "activation failed" }).catch(reportCleanupFailure);
|
|
218
|
+
}
|
|
219
|
+
})());
|
|
220
|
+
}, { once: true });
|
|
221
|
+
// {§ws-lifecycle} One owner chain makes transport order independent
|
|
222
|
+
// of the subscription implementation's asynchronous scheduler.
|
|
100
223
|
socket.addEventListener("message", (event) => {
|
|
101
|
-
|
|
102
|
-
|
|
224
|
+
if (!nativeOpened || settled || frameFailure !== null)
|
|
225
|
+
return;
|
|
226
|
+
const data = event.data;
|
|
227
|
+
const persistence = persistenceTail.then(async () => {
|
|
228
|
+
await activation;
|
|
229
|
+
if (!owner.opened || frameFailure !== null)
|
|
230
|
+
return;
|
|
231
|
+
if (typeof data !== "string") {
|
|
232
|
+
const detail = "The received WebSocket frame is binary; the messages channel accepts text only.";
|
|
233
|
+
const result = Ws.#bad(415, "binary-frame-unsupported", detail, {
|
|
234
|
+
target: url,
|
|
235
|
+
stage: "materialization",
|
|
236
|
+
retryable: false,
|
|
237
|
+
});
|
|
238
|
+
frameFailure = { result, summary: detail };
|
|
239
|
+
void settle(result, detail, { code: SOCKET_CLOSE_UNSUPPORTED_DATA, reason: "binary unsupported" }).catch(reportCleanupFailure);
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
try {
|
|
243
|
+
await subscription.notifyChunk(MESSAGES, data, "text/plain");
|
|
244
|
+
messages += 1;
|
|
245
|
+
}
|
|
246
|
+
catch (err) {
|
|
247
|
+
if (frameFailure !== null)
|
|
248
|
+
return;
|
|
249
|
+
console.error("WebSocket message persistence failed", { url, err });
|
|
250
|
+
const result = Ws.#bad(500, "message-persistence-failed", "The received WebSocket message could not be persisted.", {
|
|
251
|
+
target: url,
|
|
252
|
+
stage: "persistence",
|
|
253
|
+
retryable: false,
|
|
254
|
+
});
|
|
255
|
+
const failureSummary = result.problem?.detail ?? "WebSocket message persistence failed.";
|
|
256
|
+
frameFailure = { result, summary: failureSummary };
|
|
257
|
+
void settle(result, failureSummary, { code: SOCKET_CLOSE_INTERNAL_ERROR, reason: "persistence failed" }).catch(reportCleanupFailure);
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
persistenceTail = persistence;
|
|
261
|
+
track(persistence);
|
|
103
262
|
});
|
|
104
263
|
socket.addEventListener("error", (event) => {
|
|
105
|
-
|
|
106
|
-
|
|
264
|
+
console.error("WebSocket transport failed", { url, message: event.message });
|
|
265
|
+
const detail = `The WebSocket connection to ${url} failed.`;
|
|
266
|
+
const result = Ws.#bad(502, "connection-failed", detail, {
|
|
267
|
+
target: url,
|
|
268
|
+
stage: "connection",
|
|
269
|
+
retryable: true,
|
|
270
|
+
});
|
|
271
|
+
void settle(result, detail, {
|
|
272
|
+
code: SOCKET_CLOSE_INTERNAL_ERROR,
|
|
273
|
+
reason: "transport failed",
|
|
274
|
+
}).catch(reportCleanupFailure);
|
|
107
275
|
});
|
|
108
276
|
socket.addEventListener("close", (event) => {
|
|
109
|
-
|
|
277
|
+
if (!owner.opened && !owner.killRequested && !subscription.aborted) {
|
|
278
|
+
const detail = `The WebSocket connection to ${url} closed before it opened.`;
|
|
279
|
+
const result = Ws.#bad(502, "connection-failed", detail, {
|
|
280
|
+
target: url,
|
|
281
|
+
stage: "connection",
|
|
282
|
+
retryable: true,
|
|
283
|
+
});
|
|
284
|
+
void settle(result, detail).catch(reportCleanupFailure);
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
const summary = () => `ws closed (${event.code ?? 0}); ${messages} messages`;
|
|
288
|
+
const initial = subscription.aborted ? cancelled() : { shape: "passthrough", status: 102 };
|
|
289
|
+
const terminal = subscription.aborted ? initial : { shape: "passthrough", status: 200 };
|
|
290
|
+
void settle(terminal, summary, undefined, initial).catch(reportCleanupFailure);
|
|
110
291
|
});
|
|
111
|
-
|
|
292
|
+
if (owner.shutdownRequested || subscription.aborted)
|
|
293
|
+
requestCancel();
|
|
294
|
+
const result = await acquisition.promise;
|
|
295
|
+
if (owner.opened && result.status === 102)
|
|
296
|
+
retained = true;
|
|
297
|
+
return result;
|
|
298
|
+
}
|
|
299
|
+
finally {
|
|
300
|
+
if (!retained && !settled) {
|
|
301
|
+
if (this.#sockets.get(key) === owner)
|
|
302
|
+
this.#sockets.delete(key);
|
|
303
|
+
done.resolve();
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
async close() {
|
|
308
|
+
const owners = [...this.#sockets.values()];
|
|
309
|
+
for (const owner of owners)
|
|
310
|
+
owner.shutdownRequested = true;
|
|
311
|
+
const results = await Promise.allSettled(owners.map(async (owner) => {
|
|
312
|
+
let shutdownError;
|
|
313
|
+
try {
|
|
314
|
+
await owner.shutdown();
|
|
315
|
+
}
|
|
316
|
+
catch (error) {
|
|
317
|
+
shutdownError = error;
|
|
318
|
+
}
|
|
319
|
+
await owner.done;
|
|
320
|
+
if (shutdownError !== undefined)
|
|
321
|
+
throw shutdownError;
|
|
322
|
+
}));
|
|
323
|
+
const errors = results
|
|
324
|
+
.filter((result) => result.status === "rejected")
|
|
325
|
+
.flatMap((result) => result.reason instanceof AggregateError
|
|
326
|
+
? [...result.reason.errors]
|
|
327
|
+
: [result.reason]);
|
|
328
|
+
if (errors.length > 0)
|
|
329
|
+
throw new AggregateError(errors, "WebSocket shutdown failed");
|
|
112
330
|
}
|
|
113
|
-
// SEND[200]
|
|
114
|
-
//
|
|
331
|
+
// SEND[200] targets only an open owner whose native transport is still OPEN.
|
|
332
|
+
// SEND[499] is routed to the owning READ handle; scheme dispatch is a no-op.
|
|
115
333
|
async send(statement, ctx) {
|
|
116
334
|
if (statement.target === null || statement.target.kind !== "url") {
|
|
117
|
-
return Ws.#bad(400, "
|
|
335
|
+
return Ws.#bad(400, "bad-target", "SEND requires a ws(s):// URL target.", {
|
|
336
|
+
stage: "target-validation",
|
|
337
|
+
recovery: "Provide a ws(s):// URL target.",
|
|
338
|
+
retryable: false,
|
|
339
|
+
});
|
|
118
340
|
}
|
|
119
341
|
const status = statement.signal;
|
|
120
342
|
if (status === 499)
|
|
121
343
|
return { shape: "passthrough", status: 200 };
|
|
122
344
|
if (status === 200) {
|
|
123
|
-
const
|
|
124
|
-
if (
|
|
125
|
-
return
|
|
345
|
+
const address = Ws.#address(statement.target);
|
|
346
|
+
if (!(address instanceof NetworkAddress))
|
|
347
|
+
return address;
|
|
348
|
+
const owner = this.#sockets.get(Ws.#key(ctx.workspaceId, address));
|
|
349
|
+
if (owner === undefined) {
|
|
350
|
+
return Ws.#bad(409, "no-open-socket", `No WebSocket connection is open for ${address.url}.`, {
|
|
351
|
+
target: address.url,
|
|
352
|
+
stage: "connection",
|
|
353
|
+
recovery: "READ the WebSocket URL before sending a message.",
|
|
354
|
+
retryable: false,
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
const socket = owner.socket;
|
|
358
|
+
if (owner.state !== "open" || socket === null || socket.readyState !== SOCKET_OPEN) {
|
|
359
|
+
const connectionState = owner.state === "open" && socket?.readyState !== SOCKET_OPEN
|
|
360
|
+
? "settling"
|
|
361
|
+
: owner.state;
|
|
362
|
+
if (connectionState === "settling")
|
|
363
|
+
owner.state = "settling";
|
|
364
|
+
return Ws.#bad(409, "socket-not-open", `The WebSocket connection to ${address.url} is ${connectionState}; SEND requires open.`, {
|
|
365
|
+
target: address.url,
|
|
366
|
+
connectionState,
|
|
367
|
+
stage: "connection",
|
|
368
|
+
recovery: connectionState === "settling"
|
|
369
|
+
? "Wait for the current READ to settle, then READ the WebSocket URL again."
|
|
370
|
+
: "Wait for the connection's active stream event before sending.",
|
|
371
|
+
retryable: connectionState !== "settling",
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
try {
|
|
375
|
+
socket.send(statement.body?.raw ?? "");
|
|
376
|
+
return { shape: "passthrough", status: 200 };
|
|
377
|
+
}
|
|
378
|
+
catch (err) {
|
|
379
|
+
console.error("WebSocket send failed", { target: address.url, err });
|
|
380
|
+
return Ws.#bad(502, "send-failed", "The WebSocket message could not be sent.", {
|
|
381
|
+
target: address.url,
|
|
382
|
+
stage: "transfer",
|
|
383
|
+
retryable: false,
|
|
384
|
+
});
|
|
126
385
|
}
|
|
127
|
-
socket.send(statement.body?.raw ?? "");
|
|
128
|
-
return { shape: "passthrough", status: 200 };
|
|
129
386
|
}
|
|
130
|
-
return Ws.#bad(501, "
|
|
387
|
+
return Ws.#bad(501, "send-status-unsupported", `The WebSocket scheme does not interpret SEND status ${status}.`, {
|
|
388
|
+
requestedStatus: status,
|
|
389
|
+
stage: "dispatch",
|
|
390
|
+
retryable: false,
|
|
391
|
+
});
|
|
131
392
|
}
|
|
132
|
-
// KILL
|
|
133
|
-
//
|
|
393
|
+
// KILL closes or cancels the one claimed owner. Its terminal path settles
|
|
394
|
+
// the READ subscription before releasing the address.
|
|
134
395
|
async kill(statement, ctx) {
|
|
135
396
|
if (statement.target === null || statement.target.kind !== "url") {
|
|
136
|
-
return Ws.#bad(400, "
|
|
397
|
+
return Ws.#bad(400, "bad-target", "KILL requires a ws(s):// URL target.", {
|
|
398
|
+
stage: "target-validation",
|
|
399
|
+
recovery: "Provide a ws(s):// URL target.",
|
|
400
|
+
retryable: false,
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
const address = Ws.#address(statement.target);
|
|
404
|
+
if (!(address instanceof NetworkAddress))
|
|
405
|
+
return address;
|
|
406
|
+
const owner = this.#sockets.get(Ws.#key(ctx.workspaceId, address));
|
|
407
|
+
if (owner === undefined) {
|
|
408
|
+
return Ws.#bad(404, "no-open-socket", `No WebSocket connection is open for ${address.url}.`, {
|
|
409
|
+
target: address.url,
|
|
410
|
+
stage: "connection",
|
|
411
|
+
retryable: false,
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
if (owner.state === "settling")
|
|
415
|
+
return { shape: "passthrough", status: 200 };
|
|
416
|
+
const socket = owner.socket;
|
|
417
|
+
if (socket === null) {
|
|
418
|
+
owner.killRequested = true;
|
|
419
|
+
owner.shutdownRequested = true;
|
|
420
|
+
owner.state = "settling";
|
|
421
|
+
return { shape: "passthrough", status: 200 };
|
|
137
422
|
}
|
|
138
|
-
const
|
|
139
|
-
|
|
140
|
-
|
|
423
|
+
const priorState = owner.state;
|
|
424
|
+
owner.killRequested = true;
|
|
425
|
+
owner.state = "settling";
|
|
426
|
+
try {
|
|
427
|
+
socket.close(1000, "killed");
|
|
428
|
+
return { shape: "passthrough", status: 200 };
|
|
429
|
+
}
|
|
430
|
+
catch (err) {
|
|
431
|
+
if (this.#sockets.get(Ws.#key(ctx.workspaceId, address)) === owner) {
|
|
432
|
+
owner.killRequested = false;
|
|
433
|
+
owner.state = priorState;
|
|
434
|
+
}
|
|
435
|
+
console.error("WebSocket close failed", { target: address.url, err });
|
|
436
|
+
return Ws.#bad(502, "close-failed", "The WebSocket connection could not be closed.", {
|
|
437
|
+
target: address.url,
|
|
438
|
+
stage: "connection",
|
|
439
|
+
retryable: true,
|
|
440
|
+
});
|
|
141
441
|
}
|
|
142
|
-
socket.close(1000, "killed");
|
|
143
|
-
return { shape: "passthrough", status: 200 };
|
|
144
442
|
}
|
|
145
|
-
static #key(workspaceId,
|
|
146
|
-
return `${workspaceId}:${pathname}`;
|
|
443
|
+
static #key(workspaceId, address) {
|
|
444
|
+
return `${workspaceId}:${address.scheme}:${address.pathname}`;
|
|
147
445
|
}
|
|
148
|
-
|
|
149
|
-
|
|
446
|
+
static #address(target) {
|
|
447
|
+
let address;
|
|
448
|
+
try {
|
|
449
|
+
address = NetworkAddress.from(target);
|
|
450
|
+
}
|
|
451
|
+
catch {
|
|
452
|
+
return Ws.#bad(400, "bad-target", "WebSocket operations require a ws(s):// URL with an authority.", {
|
|
453
|
+
stage: "target-validation",
|
|
454
|
+
recovery: "Provide a ws(s):// URL with a host.",
|
|
455
|
+
retryable: false,
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
if (address.scheme !== "ws" && address.scheme !== "wss") {
|
|
459
|
+
return Ws.#bad(400, "bad-target", "WebSocket operations require a ws(s):// URL target.", {
|
|
460
|
+
stage: "target-validation",
|
|
461
|
+
recovery: "Provide a ws(s):// URL target.",
|
|
462
|
+
retryable: false,
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
if (address.hasCredentials) {
|
|
466
|
+
return Ws.#bad(400, "userinfo-not-allowed", "WebSocket URL userinfo is not allowed.", {
|
|
467
|
+
target: address.url,
|
|
468
|
+
stage: "target-validation",
|
|
469
|
+
recovery: "Remove credentials from the URL.",
|
|
470
|
+
retryable: false,
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
return address;
|
|
474
|
+
}
|
|
475
|
+
// {§ws-lifecycle} open() binds an existing entry, so seed the manifest shape.
|
|
150
476
|
static #seedEntry() {
|
|
151
477
|
const channels = Object.fromEntries(Object.entries(Ws.manifest.channels).map(([name, mimetype]) => [name, { content: "", mimetype }]));
|
|
152
478
|
return { channels, tags: [] };
|
|
153
479
|
}
|
|
154
|
-
static #
|
|
155
|
-
return { shape: "passthrough"
|
|
480
|
+
static #passthrough(result) {
|
|
481
|
+
return Results.assert({ ...result, shape: "passthrough" });
|
|
482
|
+
}
|
|
483
|
+
static #cancelled(url) {
|
|
484
|
+
return Ws.#bad(499, "cancelled", "WebSocket execution was cancelled.", {
|
|
485
|
+
target: url,
|
|
486
|
+
stage: "connection",
|
|
487
|
+
retryable: false,
|
|
488
|
+
});
|
|
489
|
+
}
|
|
490
|
+
static #bad(status, kind, message, extensions = {}) {
|
|
491
|
+
return Results.failure("scheme:wss", kind, status, message, { shape: "passthrough" }, extensions);
|
|
156
492
|
}
|
|
157
493
|
}
|
|
158
494
|
//# sourceMappingURL=Ws.js.map
|
package/dist/Ws.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Ws.js","sourceRoot":"","sources":["../src/Ws.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Ws.js","sourceRoot":"","sources":["../src/Ws.ts"],"names":[],"mappings":"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"}
|