msw 2.11.6 → 2.12.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.
Files changed (41) hide show
  1. package/lib/core/index.d.mts +1 -0
  2. package/lib/core/index.d.ts +1 -0
  3. package/lib/core/index.js +2 -0
  4. package/lib/core/index.js.map +1 -1
  5. package/lib/core/index.mjs +4 -0
  6. package/lib/core/index.mjs.map +1 -1
  7. package/lib/core/sse.d.mts +116 -0
  8. package/lib/core/sse.d.ts +116 -0
  9. package/lib/core/sse.js +599 -0
  10. package/lib/core/sse.js.map +1 -0
  11. package/lib/core/sse.mjs +581 -0
  12. package/lib/core/sse.mjs.map +1 -0
  13. package/lib/core/utils/internal/isObject.d.mts +1 -1
  14. package/lib/core/utils/internal/isObject.d.ts +1 -1
  15. package/lib/core/utils/internal/isObject.js.map +1 -1
  16. package/lib/core/utils/internal/isObject.mjs.map +1 -1
  17. package/lib/core/ws/utils/attachWebSocketLogger.d.mts +7 -1
  18. package/lib/core/ws/utils/attachWebSocketLogger.d.ts +7 -1
  19. package/lib/core/ws/utils/attachWebSocketLogger.js +1 -0
  20. package/lib/core/ws/utils/attachWebSocketLogger.js.map +1 -1
  21. package/lib/core/ws/utils/attachWebSocketLogger.mjs +1 -0
  22. package/lib/core/ws/utils/attachWebSocketLogger.mjs.map +1 -1
  23. package/lib/core/ws/utils/getMessageLength.js +2 -1
  24. package/lib/core/ws/utils/getMessageLength.js.map +1 -1
  25. package/lib/core/ws/utils/getMessageLength.mjs +2 -1
  26. package/lib/core/ws/utils/getMessageLength.mjs.map +1 -1
  27. package/lib/core/ws/utils/getPublicData.js +2 -1
  28. package/lib/core/ws/utils/getPublicData.js.map +1 -1
  29. package/lib/core/ws/utils/getPublicData.mjs +2 -1
  30. package/lib/core/ws/utils/getPublicData.mjs.map +1 -1
  31. package/lib/iife/index.js +815 -252
  32. package/lib/iife/index.js.map +1 -1
  33. package/lib/mockServiceWorker.js +1 -1
  34. package/package.json +4 -3
  35. package/src/browser/tsconfig.browser.json +1 -1
  36. package/src/core/index.ts +9 -0
  37. package/src/core/sse.ts +897 -0
  38. package/src/core/utils/internal/isObject.ts +1 -1
  39. package/src/core/ws/utils/attachWebSocketLogger.ts +1 -1
  40. package/src/core/ws/utils/getMessageLength.ts +2 -1
  41. package/src/core/ws/utils/getPublicData.ts +3 -2
package/lib/iife/index.js CHANGED
@@ -13447,6 +13447,7 @@ ${operationTypes.join("\n")}
13447
13447
  onUnhandledRequest: () => onUnhandledRequest,
13448
13448
  passthrough: () => passthrough,
13449
13449
  setupWorker: () => setupWorker,
13450
+ sse: () => sse,
13450
13451
  ws: () => ws
13451
13452
  });
13452
13453
 
@@ -19288,6 +19289,820 @@ Consider naming this operation or using "graphql.operation()" request handler to
19288
19289
  link: createWebSocketLinkHandler
19289
19290
  };
19290
19291
 
