@plurnk/plurnk-schemes-http 1.3.11 → 1.4.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 +13 -11
- package/README.md +70 -23
- package/SPEC.md +461 -124
- package/dist/Browser.d.ts +2 -11
- package/dist/Browser.d.ts.map +1 -1
- package/dist/Browser.js +91 -69
- package/dist/Browser.js.map +1 -1
- 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 +94 -53
- package/dist/Guard.js.map +1 -1
- package/dist/Http.d.ts.map +1 -1
- package/dist/Http.js +782 -273
- package/dist/Http.js.map +1 -1
- package/dist/WebFetcher.d.ts +38 -2
- package/dist/WebFetcher.d.ts.map +1 -1
- package/dist/WebFetcher.js +189 -48
- package/dist/WebFetcher.js.map +1 -1
- package/dist/Ws.d.ts +5 -1
- package/dist/Ws.d.ts.map +1 -1
- package/dist/Ws.js +431 -93
- package/dist/Ws.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -9
- package/dist/index.js.map +1 -1
- package/docs/http.md +95 -53
- package/docs/wss.md +39 -43
- package/package.json +14 -11
- package/scripts/install-browser.mjs +0 -19
package/dist/Ws.js
CHANGED
|
@@ -1,35 +1,13 @@
|
|
|
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
|
+
// Default: the Node 26+ global WebSocket, reached through globalThis so the lib
|
|
33
11
|
// typing is not a compile dependency (tests always inject, so this path is
|
|
34
12
|
// runtime-only). Fail-hard if the runtime lacks it.
|
|
35
13
|
const connectGlobal = (url) => new globalThis.WebSocket(url);
|
|
@@ -39,7 +17,6 @@ export default class Ws {
|
|
|
39
17
|
channels: { [MESSAGES]: "text/plain" },
|
|
40
18
|
defaultChannel: MESSAGES,
|
|
41
19
|
category: "data",
|
|
42
|
-
scope: "workspace",
|
|
43
20
|
writableBy: ["model", "client"],
|
|
44
21
|
volatile: true,
|
|
45
22
|
modelVisible: true,
|
|
@@ -50,109 +27,470 @@ export default class Ws {
|
|
|
50
27
|
requiresWeb: true,
|
|
51
28
|
},
|
|
52
29
|
};
|
|
53
|
-
// The socket factory (injectable for tests) and the live-
|
|
54
|
-
//
|
|
55
|
-
//
|
|
30
|
+
// The socket factory (injectable for tests) and the live-owner registry.
|
|
31
|
+
// One READ owns each workspace+addressed scheme+canonical network pathname
|
|
32
|
+
// through terminal cleanup; SEND/KILL act only through that owner.
|
|
56
33
|
#connect;
|
|
57
34
|
#sockets = new Map();
|
|
58
35
|
constructor(connect = connectGlobal) {
|
|
59
36
|
this.#connect = connect;
|
|
60
37
|
}
|
|
61
|
-
//
|
|
62
|
-
//
|
|
63
|
-
// subscription
|
|
38
|
+
// {§ws-lifecycle} Claim and connect through native open plus durable channel
|
|
39
|
+
// activation. READ then returns 102 while the owner and its retained
|
|
40
|
+
// subscription continue to stream and settle independently.
|
|
64
41
|
async read(statement, ctx) {
|
|
65
42
|
if (statement.target === null || statement.target.kind !== "url") {
|
|
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);
|
|
43
|
+
return Ws.#bad(400, "bad-target", "READ requires a ws(s):// URL target.", {
|
|
44
|
+
stage: "target-validation",
|
|
45
|
+
recovery: "Provide a ws(s):// URL target.",
|
|
46
|
+
retryable: false,
|
|
47
|
+
});
|
|
81
48
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
return
|
|
49
|
+
const address = Ws.#address(statement.target);
|
|
50
|
+
if (!(address instanceof NetworkAddress))
|
|
51
|
+
return address;
|
|
52
|
+
const { url, pathname } = address;
|
|
53
|
+
const key = Ws.#key(ctx.workspaceId, address);
|
|
54
|
+
const existing = this.#sockets.get(key);
|
|
55
|
+
if (existing !== undefined) {
|
|
56
|
+
return Ws.#bad(409, "socket-already-claimed", `A WebSocket connection is already claimed for ${url}.`, {
|
|
57
|
+
target: url,
|
|
58
|
+
connectionState: existing.state,
|
|
59
|
+
stage: "connection",
|
|
60
|
+
recovery: "Use the existing owner after it opens or KILL it before opening another.",
|
|
61
|
+
retryable: false,
|
|
62
|
+
});
|
|
85
63
|
}
|
|
86
|
-
|
|
87
|
-
const
|
|
88
|
-
|
|
89
|
-
|
|
64
|
+
const done = Promise.withResolvers();
|
|
65
|
+
const owner = {
|
|
66
|
+
socket: null,
|
|
67
|
+
state: "claimed",
|
|
68
|
+
opened: false,
|
|
69
|
+
killRequested: false,
|
|
70
|
+
shutdownRequested: false,
|
|
71
|
+
async shutdown() { },
|
|
72
|
+
done: done.promise,
|
|
73
|
+
};
|
|
74
|
+
this.#sockets.set(key, owner);
|
|
75
|
+
let retained = false;
|
|
90
76
|
let settled = false;
|
|
91
|
-
|
|
92
|
-
|
|
77
|
+
try {
|
|
78
|
+
// {§ws-lifecycle} Seed the declared channel before subscription open.
|
|
79
|
+
const written = await ctx.entries.write(pathname, Ws.#seedEntry());
|
|
80
|
+
if (Results.isErrorStatus(written.status))
|
|
81
|
+
return Ws.#passthrough(written);
|
|
82
|
+
if (owner.shutdownRequested)
|
|
83
|
+
return Ws.#cancelled(url);
|
|
84
|
+
let requestCancel = () => { owner.shutdownRequested = true; };
|
|
85
|
+
const handle = { cancel: () => requestCancel() };
|
|
86
|
+
const subscription = await ctx.subscriptions.open(pathname, handle);
|
|
87
|
+
if (owner.shutdownRequested) {
|
|
88
|
+
const cancelled = Ws.#cancelled(url);
|
|
89
|
+
await subscription.close(cancelled, "WebSocket execution was cancelled.");
|
|
90
|
+
return cancelled;
|
|
91
|
+
}
|
|
92
|
+
let socket;
|
|
93
|
+
try {
|
|
94
|
+
socket = this.#connect(url);
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
console.error("WebSocket connection failed", { url, err });
|
|
98
|
+
const detail = `The WebSocket connection to ${url} failed.`;
|
|
99
|
+
const result = Ws.#bad(502, "connect-failed", detail, {
|
|
100
|
+
target: url,
|
|
101
|
+
stage: "connection",
|
|
102
|
+
retryable: true,
|
|
103
|
+
});
|
|
104
|
+
await subscription.close(result, detail);
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
owner.socket = socket;
|
|
108
|
+
owner.state = "connecting";
|
|
109
|
+
const acquisition = Promise.withResolvers();
|
|
110
|
+
let messages = 0;
|
|
111
|
+
let settlement = null;
|
|
112
|
+
let frameFailure = null;
|
|
113
|
+
const pending = new Set();
|
|
114
|
+
const settle = (terminal, summary, transportClose, initial = terminal) => {
|
|
93
115
|
if (settled)
|
|
94
|
-
return;
|
|
116
|
+
return settlement ?? Promise.resolve();
|
|
95
117
|
settled = true;
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
118
|
+
owner.state = "settling";
|
|
119
|
+
subscription.removeEventListener("abort", onAbort);
|
|
120
|
+
settlement = (async () => {
|
|
121
|
+
const errors = [];
|
|
122
|
+
try {
|
|
123
|
+
await Promise.allSettled([...pending]);
|
|
124
|
+
const failedFrame = frameFailure;
|
|
125
|
+
const effectiveTerminal = !Results.isErrorStatus(terminal.status) && failedFrame !== null
|
|
126
|
+
? failedFrame.result
|
|
127
|
+
: terminal;
|
|
128
|
+
const effectiveSummary = !Results.isErrorStatus(terminal.status) && failedFrame !== null
|
|
129
|
+
? failedFrame.summary
|
|
130
|
+
: typeof summary === "function" ? summary() : summary;
|
|
131
|
+
if (transportClose !== undefined) {
|
|
132
|
+
try {
|
|
133
|
+
socket.close(transportClose.code, transportClose.reason);
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
errors.push(error);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
try {
|
|
140
|
+
await subscription.close(effectiveTerminal, effectiveSummary);
|
|
141
|
+
if (!owner.opened)
|
|
142
|
+
acquisition.resolve(initial);
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
if (!owner.opened)
|
|
146
|
+
acquisition.reject(error);
|
|
147
|
+
errors.push(error);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
finally {
|
|
151
|
+
if (this.#sockets.get(key) === owner)
|
|
152
|
+
this.#sockets.delete(key);
|
|
153
|
+
done.resolve();
|
|
154
|
+
}
|
|
155
|
+
if (errors.length === 1)
|
|
156
|
+
throw errors[0];
|
|
157
|
+
if (errors.length > 1)
|
|
158
|
+
throw new AggregateError(errors, "WebSocket terminal cleanup failed");
|
|
159
|
+
})();
|
|
160
|
+
return settlement;
|
|
161
|
+
};
|
|
162
|
+
const reportCleanupFailure = (error) => {
|
|
163
|
+
console.error("WebSocket terminal cleanup failed", { url, error });
|
|
164
|
+
};
|
|
165
|
+
const track = (task) => {
|
|
166
|
+
pending.add(task);
|
|
167
|
+
void task.then(() => pending.delete(task), () => pending.delete(task));
|
|
168
|
+
return task;
|
|
169
|
+
};
|
|
170
|
+
const cancelled = () => Ws.#cancelled(url);
|
|
171
|
+
requestCancel = () => {
|
|
172
|
+
owner.shutdownRequested = true;
|
|
173
|
+
const result = cancelled();
|
|
174
|
+
void settle(result, "WebSocket execution was cancelled.", {
|
|
175
|
+
code: 1000,
|
|
176
|
+
reason: "cancelled",
|
|
177
|
+
}).catch(reportCleanupFailure);
|
|
99
178
|
};
|
|
179
|
+
owner.shutdown = () => {
|
|
180
|
+
const result = cancelled();
|
|
181
|
+
return settle(result, () => `ws closed (1001); ${messages} messages`, {
|
|
182
|
+
code: 1001,
|
|
183
|
+
reason: "shutdown",
|
|
184
|
+
});
|
|
185
|
+
};
|
|
186
|
+
const onAbort = () => requestCancel();
|
|
187
|
+
subscription.addEventListener("abort", onAbort, { once: true });
|
|
188
|
+
const setChannelState = ctx.channels.setState.bind(ctx.channels);
|
|
189
|
+
const streamEvent = ctx.notify.streamEvent.bind(ctx.notify);
|
|
190
|
+
let nativeOpened = false;
|
|
191
|
+
let activation = Promise.resolve();
|
|
192
|
+
let persistenceTail = Promise.resolve();
|
|
193
|
+
socket.addEventListener("open", () => {
|
|
194
|
+
if (owner.state !== "connecting")
|
|
195
|
+
return;
|
|
196
|
+
nativeOpened = true;
|
|
197
|
+
activation = track((async () => {
|
|
198
|
+
try {
|
|
199
|
+
const activated = await setChannelState(pathname, MESSAGES, "active");
|
|
200
|
+
if (Results.isErrorStatus(activated.status)) {
|
|
201
|
+
const result = Ws.#passthrough(activated);
|
|
202
|
+
void settle(result, result.problem?.detail ?? "WebSocket channel activation failed.", { code: 1011, reason: "activation failed" }).catch(reportCleanupFailure);
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
if (owner.state !== "connecting")
|
|
206
|
+
return;
|
|
207
|
+
streamEvent(pathname, MESSAGES, "active", 0);
|
|
208
|
+
owner.opened = true;
|
|
209
|
+
owner.state = "open";
|
|
210
|
+
acquisition.resolve({ shape: "passthrough", status: 102 });
|
|
211
|
+
}
|
|
212
|
+
catch (err) {
|
|
213
|
+
console.error("WebSocket channel activation failed", { url, err });
|
|
214
|
+
const result = Ws.#bad(500, "channel-activation-failed", "The WebSocket message channel could not enter its active state.", {
|
|
215
|
+
target: url,
|
|
216
|
+
stage: "persistence",
|
|
217
|
+
retryable: false,
|
|
218
|
+
});
|
|
219
|
+
void settle(result, result.problem?.detail ?? "WebSocket channel activation failed.", { code: 1011, reason: "activation failed" }).catch(reportCleanupFailure);
|
|
220
|
+
}
|
|
221
|
+
})());
|
|
222
|
+
}, { once: true });
|
|
223
|
+
// {§ws-lifecycle} One owner chain makes transport order independent
|
|
224
|
+
// of the subscription implementation's asynchronous scheduler.
|
|
100
225
|
socket.addEventListener("message", (event) => {
|
|
101
|
-
|
|
102
|
-
|
|
226
|
+
if (!nativeOpened || settled || frameFailure !== null)
|
|
227
|
+
return;
|
|
228
|
+
const data = event.data;
|
|
229
|
+
const persistence = persistenceTail.then(async () => {
|
|
230
|
+
await activation;
|
|
231
|
+
if (!owner.opened || frameFailure !== null)
|
|
232
|
+
return;
|
|
233
|
+
if (typeof data !== "string") {
|
|
234
|
+
const detail = "The received WebSocket frame is binary; the messages channel accepts text only.";
|
|
235
|
+
const result = Ws.#bad(415, "binary-frame-unsupported", detail, {
|
|
236
|
+
target: url,
|
|
237
|
+
stage: "materialization",
|
|
238
|
+
retryable: false,
|
|
239
|
+
});
|
|
240
|
+
frameFailure = { result, summary: detail };
|
|
241
|
+
void settle(result, detail, { code: 1003, reason: "binary unsupported" }).catch(reportCleanupFailure);
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
try {
|
|
245
|
+
await subscription.notifyChunk(MESSAGES, data, "text/plain");
|
|
246
|
+
messages += 1;
|
|
247
|
+
}
|
|
248
|
+
catch (err) {
|
|
249
|
+
if (frameFailure !== null)
|
|
250
|
+
return;
|
|
251
|
+
console.error("WebSocket message persistence failed", { url, err });
|
|
252
|
+
const result = Ws.#bad(500, "message-persistence-failed", "The received WebSocket message could not be persisted.", {
|
|
253
|
+
target: url,
|
|
254
|
+
stage: "persistence",
|
|
255
|
+
retryable: false,
|
|
256
|
+
});
|
|
257
|
+
const failureSummary = result.problem?.detail ?? "WebSocket message persistence failed.";
|
|
258
|
+
frameFailure = { result, summary: failureSummary };
|
|
259
|
+
void settle(result, failureSummary, { code: 1011, reason: "persistence failed" }).catch(reportCleanupFailure);
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
persistenceTail = persistence;
|
|
263
|
+
track(persistence);
|
|
103
264
|
});
|
|
104
265
|
socket.addEventListener("error", (event) => {
|
|
105
|
-
|
|
106
|
-
|
|
266
|
+
console.error("WebSocket transport failed", { url, message: event.message });
|
|
267
|
+
const detail = `The WebSocket connection to ${url} failed.`;
|
|
268
|
+
const result = Ws.#bad(502, "connection-failed", detail, {
|
|
269
|
+
target: url,
|
|
270
|
+
stage: "connection",
|
|
271
|
+
retryable: true,
|
|
272
|
+
});
|
|
273
|
+
void settle(result, detail, {
|
|
274
|
+
code: 1011,
|
|
275
|
+
reason: "transport failed",
|
|
276
|
+
}).catch(reportCleanupFailure);
|
|
107
277
|
});
|
|
108
278
|
socket.addEventListener("close", (event) => {
|
|
109
|
-
|
|
279
|
+
if (!owner.opened && !owner.killRequested && !subscription.aborted) {
|
|
280
|
+
const detail = `The WebSocket connection to ${url} closed before it opened.`;
|
|
281
|
+
const result = Ws.#bad(502, "connection-failed", detail, {
|
|
282
|
+
target: url,
|
|
283
|
+
stage: "connection",
|
|
284
|
+
retryable: true,
|
|
285
|
+
});
|
|
286
|
+
void settle(result, detail).catch(reportCleanupFailure);
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
const summary = () => `ws closed (${event.code ?? 0}); ${messages} messages`;
|
|
290
|
+
const initial = subscription.aborted ? cancelled() : { shape: "passthrough", status: 102 };
|
|
291
|
+
const terminal = subscription.aborted ? initial : { shape: "passthrough", status: 200 };
|
|
292
|
+
void settle(terminal, summary, undefined, initial).catch(reportCleanupFailure);
|
|
110
293
|
});
|
|
111
|
-
|
|
294
|
+
if (owner.shutdownRequested || subscription.aborted)
|
|
295
|
+
requestCancel();
|
|
296
|
+
const result = await acquisition.promise;
|
|
297
|
+
if (owner.opened && result.status === 102)
|
|
298
|
+
retained = true;
|
|
299
|
+
return result;
|
|
300
|
+
}
|
|
301
|
+
finally {
|
|
302
|
+
if (!retained && !settled) {
|
|
303
|
+
if (this.#sockets.get(key) === owner)
|
|
304
|
+
this.#sockets.delete(key);
|
|
305
|
+
done.resolve();
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
async close() {
|
|
310
|
+
const owners = [...this.#sockets.values()];
|
|
311
|
+
for (const owner of owners)
|
|
312
|
+
owner.shutdownRequested = true;
|
|
313
|
+
const results = await Promise.allSettled(owners.map(async (owner) => {
|
|
314
|
+
let shutdownError;
|
|
315
|
+
try {
|
|
316
|
+
await owner.shutdown();
|
|
317
|
+
}
|
|
318
|
+
catch (error) {
|
|
319
|
+
shutdownError = error;
|
|
320
|
+
}
|
|
321
|
+
await owner.done;
|
|
322
|
+
if (shutdownError !== undefined)
|
|
323
|
+
throw shutdownError;
|
|
324
|
+
}));
|
|
325
|
+
const errors = results
|
|
326
|
+
.filter((result) => result.status === "rejected")
|
|
327
|
+
.flatMap((result) => result.reason instanceof AggregateError
|
|
328
|
+
? [...result.reason.errors]
|
|
329
|
+
: [result.reason]);
|
|
330
|
+
if (errors.length > 0)
|
|
331
|
+
throw new AggregateError(errors, "WebSocket shutdown failed");
|
|
112
332
|
}
|
|
113
|
-
// SEND[200]
|
|
114
|
-
//
|
|
333
|
+
// SEND[200] targets only an open owner whose native transport is still OPEN.
|
|
334
|
+
// SEND[499] is routed to the owning READ handle; scheme dispatch is a no-op.
|
|
115
335
|
async send(statement, ctx) {
|
|
116
336
|
if (statement.target === null || statement.target.kind !== "url") {
|
|
117
|
-
return Ws.#bad(400, "
|
|
337
|
+
return Ws.#bad(400, "bad-target", "SEND requires a ws(s):// URL target.", {
|
|
338
|
+
stage: "target-validation",
|
|
339
|
+
recovery: "Provide a ws(s):// URL target.",
|
|
340
|
+
retryable: false,
|
|
341
|
+
});
|
|
118
342
|
}
|
|
119
343
|
const status = statement.signal;
|
|
120
344
|
if (status === 499)
|
|
121
345
|
return { shape: "passthrough", status: 200 };
|
|
122
346
|
if (status === 200) {
|
|
123
|
-
const
|
|
124
|
-
if (
|
|
125
|
-
return
|
|
347
|
+
const address = Ws.#address(statement.target);
|
|
348
|
+
if (!(address instanceof NetworkAddress))
|
|
349
|
+
return address;
|
|
350
|
+
const owner = this.#sockets.get(Ws.#key(ctx.workspaceId, address));
|
|
351
|
+
if (owner === undefined) {
|
|
352
|
+
return Ws.#bad(409, "no-open-socket", `No WebSocket connection is open for ${address.url}.`, {
|
|
353
|
+
target: address.url,
|
|
354
|
+
stage: "connection",
|
|
355
|
+
recovery: "READ the WebSocket URL before sending a message.",
|
|
356
|
+
retryable: false,
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
const socket = owner.socket;
|
|
360
|
+
if (owner.state !== "open" || socket === null || socket.readyState !== SOCKET_OPEN) {
|
|
361
|
+
const connectionState = owner.state === "open" && socket?.readyState !== SOCKET_OPEN
|
|
362
|
+
? "settling"
|
|
363
|
+
: owner.state;
|
|
364
|
+
if (connectionState === "settling")
|
|
365
|
+
owner.state = "settling";
|
|
366
|
+
return Ws.#bad(409, "socket-not-open", `The WebSocket connection to ${address.url} is ${connectionState}; SEND requires open.`, {
|
|
367
|
+
target: address.url,
|
|
368
|
+
connectionState,
|
|
369
|
+
stage: "connection",
|
|
370
|
+
recovery: connectionState === "settling"
|
|
371
|
+
? "Wait for the current READ to settle, then READ the WebSocket URL again."
|
|
372
|
+
: "Wait for the connection's active stream event before sending.",
|
|
373
|
+
retryable: connectionState !== "settling",
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
try {
|
|
377
|
+
socket.send(statement.body?.raw ?? "");
|
|
378
|
+
return { shape: "passthrough", status: 200 };
|
|
379
|
+
}
|
|
380
|
+
catch (err) {
|
|
381
|
+
console.error("WebSocket send failed", { target: address.url, err });
|
|
382
|
+
return Ws.#bad(502, "send-failed", "The WebSocket message could not be sent.", {
|
|
383
|
+
target: address.url,
|
|
384
|
+
stage: "transfer",
|
|
385
|
+
retryable: false,
|
|
386
|
+
});
|
|
126
387
|
}
|
|
127
|
-
socket.send(statement.body?.raw ?? "");
|
|
128
|
-
return { shape: "passthrough", status: 200 };
|
|
129
388
|
}
|
|
130
|
-
return Ws.#bad(501, "
|
|
389
|
+
return Ws.#bad(501, "send-status-unsupported", `The WebSocket scheme does not interpret SEND status ${status}.`, {
|
|
390
|
+
requestedStatus: status,
|
|
391
|
+
stage: "dispatch",
|
|
392
|
+
retryable: false,
|
|
393
|
+
});
|
|
131
394
|
}
|
|
132
|
-
// KILL
|
|
133
|
-
//
|
|
395
|
+
// KILL closes or cancels the one claimed owner. Its terminal path settles
|
|
396
|
+
// the READ subscription before releasing the address.
|
|
134
397
|
async kill(statement, ctx) {
|
|
135
398
|
if (statement.target === null || statement.target.kind !== "url") {
|
|
136
|
-
return Ws.#bad(400, "
|
|
399
|
+
return Ws.#bad(400, "bad-target", "KILL requires a ws(s):// URL target.", {
|
|
400
|
+
stage: "target-validation",
|
|
401
|
+
recovery: "Provide a ws(s):// URL target.",
|
|
402
|
+
retryable: false,
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
const address = Ws.#address(statement.target);
|
|
406
|
+
if (!(address instanceof NetworkAddress))
|
|
407
|
+
return address;
|
|
408
|
+
const owner = this.#sockets.get(Ws.#key(ctx.workspaceId, address));
|
|
409
|
+
if (owner === undefined) {
|
|
410
|
+
return Ws.#bad(404, "no-open-socket", `No WebSocket connection is open for ${address.url}.`, {
|
|
411
|
+
target: address.url,
|
|
412
|
+
stage: "connection",
|
|
413
|
+
retryable: false,
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
if (owner.state === "settling")
|
|
417
|
+
return { shape: "passthrough", status: 200 };
|
|
418
|
+
const socket = owner.socket;
|
|
419
|
+
if (socket === null) {
|
|
420
|
+
owner.killRequested = true;
|
|
421
|
+
owner.shutdownRequested = true;
|
|
422
|
+
owner.state = "settling";
|
|
423
|
+
return { shape: "passthrough", status: 200 };
|
|
137
424
|
}
|
|
138
|
-
const
|
|
139
|
-
|
|
140
|
-
|
|
425
|
+
const priorState = owner.state;
|
|
426
|
+
owner.killRequested = true;
|
|
427
|
+
owner.state = "settling";
|
|
428
|
+
try {
|
|
429
|
+
socket.close(1000, "killed");
|
|
430
|
+
return { shape: "passthrough", status: 200 };
|
|
431
|
+
}
|
|
432
|
+
catch (err) {
|
|
433
|
+
if (this.#sockets.get(Ws.#key(ctx.workspaceId, address)) === owner) {
|
|
434
|
+
owner.killRequested = false;
|
|
435
|
+
owner.state = priorState;
|
|
436
|
+
}
|
|
437
|
+
console.error("WebSocket close failed", { target: address.url, err });
|
|
438
|
+
return Ws.#bad(502, "close-failed", "The WebSocket connection could not be closed.", {
|
|
439
|
+
target: address.url,
|
|
440
|
+
stage: "connection",
|
|
441
|
+
retryable: true,
|
|
442
|
+
});
|
|
141
443
|
}
|
|
142
|
-
socket.close(1000, "killed");
|
|
143
|
-
return { shape: "passthrough", status: 200 };
|
|
144
444
|
}
|
|
145
|
-
static #key(workspaceId,
|
|
146
|
-
return `${workspaceId}:${pathname}`;
|
|
445
|
+
static #key(workspaceId, address) {
|
|
446
|
+
return `${workspaceId}:${address.scheme}:${address.pathname}`;
|
|
147
447
|
}
|
|
148
|
-
|
|
149
|
-
|
|
448
|
+
static #address(target) {
|
|
449
|
+
let address;
|
|
450
|
+
try {
|
|
451
|
+
address = NetworkAddress.from(target);
|
|
452
|
+
}
|
|
453
|
+
catch {
|
|
454
|
+
return Ws.#bad(400, "bad-target", "WebSocket operations require a ws(s):// URL with an authority.", {
|
|
455
|
+
stage: "target-validation",
|
|
456
|
+
recovery: "Provide a ws(s):// URL with a host.",
|
|
457
|
+
retryable: false,
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
if (address.scheme !== "ws" && address.scheme !== "wss") {
|
|
461
|
+
return Ws.#bad(400, "bad-target", "WebSocket operations require a ws(s):// URL target.", {
|
|
462
|
+
stage: "target-validation",
|
|
463
|
+
recovery: "Provide a ws(s):// URL target.",
|
|
464
|
+
retryable: false,
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
if (address.hasCredentials) {
|
|
468
|
+
return Ws.#bad(400, "userinfo-not-allowed", "WebSocket URL userinfo is not allowed.", {
|
|
469
|
+
target: address.url,
|
|
470
|
+
stage: "target-validation",
|
|
471
|
+
recovery: "Remove credentials from the URL.",
|
|
472
|
+
retryable: false,
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
return address;
|
|
476
|
+
}
|
|
477
|
+
// {§ws-lifecycle} open() binds an existing entry, so seed the manifest shape.
|
|
150
478
|
static #seedEntry() {
|
|
151
479
|
const channels = Object.fromEntries(Object.entries(Ws.manifest.channels).map(([name, mimetype]) => [name, { content: "", mimetype }]));
|
|
152
480
|
return { channels, tags: [] };
|
|
153
481
|
}
|
|
154
|
-
static #
|
|
155
|
-
return { shape: "passthrough"
|
|
482
|
+
static #passthrough(result) {
|
|
483
|
+
return Results.assert({ ...result, shape: "passthrough" });
|
|
484
|
+
}
|
|
485
|
+
static #cancelled(url) {
|
|
486
|
+
return Ws.#bad(499, "cancelled", "WebSocket execution was cancelled.", {
|
|
487
|
+
target: url,
|
|
488
|
+
stage: "connection",
|
|
489
|
+
retryable: false,
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
static #bad(status, kind, message, extensions = {}) {
|
|
493
|
+
return Results.failure("scheme:wss", kind, status, message, { shape: "passthrough" }, extensions);
|
|
156
494
|
}
|
|
157
495
|
}
|
|
158
496
|
//# 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":"AAAA,4EAA4E;AAC5E,8EAA8E;AAC9E,0EAA0E;AAC1E,gFAAgF;AAChF,yEAAyE;AACzE,0CAA0C;AAC1C,EAAE;AACF,oCAAoC;AACpC,gFAAgF;AAChF,8EAA8E;AAC9E,iFAAiF;AACjF,gFAAgF;AAChF,8EAA8E;AAC9E,uDAAuD;AACvD,EAAE;AACF,2EAA2E;AAC3E,mFAAmF;AACnF,gFAAgF;AAChF,oFAAoF;AACpF,gFAAgF;AAChF,mFAAmF;AACnF,EAAE;AACF,iFAAiF;AACjF,gFAAgF;AAChF,wBAAwB;AAaxB,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,MAAM,YAAY,CAAC;AAE/B,4EAA4E;AAC5E,MAAM,QAAQ,GAAG,UAAU,CAAC;AAE5B,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,IAAI,GAAG,CAAC,gBAAgB,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;AAkB1F,gFAAgF;AAChF,2EAA2E;AAC3E,oDAAoD;AACpD,MAAM,aAAa,GAAkB,CAAC,GAAG,EAAE,EAAE,CACzC,IAAK,UAAkE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAE3F,MAAM,CAAC,OAAO,OAAO,EAAE;IACnB,MAAM,CAAC,QAAQ,GAAmB;QAC9B,IAAI,EAAE,KAAK;QACX,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE;QACtC,cAAc,EAAE,QAAQ;QACxB,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,WAAW;QAClB,UAAU,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC;QAC/B,QAAQ,EAAE,IAAI;QACd,YAAY,EAAE,IAAI;QAClB,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,2CAA2C;QACpD,aAAa;QACb,KAAK,EAAE;YACH,WAAW,EAAE,IAAI;SACpB;KACJ,CAAC;IAEF,6EAA6E;IAC7E,gEAAgE;IAChE,qEAAqE;IAC5D,QAAQ,CAAgB;IACxB,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,YAAY,OAAO,GAAkB,aAAa;QAC9C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC5B,CAAC;IAED,6EAA6E;IAC7E,8EAA8E;IAC9E,2DAA2D;IAC3D,KAAK,CAAC,IAAI,CAAC,SAAwB,EAAE,GAAc;QAC/C,IAAI,SAAS,CAAC,MAAM,KAAK,IAAI,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC/D,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,qCAAqC,CAAC,CAAC;QAC7E,CAAC;QACD,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC;QACjC,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC3C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,GAAG,kCAAkC,CAAC,CAAC;QAClF,CAAC;QACD,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAE/C,wEAAwE;QACxE,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC;QAEnD,MAAM,MAAM,GAAuB,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;QACtG,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAEhE,IAAI,MAAc,CAAC;QACnB,IAAI,CAAC;YACD,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACzF,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5F,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAE/B,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACtD,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5D,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,OAAO,MAAM,IAAI,OAAO,CAAoB,CAAC,OAAO,EAAE,EAAE;YACpD,MAAM,MAAM,GAAG,CAAC,MAAyB,EAAE,MAAsC,EAAE,OAAe,EAAE,EAAE;gBAClG,IAAI,OAAO;oBAAE,OAAO;gBACpB,OAAO,GAAG,IAAI,CAAC;gBACf,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC1B,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC/C,KAAK,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;YAC9E,CAAC,CAAC;YACF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;gBACzC,QAAQ,IAAI,CAAC,CAAC;gBACd,KAAK,GAAG,CAAC,aAAa,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;YACzF,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBACvC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,IAAI,UAAU,CAAC;gBAC3C,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YAC9D,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBACvC,MAAM,CACF,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,EAC9D,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,EACvC,cAAc,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,QAAQ,WAAW,CACzD,CAAC;YACN,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;IAED,8EAA8E;IAC9E,6EAA6E;IAC7E,KAAK,CAAC,IAAI,CAAC,SAAwB,EAAE,GAAc;QAC/C,IAAI,SAAS,CAAC,MAAM,KAAK,IAAI,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC/D,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,qCAAqC,CAAC,CAAC;QAC7E,CAAC;QACD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QAChC,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QACjE,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YACtF,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACvB,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,EAAE,kBAAkB,SAAS,CAAC,MAAM,CAAC,QAAQ,kBAAkB,CAAC,CAAC;YACzG,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;YACvC,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QACjD,CAAC;QACD,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,EAAE,QAAQ,MAAM,wBAAwB,CAAC,CAAC;IACpF,CAAC;IAED,6EAA6E;IAC7E,0DAA0D;IAC1D,KAAK,CAAC,IAAI,CAAC,SAAwB,EAAE,GAAc;QAC/C,IAAI,SAAS,CAAC,MAAM,KAAK,IAAI,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC/D,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,qCAAqC,CAAC,CAAC;QAC7E,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtF,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,EAAE,kBAAkB,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzF,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC7B,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACjD,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,WAAmB,EAAE,QAAgB;QAC7C,OAAO,GAAG,WAAW,IAAI,QAAQ,EAAE,CAAC;IACxC,CAAC;IAED,6EAA6E;IAC7E,8EAA8E;IAC9E,MAAM,CAAC,UAAU;QACb,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAC/B,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CACpG,CAAC;QACF,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAClC,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,MAAc,EAAE,IAAY,EAAE,OAAe;QACrD,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;IACxF,CAAC;CACJ"}
|
|
1
|
+
{"version":3,"file":"Ws.js","sourceRoot":"","sources":["../src/Ws.ts"],"names":[],"mappings":"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"}
|