msw 2.3.0-ws.rc-1 → 2.3.0-ws.rc-3

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 (194) hide show
  1. package/README.md +8 -3
  2. package/cli/init.js +1 -1
  3. package/lib/browser/index.d.mts +4 -4
  4. package/lib/browser/index.js +65 -60
  5. package/lib/browser/index.js.map +1 -1
  6. package/lib/browser/index.mjs +65 -60
  7. package/lib/browser/index.mjs.map +1 -1
  8. package/lib/core/{GraphQLHandler-QGQY_9Rc.d.mts → GraphQLHandler-CzcXr7At.d.mts} +3 -3
  9. package/lib/core/{GraphQLHandler-Cbu12sb0.d.ts → GraphQLHandler-DGyzNtRQ.d.ts} +3 -3
  10. package/lib/core/{HttpResponse-BWB1yDNM.d.mts → HttpResponse-BOzDwzB6.d.ts} +3 -3
  11. package/lib/core/{HttpResponse-DeJBWGN5.d.ts → HttpResponse-CSyJ1cbO.d.mts} +3 -3
  12. package/lib/core/HttpResponse.d.mts +1 -1
  13. package/lib/core/HttpResponse.d.ts +1 -1
  14. package/lib/core/HttpResponse.js.map +1 -1
  15. package/lib/core/HttpResponse.mjs.map +1 -1
  16. package/lib/core/SetupApi.d.mts +1 -1
  17. package/lib/core/SetupApi.d.ts +1 -1
  18. package/lib/core/bypass.js +6 -1
  19. package/lib/core/bypass.js.map +1 -1
  20. package/lib/core/bypass.mjs +6 -1
  21. package/lib/core/bypass.mjs.map +1 -1
  22. package/lib/core/getResponse.d.mts +1 -1
  23. package/lib/core/getResponse.d.ts +1 -1
  24. package/lib/core/getResponse.js +2 -2
  25. package/lib/core/getResponse.js.map +1 -1
  26. package/lib/core/getResponse.mjs +2 -2
  27. package/lib/core/getResponse.mjs.map +1 -1
  28. package/lib/core/graphql.d.mts +8 -6
  29. package/lib/core/graphql.d.ts +8 -6
  30. package/lib/core/graphql.js.map +1 -1
  31. package/lib/core/graphql.mjs.map +1 -1
  32. package/lib/core/handlers/GraphQLHandler.d.mts +2 -2
  33. package/lib/core/handlers/GraphQLHandler.d.ts +2 -2
  34. package/lib/core/handlers/GraphQLHandler.js.map +1 -1
  35. package/lib/core/handlers/GraphQLHandler.mjs.map +1 -1
  36. package/lib/core/handlers/HttpHandler.d.mts +1 -1
  37. package/lib/core/handlers/HttpHandler.d.ts +1 -1
  38. package/lib/core/handlers/HttpHandler.js +1 -1
  39. package/lib/core/handlers/HttpHandler.js.map +1 -1
  40. package/lib/core/handlers/HttpHandler.mjs +1 -1
  41. package/lib/core/handlers/HttpHandler.mjs.map +1 -1
  42. package/lib/core/handlers/RequestHandler.d.mts +1 -1
  43. package/lib/core/handlers/RequestHandler.d.ts +1 -1
  44. package/lib/core/handlers/WebSocketHandler.d.mts +11 -17
  45. package/lib/core/handlers/WebSocketHandler.d.ts +11 -17
  46. package/lib/core/handlers/WebSocketHandler.js +9 -12
  47. package/lib/core/handlers/WebSocketHandler.js.map +1 -1
  48. package/lib/core/handlers/WebSocketHandler.mjs +9 -12
  49. package/lib/core/handlers/WebSocketHandler.mjs.map +1 -1
  50. package/lib/core/http.d.mts +1 -1
  51. package/lib/core/http.d.ts +1 -1
  52. package/lib/core/index.d.mts +5 -5
  53. package/lib/core/index.d.ts +5 -5
  54. package/lib/core/index.js +3 -1
  55. package/lib/core/index.js.map +1 -1
  56. package/lib/core/index.mjs +5 -1
  57. package/lib/core/index.mjs.map +1 -1
  58. package/lib/core/passthrough.d.mts +1 -1
  59. package/lib/core/passthrough.d.ts +1 -1
  60. package/lib/core/typeUtils.d.mts +6 -1
  61. package/lib/core/typeUtils.d.ts +6 -1
  62. package/lib/core/typeUtils.js.map +1 -1
  63. package/lib/core/utils/HttpResponse/decorators.d.mts +1 -1
  64. package/lib/core/utils/HttpResponse/decorators.d.ts +1 -1
  65. package/lib/core/utils/HttpResponse/decorators.js +4 -1
  66. package/lib/core/utils/HttpResponse/decorators.js.map +1 -1
  67. package/lib/core/utils/HttpResponse/decorators.mjs +4 -1
  68. package/lib/core/utils/HttpResponse/decorators.mjs.map +1 -1
  69. package/lib/core/utils/executeHandlers.d.mts +1 -1
  70. package/lib/core/utils/executeHandlers.d.ts +1 -1
  71. package/lib/core/utils/handleRequest.d.mts +1 -1
  72. package/lib/core/utils/handleRequest.d.ts +1 -1
  73. package/lib/core/utils/handleRequest.js.map +1 -1
  74. package/lib/core/utils/handleRequest.mjs.map +1 -1
  75. package/lib/core/utils/internal/mergeRight.js +15 -12
  76. package/lib/core/utils/internal/mergeRight.js.map +1 -1
  77. package/lib/core/utils/internal/mergeRight.mjs +15 -12
  78. package/lib/core/utils/internal/mergeRight.mjs.map +1 -1
  79. package/lib/core/utils/internal/parseGraphQLRequest.d.mts +2 -2
  80. package/lib/core/utils/internal/parseGraphQLRequest.d.ts +2 -2
  81. package/lib/core/utils/internal/parseMultipartData.d.mts +1 -1
  82. package/lib/core/utils/internal/parseMultipartData.d.ts +1 -1
  83. package/lib/core/utils/internal/requestHandlerUtils.d.mts +1 -1
  84. package/lib/core/utils/internal/requestHandlerUtils.d.ts +1 -1
  85. package/lib/core/utils/logging/getTimestamp.d.mts +4 -1
  86. package/lib/core/utils/logging/getTimestamp.d.ts +4 -1
  87. package/lib/core/utils/logging/getTimestamp.js +6 -2
  88. package/lib/core/utils/logging/getTimestamp.js.map +1 -1
  89. package/lib/core/utils/logging/getTimestamp.mjs +6 -2
  90. package/lib/core/utils/logging/getTimestamp.mjs.map +1 -1
  91. package/lib/core/ws/handleWebSocketEvent.d.mts +16 -0
  92. package/lib/core/ws/handleWebSocketEvent.d.ts +16 -0
  93. package/lib/core/{utils → ws}/handleWebSocketEvent.js +21 -18
  94. package/lib/core/ws/handleWebSocketEvent.js.map +1 -0
  95. package/lib/core/ws/handleWebSocketEvent.mjs +39 -0
  96. package/lib/core/ws/handleWebSocketEvent.mjs.map +1 -0
  97. package/lib/core/ws/utils/attachWebSocketLogger.d.mts +34 -0
  98. package/lib/core/ws/utils/attachWebSocketLogger.d.ts +34 -0
  99. package/lib/core/ws/utils/attachWebSocketLogger.js +211 -0
  100. package/lib/core/ws/utils/attachWebSocketLogger.js.map +1 -0
  101. package/lib/core/ws/utils/attachWebSocketLogger.mjs +191 -0
  102. package/lib/core/ws/utils/attachWebSocketLogger.mjs.map +1 -0
  103. package/lib/core/ws/utils/getMessageLength.d.mts +11 -0
  104. package/lib/core/ws/utils/getMessageLength.d.ts +11 -0
  105. package/lib/core/ws/utils/getMessageLength.js +33 -0
  106. package/lib/core/ws/utils/getMessageLength.js.map +1 -0
  107. package/lib/core/ws/utils/getMessageLength.mjs +13 -0
  108. package/lib/core/ws/utils/getMessageLength.mjs.map +1 -0
  109. package/lib/core/ws/utils/getPublicData.d.mts +5 -0
  110. package/lib/core/ws/utils/getPublicData.d.ts +5 -0
  111. package/lib/core/ws/utils/getPublicData.js +36 -0
  112. package/lib/core/ws/utils/getPublicData.js.map +1 -0
  113. package/lib/core/ws/utils/getPublicData.mjs +16 -0
  114. package/lib/core/ws/utils/getPublicData.mjs.map +1 -0
  115. package/lib/core/ws/utils/truncateMessage.d.mts +3 -0
  116. package/lib/core/ws/utils/truncateMessage.d.ts +3 -0
  117. package/lib/core/{utils/internal/randomId.js → ws/utils/truncateMessage.js} +11 -7
  118. package/lib/core/ws/utils/truncateMessage.js.map +1 -0
  119. package/lib/core/ws/utils/truncateMessage.mjs +11 -0
  120. package/lib/core/ws/utils/truncateMessage.mjs.map +1 -0
  121. package/lib/core/{ws/ws.d.mts → ws.d.mts} +19 -14
  122. package/lib/core/{ws/ws.d.ts → ws.d.ts} +19 -14
  123. package/lib/core/{ws/ws.js → ws.js} +4 -23
  124. package/lib/core/ws.js.map +1 -0
  125. package/lib/core/{ws/ws.mjs → ws.mjs} +4 -23
  126. package/lib/core/ws.mjs.map +1 -0
  127. package/lib/iife/index.js +516 -256
  128. package/lib/iife/index.js.map +1 -1
  129. package/lib/mockServiceWorker.js +8 -11
  130. package/lib/native/index.d.mts +4 -4
  131. package/lib/native/index.js +9 -3
  132. package/lib/native/index.js.map +1 -1
  133. package/lib/native/index.mjs +9 -3
  134. package/lib/native/index.mjs.map +1 -1
  135. package/lib/node/index.d.mts +6 -6
  136. package/lib/node/index.d.ts +2 -2
  137. package/lib/node/index.js +9 -3
  138. package/lib/node/index.js.map +1 -1
  139. package/lib/node/index.mjs +9 -3
  140. package/lib/node/index.mjs.map +1 -1
  141. package/package.json +9 -12
  142. package/src/browser/setupWorker/glossary.ts +4 -1
  143. package/src/browser/setupWorker/setupWorker.ts +20 -3
  144. package/src/browser/setupWorker/start/createRequestListener.ts +1 -1
  145. package/src/browser/setupWorker/start/createStartHandler.ts +9 -19
  146. package/src/browser/setupWorker/start/utils/createMessageChannel.ts +1 -1
  147. package/src/browser/utils/checkWorkerIntegrity.ts +34 -0
  148. package/src/core/HttpResponse.ts +3 -2
  149. package/src/core/bypass.test.ts +22 -0
  150. package/src/core/bypass.ts +9 -1
  151. package/src/core/getResponse.ts +2 -2
  152. package/src/core/graphql.ts +6 -3
  153. package/src/core/handlers/GraphQLHandler.test.ts +4 -5
  154. package/src/core/handlers/GraphQLHandler.ts +7 -4
  155. package/src/core/handlers/HttpHandler.test.ts +5 -5
  156. package/src/core/handlers/HttpHandler.ts +1 -1
  157. package/src/core/handlers/WebSocketHandler.ts +21 -39
  158. package/src/core/index.ts +7 -3
  159. package/src/core/typeUtils.ts +16 -10
  160. package/src/core/utils/HttpResponse/decorators.ts +8 -4
  161. package/src/core/utils/handleRequest.test.ts +14 -14
  162. package/src/core/utils/handleRequest.ts +1 -1
  163. package/src/core/utils/internal/mergeRight.ts +16 -13
  164. package/src/core/utils/logging/getTimestamp.test.ts +20 -6
  165. package/src/core/utils/logging/getTimestamp.ts +11 -6
  166. package/src/core/ws/handleWebSocketEvent.ts +59 -0
  167. package/src/core/ws/utils/attachWebSocketLogger.ts +262 -0
  168. package/src/core/ws/utils/getMessageLength.test.ts +16 -0
  169. package/src/core/ws/utils/getMessageLength.ts +19 -0
  170. package/src/core/ws/utils/getPublicData.test.ts +38 -0
  171. package/src/core/ws/utils/getPublicData.ts +17 -0
  172. package/src/core/ws/utils/truncateMessage.test.ts +12 -0
  173. package/src/core/ws/utils/truncateMessage.ts +9 -0
  174. package/src/core/{ws/ws.ts → ws.ts} +49 -35
  175. package/src/mockServiceWorker.js +7 -10
  176. package/src/node/SetupServerApi.ts +4 -4
  177. package/src/node/SetupServerCommonApi.ts +7 -3
  178. package/src/node/glossary.ts +3 -3
  179. package/lib/core/utils/handleWebSocketEvent.d.mts +0 -10
  180. package/lib/core/utils/handleWebSocketEvent.d.ts +0 -10
  181. package/lib/core/utils/handleWebSocketEvent.js.map +0 -1
  182. package/lib/core/utils/handleWebSocketEvent.mjs +0 -40
  183. package/lib/core/utils/handleWebSocketEvent.mjs.map +0 -1
  184. package/lib/core/utils/internal/randomId.d.mts +0 -3
  185. package/lib/core/utils/internal/randomId.d.ts +0 -3
  186. package/lib/core/utils/internal/randomId.js.map +0 -1
  187. package/lib/core/utils/internal/randomId.mjs +0 -7
  188. package/lib/core/utils/internal/randomId.mjs.map +0 -1
  189. package/lib/core/ws/ws.js.map +0 -1
  190. package/lib/core/ws/ws.mjs.map +0 -1
  191. package/src/browser/utils/requestIntegrityCheck.ts +0 -23
  192. package/src/core/utils/handleWebSocketEvent.ts +0 -49
  193. package/src/core/utils/internal/randomId.ts +0 -3
  194. /package/src/core/{ws/ws.test.ts → ws.test.ts} +0 -0