19292
+ // src/core/delay.ts
19293
+ var SET_TIMEOUT_MAX_ALLOWED_INT = 2147483647;
19294
+ var MIN_SERVER_RESPONSE_TIME = 100;
19295
+ var MAX_SERVER_RESPONSE_TIME = 400;
19296
+ var NODE_SERVER_RESPONSE_TIME = 5;
19297
+ function getRealisticResponseTime() {
19298
+ if (isNodeProcess()) {
19299
+ return NODE_SERVER_RESPONSE_TIME;
19300
+ }
19301
+ return Math.floor(
19302
+ Math.random() * (MAX_SERVER_RESPONSE_TIME - MIN_SERVER_RESPONSE_TIME) + MIN_SERVER_RESPONSE_TIME
19303
+ );
19304
+ }
19305
+ async function delay(durationOrMode) {
19306
+ let delayTime;
19307
+ if (typeof durationOrMode === "string") {
19308
+ switch (durationOrMode) {
19309
+ case "infinite": {
19310
+ delayTime = SET_TIMEOUT_MAX_ALLOWED_INT;
19311
+ break;
19312
+ }
19313
+ case "real": {
19314
+ delayTime = getRealisticResponseTime();
19315
+ break;
19316
+ }
19317
+ default: {
19318
+ throw new Error(
19319
+ `Failed to delay a response: unknown delay mode "${durationOrMode}". Please make sure you provide one of the supported modes ("real", "infinite") or a number.`
19320
+ );
19321
+ }
19322
+ }
19323
+ } else if (typeof durationOrMode === "undefined") {
19324
+ delayTime = getRealisticResponseTime();
19325
+ } else {
19326
+ if (durationOrMode > SET_TIMEOUT_MAX_ALLOWED_INT) {
19327
+ throw new Error(
19328
+ `Failed to delay a response: provided delay duration (${durationOrMode}) exceeds the maximum allowed duration for "setTimeout" (${SET_TIMEOUT_MAX_ALLOWED_INT}). This will cause the response to be returned immediately. Please use a number within the allowed range to delay the response by exact duration, or consider the "infinite" delay mode to delay the response indefinitely.`
19329
+ );
19330
+ }
19331
+ delayTime = durationOrMode;
19332
+ }
19333
+ return new Promise((resolve) => setTimeout(resolve, delayTime));
19334
+ }
19335
+
19336
+ // src/core/utils/internal/isObject.ts
19337
+ function isObject2(value) {
19338
+ return value != null && typeof value === "object" && !Array.isArray(value);
19339
+ }
19340
+
19341
+ // src/core/ws/utils/getMessageLength.ts
19342
+ function getMessageLength(data) {
19343
+ if (data instanceof Blob) {
19344
+ return data.size;
19345
+ }
19346
+ if (isObject2(data) && "byteLength" in data) {
19347
+ return data.byteLength;
19348
+ }
19349
+ return new Blob([data]).size;
19350
+ }
19351
+
19352
+ // src/core/ws/utils/truncateMessage.ts
19353
+ var MAX_LENGTH = 24;
19354
+ function truncateMessage(message4) {
19355
+ if (message4.length <= MAX_LENGTH) {
19356
+ return message4;
19357
+ }
19358
+ return `${message4.slice(0, MAX_LENGTH)}\u2026`;
19359
+ }
19360
+
19361
+ // src/core/ws/utils/getPublicData.ts
19362
+ async function getPublicData(data) {
19363
+ if (data instanceof Blob) {
19364
+ const text = await data.text();
19365
+ return `Blob(${truncateMessage(text)})`;
19366
+ }
19367
+ if (isObject2(data)) {
19368
+ const text = new TextDecoder().decode(data);
19369
+ return `ArrayBuffer(${truncateMessage(text)})`;
19370
+ }
19371
+ return truncateMessage(data);
19372
+ }
19373
+
19374
+ // src/core/ws/utils/attachWebSocketLogger.ts
19375
+ var colors = {
19376
+ system: "#3b82f6",
19377
+ outgoing: "#22c55e",
19378
+ incoming: "#ef4444",
19379
+ mocked: "#ff6a33"
19380
+ };
19381
+ function attachWebSocketLogger(connection) {
19382
+ const { client, server } = connection;
19383
+ logConnectionOpen(client);
19384
+ client.addEventListener("message", (event) => {
19385
+ logOutgoingClientMessage(event);
19386
+ });
19387
+ client.addEventListener("close", (event) => {
19388
+ logConnectionClose(event);
19389
+ });
19390
+ client.socket.addEventListener("error", (event) => {
19391
+ logClientError(event);
19392
+ });
19393
+ client.send = new Proxy(client.send, {
19394
+ apply(target, thisArg, args) {
19395
+ const [data] = args;
19396
+ const messageEvent = new MessageEvent("message", { data });
19397
+ Object.defineProperties(messageEvent, {
19398
+ currentTarget: {
19399
+ enumerable: true,
19400
+ writable: false,
19401
+ value: client.socket
19402
+ },
19403
+ target: {
19404
+ enumerable: true,
19405
+ writable: false,
19406
+ value: client.socket
19407
+ }
19408
+ });
19409
+ queueMicrotask(() => {
19410
+ logIncomingMockedClientMessage(messageEvent);
19411
+ });
19412
+ return Reflect.apply(target, thisArg, args);
19413
+ }
19414
+ });
19415
+ server.addEventListener(
19416
+ "open",
19417
+ () => {
19418
+ server.addEventListener("message", (event) => {
19419
+ logIncomingServerMessage(event);
19420
+ });
19421
+ },
19422
+ { once: true }
19423
+ );
19424
+ server.send = new Proxy(server.send, {
19425
+ apply(target, thisArg, args) {
19426
+ const [data] = args;
19427
+ const messageEvent = new MessageEvent("message", { data });
19428
+ Object.defineProperties(messageEvent, {
19429
+ currentTarget: {
19430
+ enumerable: true,
19431
+ writable: false,
19432
+ value: server.socket
19433
+ },
19434
+ target: {
19435
+ enumerable: true,
19436
+ writable: false,
19437
+ value: server.socket
19438
+ }
19439
+ });
19440
+ logOutgoingMockedClientMessage(messageEvent);
19441
+ return Reflect.apply(target, thisArg, args);
19442
+ }
19443
+ });
19444
+ }
19445
+ function logConnectionOpen(client) {
19446
+ const publicUrl = toPublicUrl(client.url);
19447
+ console.groupCollapsed(
19448
+ devUtils.formatMessage(`${getTimestamp()} %c\u25B6%c ${publicUrl}`),
19449
+ `color:${colors.system}`,
19450
+ "color:inherit"
19451
+ );
19452
+ console.log("Client:", client.socket);
19453
+ console.groupEnd();
19454
+ }
19455
+ function logConnectionClose(event) {
19456
+ const target = event.target;
19457
+ const publicUrl = toPublicUrl(target.url);
19458
+ console.groupCollapsed(
19459
+ devUtils.formatMessage(
19460
+ `${getTimestamp({ milliseconds: true })} %c\u25A0%c ${publicUrl}`
19461
+ ),
19462
+ `color:${colors.system}`,
19463
+ "color:inherit"
19464
+ );
19465
+ console.log(event);
19466
+ console.groupEnd();
19467
+ }
19468
+ function logClientError(event) {
19469
+ const socket = event.target;
19470
+ const publicUrl = toPublicUrl(socket.url);
19471
+ console.groupCollapsed(
19472
+ devUtils.formatMessage(
19473
+ `${getTimestamp({ milliseconds: true })} %c\xD7%c ${publicUrl}`
19474
+ ),
19475
+ `color:${colors.system}`,
19476
+ "color:inherit"
19477
+ );
19478
+ console.log(event);
19479
+ console.groupEnd();
19480
+ }
19481
+ async function logOutgoingClientMessage(event) {
19482
+ const byteLength = getMessageLength(event.data);
19483
+ const publicData = await getPublicData(event.data);
19484
+ const arrow = event.defaultPrevented ? "\u21E1" : "\u2B06";
19485
+ console.groupCollapsed(
19486
+ devUtils.formatMessage(
19487
+ `${getTimestamp({ milliseconds: true })} %c${arrow}%c ${publicData} %c${byteLength}%c`
19488
+ ),
19489
+ `color:${colors.outgoing}`,
19490
+ "color:inherit",
19491
+ "color:gray;font-weight:normal",
19492
+ "color:inherit;font-weight:inherit"
19493
+ );
19494
+ console.log(event);
19495
+ console.groupEnd();
19496
+ }
19497
+ async function logOutgoingMockedClientMessage(event) {
19498
+ const byteLength = getMessageLength(event.data);
19499
+ const publicData = await getPublicData(event.data);
19500
+ console.groupCollapsed(
19501
+ devUtils.formatMessage(
19502
+ `${getTimestamp({ milliseconds: true })} %c\u2B06%c ${publicData} %c${byteLength}%c`
19503
+ ),
19504
+ `color:${colors.mocked}`,
19505
+ "color:inherit",
19506
+ "color:gray;font-weight:normal",
19507
+ "color:inherit;font-weight:inherit"
19508
+ );
19509
+ console.log(event);
19510
+ console.groupEnd();
19511
+ }
19512
+ async function logIncomingMockedClientMessage(event) {
19513
+ const byteLength = getMessageLength(event.data);
19514
+ const publicData = await getPublicData(event.data);
19515
+ console.groupCollapsed(
19516
+ devUtils.formatMessage(
19517
+ `${getTimestamp({ milliseconds: true })} %c\u2B07%c ${publicData} %c${byteLength}%c`
19518
+ ),
19519
+ `color:${colors.mocked}`,
19520
+ "color:inherit",
19521
+ "color:gray;font-weight:normal",
19522
+ "color:inherit;font-weight:inherit"
19523
+ );
19524
+ console.log(event);
19525
+ console.groupEnd();
19526
+ }
19527
+ async function logIncomingServerMessage(event) {
19528
+ const byteLength = getMessageLength(event.data);
19529
+ const publicData = await getPublicData(event.data);
19530
+ const arrow = event.defaultPrevented ? "\u21E3" : "\u2B07";
19531
+ console.groupCollapsed(
19532
+ devUtils.formatMessage(
19533
+ `${getTimestamp({ milliseconds: true })} %c${arrow}%c ${publicData} %c${byteLength}%c`
19534
+ ),
19535
+ `color:${colors.incoming}`,
19536
+ "color:inherit",
19537
+ "color:gray;font-weight:normal",
19538
+ "color:inherit;font-weight:inherit"
19539
+ );
19540
+ console.log(event);
19541
+ console.groupEnd();
19542
+ }
19543
+
19544
+ // src/core/sse.ts
19545
+ var sse = (path, resolver) => {
19546
+ return new ServerSentEventHandler(path, resolver);
19547
+ };
19548
+ var ServerSentEventHandler = class extends HttpHandler {
19549
+ constructor(path, resolver) {
19550
+ invariant(
19551
+ typeof EventSource !== "undefined",
19552
+ 'Failed to construct a Server-Sent Event handler for path "%s": the EventSource API is not supported in this environment',
19553
+ path
19554
+ );
19555
+ const clientEmitter = new Emitter();
19556
+ super("GET", path, async (info) => {
19557
+ const responseInit = {
19558
+ headers: {
19559
+ "content-type": "text/event-stream",
19560
+ "cache-control": "no-cache",
19561
+ connection: "keep-alive"
19562
+ }
19563
+ };
19564
+ await super.log({
19565
+ request: info.request,
19566
+ /**
19567
+ * @note Construct a placeholder response since SSE response
19568
+ * is being streamed and cannot be cloned/consumed for logging.
19569
+ */
19570
+ response: new Response("[streaming]", responseInit)
19571
+ });
19572
+ this.#attachClientLogger(info.request, clientEmitter);
19573
+ const stream = new ReadableStream({
19574
+ async start(controller) {
19575
+ const client = new ServerSentEventClient({
19576
+ controller,
19577
+ emitter: clientEmitter
19578
+ });
19579
+ const server = new ServerSentEventServer({
19580
+ request: info.request,
19581
+ client
19582
+ });
19583
+ await resolver({
19584
+ ...info,
19585
+ client,
19586
+ server
19587
+ });
19588
+ }
19589
+ });
19590
+ return new Response(stream, responseInit);
19591
+ });
19592
+ }
19593
+ async predicate(args) {
19594
+ if (args.request.headers.get("accept") !== "text/event-stream") {
19595
+ return false;
19596
+ }
19597
+ return super.predicate(args);
19598
+ }
19599
+ async log(_args) {
19600
+ return;
19601
+ }
19602
+ #attachClientLogger(request, emitter) {
19603
+ const publicUrl = toPublicUrl(request.url);
19604
+ emitter.on("message", (payload) => {
19605
+ console.groupCollapsed(
19606
+ devUtils.formatMessage(
19607
+ `${getTimestamp()} SSE %s %c\u21E3%c ${payload.event}`
19608
+ ),
19609
+ publicUrl,
19610
+ `color:${colors.mocked}`,
19611
+ "color:inherit"
19612
+ );
19613
+ console.log(payload.frames);
19614
+ console.groupEnd();
19615
+ });
19616
+ emitter.on("error", () => {
19617
+ console.groupCollapsed(
19618
+ devUtils.formatMessage(`${getTimestamp()} SSE %s %c\xD7%c error`),
19619
+ publicUrl,
19620
+ `color: ${colors.system}`,
19621
+ "color:inherit"
19622
+ );
19623
+ console.log("Handler:", this);
19624
+ console.groupEnd();
19625
+ });
19626
+ emitter.on("close", () => {
19627
+ console.groupCollapsed(
19628
+ devUtils.formatMessage(`${getTimestamp()} SSE %s %c\u25A0%c close`),
19629
+ publicUrl,
19630
+ `colors:${colors.system}`,
19631
+ "color:inherit"
19632
+ );
19633
+ console.log("Handler:", this);
19634
+ console.groupEnd();
19635
+ });
19636
+ }
19637
+ };
19638
+ var ServerSentEventClient = class {
19639
+ #encoder;
19640
+ #controller;
19641
+ #emitter;
19642
+ constructor(args) {
19643
+ this.#encoder = new TextEncoder();
19644
+ this.#controller = args.controller;
19645
+ this.#emitter = args.emitter;
19646
+ }
19647
+ /**
19648
+ * Sends the given payload to the intercepted `EventSource`.
19649
+ */
19650
+ send(payload) {
19651
+ if ("retry" in payload && payload.retry != null) {
19652
+ this.#sendRetry(payload.retry);
19653
+ return;
19654
+ }
19655
+ this.#sendMessage({
19656
+ id: payload.id,
19657
+ event: payload.event,
19658
+ data: typeof payload.data === "object" ? JSON.stringify(payload.data) : payload.data
19659
+ });
19660
+ }
19661
+ /**
19662
+ * Dispatches the given event on the intercepted `EventSource`.
19663
+ */
19664
+ dispatchEvent(event) {
19665
+ if (event instanceof MessageEvent) {
19666
+ this.#sendMessage({
19667
+ id: event.lastEventId || void 0,
19668
+ event: event.type === "message" ? void 0 : event.type,
19669
+ data: event.data
19670
+ });
19671
+ return;
19672
+ }
19673
+ if (event.type === "error") {
19674
+ this.error();
19675
+ return;
19676
+ }
19677
+ if (event.type === "close") {
19678
+ this.close();
19679
+ return;
19680
+ }
19681
+ }
19682
+ /**
19683
+ * Errors the underlying `EventSource`, closing the connection with an error.
19684
+ * This is equivalent to aborting the connection and will produce a `TypeError: Failed to fetch`
19685
+ * error.
19686
+ */
19687
+ error() {
19688
+ this.#controller.error();
19689
+ this.#emitter.emit("error");
19690
+ }
19691
+ /**
19692
+ * Closes the underlying `EventSource`, closing the connection.
19693
+ */
19694
+ close() {
19695
+ this.#controller.close();
19696
+ this.#emitter.emit("close");
19697
+ }
19698
+ #sendRetry(retry) {
19699
+ if (typeof retry === "number") {
19700
+ this.#controller.enqueue(this.#encoder.encode(`retry:${retry}
19701
+
19702
+ `));
19703
+ }
19704
+ }
19705
+ #sendMessage(message4) {
19706
+ const frames = [];
19707
+ if (message4.id) {
19708
+ frames.push(`id:${message4.id}`);
19709
+ }
19710
+ if (message4.event) {
19711
+ frames.push(`event:${message4.event?.toString()}`);
19712
+ }
19713
+ frames.push(`data:${message4.data}`);
19714
+ frames.push("", "");
19715
+ this.#controller.enqueue(this.#encoder.encode(frames.join("\n")));
19716
+ this.#emitter.emit("message", {
19717
+ id: message4.id,
19718
+ event: message4.event?.toString() || "message",
19719
+ data: message4.data,
19720
+ frames
19721
+ });
19722
+ }
19723
+ };
19724
+ var ServerSentEventServer = class {
19725
+ #request;
19726
+ #client;
19727
+ constructor(args) {
19728
+ this.#request = args.request;
19729
+ this.#client = args.client;
19730
+ }
19731
+ /**
19732
+ * Establishes the actual connection for this SSE request
19733
+ * and returns the `EventSource` instance.
19734
+ */
19735
+ connect() {
19736
+ const source = new ObservableEventSource(this.#request.url, {
19737
+ withCredentials: this.#request.credentials === "include",
19738
+ headers: {
19739
+ /**
19740
+ * @note Mark this request as passthrough so it doesn't trigger
19741
+ * an infinite loop matching against the existing request handler.
19742
+ */
19743
+ accept: "msw/passthrough"
19744
+ }
19745
+ });
19746
+ source[kOnAnyMessage] = (event) => {
19747
+ Object.defineProperties(event, {
19748
+ target: {
19749
+ value: this,
19750
+ enumerable: true,
19751
+ writable: true,
19752
+ configurable: true
19753
+ }
19754
+ });
19755
+ queueMicrotask(() => {
19756
+ if (!event.defaultPrevented) {
19757
+ this.#client.dispatchEvent(event);
19758
+ }
19759
+ });
19760
+ };
19761
+ source.addEventListener("error", (event) => {
19762
+ Object.defineProperties(event, {
19763
+ target: {
19764
+ value: this,
19765
+ enumerable: true,
19766
+ writable: true,
19767
+ configurable: true
19768
+ }
19769
+ });
19770
+ queueMicrotask(() => {
19771
+ if (!event.defaultPrevented) {
19772
+ this.#client.dispatchEvent(event);
19773
+ }
19774
+ });
19775
+ });
19776
+ return source;
19777
+ }
19778
+ };
19779
+ var kRequest = Symbol("kRequest");
19780
+ var kReconnectionTime = Symbol("kReconnectionTime");
19781
+ var kLastEventId = Symbol("kLastEventId");
19782
+ var kAbortController = Symbol("kAbortController");
19783
+ var kOnOpen = Symbol("kOnOpen");
19784
+ var kOnMessage = Symbol("kOnMessage");
19785
+ var kOnAnyMessage = Symbol("kOnAnyMessage");
19786
+ var kOnError = Symbol("kOnError");
19787
+ var ObservableEventSource = class _ObservableEventSource extends EventTarget {
19788
+ static CONNECTING = 0;
19789
+ static OPEN = 1;
19790
+ static CLOSED = 2;
19791
+ CONNECTING = _ObservableEventSource.CONNECTING;
19792
+ OPEN = _ObservableEventSource.OPEN;
19793
+ CLOSED = _ObservableEventSource.CLOSED;
19794
+ readyState;
19795
+ url;
19796
+ withCredentials;
19797
+ [kRequest];
19798
+ [kReconnectionTime];
19799
+ [kLastEventId];
19800
+ [kAbortController];
19801
+ [kOnOpen] = null;
19802
+ [kOnMessage] = null;
19803
+ [kOnAnyMessage] = null;
19804
+ [kOnError] = null;
19805
+ constructor(url, init) {
19806
+ super();
19807
+ this.url = new URL(url).href;
19808
+ this.withCredentials = init?.withCredentials ?? false;
19809
+ this.readyState = this.CONNECTING;
19810
+ const headers = new Headers(init?.headers || {});
19811
+ headers.append("accept", "text/event-stream");
19812
+ this[kAbortController] = new AbortController();
19813
+ this[kReconnectionTime] = 2e3;
19814
+ this[kLastEventId] = "";
19815
+ this[kRequest] = new Request(this.url, {
19816
+ method: "GET",
19817
+ headers,
19818
+ credentials: this.withCredentials ? "include" : "omit",
19819
+ signal: this[kAbortController].signal
19820
+ });
19821
+ this.connect();
19822
+ }
19823
+ get onopen() {
19824
+ return this[kOnOpen];
19825
+ }
19826
+ set onopen(handler) {
19827
+ if (this[kOnOpen]) {
19828
+ this.removeEventListener("open", this[kOnOpen]);
19829
+ }
19830
+ this[kOnOpen] = handler.bind(this);
19831
+ this.addEventListener("open", this[kOnOpen]);
19832
+ }
19833
+ get onmessage() {
19834
+ return this[kOnMessage];
19835
+ }
19836
+ set onmessage(handler) {
19837
+ if (this[kOnMessage]) {
19838
+ this.removeEventListener("message", { handleEvent: this[kOnMessage] });
19839
+ }
19840
+ this[kOnMessage] = handler.bind(this);
19841
+ this.addEventListener("message", { handleEvent: this[kOnMessage] });
19842
+ }
19843
+ get onerror() {
19844
+ return this[kOnError];
19845
+ }
19846
+ set oneerror(handler) {
19847
+ if (this[kOnError]) {
19848
+ this.removeEventListener("error", { handleEvent: this[kOnError] });
19849
+ }
19850
+ this[kOnError] = handler.bind(this);
19851
+ this.addEventListener("error", { handleEvent: this[kOnError] });
19852
+ }
19853
+ addEventListener(type, listener, options) {
19854
+ super.addEventListener(
19855
+ type,
19856
+ listener,
19857
+ options
19858
+ );
19859
+ }
19860
+ removeEventListener(type, listener, options) {
19861
+ super.removeEventListener(
19862
+ type,
19863
+ listener,
19864
+ options
19865
+ );
19866
+ }
19867
+ dispatchEvent(event) {
19868
+ return super.dispatchEvent(event);
19869
+ }
19870
+ close() {
19871
+ this[kAbortController].abort();
19872
+ this.readyState = this.CLOSED;
19873
+ }
19874
+ async connect() {
19875
+ await fetch(this[kRequest]).then((response) => {
19876
+ this.processResponse(response);
19877
+ }).catch(() => {
19878
+ this.failConnection();
19879
+ });
19880
+ }
19881
+ processResponse(response) {
19882
+ if (!response.body) {
19883
+ this.failConnection();
19884
+ return;
19885
+ }
19886
+ if (isNetworkError(response)) {
19887
+ this.reestablishConnection();
19888
+ return;
19889
+ }
19890
+ if (response.status !== 200 || response.headers.get("content-type") !== "text/event-stream") {
19891
+ this.failConnection();
19892
+ return;
19893
+ }
19894
+ this.announceConnection();
19895
+ this.interpretResponseBody(response);
19896
+ }
19897
+ announceConnection() {
19898
+ queueMicrotask(() => {
19899
+ if (this.readyState !== this.CLOSED) {
19900
+ this.readyState = this.OPEN;
19901
+ this.dispatchEvent(new Event("open"));
19902
+ }
19903
+ });
19904
+ }
19905
+ interpretResponseBody(response) {
19906
+ const parsingStream = new EventSourceParsingStream({
19907
+ message: (message4) => {
19908
+ if (message4.id) {
19909
+ this[kLastEventId] = message4.id;
19910
+ }
19911
+ if (message4.retry) {
19912
+ this[kReconnectionTime] = message4.retry;
19913
+ }
19914
+ const messageEvent = new MessageEvent(
19915
+ message4.event ? message4.event : "message",
19916
+ {
19917
+ data: message4.data,
19918
+ origin: this[kRequest].url,
19919
+ lastEventId: this[kLastEventId],
19920
+ cancelable: true
19921
+ }
19922
+ );
19923
+ this[kOnAnyMessage]?.(messageEvent);
19924
+ this.dispatchEvent(messageEvent);
19925
+ },
19926
+ abort: () => {
19927
+ throw new Error("Stream abort is not implemented");
19928
+ },
19929
+ close: () => {
19930
+ this.failConnection();
19931
+ }
19932
+ });
19933
+ response.body.pipeTo(parsingStream).then(() => {
19934
+ this.processResponseEndOfBody(response);
19935
+ }).catch(() => {
19936
+ this.failConnection();
19937
+ });
19938
+ }
19939
+ processResponseEndOfBody(response) {
19940
+ if (!isNetworkError(response)) {
19941
+ this.reestablishConnection();
19942
+ }
19943
+ }
19944
+ async reestablishConnection() {
19945
+ queueMicrotask(() => {
19946
+ if (this.readyState === this.CLOSED) {
19947
+ return;
19948
+ }
19949
+ this.readyState = this.CONNECTING;
19950
+ this.dispatchEvent(new Event("error"));
19951
+ });
19952
+ await delay(this[kReconnectionTime]);
19953
+ queueMicrotask(async () => {
19954
+ if (this.readyState !== this.CONNECTING) {
19955
+ return;
19956
+ }
19957
+ if (this[kLastEventId] !== "") {
19958
+ this[kRequest].headers.set("last-event-id", this[kLastEventId]);
19959
+ }
19960
+ await this.connect();
19961
+ });
19962
+ }
19963
+ failConnection() {
19964
+ queueMicrotask(() => {
19965
+ if (this.readyState !== this.CLOSED) {
19966
+ this.readyState = this.CLOSED;
19967
+ this.dispatchEvent(new Event("error"));
19968
+ }
19969
+ });
19970
+ }
19971
+ };
19972
+ function isNetworkError(response) {
19973
+ return response.type === "error" && response.status === 0 && response.statusText === "" && Array.from(response.headers.entries()).length === 0 && response.body === null;
19974
+ }
19975
+ var EventSourceParsingStream = class extends WritableStream {
19976
+ constructor(underlyingSink) {
19977
+ super({
19978
+ write: (chunk) => {
19979
+ this.processResponseBodyChunk(chunk);
19980
+ },
19981
+ abort: (reason) => {
19982
+ this.underlyingSink.abort?.(reason);
19983
+ },
19984
+ close: () => {
19985
+ this.underlyingSink.close?.();
19986
+ }
19987
+ });
19988
+ this.underlyingSink = underlyingSink;
19989
+ this.decoder = new TextDecoder();
19990
+ this.position = 0;
19991
+ }
19992
+ decoder;
19993
+ buffer;
19994
+ position;
19995
+ fieldLength;
19996
+ discardTrailingNewline = false;
19997
+ message = {
19998
+ id: void 0,
19999
+ event: void 0,
20000
+ data: void 0,
20001
+ retry: void 0
20002
+ };
20003
+ resetMessage() {
20004
+ this.message = {
20005
+ id: void 0,
20006
+ event: void 0,
20007
+ data: void 0,
20008
+ retry: void 0
20009
+ };
20010
+ }
20011
+ processResponseBodyChunk(chunk) {
20012
+ if (this.buffer == null) {
20013
+ this.buffer = chunk;
20014
+ this.position = 0;
20015
+ this.fieldLength = -1;
20016
+ } else {
20017
+ const nextBuffer = new Uint8Array(this.buffer.length + chunk.length);
20018
+ nextBuffer.set(this.buffer);
20019
+ nextBuffer.set(chunk, this.buffer.length);
20020
+ this.buffer = nextBuffer;
20021
+ }
20022
+ const bufferLength = this.buffer.length;
20023
+ let lineStart = 0;
20024
+ while (this.position < bufferLength) {
20025
+ if (this.discardTrailingNewline) {
20026
+ if (this.buffer[this.position] === 10 /* NewLine */) {
20027
+ lineStart = ++this.position;
20028
+ }
20029
+ this.discardTrailingNewline = false;
20030
+ }
20031
+ let lineEnd = -1;
20032
+ for (; this.position < bufferLength && lineEnd === -1; ++this.position) {
20033
+ switch (this.buffer[this.position]) {
20034
+ case 58 /* Colon */: {
20035
+ if (this.fieldLength === -1) {
20036
+ this.fieldLength = this.position - lineStart;
20037
+ }
20038
+ break;
20039
+ }
20040
+ case 13 /* CarriageReturn */: {
20041
+ this.discardTrailingNewline = true;
20042
+ break;
20043
+ }
20044
+ case 10 /* NewLine */: {
20045
+ lineEnd = this.position;
20046
+ break;
20047
+ }
20048
+ }
20049
+ }
20050
+ if (lineEnd === -1) {
20051
+ break;
20052
+ }
20053
+ this.processLine(
20054
+ this.buffer.subarray(lineStart, lineEnd),
20055
+ this.fieldLength
20056
+ );
20057
+ lineStart = this.position;
20058
+ this.fieldLength = -1;
20059
+ }
20060
+ if (lineStart === bufferLength) {
20061
+ this.buffer = void 0;
20062
+ } else if (lineStart !== 0) {
20063
+ this.buffer = this.buffer.subarray(lineStart);
20064
+ this.position -= lineStart;
20065
+ }
20066
+ }
20067
+ processLine(line, fieldLength) {
20068
+ if (line.length === 0) {
20069
+ if (this.message.data === void 0) {
20070
+ this.message.event = void 0;
20071
+ return;
20072
+ }
20073
+ this.underlyingSink.message(this.message);
20074
+ this.resetMessage();
20075
+ return;
20076
+ }
20077
+ if (fieldLength > 0) {
20078
+ const field = this.decoder.decode(line.subarray(0, fieldLength));
20079
+ const valueOffset = fieldLength + (line[fieldLength + 1] === 32 /* Space */ ? 2 : 1);
20080
+ const value = this.decoder.decode(line.subarray(valueOffset));
20081
+ switch (field) {
20082
+ case "data": {
20083
+ this.message.data = this.message.data ? this.message.data + "\n" + value : value;
20084
+ break;
20085
+ }
20086
+ case "event": {
20087
+ this.message.event = value;
20088
+ break;
20089
+ }
20090
+ case "id": {
20091
+ this.message.id = value;
20092
+ break;
20093
+ }
20094
+ case "retry": {
20095
+ const retry = parseInt(value, 10);
20096
+ if (!isNaN(retry)) {
20097
+ this.message.retry = retry;
20098
+ }
20099
+ break;
20100
+ }
20101
+ }
20102
+ }
20103
+ }
20104
+ };
20105
+
19291
20106
  // node_modules/.pnpm/until-async@3.0.2/node_modules/until-async/lib/index.js
19292
20107
  async function until(callback) {
19293
20108
  try {
@@ -19617,50 +20432,6 @@ Read more: https://mswjs.io/docs/http/intercepting-requests`;
19617
20432
  }
