@plurnk/plurnk-schemes-http 1.3.12 → 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/dist/Ws.js CHANGED
@@ -1,35 +1,13 @@
1
- // ws(s):// scheme handler — this package's second first-class scheme (#468,
2
- // #473): registered `wss` via package.json plurnk.schemes ({ export: "Ws" });
3
- // the `ws` prefix rides it (core's schemeNameOf, mirroring https → http).
4
- // WebSocket IS a distinct protocol — bidirectional, stateful, full-duplex — not
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
- import Guard from "./Guard.js";
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
- // Default: the Node ≥22 global WebSocket, reached through globalThis so the lib
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-connection registry
54
- // — the stateless-contract exception (SPEC §ws). One socket per
55
- // workspace+pathname; SEND/KILL find the socket a prior READ opened.
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
- // READ → open the socket, stream inbound frames into `messages`, hold the op
62
- // until the socket closes (mirrors the http streaming lifecycle: 102 now, the
63
- // subscription drives content, the worker wakes on close).
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, "bad_target", "READ requires a ws(s):// URL target");
67
- }
68
- const url = statement.target.raw;
69
- const pathname = statement.target.pathname;
70
- if (!(await Guard.isPublicUrl(url))) {
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
- catch (err) {
83
- await ctx.subscriptions.close("error", err instanceof Error ? err.message : String(err));
84
- return Ws.#bad(502, "connect_failed", err instanceof Error ? err.message : String(err));
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
- this.#sockets.set(key, socket);
87
- const onAbort = () => socket.close(1000, "cancelled");
88
- composed.addEventListener("abort", onAbort, { once: true });
89
- let messages = 0;
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
- return await new Promise((resolve) => {
92
- const settle = (result, reason, outcome) => {
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
- this.#sockets.delete(key);
97
- composed.removeEventListener("abort", onAbort);
98
- void ctx.subscriptions.close(reason, outcome).then(() => resolve(result));
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
- messages += 1;
102
- void ctx.subscriptions.notifyChunk(MESSAGES, String(event.data ?? ""), "text/plain");
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
- const reason = event.message ?? "ws error";
106
- settle(Ws.#bad(502, "ws_error", reason), "error", reason);
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
- settle({ shape: "passthrough", status: composed.aborted ? 499 : 102 }, composed.aborted ? "cancelled" : "done", `ws closed (${event.code ?? 0}); ${messages} messages`);
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] → push a message onto the open socket. SEND[499] → cancel (engine
114
- // routes to the READ handle; scheme no-op, mirroring http). Other codes 501.
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, "bad_target", "SEND requires a ws(s):// URL target");
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 socket = this.#sockets.get(Ws.#key(ctx.workspaceId, statement.target.pathname));
124
- if (socket === undefined) {
125
- return Ws.#bad(409, "no_open_socket", `no open ws for ${statement.target.pathname} — READ it first`);
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, "unsupported_send", `SEND[${status}] not supported by wss`);
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 → close the open socket. The READ's close listener deregisters it and
133
- // settles the subscription, so KILL only trips the close.
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, "bad_target", "KILL requires a ws(s):// URL target");
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 socket = this.#sockets.get(Ws.#key(ctx.workspaceId, statement.target.pathname));
139
- if (socket === undefined) {
140
- return Ws.#bad(404, "no_open_socket", `no open ws for ${statement.target.pathname}`);
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, pathname) {
146
- return `${workspaceId}:${pathname}`;
445
+ static #key(workspaceId, address) {
446
+ return `${workspaceId}:${address.scheme}:${address.pathname}`;
147
447
  }
148
- // Seed entry mirroring the manifest channel (empty content + seed mimetype),
149
- // so open() binds an existing entry (http#3) — same shape as Http.#seedEntry.
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 #bad(status, kind, message) {
155
- return { shape: "passthrough", status, error: Results.error("wss", kind, message) };
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":"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"}
1
+ {"version":3,"file":"Ws.js","sourceRoot":"","sources":["../src/Ws.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,8EAA8E;AAC9E,6DAA6D;AAe7D,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,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;AAkC1F,MAAM,WAAW,GAAG,CAAC,CAAC;AAEtB,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,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,yEAAyE;IACzE,2EAA2E;IAC3E,mEAAmE;IAC1D,QAAQ,CAAgB;IACxB,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;IACnD,YAAY,OAAO,GAAkB,aAAa;QAC9C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC5B,CAAC;IAED,6EAA6E;IAC7E,qEAAqE;IACrE,4DAA4D;IAC5D,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,sCAAsC,EAAE;gBACtE,KAAK,EAAE,mBAAmB;gBAC1B,QAAQ,EAAE,gCAAgC;gBAC1C,SAAS,EAAE,KAAK;aACnB,CAAC,CAAC;QACP,CAAC;QACD,MAAM,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,CAAC,OAAO,YAAY,cAAc,CAAC;YAAE,OAAO,OAAO,CAAC;QACzD,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;QAClC,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,wBAAwB,EAAE,iDAAiD,GAAG,GAAG,EAAE;gBACnG,MAAM,EAAE,GAAG;gBACX,eAAe,EAAE,QAAQ,CAAC,KAAK;gBAC/B,KAAK,EAAE,YAAY;gBACnB,QAAQ,EAAE,0EAA0E;gBACpF,SAAS,EAAE,KAAK;aACnB,CAAC,CAAC;QACP,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,EAAQ,CAAC;QAC3C,MAAM,KAAK,GAAgB;YACvB,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,KAAK;YACb,aAAa,EAAE,KAAK;YACpB,iBAAiB,EAAE,KAAK;YACxB,KAAK,CAAC,QAAQ,KAAI,CAAC;YACnB,IAAI,EAAE,IAAI,CAAC,OAAO;SACrB,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9B,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,IAAI,CAAC;YACD,sEAAsE;YACtE,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC;YACnE,IAAI,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC;gBAAE,OAAO,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAC3E,IAAI,KAAK,CAAC,iBAAiB;gBAAE,OAAO,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAEvD,IAAI,aAAa,GAAG,GAAG,EAAE,GAAG,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAuB,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC;YACrE,MAAM,YAAY,GAAuB,MAAM,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACxF,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;gBAC1B,MAAM,SAAS,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBACrC,MAAM,YAAY,CAAC,KAAK,CAAC,SAAS,EAAE,oCAAoC,CAAC,CAAC;gBAC1E,OAAO,SAAS,CAAC;YACrB,CAAC;YAED,IAAI,MAAc,CAAC;YACnB,IAAI,CAAC;gBACD,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAChC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC3D,MAAM,MAAM,GAAG,+BAA+B,GAAG,UAAU,CAAC;gBAC5D,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE;oBAClD,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,YAAY;oBACnB,SAAS,EAAE,IAAI;iBAClB,CAAC,CAAC;gBACH,MAAM,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACzC,OAAO,MAAM,CAAC;YAClB,CAAC;YACD,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;YACtB,KAAK,CAAC,KAAK,GAAG,YAAY,CAAC;YAE3B,MAAM,WAAW,GAAG,OAAO,CAAC,aAAa,EAAqB,CAAC;YAC/D,IAAI,QAAQ,GAAG,CAAC,CAAC;YACjB,IAAI,UAAU,GAAyB,IAAI,CAAC;YAC5C,IAAI,YAAY,GAA0D,IAAI,CAAC;YAC/E,MAAM,OAAO,GAAG,IAAI,GAAG,EAAiB,CAAC;YACzC,MAAM,MAAM,GAAG,CACX,QAA2B,EAC3B,OAAgC,EAChC,cAAiD,EACjD,OAAO,GAAsB,QAAQ,EACxB,EAAE;gBACf,IAAI,OAAO;oBAAE,OAAO,UAAU,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpD,OAAO,GAAG,IAAI,CAAC;gBACf,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC;gBACzB,YAAY,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACnD,UAAU,GAAG,CAAC,KAAK,IAAI,EAAE;oBACrB,MAAM,MAAM,GAAc,EAAE,CAAC;oBAC7B,IAAI,CAAC;wBACD,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;wBACvC,MAAM,WAAW,GAAG,YAAY,CAAC;wBACjC,MAAM,iBAAiB,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,WAAW,KAAK,IAAI;4BACrF,CAAC,CAAC,WAAW,CAAC,MAAM;4BACpB,CAAC,CAAC,QAAQ,CAAC;wBACf,MAAM,gBAAgB,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,WAAW,KAAK,IAAI;4BACpF,CAAC,CAAC,WAAW,CAAC,OAAO;4BACrB,CAAC,CAAC,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;wBAC1D,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;4BAC/B,IAAI,CAAC;gCACD,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;4BAC7D,CAAC;4BAAC,OAAO,KAAK,EAAE,CAAC;gCACb,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;4BACvB,CAAC;wBACL,CAAC;wBACD,IAAI,CAAC;4BACD,MAAM,YAAY,CAAC,KAAK,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;4BAC9D,IAAI,CAAC,KAAK,CAAC,MAAM;gCAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;wBACpD,CAAC;wBAAC,OAAO,KAAK,EAAE,CAAC;4BACb,IAAI,CAAC,KAAK,CAAC,MAAM;gCAAE,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;4BAC7C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBACvB,CAAC;oBACL,CAAC;4BAAS,CAAC;wBACP,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK;4BAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;wBAChE,IAAI,CAAC,OAAO,EAAE,CAAC;oBACnB,CAAC;oBACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;wBAAE,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;oBACzC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;wBAAE,MAAM,IAAI,cAAc,CAAC,MAAM,EAAE,mCAAmC,CAAC,CAAC;gBACjG,CAAC,CAAC,EAAE,CAAC;gBACL,OAAO,UAAU,CAAC;YACtB,CAAC,CAAC;YACF,MAAM,oBAAoB,GAAG,CAAC,KAAc,EAAE,EAAE;gBAC5C,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YACvE,CAAC,CAAC;YACF,MAAM,KAAK,GAAG,CAAC,IAAmB,EAAiB,EAAE;gBACjD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAClB,KAAK,IAAI,CAAC,IAAI,CACV,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAC1B,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAC7B,CAAC;gBACF,OAAO,IAAI,CAAC;YAChB,CAAC,CAAC;YACF,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAC3C,aAAa,GAAG,GAAG,EAAE;gBACjB,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC;gBAC/B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;gBAC3B,KAAK,MAAM,CAAC,MAAM,EAAE,oCAAoC,EAAE;oBACtD,IAAI,EAAE,IAAI;oBACV,MAAM,EAAE,WAAW;iBACtB,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YACnC,CAAC,CAAC;YACF,KAAK,CAAC,QAAQ,GAAG,GAAG,EAAE;gBAClB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;gBAC3B,OAAO,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,qBAAqB,QAAQ,WAAW,EAAE;oBAClE,IAAI,EAAE,IAAI;oBACV,MAAM,EAAE,UAAU;iBACrB,CAAC,CAAC;YACP,CAAC,CAAC;YAEF,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;YACtC,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAChE,MAAM,eAAe,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACjE,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC5D,IAAI,YAAY,GAAG,KAAK,CAAC;YACzB,IAAI,UAAU,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;YAClD,IAAI,eAAe,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;YACvD,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE;gBACjC,IAAI,KAAK,CAAC,KAAK,KAAK,YAAY;oBAAE,OAAO;gBACzC,YAAY,GAAG,IAAI,CAAC;gBACpB,UAAU,GAAG,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE;oBAC3B,IAAI,CAAC;wBACD,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;wBACtE,IAAI,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;4BAC1C,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;4BAC1C,KAAK,MAAM,CACP,MAAM,EACN,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,sCAAsC,EAChE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAC9C,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;4BAC9B,OAAO;wBACX,CAAC;wBACD,IAAI,KAAK,CAAC,KAAK,KAAK,YAAY;4BAAE,OAAO;wBACzC,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;wBAC7C,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;wBACpB,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;wBACrB,WAAW,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;oBAC/D,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACX,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;wBACnE,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI,CAClB,GAAG,EACH,2BAA2B,EAC3B,iEAAiE,EACjE;4BACI,MAAM,EAAE,GAAG;4BACX,KAAK,EAAE,aAAa;4BACpB,SAAS,EAAE,KAAK;yBACnB,CACJ,CAAC;wBACF,KAAK,MAAM,CACP,MAAM,EACN,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,sCAAsC,EAChE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAC9C,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;oBAClC,CAAC;gBACL,CAAC,CAAC,EAAE,CAAC,CAAC;YACV,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACnB,oEAAoE;YACpE,+DAA+D;YAC/D,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;gBACzC,IAAI,CAAC,YAAY,IAAI,OAAO,IAAI,YAAY,KAAK,IAAI;oBAAE,OAAO;gBAC9D,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;oBAChD,MAAM,UAAU,CAAC;oBACjB,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,YAAY,KAAK,IAAI;wBAAE,OAAO;oBACnD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;wBAC3B,MAAM,MAAM,GAAG,iFAAiF,CAAC;wBACjG,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI,CAClB,GAAG,EACH,0BAA0B,EAC1B,MAAM,EACN;4BACI,MAAM,EAAE,GAAG;4BACX,KAAK,EAAE,iBAAiB;4BACxB,SAAS,EAAE,KAAK;yBACnB,CACJ,CAAC;wBACF,YAAY,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;wBAC3C,KAAK,MAAM,CACP,MAAM,EACN,MAAM,EACN,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAC/C,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;wBAC9B,OAAO;oBACX,CAAC;oBACD,IAAI,CAAC;wBACD,MAAM,YAAY,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;wBAC7D,QAAQ,IAAI,CAAC,CAAC;oBAClB,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACX,IAAI,YAAY,KAAK,IAAI;4BAAE,OAAO;wBAClC,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;wBACpE,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI,CAClB,GAAG,EACH,4BAA4B,EAC5B,wDAAwD,EACxD;4BACI,MAAM,EAAE,GAAG;4BACX,KAAK,EAAE,aAAa;4BACpB,SAAS,EAAE,KAAK;yBACnB,CACJ,CAAC;wBACF,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,uCAAuC,CAAC;wBACzF,YAAY,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;wBACnD,KAAK,MAAM,CACP,MAAM,EACN,cAAc,EACd,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAC/C,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;oBAClC,CAAC;gBACL,CAAC,CAAC,CAAC;gBACH,eAAe,GAAG,WAAW,CAAC;gBAC9B,KAAK,CAAC,WAAW,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBACvC,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC7E,MAAM,MAAM,GAAG,+BAA+B,GAAG,UAAU,CAAC;gBAC5D,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,mBAAmB,EAAE,MAAM,EAAE;oBACrD,MAAM,EAAE,GAAG;oBACX,KAAK,EAAE,YAAY;oBACnB,SAAS,EAAE,IAAI;iBAClB,CAAC,CAAC;gBACH,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE;oBACxB,IAAI,EAAE,IAAI;oBACV,MAAM,EAAE,kBAAkB;iBAC7B,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YACnC,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBACvC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;oBACjE,MAAM,MAAM,GAAG,+BAA+B,GAAG,2BAA2B,CAAC;oBAC7E,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,mBAAmB,EAAE,MAAM,EAAE;wBACrD,MAAM,EAAE,GAAG;wBACX,KAAK,EAAE,YAAY;wBACnB,SAAS,EAAE,IAAI;qBAClB,CAAC,CAAC;oBACH,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;oBACxD,OAAO;gBACX,CAAC;gBACD,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,cAAc,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,QAAQ,WAAW,CAAC;gBAC7E,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAW,CAAC;gBACpG,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAW,CAAC;gBACjG,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YACnF,CAAC,CAAC,CAAC;YAEH,IAAI,KAAK,CAAC,iBAAiB,IAAI,YAAY,CAAC,OAAO;gBAAE,aAAa,EAAE,CAAC;YACrE,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC;YACzC,IAAI,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG;gBAAE,QAAQ,GAAG,IAAI,CAAC;YAC3D,OAAO,MAAM,CAAC;QAClB,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC;gBACxB,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK;oBAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAChE,IAAI,CAAC,OAAO,EAAE,CAAC;YACnB,CAAC;QACL,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK;QACP,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3C,KAAK,MAAM,KAAK,IAAI,MAAM;YAAE,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC3D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YAChE,IAAI,aAAsB,CAAC;YAC3B,IAAI,CAAC;gBACD,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC3B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,aAAa,GAAG,KAAK,CAAC;YAC1B,CAAC;YACD,MAAM,KAAK,CAAC,IAAI,CAAC;YACjB,IAAI,aAAa,KAAK,SAAS;gBAAE,MAAM,aAAa,CAAC;QACzD,CAAC,CAAC,CAAC,CAAC;QACJ,MAAM,MAAM,GAAG,OAAO;aACjB,MAAM,CAAC,CAAC,MAAM,EAAmC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC;aACjF,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,YAAY,cAAc;YACxD,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;YAC3B,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3B,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,IAAI,cAAc,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC;IACzF,CAAC;IAED,6EAA6E;IAC7E,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,sCAAsC,EAAE;gBACtE,KAAK,EAAE,mBAAmB;gBAC1B,QAAQ,EAAE,gCAAgC;gBAC1C,SAAS,EAAE,KAAK;aACnB,CAAC,CAAC;QACP,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,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC9C,IAAI,CAAC,CAAC,OAAO,YAAY,cAAc,CAAC;gBAAE,OAAO,OAAO,CAAC;YACzD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;YACnE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACtB,OAAO,EAAE,CAAC,IAAI,CACV,GAAG,EACH,gBAAgB,EAChB,uCAAuC,OAAO,CAAC,GAAG,GAAG,EACrD;oBACI,MAAM,EAAE,OAAO,CAAC,GAAG;oBACnB,KAAK,EAAE,YAAY;oBACnB,QAAQ,EAAE,kDAAkD;oBAC5D,SAAS,EAAE,KAAK;iBACnB,CACJ,CAAC;YACN,CAAC;YACD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;YAC5B,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,UAAU,KAAK,WAAW,EAAE,CAAC;gBACjF,MAAM,eAAe,GAAG,KAAK,CAAC,KAAK,KAAK,MAAM,IAAI,MAAM,EAAE,UAAU,KAAK,WAAW;oBAChF,CAAC,CAAC,UAAU;oBACZ,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;gBAClB,IAAI,eAAe,KAAK,UAAU;oBAAE,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC;gBAC7D,OAAO,EAAE,CAAC,IAAI,CACV,GAAG,EACH,iBAAiB,EACjB,+BAA+B,OAAO,CAAC,GAAG,OAAO,eAAe,uBAAuB,EACvF;oBACI,MAAM,EAAE,OAAO,CAAC,GAAG;oBACnB,eAAe;oBACf,KAAK,EAAE,YAAY;oBACnB,QAAQ,EAAE,eAAe,KAAK,UAAU;wBACpC,CAAC,CAAC,yEAAyE;wBAC3E,CAAC,CAAC,+DAA+D;oBACrE,SAAS,EAAE,eAAe,KAAK,UAAU;iBAC5C,CACJ,CAAC;YACN,CAAC;YACD,IAAI,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;gBACvC,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;YACjD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;gBACrE,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,0CAA0C,EAAE;oBAC3E,MAAM,EAAE,OAAO,CAAC,GAAG;oBACnB,KAAK,EAAE,UAAU;oBACjB,SAAS,EAAE,KAAK;iBACnB,CAAC,CAAC;YACP,CAAC;QACL,CAAC;QACD,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,yBAAyB,EAAE,uDAAuD,MAAM,GAAG,EAAE;YAC7G,eAAe,EAAE,MAAM;YACvB,KAAK,EAAE,UAAU;YACjB,SAAS,EAAE,KAAK;SACnB,CAAC,CAAC;IACP,CAAC;IAED,0EAA0E;IAC1E,sDAAsD;IACtD,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,sCAAsC,EAAE;gBACtE,KAAK,EAAE,mBAAmB;gBAC1B,QAAQ,EAAE,gCAAgC;gBAC1C,SAAS,EAAE,KAAK;aACnB,CAAC,CAAC;QACP,CAAC;QACD,MAAM,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,CAAC,OAAO,YAAY,cAAc,CAAC;YAAE,OAAO,OAAO,CAAC;QACzD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;QACnE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtB,OAAO,EAAE,CAAC,IAAI,CACV,GAAG,EACH,gBAAgB,EAChB,uCAAuC,OAAO,CAAC,GAAG,GAAG,EACrD;gBACI,MAAM,EAAE,OAAO,CAAC,GAAG;gBACnB,KAAK,EAAE,YAAY;gBACnB,SAAS,EAAE,KAAK;aACnB,CACJ,CAAC;QACN,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,KAAK,UAAU;YAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAC7E,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5B,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAClB,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC;YAC3B,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAC/B,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC;YACzB,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QACjD,CAAC;QACD,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC;QAC/B,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC;QAC3B,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC;QACzB,IAAI,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC7B,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QACjD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;gBACjE,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC;gBAC5B,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC;YAC7B,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YACtE,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,+CAA+C,EAAE;gBACjF,MAAM,EAAE,OAAO,CAAC,GAAG;gBACnB,KAAK,EAAE,YAAY;gBACnB,SAAS,EAAE,IAAI;aAClB,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,WAAmB,EAAE,OAAuB;QACpD,OAAO,GAAG,WAAW,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAClE,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,MAAe;QAC3B,IAAI,OAAuB,CAAC;QAC5B,IAAI,CAAC;YACD,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,gEAAgE,EAAE;gBAChG,KAAK,EAAE,mBAAmB;gBAC1B,QAAQ,EAAE,qCAAqC;gBAC/C,SAAS,EAAE,KAAK;aACnB,CAAC,CAAC;QACP,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACtD,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,qDAAqD,EAAE;gBACrF,KAAK,EAAE,mBAAmB;gBAC1B,QAAQ,EAAE,gCAAgC;gBAC1C,SAAS,EAAE,KAAK;aACnB,CAAC,CAAC;QACP,CAAC;QACD,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YACzB,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,sBAAsB,EAAE,wCAAwC,EAAE;gBAClF,MAAM,EAAE,OAAO,CAAC,GAAG;gBACnB,KAAK,EAAE,mBAAmB;gBAC1B,QAAQ,EAAE,kCAAkC;gBAC5C,SAAS,EAAE,KAAK;aACnB,CAAC,CAAC;QACP,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,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,YAAY,CAAC,MAAqD;QACrE,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,CAAsB,CAAC;IACpF,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,GAAW;QACzB,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,oCAAoC,EAAE;YACnE,MAAM,EAAE,GAAG;YACX,KAAK,EAAE,YAAY;YACnB,SAAS,EAAE,KAAK;SACnB,CAAC,CAAC;IACP,CAAC;IAED,MAAM,CAAC,IAAI,CACP,MAAc,EACd,IAAY,EACZ,OAAe,EACf,UAAU,GAAsC,EAAE;QAElD,OAAO,OAAO,CAAC,OAAO,CAClB,YAAY,EACZ,IAAI,EACJ,MAAM,EACN,OAAO,EACP,EAAE,KAAK,EAAE,aAAa,EAAE,EACxB,UAAU,CACQ,CAAC;IAC3B,CAAC;CACJ"}