package/lib/iife/index.js CHANGED
@@ -32,6 +32,7 @@ var MockServiceWorker = (() => {
32
32
  SET_TIMEOUT_MAX_ALLOWED_INT: () => SET_TIMEOUT_MAX_ALLOWED_INT,
33
33
  SetupApi: () => SetupApi,
34
34
  SetupWorkerApi: () => SetupWorkerApi,
35
+ WebSocketHandler: () => WebSocketHandler,
35
36
  bypass: () => bypass,
36
37
  cleanUrl: () => cleanUrl,
37
38
  delay: () => delay,
@@ -626,9 +627,13 @@ var MockServiceWorker = (() => {
626
627
  }
627
628
 
628
629
  // src/core/utils/logging/getTimestamp.ts
629
- function getTimestamp() {
630
+ function getTimestamp(options) {
630
631
  const now = /* @__PURE__ */ new Date();
631
- return [now.getHours(), now.getMinutes(), now.getSeconds()].map(String).map((chunk) => chunk.slice(0, 2)).map((chunk) => chunk.padStart(2, "0")).join(":");
632
+ const timestamp = `${now.getHours().toString().padStart(2, "0")}:${now.getMinutes().toString().padStart(2, "0")}:${now.getSeconds().toString().padStart(2, "0")}`;
633
+ if (options?.milliseconds) {
634
+ return `${timestamp}.${now.getMilliseconds().toString().padStart(3, "0")}`;
635
+ }
636
+ return timestamp;
632
637
  }
633
638
 
634
639
  // src/core/utils/logging/serializeRequest.ts
@@ -1065,7 +1070,7 @@ var MockServiceWorker = (() => {
1065
1070
  if (options === void 0) {
1066
1071
  options = {};
1067
1072
  }
1068
- var _a2 = options.strict, strict = _a2 === void 0 ? false : _a2, _b2 = options.start, start = _b2 === void 0 ? true : _b2, _c = options.end, end = _c === void 0 ? true : _c, _d = options.encode, encode = _d === void 0 ? function(x) {
1073
+ var _a2 = options.strict, strict = _a2 === void 0 ? false : _a2, _b2 = options.start, start = _b2 === void 0 ? true : _b2, _c2 = options.end, end = _c2 === void 0 ? true : _c2, _d = options.encode, encode = _d === void 0 ? function(x) {
1069
1074
  return x;
1070
1075
  } : _d, _e = options.delimiter, delimiter = _e === void 0 ? "/#?" : _e, _f = options.endsWith, endsWith = _f === void 0 ? "" : _f;
1071
1076
  var endsWithRe = "[".concat(escapeString(endsWith), "]|$");
@@ -1124,7 +1129,7 @@ var MockServiceWorker = (() => {
1124
1129
  return stringToRegexp(path, keys, options);
1125
1130
  }
1126
1131
 
1127
- // node_modules/.pnpm/@mswjs+interceptors@0.26.8/node_modules/@mswjs/interceptors/lib/browser/chunk-UJZOJSMP.mjs
1132
+ // node_modules/.pnpm/@mswjs+interceptors@0.26.15/node_modules/@mswjs/interceptors/lib/browser/chunk-UJZOJSMP.mjs
1128
1133
  var encoder = new TextEncoder();
1129
1134
  function encodeBuffer(text) {
1130
1135
  return encoder.encode(text);
@@ -1150,7 +1155,7 @@ var MockServiceWorker = (() => {
1150
1155
  return RESPONSE_STATUS_CODES_WITHOUT_BODY.has(status);
1151
1156
  }
1152
1157
 
1153
- // node_modules/.pnpm/@mswjs+interceptors@0.26.8/node_modules/@mswjs/interceptors/lib/browser/chunk-HAGW22AN.mjs
1158
+ // node_modules/.pnpm/@mswjs+interceptors@0.26.15/node_modules/@mswjs/interceptors/lib/browser/chunk-HAGW22AN.mjs
1154
1159
  var IS_PATCHED_MODULE = Symbol("isPatchedModule");
1155
1160
 
1156
1161
  // node_modules/.pnpm/is-node-process@1.2.0/node_modules/is-node-process/lib/index.mjs
@@ -1440,7 +1445,8 @@ var MockServiceWorker = (() => {
1440
1445
  return message3.toString();
1441
1446
  }
1442
1447
 
1443
- // node_modules/.pnpm/@mswjs+interceptors@0.26.8/node_modules/@mswjs/interceptors/lib/browser/chunk-SGO3INLV.mjs
1448
+ // node_modules/.pnpm/@mswjs+interceptors@0.26.15/node_modules/@mswjs/interceptors/lib/browser/chunk-QED3Q6Z2.mjs
1449
+ var INTERNAL_REQUEST_ID_HEADER_NAME = "x-interceptors-internal-request-id";
1444
1450
  function getGlobalSymbol(symbol) {
1445
1451
  return (
1446
1452
  // @ts-ignore https://github.com/Microsoft/TypeScript/issues/24587
@@ -1583,8 +1589,11 @@ var MockServiceWorker = (() => {
1583
1589
  this.logger.info("cleared global instance!", this.symbol.description);
1584
1590
  }
1585
1591
  };
1592
+ function createRequestId() {
1593
+ return Math.random().toString(16).slice(2);
1594
+ }
1586
1595
 
1587
- // node_modules/.pnpm/@mswjs+interceptors@0.26.8/node_modules/@mswjs/interceptors/lib/browser/index.mjs
1596
+ // node_modules/.pnpm/@mswjs+interceptors@0.26.15/node_modules/@mswjs/interceptors/lib/browser/index.mjs
1588
1597
  var BatchInterceptor = class extends Interceptor {
1589
1598
  constructor(options) {
1590
1599
  BatchInterceptor.symbol = Symbol(options.name);
@@ -2291,7 +2300,7 @@ Invalid value has been removed from localStorage to prevent subsequent failed pa
2291
2300
  queryParams.push(paramName);
2292
2301
  });
2293
2302
  devUtils.warn(
2294
- `Found a redundant usage of query parameters in the request handler URL for "${method} ${path}". Please match against a path instead and access query parameters in the response resolver function using "req.url.searchParams".`
2303
+ `Found a redundant usage of query parameters in the request handler URL for "${method} ${path}". Please match against a path instead and access query parameters using "new URL(request.url).searchParams" instead. Learn more: https://mswjs.io/docs/recipes/query-parameters`
2295
2304
  );
2296
2305
  }
2297
2306
  async parse(args) {
@@ -4824,7 +4833,7 @@ spurious results.`);
4824
4833
  }
4825
4834
  }
4826
4835
 
4827
- // node_modules/.pnpm/headers-polyfill@4.0.2/node_modules/headers-polyfill/lib/index.mjs
4836
+ // node_modules/.pnpm/headers-polyfill@4.0.3/node_modules/headers-polyfill/lib/index.mjs
4828
4837
  var __create4 = Object.create;
4829
4838
  var __defProp6 = Object.defineProperty;
4830
4839
  var __getOwnPropDesc5 = Object.getOwnPropertyDescriptor;
@@ -5100,10 +5109,12 @@ spurious results.`);
5100
5109
  var HEADER_VALUE_DELIMITER = ", ";
5101
5110
  var _a;
5102
5111
  var _b;
5112
+ var _c;
5103
5113
  var Headers2 = class _Headers {
5104
5114
  constructor(init) {
5105
5115
  this[_a] = {};
5106
5116
  this[_b] = /* @__PURE__ */ new Map();
5117
+ this[_c] = "Headers";
5107
5118
  if (["Headers", "HeadersPolyfill"].includes(init?.constructor.name) || init instanceof _Headers || typeof globalThis.Headers !== "undefined" && init instanceof globalThis.Headers) {
5108
5119
  const initialHeaders = init;
5109
5120
  initialHeaders.forEach((value, name) => {
@@ -5126,7 +5137,7 @@ spurious results.`);
5126
5137
  });
5127
5138
  }
5128
5139
  }
5129
- [(_a = NORMALIZED_HEADERS, _b = RAW_HEADER_NAMES, Symbol.iterator)]() {
5140
+ [(_a = NORMALIZED_HEADERS, _b = RAW_HEADER_NAMES, _c = Symbol.toStringTag, Symbol.iterator)]() {
5130
5141
  return this.entries();
5131
5142
  }
5132
5143
  *keys() {
@@ -5618,12 +5629,14 @@ Consider naming this operation or using "graphql.operation()" request handler to
5618
5629
  // src/core/handlers/WebSocketHandler.ts
5619
5630
  var kEmitter = Symbol("kEmitter");
5620
5631
  var kDispatchEvent = Symbol("kDispatchEvent");
5621
- var kDefaultPrevented = Symbol("kDefaultPrevented");
5632
+ var kSender = Symbol("kSender");
5622
5633
  var WebSocketHandler = class {
5623
5634
  constructor(url) {
5624
5635
  this.url = url;
5625
5636
  this[kEmitter] = new Emitter();
5637
+ this.callFrame = getCallFrame(new Error());
5626
5638
  }
5639
+ callFrame;
5627
5640
  [kEmitter];
5628
5641
  parse(args) {
5629
5642
  const connection = args.event.data;
@@ -5637,19 +5650,13 @@ Consider naming this operation or using "graphql.operation()" request handler to
5637
5650
  }
5638
5651
  async [kDispatchEvent](event) {
5639
5652
  const parsedResult = this.parse({ event });
5640
- const shouldIntercept = this.predicate({ event, parsedResult });
5641
- if (!shouldIntercept) {
5642
- return;
5643
- }
5644
- if (!Reflect.get(event, kDefaultPrevented)) {
5645
- Reflect.set(event, kDefaultPrevented, true);
5646
- }
5647
5653
  const connection = event.data;
5648
- this[kEmitter].emit("connection", {
5654
+ const resolvedConnection = {
5649
5655
  client: connection.client,
5650
5656
  server: connection.server,
5651
5657
  params: parsedResult.match.params || {}
5652
- });
5658
+ };
5659
+ this[kEmitter].emit("connection", resolvedConnection);
5653
5660
  }
5654
5661
  };
5655
5662
 
@@ -5752,13 +5759,13 @@ Consider naming this operation or using "graphql.operation()" request handler to
5752
5759
  }
5753
5760
  };
5754
5761
 
5755
- // src/core/ws/ws.ts
5762
+ // src/core/ws.ts
5756
5763
  var wsBroadcastChannel = new BroadcastChannel("msw:ws-client-manager");
5757
5764
  function createWebSocketLinkHandler(url) {
5758
5765
  invariant(url, "Expected a WebSocket server URL but got undefined");
5759
5766
  invariant(
5760
5767
  isPath(url),
5761
- "Expected a WebSocket server URL but got %s",
5768
+ "Expected a WebSocket server URL to be a valid path but got %s",
5762
5769
  typeof url
5763
5770
  );
5764
5771
  const clientManager = new WebSocketClientManager(wsBroadcastChannel);
@@ -5772,28 +5779,9 @@ Consider naming this operation or using "graphql.operation()" request handler to
5772
5779
  handler[kEmitter].on(event, listener);
5773
5780
  return handler;
5774
5781
  },
5775
- /**
5776
- * Broadcasts the given data to all WebSocket clients.
5777
- *
5778
- * @example
5779
- * const service = ws.link('wss://example.com')
5780
- * service.on('connection', () => {
5781
- * service.broadcast('hello, everyone!')
5782
- * })
5783
- */
5784
5782
  broadcast(data) {
5785
5783
  this.broadcastExcept([], data);
5786
5784
  },
5787
- /**
5788
- * Broadcasts the given data to all WebSocket clients
5789
- * except the ones provided in the `clients` argument.
5790
- *
5791
- * @example
5792
- * const service = ws.link('wss://example.com')
5793
- * service.on('connection', ({ client }) => {
5794
- * service.broadcastExcept(client, 'hi, the rest of you!')
5795
- * })
5796
- */
5797
5785
  broadcastExcept(clients, data) {
5798
5786
  const ignoreClients = Array.prototype.concat(clients).map((client) => client.id);
5799
5787
  clientManager.clients.forEach((otherClient) => {
@@ -5959,16 +5947,11 @@ Read more: https://mswjs.io/docs/getting-started/mocks`;
5959
5947
  return transformedResponse;
5960
5948
  }
5961
5949
 
5962
- // src/core/utils/internal/randomId.ts
5963
- function randomId() {
5964
- return Math.random().toString(16).slice(2);
5965
- }
5966
-
5967
5950
  // src/core/getResponse.ts
5968
5951
  var getResponse = async (handlers, request) => {
5969
5952
  const result = await executeHandlers({
5970
5953
  request,
5971
- requestId: randomId(),
5954
+ requestId: createRequestId(),
5972
5955
  handlers
5973
5956
  });
5974
5957
  return result?.response;
@@ -5996,7 +5979,9 @@ Read more: https://mswjs.io/docs/getting-started/mocks`;
5996
5979
  });
5997
5980
  }
5998
5981
  if (typeof document !== "undefined") {
5999
- const responseCookies = init.headers.get("Set-Cookie")?.split(",") || [];
5982
+ const responseCookies = Headers2.prototype.getSetCookie.call(
5983
+ init.headers
5984
+ );
6000
5985
  for (const cookieString of responseCookies) {
6001
5986
  document.cookie = cookieString;
6002
5987
  }
@@ -6141,7 +6126,12 @@ Read more: https://mswjs.io/docs/getting-started/mocks`;
6141
6126
 
6142
6127
  // src/core/bypass.ts
6143
6128
  function bypass(input, init) {
6144
- const request = input instanceof Request ? input : new Request(input, init);
6129
+ const request = new Request(
6130
+ // If given a Request instance, clone it not to exhaust
6131
+ // the original request's body.
6132
+ input instanceof Request ? input.clone() : input,
6133
+ init
6134
+ );
6145
6135
  invariant(
6146
6136
  !request.bodyUsed,
6147
6137
  'Failed to create a bypassed request to "%s %s": given request instance already has its body read. Make sure to clone the intercepted request if you wish to read its body before bypassing it.',
@@ -6343,7 +6333,7 @@ Learn more about creating the Service Worker script: https://mswjs.io/docs/cli/i
6343
6333
  context.emitter,
6344
6334
  {
6345
6335
  onPassthroughResponse() {
6346
- messageChannel.postMessage("NOT_FOUND");
6336
+ messageChannel.postMessage("PASSTHROUGH");
6347
6337
  },
6348
6338
  async onMockedResponse(response, { handler, parsedResult }) {
6349
6339
  const responseClone = response.clone();
@@ -6407,18 +6397,21 @@ This exception has been gracefully handled as a 500 response, however, it's stro
6407
6397
  };
6408
6398
  };
6409
6399
 
6410
- // src/browser/utils/requestIntegrityCheck.ts
6411
- async function requestIntegrityCheck(context, serviceWorker) {
6400
+ // src/browser/utils/checkWorkerIntegrity.ts
6401
+ async function checkWorkerIntegrity(context) {
6412
6402
  context.workerChannel.send("INTEGRITY_CHECK_REQUEST");
6413
- const { payload: actualChecksum } = await context.events.once(
6414
- "INTEGRITY_CHECK_RESPONSE"
6415
- );
6416
- if (actualChecksum !== "223d191a56023cd36aa88c802961b911") {
6417
- throw new Error(
6418
- `Currently active Service Worker (${actualChecksum}) is behind the latest published one (${"223d191a56023cd36aa88c802961b911"}).`
6403
+ const { payload } = await context.events.once("INTEGRITY_CHECK_RESPONSE");
6404
+ if (payload.checksum !== "26357c79639bfa20d64c0efca2a87423") {
6405
+ devUtils.warn(
6406
+ `The currently registered Service Worker has been generated by a different version of MSW (${payload.packageVersion}) and may not be fully compatible with the installed version.
6407
+
6408
+ It's recommended you update your worker script by running this command:
6409
+
6410
+ \u2022 npx msw init <PUBLIC_DIR>
6411
+
6412
+ You can also automate this process and make the worker script update automatically upon the library installations. Read more: https://mswjs.io/docs/cli/init.`
6419
6413
  );
6420
6414
  }
6421
- return serviceWorker;
6422
6415
  }
6423
6416
 
6424
6417
  // src/browser/setupWorker/start/createResponseListener.ts
@@ -6514,19 +6507,12 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
6514
6507
  }
6515
6508
  window.clearInterval(context.keepAliveInterval);
6516
6509
  });
6517
- const integrityCheckResult = await until(
6518
- () => requestIntegrityCheck(context, worker)
6519
- );
6520
- if (integrityCheckResult.error) {
6521
- devUtils.error(`Detected outdated Service Worker: ${integrityCheckResult.error.message}
6522
-
6523
- The mocking is still enabled, but it's highly recommended that you update your Service Worker by running:
6524
-
6525
- $ npx msw init <PUBLIC_DIR>
6526
-
6527
- This is necessary to ensure that the Service Worker is in sync with the library to guarantee its stability.
6528
- If this message still persists after updating, please report an issue: https://github.com/open-draft/msw/issues `);
6529
- }
6510
+ await checkWorkerIntegrity(context).catch((error3) => {
6511
+ devUtils.error(
6512
+ "Error while checking the worker script integrity. Please report this on GitHub (https://github.com/mswjs/msw/issues), including the original error below."
6513
+ );
6514
+ console.error(error3);
6515
+ });
6530
6516
  context.keepAliveInterval = window.setInterval(
6531
6517
  () => context.workerChannel.send("KEEPALIVE_REQUEST"),
6532
6518
  5e3
@@ -6590,19 +6576,22 @@ If this message still persists after updating, please report an issue: https://g
6590
6576
 
6591
6577
  // src/core/utils/internal/mergeRight.ts
6592
6578
  function mergeRight(left, right) {
6593
- return Object.entries(right).reduce((result, [key, rightValue]) => {
6594
- const leftValue = result[key];
6595
- if (Array.isArray(leftValue) && Array.isArray(rightValue)) {
6596
- result[key] = leftValue.concat(rightValue);
6579
+ return Object.entries(right).reduce(
6580
+ (result, [key, rightValue]) => {
6581
+ const leftValue = result[key];
6582
+ if (Array.isArray(leftValue) && Array.isArray(rightValue)) {
6583
+ result[key] = leftValue.concat(rightValue);
6584
+ return result;
6585
+ }
6586
+ if (isObject(leftValue) && isObject(rightValue)) {
6587
+ result[key] = mergeRight(leftValue, rightValue);
6588
+ return result;
6589
+ }
6590
+ result[key] = rightValue;
6597
6591
  return result;
6598
- }
6599
- if (isObject(leftValue) && isObject(rightValue)) {
6600
- result[key] = mergeRight(leftValue, rightValue);
6601
- return result;
6602
- }
6603
- result[key] = rightValue;
6604
- return result;
6605
- }, Object.assign({}, left));
6592
+ },
6593
+ Object.assign({}, left)
6594
+ );
6606
6595
  }
6607
6596
 
6608
6597
  // src/browser/setupWorker/start/utils/prepareStartHandler.ts
@@ -6685,7 +6674,7 @@ If this message still persists after updating, please report an issue: https://g
6685
6674
  }
6686
6675
  };
6687
6676
 
6688
- // node_modules/.pnpm/@mswjs+interceptors@0.26.8/node_modules/@mswjs/interceptors/lib/browser/chunk-OUWBQF3Z.mjs
6677
+ // node_modules/.pnpm/@mswjs+interceptors@0.26.15/node_modules/@mswjs/interceptors/lib/browser/chunk-OUWBQF3Z.mjs
6689
6678
  var RequestController = class {
6690
6679
  constructor(request) {
6691
6680
  this.request = request;
@@ -6723,16 +6712,7 @@ If this message still persists after updating, please report an issue: https://g
6723
6712
  }
6724
6713
  }
6725
6714
 
6726
- // node_modules/.pnpm/@mswjs+interceptors@0.26.8/node_modules/@mswjs/interceptors/lib/browser/chunk-CEKC26XE.mjs
6727
- function uuidv4() {
6728
- return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) {
6729
- const r = Math.random() * 16 | 0;
6730
- const v = c == "x" ? r : r & 3 | 8;
6731
- return v.toString(16);
6732
- });
6733
- }
6734
-
6735
- // node_modules/.pnpm/@mswjs+interceptors@0.26.8/node_modules/@mswjs/interceptors/lib/browser/chunk-65OQZE6W.mjs
6715
+ // node_modules/.pnpm/@mswjs+interceptors@0.26.15/node_modules/@mswjs/interceptors/lib/browser/chunk-3FNUI33J.mjs
6736
6716
  function isPropertyAccessible2(obj, key) {
6737
6717
  try {
6738
6718
  obj[key];
@@ -6756,7 +6736,7 @@ If this message still persists after updating, please report an issue: https://g
6756
6736
  checkEnvironment() {
6757
6737
  return typeof globalThis !== "undefined" && typeof globalThis.fetch !== "undefined";
6758
6738
  }
6759
- setup() {
6739
+ async setup() {
6760
6740
  const pureFetch = globalThis.fetch;
6761
6741
  invariant(
6762
6742
  !pureFetch[IS_PATCHED_MODULE],
@@ -6764,7 +6744,7 @@ If this message still persists after updating, please report an issue: https://g
6764
6744
  );
6765
6745
  globalThis.fetch = async (input, init) => {
6766
6746
  var _a2;
6767
- const requestId = uuidv4();
6747
+ const requestId = createRequestId();
6768
6748
  const resolvedInput = typeof input === "string" && typeof location !== "undefined" && !canParseUrl(input) ? new URL(input, location.origin) : input;
6769
6749
  const request = new Request(resolvedInput, init);
6770
6750
  this.logger.info("[%s] %s", request.method, request.url);
@@ -6879,7 +6859,7 @@ If this message still persists after updating, please report an issue: https://g
6879
6859
  });
6880
6860
  }
6881
6861
 
6882
- // node_modules/.pnpm/@mswjs+interceptors@0.26.8/node_modules/@mswjs/interceptors/lib/browser/chunk-6ZIL5FW4.mjs
6862
+ // node_modules/.pnpm/@mswjs+interceptors@0.26.15/node_modules/@mswjs/interceptors/lib/browser/chunk-VYFS2IF2.mjs
6883
6863
  function concatArrayBuffer(left, right) {
6884
6864
  const result = new Uint8Array(left.byteLength + right.byteLength);
6885
6865
  result.set(left, 0);
@@ -7073,7 +7053,7 @@ If this message still persists after updating, please report an issue: https://g
7073
7053
  this.method = "GET";
7074
7054
  this.url = null;
7075
7055
  this.events = /* @__PURE__ */ new Map();
7076
- this.requestId = uuidv4();
7056
+ this.requestId = createRequestId();
7077
7057
  this.requestHeaders = new Headers();
7078
7058
  this.responseBuffer = new Uint8Array();
7079
7059
  this.request = createProxy(initialRequest, {
@@ -7155,7 +7135,10 @@ If this message still persists after updating, please report an issue: https://g
7155
7135
  this.request.readyState
7156
7136
  );
7157
7137
  if (IS_NODE2) {
7158
- this.request.setRequestHeader("X-Request-Id", this.requestId);
7138
+ this.request.setRequestHeader(
7139
+ INTERNAL_REQUEST_ID_HEADER_NAME,
7140
+ this.requestId
7141
+ );
7159
7142
  }
7160
7143
  return invoke();
7161
7144
  }
@@ -7701,32 +7684,39 @@ If this message still persists after updating, please report an issue: https://g
7701
7684
  }
7702
7685
  }
7703
7686
 
7704
- // node_modules/.pnpm/@mswjs+interceptors@0.26.8/node_modules/@mswjs/interceptors/lib/browser/interceptors/WebSocket/index.mjs
7687
+ // node_modules/.pnpm/@mswjs+interceptors@0.26.15/node_modules/@mswjs/interceptors/lib/browser/interceptors/WebSocket/index.mjs
7705
7688
  function bindEvent(target, event) {
7706
- Object.defineProperty(event, "target", {
7707
- enumerable: true,
7708
- writable: true,
7709
- value: target
7689
+ Object.defineProperties(event, {
7690
+ target: {
7691
+ value: target,
7692
+ enumerable: true,
7693
+ writable: true
7694
+ },
7695
+ currentTarget: {
7696
+ value: target,
7697
+ enumerable: true,
7698
+ writable: true
7699
+ }
7710
7700
  });
7711
7701
  return event;
7712
7702
  }
7713
7703
  var kCancelable = Symbol("kCancelable");
7714
- var kDefaultPrevented2 = Symbol("kDefaultPrevented");
7704
+ var kDefaultPrevented = Symbol("kDefaultPrevented");
7715
7705
  var CancelableMessageEvent = class extends MessageEvent {
7716
7706
  constructor(type, init) {
7717
7707
  super(type, init);
7718
7708
  this[kCancelable] = !!init.cancelable;
7719
- this[kDefaultPrevented2] = false;
7709
+ this[kDefaultPrevented] = false;
7720
7710
  }
7721
7711
  get cancelable() {
7722
7712
  return this[kCancelable];
7723
7713
  }
7724
7714
  get defaultPrevented() {
7725
- return this[kDefaultPrevented2];
7715
+ return this[kDefaultPrevented];
7726
7716
  }
7727
7717
  preventDefault() {
7728
- if (this.cancelable && !this[kDefaultPrevented2]) {
7729
- this[kDefaultPrevented2] = true;
7718
+ if (this.cancelable && !this[kDefaultPrevented]) {
7719
+ this[kDefaultPrevented] = true;
7730
7720
  }
7731
7721
  }
7732
7722
  };
@@ -7743,7 +7733,7 @@ If this message still persists after updating, please report an issue: https://g
7743
7733
  constructor(socket, transport) {
7744
7734
  this.socket = socket;
7745
7735
  this.transport = transport;
7746
- this.id = uuidv4();
7736
+ this.id = createRequestId();
7747
7737
  this.url = new URL(socket.url);
7748
7738
  this[kEmitter2] = new EventTarget();
7749
7739
  this.transport.onOutgoing = (data) => {
@@ -7760,8 +7750,8 @@ If this message still persists after updating, please report an issue: https://g
7760
7750
  /**
7761
7751
  * Listen for the outgoing events from the connected WebSocket client.
7762
7752
  */
7763
- addEventListener(event, listener, options) {
7764
- this[kEmitter2].addEventListener(event, listener, options);
7753
+ addEventListener(type, listener, options) {
7754
+ this[kEmitter2].addEventListener(type, listener, options);
7765
7755
  }
7766
7756
  /**
7767
7757
  * Removes the listener for the given event.
@@ -7788,129 +7778,6 @@ If this message still persists after updating, please report an issue: https://g
7788
7778
  this.transport.close(code, reason);
7789
7779
  }
7790
7780
  };
7791
- var kEmitter22 = Symbol("kEmitter");
7792
- var WebSocketServerConnection = class {
7793
- constructor(socket, transport, createConnection) {
7794
- this.socket = socket;
7795
- this.transport = transport;
7796
- this.createConnection = createConnection;
7797
- this[kEmitter22] = new EventTarget();
7798
- this.transport.onIncoming = (event) => {
7799
- const messageEvent = bindEvent(
7800
- this.realWebSocket,
7801
- new CancelableMessageEvent("message", {
7802
- data: event.data,
7803
- origin: event.origin,
7804
- cancelable: true
7805
- })
7806
- );
7807
- this[kEmitter22].dispatchEvent(messageEvent);
7808
- if (!messageEvent.defaultPrevented) {
7809
- this.socket.dispatchEvent(
7810
- bindEvent(
7811
- /**
7812
- * @note Bind the forwarded original server events
7813
- * to the mock WebSocket instance so it would
7814
- * dispatch them straight away.
7815
- */
7816
- this.socket,
7817
- // Clone the message event again to prevent
7818
- // the "already being dispatched" exception.
7819
- new MessageEvent("message", {
7820
- data: event.data,
7821
- origin: event.origin
7822
- })
7823
- )
7824
- );
7825
- }
7826
- };
7827
- }
7828
- /**
7829
- * Server ready state.
7830
- * Proxies the ready state of the original WebSocket instance,
7831
- * if set. If the original connection hasn't been established,
7832
- * defaults to `-1`.
7833
- */
7834
- get readyState() {
7835
- if (this.realWebSocket) {
7836
- return this.realWebSocket.readyState;
7837
- }
7838
- return -1;
7839
- }
7840
- /**
7841
- * Open connection to the original WebSocket server.
7842
- */
7843
- connect() {
7844
- invariant(
7845
- this.readyState === -1,
7846
- 'Failed to call "connect()" on the original WebSocket instance: the connection already open'
7847
- );
7848
- const ws2 = this.createConnection();
7849
- ws2.binaryType = this.socket.binaryType;
7850
- this.socket.addEventListener(
7851
- "close",
7852
- (event) => {
7853
- ws2.close(event.code, event.reason);
7854
- },
7855
- { once: true }
7856
- );
7857
- ws2.addEventListener("message", (event) => {
7858
- this.transport.onIncoming(event);
7859
- });
7860
- ws2.addEventListener("error", () => {
7861
- this.socket.dispatchEvent(bindEvent(this.socket, new Event("error")));
7862
- });
7863
- this.realWebSocket = ws2;
7864
- }
7865
- /**
7866
- * Listen for the incoming events from the original WebSocket server.
7867
- */
7868
- addEventListener(event, listener, options) {
7869
- this[kEmitter22].addEventListener(
7870
- event,
7871
- listener.bind(this.realWebSocket),
7872
- options
7873
- );
7874
- }
7875
- /**
7876
- * Removes the listener for the given event.
7877
- */
7878
- removeEventListener(event, listener, options) {
7879
- this[kEmitter22].removeEventListener(
7880
- event,
7881
- listener,
7882
- options
7883
- );
7884
- }
7885
- /**
7886
- * Send data to the original WebSocket server.
7887
- * @example
7888
- * server.send('hello')
7889
- * server.send(new Blob(['hello']))
7890
- * server.send(new TextEncoder().encode('hello'))
7891
- */
7892
- send(data) {
7893
- const { realWebSocket } = this;
7894
- invariant(
7895
- realWebSocket,
7896
- 'Failed to call "server.send()" for "%s": the connection is not open. Did you forget to call "await server.connect()"?',
7897
- this.socket.url
7898
- );
7899
- if (realWebSocket.readyState === realWebSocket.CONNECTING) {
7900
- realWebSocket.addEventListener(
7901
- "open",
7902
- () => {
7903
- realWebSocket.send(data);
7904
- },
7905
- { once: true }
7906
- );
7907
- return;
7908
- }
7909
- realWebSocket.send(data);
7910
- }
7911
- };
7912
- var WebSocketTransport = class {
7913
- };
7914
7781
  var WEBSOCKET_CLOSE_CODE_RANGE_ERROR = "InvalidAccessError: close code out of user configurable range";
7915
7782
  var kOnSend = Symbol("kOnSend");
7916
7783
  var kClose = Symbol("kClose");
@@ -8057,6 +7924,176 @@ If this message still persists after updating, please report an issue: https://g
8057
7924
  }
8058
7925
  return data.byteLength;
8059
7926
  }
7927
+ var kEmitter22 = Symbol("kEmitter");
7928
+ var WebSocketServerConnection = class {
7929
+ constructor(socket, transport, createConnection) {
7930
+ this.socket = socket;
7931
+ this.transport = transport;
7932
+ this.createConnection = createConnection;
7933
+ this[kEmitter22] = new EventTarget();
7934
+ this.mockCloseController = new AbortController();
7935
+ this.transport.onIncoming = (event) => {
7936
+ const messageEvent = bindEvent(
7937
+ this.realWebSocket,
7938
+ new CancelableMessageEvent("message", {
7939
+ data: event.data,
7940
+ origin: event.origin,
7941
+ cancelable: true
7942
+ })
7943
+ );
7944
+ this[kEmitter22].dispatchEvent(messageEvent);
7945
+ if (!messageEvent.defaultPrevented) {
7946
+ this.socket.dispatchEvent(
7947
+ bindEvent(
7948
+ /**
7949
+ * @note Bind the forwarded original server events
7950
+ * to the mock WebSocket instance so it would
7951
+ * dispatch them straight away.
7952
+ */
7953
+ this.socket,
7954
+ // Clone the message event again to prevent
7955
+ // the "already being dispatched" exception.
7956
+ new MessageEvent("message", {
7957
+ data: event.data,
7958
+ origin: event.origin
7959
+ })
7960
+ )
7961
+ );
7962
+ }
7963
+ };
7964
+ }
7965
+ /**
7966
+ * Server ready state.
7967
+ * Proxies the ready state of the original WebSocket instance,
7968
+ * if set. If the original connection hasn't been established,
7969
+ * defaults to `-1`.
7970
+ */
7971
+ get readyState() {
7972
+ if (this.realWebSocket) {
7973
+ return this.realWebSocket.readyState;
7974
+ }
7975
+ return -1;
7976
+ }
7977
+ /**
7978
+ * Open connection to the original WebSocket server.
7979
+ */
7980
+ connect() {
7981
+ invariant(
7982
+ !this.realWebSocket || this.realWebSocket.readyState !== WebSocket.OPEN,
7983
+ 'Failed to call "connect()" on the original WebSocket instance: the connection already open'
7984
+ );
7985
+ const realWebSocket = this.createConnection();
7986
+ realWebSocket.binaryType = this.socket.binaryType;
7987
+ realWebSocket.addEventListener(
7988
+ "open",
7989
+ (event) => {
7990
+ this[kEmitter22].dispatchEvent(
7991
+ bindEvent(this.realWebSocket, new Event("open", event))
7992
+ );
7993
+ },
7994
+ { once: true }
7995
+ );
7996
+ realWebSocket.addEventListener("message", (event) => {
7997
+ this.transport.onIncoming(event);
7998
+ });
7999
+ this.socket.addEventListener("close", this.handleMockClose.bind(this), {
8000
+ signal: this.mockCloseController.signal
8001
+ });
8002
+ realWebSocket.addEventListener("close", this.handleRealClose.bind(this));
8003
+ realWebSocket.addEventListener("error", () => {
8004
+ this.socket.dispatchEvent(bindEvent(this.socket, new Event("error")));
8005
+ });
8006
+ this.realWebSocket = realWebSocket;
8007
+ }
8008
+ /**
8009
+ * Listen for the incoming events from the original WebSocket server.
8010
+ */
8011
+ addEventListener(event, listener, options) {
8012
+ this[kEmitter22].addEventListener(
8013
+ event,
8014
+ listener.bind(this.realWebSocket),
8015
+ options
8016
+ );
8017
+ }
8018
+ /**
8019
+ * Remove the listener for the given event.
8020
+ */
8021
+ removeEventListener(event, listener, options) {
8022
+ this[kEmitter22].removeEventListener(
8023
+ event,
8024
+ listener,
8025
+ options
8026
+ );
8027
+ }
8028
+ /**
8029
+ * Send data to the original WebSocket server.
8030
+ * @example
8031
+ * server.send('hello')
8032
+ * server.send(new Blob(['hello']))
8033
+ * server.send(new TextEncoder().encode('hello'))
8034
+ */
8035
+ send(data) {
8036
+ const { realWebSocket } = this;
8037
+ invariant(
8038
+ realWebSocket,
8039
+ 'Failed to call "server.send()" for "%s": the connection is not open. Did you forget to call "server.connect()"?',
8040
+ this.socket.url
8041
+ );
8042
+ if (realWebSocket.readyState === WebSocket.CLOSING || realWebSocket.readyState === WebSocket.CLOSED) {
8043
+ return;
8044
+ }
8045
+ if (realWebSocket.readyState === WebSocket.CONNECTING) {
8046
+ realWebSocket.addEventListener(
8047
+ "open",
8048
+ () => {
8049
+ realWebSocket.send(data);
8050
+ },
8051
+ { once: true }
8052
+ );
8053
+ return;
8054
+ }
8055
+ realWebSocket.send(data);
8056
+ }
8057
+ /**
8058
+ * Close the actual server connection.
8059
+ */
8060
+ close() {
8061
+ const { realWebSocket } = this;
8062
+ invariant(
8063
+ realWebSocket,
8064
+ 'Failed to close server connection for "%s": the connection is not open. Did you forget to call "server.connect()"?',
8065
+ this.socket.url
8066
+ );
8067
+ realWebSocket.removeEventListener("close", this.handleRealClose);
8068
+ if (realWebSocket.readyState === WebSocket.CLOSING || realWebSocket.readyState === WebSocket.CLOSED) {
8069
+ return;
8070
+ }
8071
+ realWebSocket.close();
8072
+ queueMicrotask(() => {
8073
+ this[kEmitter22].dispatchEvent(
8074
+ bindEvent(this.realWebSocket, new CloseEvent("close"))
8075
+ );
8076
+ });
8077
+ }
8078
+ handleMockClose(_event) {
8079
+ if (this.realWebSocket) {
8080
+ this.realWebSocket.close();
8081
+ }
8082
+ }
8083
+ handleRealClose(event) {
8084
+ this.mockCloseController.abort();
8085
+ const closeEvent = bindEvent(
8086
+ this.realWebSocket,
8087
+ new CloseEvent("close", event)
8088
+ );
8089
+ this[kEmitter22].dispatchEvent(closeEvent);
8090
+ if (!closeEvent.defaultPrevented) {
8091
+ this.socket[kClose](event.code, event.reason);
8092
+ }
8093
+ }
8094
+ };
8095
+ var WebSocketTransport = class {
8096
+ };
8060
8097
  var WebSocketClassTransport = class extends WebSocketTransport {
8061
8098
  constructor(socket) {
8062
8099
  super();
@@ -8138,30 +8175,33 @@ If this message still persists after updating, please report an issue: https://g
8138
8175
  // src/core/ws/webSocketInterceptor.ts
8139
8176
  var webSocketInterceptor = new WebSocketInterceptor();
8140
8177
 
8141
- // src/core/utils/handleWebSocketEvent.ts
8142
- function handleWebSocketEvent(getCurrentHandlers) {
8178
+ // src/core/ws/handleWebSocketEvent.ts
8179
+ function handleWebSocketEvent(options) {
8143
8180
  webSocketInterceptor.on("connection", (connection) => {
8144
- const handlers = getCurrentHandlers();
8181
+ const handlers = options.getHandlers();
8145
8182
  const connectionEvent = new MessageEvent("connection", {
8146
8183
  data: connection
8147
- /**
8148
- * @note This message event should be marked as "cancelable"
8149
- * to have its default prevented using "event.preventDefault()".
8150
- * There's a bug in Node.js that breaks the "cancelable" flag.
8151
- * @see https://github.com/nodejs/node/issues/51767
8152
- */
8153
- });
8154
- Object.defineProperty(connectionEvent, kDefaultPrevented, {
8155
- enumerable: false,
8156
- writable: true,
8157
- value: false
8158
8184
  });
8159
- for (const handler of handlers) {
8160
- if (handler instanceof WebSocketHandler) {
8185
+ const matchingHandlers = handlers.filter(
8186
+ (handler) => {
8187
+ if (handler instanceof WebSocketHandler) {
8188
+ return handler.predicate({
8189
+ event: connectionEvent,
8190
+ parsedResult: handler.parse({
8191
+ event: connectionEvent
8192
+ })
8193
+ });
8194
+ }
8195
+ return false;
8196
+ }
8197
+ );
8198
+ if (matchingHandlers.length > 0) {
8199
+ options?.onMockedConnection(connection);
8200
+ for (const handler of matchingHandlers) {
8161
8201
  handler[kDispatchEvent](connectionEvent);
8162
8202
  }
8163
- }
8164
- if (!Reflect.get(connectionEvent, kDefaultPrevented)) {
8203
+ } else {
8204
+ options?.onPassthroughConnection(connection);
8165
8205
  connection.server.connect();
8166
8206
  connection.client.addEventListener("message", (event) => {
8167
8207
  connection.server.send(event.data);
@@ -8170,6 +8210,217 @@ If this message still persists after updating, please report an issue: https://g
8170
8210
  });
8171
8211
  }
8172
8212
 
8213
+ // src/core/ws/utils/getMessageLength.ts
8214
+ function getMessageLength(data) {
8215
+ if (data instanceof Blob) {
8216
+ return data.size;
8217
+ }
8218
+ if (data instanceof ArrayBuffer) {
8219
+ return data.byteLength;
8220
+ }
8221
+ return new Blob([data]).size;
8222
+ }
8223
+
8224
+ // src/core/ws/utils/truncateMessage.ts
8225
+ var MAX_LENGTH = 24;
8226
+ function truncateMessage(message3) {
8227
+ if (message3.length <= MAX_LENGTH) {
8228
+ return message3;
8229
+ }
8230
+ return `${message3.slice(0, MAX_LENGTH)}\u2026`;
8231
+ }
8232
+
8233
+ // src/core/ws/utils/getPublicData.ts
8234
+ async function getPublicData(data) {
8235
+ if (data instanceof Blob) {
8236
+ const text = await data.text();
8237
+ return `Blob(${truncateMessage(text)})`;
8238
+ }
8239
+ if (typeof data === "object" && "byteLength" in data) {
8240
+ const text = new TextDecoder().decode(data);
8241
+ return `ArrayBuffer(${truncateMessage(text)})`;
8242
+ }
8243
+ return truncateMessage(data);
8244
+ }
8245
+
8246
+ // src/core/ws/utils/attachWebSocketLogger.ts
8247
+ function attachWebSocketLogger(connection) {
8248
+ const { client, server } = connection;
8249
+ logConnectionOpen(client);
8250
+ client.addEventListener("message", (event) => {
8251
+ logOutgoingClientMessage(event);
8252
+ });
8253
+ client.addEventListener("close", (event) => {
8254
+ logConnectionClose(event);
8255
+ });
8256
+ client.socket.addEventListener("message", (event) => {
8257
+ logIncomingClientMessage(event);
8258
+ });
8259
+ client.socket.addEventListener("error", (event) => {
8260
+ logClientError(event);
8261
+ });
8262
+ client.send = new Proxy(client.send, {
8263
+ apply(target, thisArg, args) {
8264
+ const [data] = args;
8265
+ const messageEvent = new MessageEvent("message", { data });
8266
+ Object.defineProperties(messageEvent, {
8267
+ currentTarget: {
8268
+ enumerable: true,
8269
+ writable: false,
8270
+ value: client.socket
8271
+ },
8272
+ target: {
8273
+ enumerable: true,
8274
+ writable: false,
8275
+ value: client.socket
8276
+ }
8277
+ });
8278
+ logIncomingMockedClientMessage(messageEvent);
8279
+ return Reflect.apply(target, thisArg, args);
8280
+ }
8281
+ });
8282
+ server.addEventListener(
8283
+ "open",
8284
+ () => {
8285
+ server.addEventListener("message", (event) => {
8286
+ logIncomingServerMessage(event);
8287
+ });
8288
+ },
8289
+ { once: true }
8290
+ );
8291
+ server.send = new Proxy(server.send, {
8292
+ apply(target, thisArg, args) {
8293
+ const [data] = args;
8294
+ const messageEvent = new MessageEvent("message", { data });
8295
+ Object.defineProperties(messageEvent, {
8296
+ currentTarget: {
8297
+ enumerable: true,
8298
+ writable: false,
8299
+ value: server["realWebSocket"]
8300
+ },
8301
+ target: {
8302
+ enumerable: true,
8303
+ writable: false,
8304
+ value: server["realWebSocket"]
8305
+ }
8306
+ });
8307
+ logOutgoingMockedClientMessage(messageEvent);
8308
+ return Reflect.apply(target, thisArg, args);
8309
+ }
8310
+ });
8311
+ }
8312
+ function logConnectionOpen(client) {
8313
+ const publicUrl = toPublicUrl(client.url);
8314
+ console.groupCollapsed(
8315
+ devUtils.formatMessage(`${getTimestamp()} %c\u25B8%c ${publicUrl}`),
8316
+ "color:blue",
8317
+ "color:inherit"
8318
+ );
8319
+ console.log("Client:", client.socket);
8320
+ console.groupEnd();
8321
+ }
8322
+ async function logOutgoingClientMessage(event) {
8323
+ const byteLength = getMessageLength(event.data);
8324
+ const publicData = await getPublicData(event.data);
8325
+ console.groupCollapsed(
8326
+ devUtils.formatMessage(
8327
+ `${getTimestamp({ milliseconds: true })} %c\u2191%c ${publicData} %c${byteLength}%c`
8328
+ ),
8329
+ "color:green",
8330
+ "color:inherit",
8331
+ "color:gray;font-weight:normal",
8332
+ "color:inherit;font-weight:inherit"
8333
+ );
8334
+ console.log(event);
8335
+ console.groupEnd();
8336
+ }
8337
+ async function logOutgoingMockedClientMessage(event) {
8338
+ const byteLength = getMessageLength(event.data);
8339
+ const publicData = await getPublicData(event.data);
8340
+ console.groupCollapsed(
8341
+ devUtils.formatMessage(
8342
+ `${getTimestamp({ milliseconds: true })} %c\u21E1%c ${publicData} %c${byteLength}%c`
8343
+ ),
8344
+ "color:orangered",
8345
+ "color:inherit",
8346
+ "color:gray;font-weight:normal",
8347
+ "color:inherit;font-weight:inherit"
8348
+ );
8349
+ console.log(event);
8350
+ console.groupEnd();
8351
+ }
8352
+ async function logIncomingClientMessage(event) {
8353
+ const byteLength = getMessageLength(event.data);
8354
+ const publicData = await getPublicData(event.data);
8355
+ console.groupCollapsed(
8356
+ devUtils.formatMessage(
8357
+ `${getTimestamp({ milliseconds: true })} %c\u2193%c ${publicData} %c${byteLength}%c`
8358
+ ),
8359
+ "color:red",
8360
+ "color:inherit",
8361
+ "color:gray;font-weight:normal",
8362
+ "color:inherit;font-weight:inherit"
8363
+ );
8364
+ console.log(event);
8365
+ console.groupEnd();
8366
+ }
8367
+ async function logIncomingMockedClientMessage(event) {
8368
+ const byteLength = getMessageLength(event.data);
8369
+ const publicData = await getPublicData(event.data);
8370
+ console.groupCollapsed(
8371
+ devUtils.formatMessage(
8372
+ `${getTimestamp({ milliseconds: true })} %c\u21E3%c ${publicData} %c${byteLength}%c`
8373
+ ),
8374
+ "color:orangered",
8375
+ "color:inherit",
8376
+ "color:gray;font-weight:normal",
8377
+ "color:inherit;font-weight:inherit"
8378
+ );
8379
+ console.log(event);
8380
+ console.groupEnd();
8381
+ }
8382
+ function logConnectionClose(event) {
8383
+ const target = event.target;
8384
+ const publicUrl = toPublicUrl(target.url);
8385
+ console.groupCollapsed(
8386
+ devUtils.formatMessage(
8387
+ `${getTimestamp({ milliseconds: true })} %c\u25A0%c ${publicUrl}`
8388
+ ),
8389
+ "color:blue",
8390
+ "color:inherit"
8391
+ );
8392
+ console.log(event);
8393
+ console.groupEnd();
8394
+ }
8395
+ async function logIncomingServerMessage(event) {
8396
+ const byteLength = getMessageLength(event.data);
8397
+ const publicData = await getPublicData(event.data);
8398
+ console.groupCollapsed(
8399
+ devUtils.formatMessage(
8400
+ `${getTimestamp({ milliseconds: true })} %c\u21E3%c ${publicData} %c${byteLength}%c`
8401
+ ),
8402
+ "color:orangered",
8403
+ "color:inherit",
8404
+ "color:gray;font-weight:normal",
8405
+ "color:inherit;font-weight:inherit"
8406
+ );
8407
+ console.log(event);
8408
+ console.groupEnd();
8409
+ }
8410
+ function logClientError(event) {
8411
+ const socket = event.target;
8412
+ const publicUrl = toPublicUrl(socket.url);
8413
+ console.groupCollapsed(
8414
+ devUtils.formatMessage(
8415
+ `${getTimestamp({ milliseconds: true })} %c\xD7%c ${publicUrl}`
8416
+ ),
8417
+ "color:red",
8418
+ "color:inherit"
8419
+ );
8420
+ console.log(event);
8421
+ console.groupEnd();
8422
+ }
8423
+
8173
8424
  // src/browser/setupWorker/setupWorker.ts
8174
8425
  var SetupWorkerApi = class extends SetupApi {
8175
8426
  context;
@@ -8286,8 +8537,17 @@ If this message still persists after updating, please report an issue: https://g
8286
8537
  DEFAULT_START_OPTIONS,
8287
8538
  options
8288
8539
  );
8289
- handleWebSocketEvent(() => {
8290
- return this.handlersController.currentHandlers();
8540
+ handleWebSocketEvent({
8541
+ getHandlers: () => {
8542
+ return this.handlersController.currentHandlers();
8543
+ },
8544
+ onMockedConnection: (connection) => {
8545
+ if (!this.context.startOptions.quiet) {
8546
+ attachWebSocketLogger(connection);
8547
+ }
8548
+ },
8549
+ onPassthroughConnection() {
8550
+ }
8291
8551
  });
8292
8552
  webSocketInterceptor.apply();
8293
8553
  this.subscriptions.push(() => {