19618
20433
  };
19619
20434
 
19620
- // src/core/delay.ts
19621
- var SET_TIMEOUT_MAX_ALLOWED_INT = 2147483647;
19622
- var MIN_SERVER_RESPONSE_TIME = 100;
19623
- var MAX_SERVER_RESPONSE_TIME = 400;
19624
- var NODE_SERVER_RESPONSE_TIME = 5;
19625
- function getRealisticResponseTime() {
19626
- if (isNodeProcess()) {
19627
- return NODE_SERVER_RESPONSE_TIME;
19628
- }
19629
- return Math.floor(
19630
- Math.random() * (MAX_SERVER_RESPONSE_TIME - MIN_SERVER_RESPONSE_TIME) + MIN_SERVER_RESPONSE_TIME
19631
- );
19632
- }
19633
- async function delay(durationOrMode) {
19634
- let delayTime;
19635
- if (typeof durationOrMode === "string") {
19636
- switch (durationOrMode) {
19637
- case "infinite": {
19638
- delayTime = SET_TIMEOUT_MAX_ALLOWED_INT;
19639
- break;
19640
- }
19641
- case "real": {
19642
- delayTime = getRealisticResponseTime();
19643
- break;
19644
- }
19645
- default: {
19646
- throw new Error(
19647
- `Failed to delay a response: unknown delay mode "${durationOrMode}". Please make sure you provide one of the supported modes ("real", "infinite") or a number.`
19648
- );
19649
- }
19650
- }
19651
- } else if (typeof durationOrMode === "undefined") {
19652
- delayTime = getRealisticResponseTime();
19653
- } else {
19654
- if (durationOrMode > SET_TIMEOUT_MAX_ALLOWED_INT) {
19655
- throw new Error(
19656
- `Failed to delay a response: provided delay duration (${durationOrMode}) exceeds the maximum allowed duration for "setTimeout" (${SET_TIMEOUT_MAX_ALLOWED_INT}). This will cause the response to be returned immediately. Please use a number within the allowed range to delay the response by exact duration, or consider the "infinite" delay mode to delay the response indefinitely.`
19657
- );
19658
- }
19659
- delayTime = durationOrMode;
19660
- }
19661
- return new Promise((resolve) => setTimeout(resolve, delayTime));
19662
- }
19663
-
19664
20435
  // src/core/bypass.ts
19665
20436
  function bypass(input, init) {
19666
20437
  const request = new Request(
@@ -19694,11 +20465,6 @@ Read more: https://mswjs.io/docs/http/intercepting-requests`;
19694
20465
  // src/core/index.ts
19695
20466
  checkGlobals();
19696
20467
 
19697
- // src/core/utils/internal/isObject.ts
19698
- function isObject2(value) {
19699
- return value != null && typeof value === "object" && !Array.isArray(value);
19700
- }
19701
-
19702
20468
  // src/core/utils/internal/mergeRight.ts
19703
20469
  function mergeRight(left, right) {
19704
20470
  return Object.entries(right).reduce(
@@ -20889,209 +21655,6 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
20889
21655
  });
20890
21656
  }
20891
21657
 
20892
- // src/core/ws/utils/getMessageLength.ts
20893
- function getMessageLength(data) {
20894
- if (data instanceof Blob) {
20895
- return data.size;
20896
- }
20897
- if (data instanceof ArrayBuffer) {
20898
- return data.byteLength;
20899
- }
20900
- return new Blob([data]).size;
20901
- }
20902
-
20903
- // src/core/ws/utils/truncateMessage.ts
20904
- var MAX_LENGTH = 24;
20905
- function truncateMessage(message4) {
20906
- if (message4.length <= MAX_LENGTH) {
20907
- return message4;
20908
- }
20909
- return `${message4.slice(0, MAX_LENGTH)}\u2026`;
20910
- }
20911
-
20912
- // src/core/ws/utils/getPublicData.ts
20913
- async function getPublicData(data) {
20914
- if (data instanceof Blob) {
20915
- const text = await data.text();
20916
- return `Blob(${truncateMessage(text)})`;
20917
- }
20918
- if (typeof data === "object" && "byteLength" in data) {
20919
- const text = new TextDecoder().decode(data);
20920
- return `ArrayBuffer(${truncateMessage(text)})`;
20921
- }
20922
- return truncateMessage(data);
20923
- }
20924
-
20925
- // src/core/ws/utils/attachWebSocketLogger.ts
20926
- var colors = {
20927
- system: "#3b82f6",
20928
- outgoing: "#22c55e",
20929
- incoming: "#ef4444",
20930
- mocked: "#ff6a33"
20931
- };
20932
- function attachWebSocketLogger(connection) {
20933
- const { client, server } = connection;
20934
- logConnectionOpen(client);
20935
- client.addEventListener("message", (event) => {
20936
- logOutgoingClientMessage(event);
20937
- });
20938
- client.addEventListener("close", (event) => {
20939
- logConnectionClose(event);
20940
- });
20941
- client.socket.addEventListener("error", (event) => {
20942
- logClientError(event);
20943
- });
20944
- client.send = new Proxy(client.send, {
20945
- apply(target, thisArg, args) {
20946
- const [data] = args;
20947
- const messageEvent = new MessageEvent("message", { data });
20948
- Object.defineProperties(messageEvent, {
20949
- currentTarget: {
20950
- enumerable: true,
20951
- writable: false,
20952
- value: client.socket
20953
- },
20954
- target: {
20955
- enumerable: true,
20956
- writable: false,
20957
- value: client.socket
20958
- }
20959
- });
20960
- queueMicrotask(() => {
20961
- logIncomingMockedClientMessage(messageEvent);
20962
- });
20963
- return Reflect.apply(target, thisArg, args);
20964
- }
20965
- });
20966
- server.addEventListener(
20967
- "open",
20968
- () => {
20969
- server.addEventListener("message", (event) => {
20970
- logIncomingServerMessage(event);
20971
- });
20972
- },
20973
- { once: true }
20974
- );
20975
- server.send = new Proxy(server.send, {
20976
- apply(target, thisArg, args) {
20977
- const [data] = args;
20978
- const messageEvent = new MessageEvent("message", { data });
20979
- Object.defineProperties(messageEvent, {
20980
- currentTarget: {
20981
- enumerable: true,
20982
- writable: false,
20983
- value: server.socket
20984
- },
20985
- target: {
20986
- enumerable: true,
20987
- writable: false,
20988
- value: server.socket
20989
- }
20990
- });
20991
- logOutgoingMockedClientMessage(messageEvent);
20992
- return Reflect.apply(target, thisArg, args);
20993
- }
20994
- });
20995
- }
20996
- function logConnectionOpen(client) {
20997
- const publicUrl = toPublicUrl(client.url);
20998
- console.groupCollapsed(
20999
- devUtils.formatMessage(`${getTimestamp()} %c\u25B6%c ${publicUrl}`),
21000
- `color:${colors.system}`,
21001
- "color:inherit"
21002
- );
21003
- console.log("Client:", client.socket);
21004
- console.groupEnd();
21005
- }
21006
- function logConnectionClose(event) {
21007
- const target = event.target;
21008
- const publicUrl = toPublicUrl(target.url);
21009
- console.groupCollapsed(
21010
- devUtils.formatMessage(
21011
- `${getTimestamp({ milliseconds: true })} %c\u25A0%c ${publicUrl}`
21012
- ),
21013
- `color:${colors.system}`,
21014
- "color:inherit"
21015
- );
21016
- console.log(event);
21017
- console.groupEnd();
21018
- }
21019
- function logClientError(event) {
21020
- const socket = event.target;
21021
- const publicUrl = toPublicUrl(socket.url);
21022
- console.groupCollapsed(
21023
- devUtils.formatMessage(
21024
- `${getTimestamp({ milliseconds: true })} %c\xD7%c ${publicUrl}`
21025
- ),
21026
- `color:${colors.system}`,
21027
- "color:inherit"
21028
- );
21029
- console.log(event);
21030
- console.groupEnd();
21031
- }
21032
- async function logOutgoingClientMessage(event) {
21033
- const byteLength = getMessageLength(event.data);
21034
- const publicData = await getPublicData(event.data);
21035
- const arrow = event.defaultPrevented ? "\u21E1" : "\u2B06";
21036
- console.groupCollapsed(
21037
- devUtils.formatMessage(
21038
- `${getTimestamp({ milliseconds: true })} %c${arrow}%c ${publicData} %c${byteLength}%c`
21039
- ),
21040
- `color:${colors.outgoing}`,
21041
- "color:inherit",
21042
- "color:gray;font-weight:normal",
21043
- "color:inherit;font-weight:inherit"
21044
- );
21045
- console.log(event);
21046
- console.groupEnd();
21047
- }
21048
- async function logOutgoingMockedClientMessage(event) {
21049
- const byteLength = getMessageLength(event.data);
21050
- const publicData = await getPublicData(event.data);
21051
- console.groupCollapsed(
21052
- devUtils.formatMessage(
21053
- `${getTimestamp({ milliseconds: true })} %c\u2B06%c ${publicData} %c${byteLength}%c`
21054
- ),
21055
- `color:${colors.mocked}`,
21056
- "color:inherit",
21057
- "color:gray;font-weight:normal",
21058
- "color:inherit;font-weight:inherit"
21059
- );
21060
- console.log(event);
21061
- console.groupEnd();
21062
- }
21063
- async function logIncomingMockedClientMessage(event) {
21064
- const byteLength = getMessageLength(event.data);
21065
- const publicData = await getPublicData(event.data);
21066
- console.groupCollapsed(
21067
- devUtils.formatMessage(
21068
- `${getTimestamp({ milliseconds: true })} %c\u2B07%c ${publicData} %c${byteLength}%c`
21069
- ),
21070
- `color:${colors.mocked}`,
21071
- "color:inherit",
21072
- "color:gray;font-weight:normal",
21073
- "color:inherit;font-weight:inherit"
21074
- );
21075
- console.log(event);
21076
- console.groupEnd();
21077
- }
21078
- async function logIncomingServerMessage(event) {
21079
- const byteLength = getMessageLength(event.data);
21080
- const publicData = await getPublicData(event.data);
21081
- const arrow = event.defaultPrevented ? "\u21E3" : "\u2B07";
21082
- console.groupCollapsed(
21083
- devUtils.formatMessage(
21084
- `${getTimestamp({ milliseconds: true })} %c${arrow}%c ${publicData} %c${byteLength}%c`
21085
- ),
21086
- `color:${colors.incoming}`,
21087
- "color:inherit",
21088
- "color:gray;font-weight:normal",
21089
- "color:inherit;font-weight:inherit"
21090
- );
21091
- console.log(event);
21092
- console.groupEnd();
21093
- }
21094
-
21095
21658
  // node_modules/.pnpm/rettime@0.7.0/node_modules/rettime/build/index.js
21096
21659
  var kDefaultPrevented2 = Symbol("kDefaultPrevented");
21097
21660
  var kPropagationStopped = Symbol("kPropagationStopped");