msw 2.5.2 → 2.6.1

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 (209) hide show
  1. package/lib/browser/index.d.mts +7 -6
  2. package/lib/browser/index.d.ts +7 -6
  3. package/lib/browser/index.js +28 -2
  4. package/lib/browser/index.js.map +1 -1
  5. package/lib/browser/index.mjs +28 -2
  6. package/lib/browser/index.mjs.map +1 -1
  7. package/lib/core/{GraphQLHandler-ClMB0BOy.d.mts → GraphQLHandler-B6uni-E_.d.mts} +1 -1
  8. package/lib/core/{GraphQLHandler-D6mLMXGZ.d.ts → GraphQLHandler-Cjm7JNGi.d.ts} +1 -1
  9. package/lib/core/{HttpResponse-vn-Pb4Bi.d.mts → HttpResponse-63H9vVoL.d.mts} +1 -0
  10. package/lib/core/{HttpResponse-DaYkf3ml.d.ts → HttpResponse-DzhqZzTK.d.ts} +1 -0
  11. package/lib/core/HttpResponse.d.mts +1 -1
  12. package/lib/core/HttpResponse.d.ts +1 -1
  13. package/lib/core/SetupApi.d.mts +15 -12
  14. package/lib/core/SetupApi.d.ts +15 -12
  15. package/lib/core/SetupApi.js +3 -1
  16. package/lib/core/SetupApi.js.map +1 -1
  17. package/lib/core/SetupApi.mjs +3 -1
  18. package/lib/core/SetupApi.mjs.map +1 -1
  19. package/lib/core/getResponse.d.mts +1 -1
  20. package/lib/core/getResponse.d.ts +1 -1
  21. package/lib/core/graphql.d.mts +2 -2
  22. package/lib/core/graphql.d.ts +2 -2
  23. package/lib/core/handlers/GraphQLHandler.d.mts +2 -2
  24. package/lib/core/handlers/GraphQLHandler.d.ts +2 -2
  25. package/lib/core/handlers/HttpHandler.d.mts +1 -1
  26. package/lib/core/handlers/HttpHandler.d.ts +1 -1
  27. package/lib/core/handlers/RequestHandler.d.mts +1 -1
  28. package/lib/core/handlers/RequestHandler.d.ts +1 -1
  29. package/lib/core/handlers/RequestHandler.js +2 -0
  30. package/lib/core/handlers/RequestHandler.js.map +1 -1
  31. package/lib/core/handlers/RequestHandler.mjs +2 -0
  32. package/lib/core/handlers/RequestHandler.mjs.map +1 -1
  33. package/lib/core/handlers/WebSocketHandler.d.mts +34 -0
  34. package/lib/core/handlers/WebSocketHandler.d.ts +34 -0
  35. package/lib/core/handlers/WebSocketHandler.js +122 -0
  36. package/lib/core/handlers/WebSocketHandler.js.map +1 -0
  37. package/lib/core/handlers/WebSocketHandler.mjs +104 -0
  38. package/lib/core/handlers/WebSocketHandler.mjs.map +1 -0
  39. package/lib/core/handlers/common.d.mts +3 -0
  40. package/lib/core/handlers/common.d.ts +3 -0
  41. package/lib/core/handlers/common.js +17 -0
  42. package/lib/core/handlers/common.js.map +1 -0
  43. package/lib/core/handlers/common.mjs +1 -0
  44. package/lib/core/handlers/common.mjs.map +1 -0
  45. package/lib/core/http.d.mts +1 -1
  46. package/lib/core/http.d.ts +1 -1
  47. package/lib/core/index.d.mts +5 -2
  48. package/lib/core/index.d.ts +5 -2
  49. package/lib/core/index.js +5 -1
  50. package/lib/core/index.js.map +1 -1
  51. package/lib/core/index.mjs +7 -1
  52. package/lib/core/index.mjs.map +1 -1
  53. package/lib/core/passthrough.d.mts +1 -1
  54. package/lib/core/passthrough.d.ts +1 -1
  55. package/lib/core/utils/HttpResponse/decorators.d.mts +1 -1
  56. package/lib/core/utils/HttpResponse/decorators.d.ts +1 -1
  57. package/lib/core/utils/executeHandlers.d.mts +1 -1
  58. package/lib/core/utils/executeHandlers.d.ts +1 -1
  59. package/lib/core/utils/executeHandlers.js.map +1 -1
  60. package/lib/core/utils/executeHandlers.mjs.map +1 -1
  61. package/lib/core/utils/handleRequest.d.mts +2 -2
  62. package/lib/core/utils/handleRequest.d.ts +2 -2
  63. package/lib/core/utils/handleRequest.js.map +1 -1
  64. package/lib/core/utils/handleRequest.mjs.map +1 -1
  65. package/lib/core/utils/internal/isHandlerKind.d.mts +17 -0
  66. package/lib/core/utils/internal/isHandlerKind.d.ts +17 -0
  67. package/lib/core/utils/internal/isHandlerKind.js +29 -0
  68. package/lib/core/utils/internal/isHandlerKind.js.map +1 -0
  69. package/lib/core/utils/internal/isHandlerKind.mjs +9 -0
  70. package/lib/core/utils/internal/isHandlerKind.mjs.map +1 -0
  71. package/lib/core/utils/internal/parseGraphQLRequest.d.mts +2 -2
  72. package/lib/core/utils/internal/parseGraphQLRequest.d.ts +2 -2
  73. package/lib/core/utils/internal/parseMultipartData.d.mts +1 -1
  74. package/lib/core/utils/internal/parseMultipartData.d.ts +1 -1
  75. package/lib/core/utils/internal/requestHandlerUtils.d.mts +1 -1
  76. package/lib/core/utils/internal/requestHandlerUtils.d.ts +1 -1
  77. package/lib/core/utils/logging/getTimestamp.d.mts +4 -1
  78. package/lib/core/utils/logging/getTimestamp.d.ts +4 -1
  79. package/lib/core/utils/logging/getTimestamp.js +6 -2
  80. package/lib/core/utils/logging/getTimestamp.js.map +1 -1
  81. package/lib/core/utils/logging/getTimestamp.mjs +6 -2
  82. package/lib/core/utils/logging/getTimestamp.mjs.map +1 -1
  83. package/lib/core/utils/matching/matchRequestUrl.d.mts +2 -1
  84. package/lib/core/utils/matching/matchRequestUrl.d.ts +2 -1
  85. package/lib/core/utils/matching/matchRequestUrl.js +4 -0
  86. package/lib/core/utils/matching/matchRequestUrl.js.map +1 -1
  87. package/lib/core/utils/matching/matchRequestUrl.mjs +4 -0
  88. package/lib/core/utils/matching/matchRequestUrl.mjs.map +1 -1
  89. package/lib/core/ws/WebSocketClientManager.d.mts +63 -0
  90. package/lib/core/ws/WebSocketClientManager.d.ts +63 -0
  91. package/lib/core/ws/WebSocketClientManager.js +149 -0
  92. package/lib/core/ws/WebSocketClientManager.js.map +1 -0
  93. package/lib/core/ws/WebSocketClientManager.mjs +129 -0
  94. package/lib/core/ws/WebSocketClientManager.mjs.map +1 -0
  95. package/lib/core/ws/WebSocketClientStore.d.mts +13 -0
  96. package/lib/core/ws/WebSocketClientStore.d.ts +13 -0
  97. package/lib/core/ws/WebSocketClientStore.js +26 -0
  98. package/lib/core/ws/WebSocketClientStore.js.map +1 -0
  99. package/lib/core/ws/WebSocketClientStore.mjs +6 -0
  100. package/lib/core/ws/WebSocketClientStore.mjs.map +1 -0
  101. package/lib/core/ws/WebSocketIndexedDBClientStore.d.mts +15 -0
  102. package/lib/core/ws/WebSocketIndexedDBClientStore.d.ts +15 -0
  103. package/lib/core/ws/WebSocketIndexedDBClientStore.js +130 -0
  104. package/lib/core/ws/WebSocketIndexedDBClientStore.js.map +1 -0
  105. package/lib/core/ws/WebSocketIndexedDBClientStore.mjs +110 -0
  106. package/lib/core/ws/WebSocketIndexedDBClientStore.mjs.map +1 -0
  107. package/lib/core/ws/WebSocketMemoryClientStore.d.mts +13 -0
  108. package/lib/core/ws/WebSocketMemoryClientStore.d.ts +13 -0
  109. package/lib/core/ws/WebSocketMemoryClientStore.js +41 -0
  110. package/lib/core/ws/WebSocketMemoryClientStore.js.map +1 -0
  111. package/lib/core/ws/WebSocketMemoryClientStore.mjs +21 -0
  112. package/lib/core/ws/WebSocketMemoryClientStore.mjs.map +1 -0
  113. package/lib/core/ws/handleWebSocketEvent.d.mts +19 -0
  114. package/lib/core/ws/handleWebSocketEvent.d.ts +19 -0
  115. package/lib/core/ws/handleWebSocketEvent.js +74 -0
  116. package/lib/core/ws/handleWebSocketEvent.js.map +1 -0
  117. package/lib/core/ws/handleWebSocketEvent.mjs +56 -0
  118. package/lib/core/ws/handleWebSocketEvent.mjs.map +1 -0
  119. package/lib/core/ws/utils/attachWebSocketLogger.d.mts +12 -0
  120. package/lib/core/ws/utils/attachWebSocketLogger.d.ts +12 -0
  121. package/lib/core/ws/utils/attachWebSocketLogger.js +198 -0
  122. package/lib/core/ws/utils/attachWebSocketLogger.js.map +1 -0
  123. package/lib/core/ws/utils/attachWebSocketLogger.mjs +178 -0
  124. package/lib/core/ws/utils/attachWebSocketLogger.mjs.map +1 -0
  125. package/lib/core/ws/utils/getMessageLength.d.mts +11 -0
  126. package/lib/core/ws/utils/getMessageLength.d.ts +11 -0
  127. package/lib/core/ws/utils/getMessageLength.js +33 -0
  128. package/lib/core/ws/utils/getMessageLength.js.map +1 -0
  129. package/lib/core/ws/utils/getMessageLength.mjs +13 -0
  130. package/lib/core/ws/utils/getMessageLength.mjs.map +1 -0
  131. package/lib/core/ws/utils/getPublicData.d.mts +5 -0
  132. package/lib/core/ws/utils/getPublicData.d.ts +5 -0
  133. package/lib/core/ws/utils/getPublicData.js +36 -0
  134. package/lib/core/ws/utils/getPublicData.js.map +1 -0
  135. package/lib/core/ws/utils/getPublicData.mjs +16 -0
  136. package/lib/core/ws/utils/getPublicData.mjs.map +1 -0
  137. package/lib/core/ws/utils/truncateMessage.d.mts +3 -0
  138. package/lib/core/ws/utils/truncateMessage.d.ts +3 -0
  139. package/lib/core/ws/utils/truncateMessage.js +31 -0
  140. package/lib/core/ws/utils/truncateMessage.js.map +1 -0
  141. package/lib/core/ws/utils/truncateMessage.mjs +11 -0
  142. package/lib/core/ws/utils/truncateMessage.mjs.map +1 -0
  143. package/lib/core/ws/webSocketInterceptor.d.mts +5 -0
  144. package/lib/core/ws/webSocketInterceptor.d.ts +5 -0
  145. package/lib/core/ws/webSocketInterceptor.js +26 -0
  146. package/lib/core/ws/webSocketInterceptor.js.map +1 -0
  147. package/lib/core/ws/webSocketInterceptor.mjs +6 -0
  148. package/lib/core/ws/webSocketInterceptor.mjs.map +1 -0
  149. package/lib/core/ws.d.mts +75 -0
  150. package/lib/core/ws.d.ts +75 -0
  151. package/lib/core/ws.js +71 -0
  152. package/lib/core/ws.js.map +1 -0
  153. package/lib/core/ws.mjs +54 -0
  154. package/lib/core/ws.mjs.map +1 -0
  155. package/lib/iife/index.js +1420 -86
  156. package/lib/iife/index.js.map +1 -1
  157. package/lib/mockServiceWorker.js +1 -1
  158. package/lib/native/index.d.mts +6 -5
  159. package/lib/native/index.d.ts +6 -5
  160. package/lib/native/index.js +19 -4
  161. package/lib/native/index.js.map +1 -1
  162. package/lib/native/index.mjs +19 -4
  163. package/lib/native/index.mjs.map +1 -1
  164. package/lib/node/index.d.mts +8 -7
  165. package/lib/node/index.d.ts +8 -7
  166. package/lib/node/index.js +19 -4
  167. package/lib/node/index.js.map +1 -1
  168. package/lib/node/index.mjs +19 -4
  169. package/lib/node/index.mjs.map +1 -1
  170. package/package.json +10 -1
  171. package/src/browser/setupWorker/glossary.ts +10 -10
  172. package/src/browser/setupWorker/setupWorker.ts +32 -3
  173. package/src/browser/setupWorker/start/createFallbackRequestListener.ts +2 -1
  174. package/src/browser/setupWorker/start/createRequestListener.ts +2 -1
  175. package/src/browser/setupWorker/start/createStartHandler.ts +5 -0
  176. package/src/browser/setupWorker/stop/createStop.ts +6 -0
  177. package/src/core/SetupApi.ts +28 -20
  178. package/src/core/handlers/RequestHandler.ts +4 -0
  179. package/src/core/handlers/WebSocketHandler.ts +146 -0
  180. package/src/core/handlers/common.ts +1 -0
  181. package/src/core/index.ts +11 -1
  182. package/src/core/utils/executeHandlers.ts +1 -1
  183. package/src/core/utils/handleRequest.ts +1 -1
  184. package/src/core/utils/internal/isHandlerKind.test.ts +64 -0
  185. package/src/core/utils/internal/isHandlerKind.ts +21 -0
  186. package/src/core/utils/logging/getTimestamp.test.ts +20 -6
  187. package/src/core/utils/logging/getTimestamp.ts +11 -6
  188. package/src/core/utils/matching/matchRequestUrl.test.ts +44 -0
  189. package/src/core/utils/matching/matchRequestUrl.ts +4 -0
  190. package/src/core/ws/WebSocketClientManager.test.ts +164 -0
  191. package/src/core/ws/WebSocketClientManager.ts +211 -0
  192. package/src/core/ws/WebSocketClientStore.ts +14 -0
  193. package/src/core/ws/WebSocketIndexedDBClientStore.ts +145 -0
  194. package/src/core/ws/WebSocketMemoryClientStore.ts +27 -0
  195. package/src/core/ws/handleWebSocketEvent.ts +83 -0
  196. package/src/core/ws/utils/attachWebSocketLogger.ts +259 -0
  197. package/src/core/ws/utils/getMessageLength.test.ts +16 -0
  198. package/src/core/ws/utils/getMessageLength.ts +19 -0
  199. package/src/core/ws/utils/getPublicData.test.ts +38 -0
  200. package/src/core/ws/utils/getPublicData.ts +17 -0
  201. package/src/core/ws/utils/truncateMessage.test.ts +12 -0
  202. package/src/core/ws/utils/truncateMessage.ts +9 -0
  203. package/src/core/ws/webSocketInterceptor.ts +3 -0
  204. package/src/core/ws.test.ts +23 -0
  205. package/src/core/ws.ts +166 -0
  206. package/src/node/SetupServerApi.ts +8 -7
  207. package/src/node/SetupServerCommonApi.ts +25 -5
  208. package/src/node/glossary.ts +5 -7
  209. package/src/node/setupServer.ts +2 -1
package/lib/iife/index.js CHANGED
@@ -13336,6 +13336,7 @@ ${operationTypes.join("\n")}
13336
13336
  SET_TIMEOUT_MAX_ALLOWED_INT: () => SET_TIMEOUT_MAX_ALLOWED_INT,
13337
13337
  SetupApi: () => SetupApi,
13338
13338
  SetupWorkerApi: () => SetupWorkerApi,
13339
+ WebSocketHandler: () => WebSocketHandler,
13339
13340
  bypass: () => bypass,
13340
13341
  cleanUrl: () => cleanUrl,
13341
13342
  delay: () => delay,
@@ -13345,7 +13346,8 @@ ${operationTypes.join("\n")}
13345
13346
  http: () => http,
13346
13347
  matchRequestUrl: () => matchRequestUrl,
13347
13348
  passthrough: () => passthrough,
13348
- setupWorker: () => setupWorker
13349
+ setupWorker: () => setupWorker,
13350
+ ws: () => ws
13349
13351
  });
13350
13352
 
13351
13353
  // node_modules/.pnpm/outvariant@1.4.3/node_modules/outvariant/lib/index.mjs
@@ -13717,7 +13719,9 @@ ${operationTypes.join("\n")}
13717
13719
  }
13718
13720
  restoreHandlers() {
13719
13721
  this.handlersController.currentHandlers().forEach((handler) => {
13720
- handler.isUsed = false;
13722
+ if ("isUsed" in handler) {
13723
+ handler.isUsed = false;
13724
+ }
13721
13725
  });
13722
13726
  }
13723
13727
  resetHandlers(...nextHandlers) {
@@ -13771,6 +13775,7 @@ ${operationTypes.join("\n")}
13771
13775
  // src/core/handlers/RequestHandler.ts
13772
13776
  var RequestHandler = class _RequestHandler {
13773
13777
  static cache = /* @__PURE__ */ new WeakMap();
13778
+ __kind;
13774
13779
  info;
13775
13780
  /**
13776
13781
  * Indicates whether this request handler has been used
@@ -13790,6 +13795,7 @@ ${operationTypes.join("\n")}
13790
13795
  callFrame
13791
13796
  };
13792
13797
  this.isUsed = false;
13798
+ this.__kind = "RequestHandler";
13793
13799
  }
13794
13800
  /**
13795
13801
  * Parse the intercepted request to extract additional information from it.
@@ -13932,9 +13938,13 @@ ${operationTypes.join("\n")}
13932
13938
  }
13933
13939
 
13934
13940
  // src/core/utils/logging/getTimestamp.ts
13935
- function getTimestamp() {
13941
+ function getTimestamp(options) {
13936
13942
  const now = /* @__PURE__ */ new Date();
13937
- return [now.getHours(), now.getMinutes(), now.getSeconds()].map(String).map((chunk) => chunk.slice(0, 2)).map((chunk) => chunk.padStart(2, "0")).join(":");
13943
+ const timestamp = `${now.getHours().toString().padStart(2, "0")}:${now.getMinutes().toString().padStart(2, "0")}:${now.getSeconds().toString().padStart(2, "0")}`;
13944
+ if (options?.milliseconds) {
13945
+ return `${timestamp}.${now.getMilliseconds().toString().padStart(3, "0")}`;
13946
+ }
13947
+ return timestamp;
13938
13948
  }
13939
13949
 
13940
13950
  // src/core/utils/logging/serializeRequest.ts
@@ -15057,6 +15067,9 @@ ${operationTypes.join("\n")}
15057
15067
  params
15058
15068
  };
15059
15069
  }
15070
+ function isPath(value) {
15071
+ return typeof value === "string" || value instanceof RegExp;
15072
+ }
15060
15073
 
15061
15074
  // src/core/utils/request/toPublicUrl.ts
15062
15075
  function toPublicUrl(url) {
@@ -28154,6 +28167,460 @@ Consider naming this operation or using "graphql.operation()" request handler to
28154
28167
  link: createGraphQLLink
28155
28168
  };
28156
28169
 
28170
+ // src/core/handlers/WebSocketHandler.ts
28171
+ var kEmitter = Symbol("kEmitter");
28172
+ var kDispatchEvent = Symbol("kDispatchEvent");
28173
+ var kSender = Symbol("kSender");
28174
+ var kStopPropagationPatched = Symbol("kStopPropagationPatched");
28175
+ var KOnStopPropagation = Symbol("KOnStopPropagation");
28176
+ var WebSocketHandler = class {
28177
+ constructor(url) {
28178
+ this.url = url;
28179
+ this.id = createRequestId();
28180
+ this[kEmitter] = new Emitter();
28181
+ this.callFrame = getCallFrame(new Error());
28182
+ this.__kind = "EventHandler";
28183
+ }
28184
+ __kind;
28185
+ id;
28186
+ callFrame;
28187
+ [kEmitter];
28188
+ parse(args) {
28189
+ const connection = args.event.data;
28190
+ const match2 = matchRequestUrl(connection.client.url, this.url);
28191
+ return {
28192
+ match: match2
28193
+ };
28194
+ }
28195
+ predicate(args) {
28196
+ return args.parsedResult.match.matches;
28197
+ }
28198
+ async [kDispatchEvent](event) {
28199
+ const parsedResult = this.parse({ event });
28200
+ const connection = event.data;
28201
+ const resolvedConnection = {
28202
+ ...connection,
28203
+ params: parsedResult.match.params || {}
28204
+ };
28205
+ connection.client.addEventListener(
28206
+ "message",
28207
+ createStopPropagationListener(this)
28208
+ );
28209
+ connection.client.addEventListener(
28210
+ "close",
28211
+ createStopPropagationListener(this)
28212
+ );
28213
+ connection.server.addEventListener(
28214
+ "open",
28215
+ createStopPropagationListener(this)
28216
+ );
28217
+ connection.server.addEventListener(
28218
+ "message",
28219
+ createStopPropagationListener(this)
28220
+ );
28221
+ connection.server.addEventListener(
28222
+ "error",
28223
+ createStopPropagationListener(this)
28224
+ );
28225
+ connection.server.addEventListener(
28226
+ "close",
28227
+ createStopPropagationListener(this)
28228
+ );
28229
+ this[kEmitter].emit("connection", resolvedConnection);
28230
+ }
28231
+ };
28232
+ function createStopPropagationListener(handler) {
28233
+ return function stopPropagationListener(event) {
28234
+ const propagationStoppedAt = Reflect.get(event, "kPropagationStoppedAt");
28235
+ if (propagationStoppedAt && handler.id !== propagationStoppedAt) {
28236
+ event.stopImmediatePropagation();
28237
+ return;
28238
+ }
28239
+ Object.defineProperty(event, KOnStopPropagation, {
28240
+ value() {
28241
+ Object.defineProperty(event, "kPropagationStoppedAt", {
28242
+ value: handler.id
28243
+ });
28244
+ },
28245
+ configurable: true
28246
+ });
28247
+ if (!Reflect.get(event, kStopPropagationPatched)) {
28248
+ event.stopPropagation = new Proxy(event.stopPropagation, {
28249
+ apply: (target, thisArg, args) => {
28250
+ Reflect.get(event, KOnStopPropagation)?.call(handler);
28251
+ return Reflect.apply(target, thisArg, args);
28252
+ }
28253
+ });
28254
+ Object.defineProperty(event, kStopPropagationPatched, {
28255
+ value: true,
28256
+ // If something else attempts to redefine this, throw.
28257
+ configurable: false
28258
+ });
28259
+ }
28260
+ };
28261
+ }
28262
+
28263
+ // src/core/ws/WebSocketMemoryClientStore.ts
28264
+ var WebSocketMemoryClientStore = class {
28265
+ store;
28266
+ constructor() {
28267
+ this.store = /* @__PURE__ */ new Map();
28268
+ }
28269
+ async add(client) {
28270
+ this.store.set(client.id, { id: client.id, url: client.url.href });
28271
+ }
28272
+ getAll() {
28273
+ return Promise.resolve(Array.from(this.store.values()));
28274
+ }
28275
+ async deleteMany(clientIds) {
28276
+ for (const clientId of clientIds) {
28277
+ this.store.delete(clientId);
28278
+ }
28279
+ }
28280
+ };
28281
+
28282
+ // node_modules/.pnpm/@open-draft+deferred-promise@2.2.0/node_modules/@open-draft/deferred-promise/build/index.mjs
28283
+ function createDeferredExecutor() {
28284
+ const executor = (resolve, reject) => {
28285
+ executor.state = "pending";
28286
+ executor.resolve = (data) => {
28287
+ if (executor.state !== "pending") {
28288
+ return;
28289
+ }
28290
+ executor.result = data;
28291
+ const onFulfilled = (value) => {
28292
+ executor.state = "fulfilled";
28293
+ return value;
28294
+ };
28295
+ return resolve(
28296
+ data instanceof Promise ? data : Promise.resolve(data).then(onFulfilled)
28297
+ );
28298
+ };
28299
+ executor.reject = (reason) => {
28300
+ if (executor.state !== "pending") {
28301
+ return;
28302
+ }
28303
+ queueMicrotask(() => {
28304
+ executor.state = "rejected";
28305
+ });
28306
+ return reject(executor.rejectionReason = reason);
28307
+ };
28308
+ };
28309
+ return executor;
28310
+ }
28311
+ var DeferredPromise = class extends Promise {
28312
+ #executor;
28313
+ resolve;
28314
+ reject;
28315
+ constructor(executor = null) {
28316
+ const deferredExecutor = createDeferredExecutor();
28317
+ super((originalResolve, originalReject) => {
28318
+ deferredExecutor(originalResolve, originalReject);
28319
+ executor?.(deferredExecutor.resolve, deferredExecutor.reject);
28320
+ });
28321
+ this.#executor = deferredExecutor;
28322
+ this.resolve = this.#executor.resolve;
28323
+ this.reject = this.#executor.reject;
28324
+ }
28325
+ get state() {
28326
+ return this.#executor.state;
28327
+ }
28328
+ get rejectionReason() {
28329
+ return this.#executor.rejectionReason;
28330
+ }
28331
+ then(onFulfilled, onRejected) {
28332
+ return this.#decorate(super.then(onFulfilled, onRejected));
28333
+ }
28334
+ catch(onRejected) {
28335
+ return this.#decorate(super.catch(onRejected));
28336
+ }
28337
+ finally(onfinally) {
28338
+ return this.#decorate(super.finally(onfinally));
28339
+ }
28340
+ #decorate(promise) {
28341
+ return Object.defineProperties(promise, {
28342
+ resolve: { configurable: true, value: this.resolve },
28343
+ reject: { configurable: true, value: this.reject }
28344
+ });
28345
+ }
28346
+ };
28347
+
28348
+ // src/core/ws/WebSocketIndexedDBClientStore.ts
28349
+ var DB_NAME = "msw-websocket-clients";
28350
+ var DB_STORE_NAME = "clients";
28351
+ var WebSocketIndexedDBClientStore = class {
28352
+ db;
28353
+ constructor() {
28354
+ this.db = this.createDatabase();
28355
+ }
28356
+ async add(client) {
28357
+ const promise = new DeferredPromise();
28358
+ const store2 = await this.getStore();
28359
+ const request = store2.put({
28360
+ id: client.id,
28361
+ url: client.url.href
28362
+ });
28363
+ request.onsuccess = () => {
28364
+ promise.resolve();
28365
+ };
28366
+ request.onerror = () => {
28367
+ console.error(request.error);
28368
+ promise.reject(
28369
+ new Error(
28370
+ `Failed to add WebSocket client "${client.id}". There is likely an additional output above.`
28371
+ )
28372
+ );
28373
+ };
28374
+ return promise;
28375
+ }
28376
+ async getAll() {
28377
+ const promise = new DeferredPromise();
28378
+ const store2 = await this.getStore();
28379
+ const request = store2.getAll();
28380
+ request.onsuccess = () => {
28381
+ promise.resolve(request.result);
28382
+ };
28383
+ request.onerror = () => {
28384
+ console.log(request.error);
28385
+ promise.reject(
28386
+ new Error(
28387
+ `Failed to get all WebSocket clients. There is likely an additional output above.`
28388
+ )
28389
+ );
28390
+ };
28391
+ return promise;
28392
+ }
28393
+ async deleteMany(clientIds) {
28394
+ const promise = new DeferredPromise();
28395
+ const store2 = await this.getStore();
28396
+ for (const clientId of clientIds) {
28397
+ store2.delete(clientId);
28398
+ }
28399
+ store2.transaction.oncomplete = () => {
28400
+ promise.resolve();
28401
+ };
28402
+ store2.transaction.onerror = () => {
28403
+ console.error(store2.transaction.error);
28404
+ promise.reject(
28405
+ new Error(
28406
+ `Failed to delete WebSocket clients [${clientIds.join(", ")}]. There is likely an additional output above.`
28407
+ )
28408
+ );
28409
+ };
28410
+ return promise;
28411
+ }
28412
+ async createDatabase() {
28413
+ const promise = new DeferredPromise();
28414
+ const request = indexedDB.open(DB_NAME, 1);
28415
+ request.onsuccess = ({ currentTarget }) => {
28416
+ const db = Reflect.get(currentTarget, "result");
28417
+ if (db.objectStoreNames.contains(DB_STORE_NAME)) {
28418
+ return promise.resolve(db);
28419
+ }
28420
+ };
28421
+ request.onupgradeneeded = async ({ currentTarget }) => {
28422
+ const db = Reflect.get(currentTarget, "result");
28423
+ if (db.objectStoreNames.contains(DB_STORE_NAME)) {
28424
+ return;
28425
+ }
28426
+ const store2 = db.createObjectStore(DB_STORE_NAME, { keyPath: "id" });
28427
+ store2.transaction.oncomplete = () => {
28428
+ promise.resolve(db);
28429
+ };
28430
+ store2.transaction.onerror = () => {
28431
+ console.error(store2.transaction.error);
28432
+ promise.reject(
28433
+ new Error(
28434
+ "Failed to create WebSocket client store. There is likely an additional output above."
28435
+ )
28436
+ );
28437
+ };
28438
+ };
28439
+ request.onerror = () => {
28440
+ console.error(request.error);
28441
+ promise.reject(
28442
+ new Error(
28443
+ "Failed to open an IndexedDB database. There is likely an additional output above."
28444
+ )
28445
+ );
28446
+ };
28447
+ return promise;
28448
+ }
28449
+ async getStore() {
28450
+ const db = await this.db;
28451
+ return db.transaction(DB_STORE_NAME, "readwrite").objectStore(DB_STORE_NAME);
28452
+ }
28453
+ };
28454
+
28455
+ // src/core/ws/WebSocketClientManager.ts
28456
+ var WebSocketClientManager = class {
28457
+ constructor(channel) {
28458
+ this.channel = channel;
28459
+ this.store = typeof indexedDB !== "undefined" ? new WebSocketIndexedDBClientStore() : new WebSocketMemoryClientStore();
28460
+ this.runtimeClients = /* @__PURE__ */ new Map();
28461
+ this.allClients = /* @__PURE__ */ new Set();
28462
+ this.channel.addEventListener("message", (message3) => {
28463
+ if (message3.data?.type === "db:update") {
28464
+ this.flushDatabaseToMemory();
28465
+ }
28466
+ });
28467
+ if (typeof window !== "undefined") {
28468
+ window.addEventListener("message", async (message3) => {
28469
+ if (message3.data?.type === "msw/worker:stop") {
28470
+ await this.removeRuntimeClients();
28471
+ }
28472
+ });
28473
+ }
28474
+ }
28475
+ store;
28476
+ runtimeClients;
28477
+ allClients;
28478
+ async flushDatabaseToMemory() {
28479
+ const storedClients = await this.store.getAll();
28480
+ this.allClients = new Set(
28481
+ storedClients.map((client) => {
28482
+ const runtimeClient = this.runtimeClients.get(client.id);
28483
+ if (runtimeClient) {
28484
+ return runtimeClient;
28485
+ }
28486
+ return new WebSocketRemoteClientConnection(
28487
+ client.id,
28488
+ new URL(client.url),
28489
+ this.channel
28490
+ );
28491
+ })
28492
+ );
28493
+ }
28494
+ async removeRuntimeClients() {
28495
+ await this.store.deleteMany(Array.from(this.runtimeClients.keys()));
28496
+ this.runtimeClients.clear();
28497
+ await this.flushDatabaseToMemory();
28498
+ this.notifyOthersAboutDatabaseUpdate();
28499
+ }
28500
+ /**
28501
+ * All active WebSocket client connections.
28502
+ */
28503
+ get clients() {
28504
+ return this.allClients;
28505
+ }
28506
+ /**
28507
+ * Notify other runtimes about the database update
28508
+ * using the shared `BroadcastChannel` instance.
28509
+ */
28510
+ notifyOthersAboutDatabaseUpdate() {
28511
+ this.channel.postMessage({ type: "db:update" });
28512
+ }
28513
+ async addClient(client) {
28514
+ await this.store.add(client);
28515
+ await this.flushDatabaseToMemory();
28516
+ this.notifyOthersAboutDatabaseUpdate();
28517
+ }
28518
+ /**
28519
+ * Adds the given `WebSocket` client connection to the set
28520
+ * of all connections. The given connection is always the complete
28521
+ * connection object because `addConnection()` is called only
28522
+ * for the opened connections in the same runtime.
28523
+ */
28524
+ async addConnection(client) {
28525
+ this.runtimeClients.set(client.id, client);
28526
+ await this.addClient(client);
28527
+ const handleExtraneousMessage = (message3) => {
28528
+ const { type, payload } = message3.data;
28529
+ if (typeof payload === "object" && "clientId" in payload && payload.clientId !== client.id) {
28530
+ return;
28531
+ }
28532
+ switch (type) {
28533
+ case "extraneous:send": {
28534
+ client.send(payload.data);
28535
+ break;
28536
+ }
28537
+ case "extraneous:close": {
28538
+ client.close(payload.code, payload.reason);
28539
+ break;
28540
+ }
28541
+ }
28542
+ };
28543
+ const abortController = new AbortController();
28544
+ this.channel.addEventListener("message", handleExtraneousMessage, {
28545
+ signal: abortController.signal
28546
+ });
28547
+ client.addEventListener("close", () => abortController.abort(), {
28548
+ once: true
28549
+ });
28550
+ }
28551
+ };
28552
+ var WebSocketRemoteClientConnection = class {
28553
+ constructor(id, url, channel) {
28554
+ this.id = id;
28555
+ this.url = url;
28556
+ this.channel = channel;
28557
+ }
28558
+ send(data) {
28559
+ this.channel.postMessage({
28560
+ type: "extraneous:send",
28561
+ payload: {
28562
+ clientId: this.id,
28563
+ data
28564
+ }
28565
+ });
28566
+ }
28567
+ close(code, reason) {
28568
+ this.channel.postMessage({
28569
+ type: "extraneous:close",
28570
+ payload: {
28571
+ clientId: this.id,
28572
+ code,
28573
+ reason
28574
+ }
28575
+ });
28576
+ }
28577
+ };
28578
+
28579
+ // src/core/ws.ts
28580
+ function isBroadcastChannelWithUnref(channel) {
28581
+ return typeof Reflect.get(channel, "unref") !== "undefined";
28582
+ }
28583
+ var webSocketChannel = new BroadcastChannel("msw:websocket-client-manager");
28584
+ if (isBroadcastChannelWithUnref(webSocketChannel)) {
28585
+ webSocketChannel.unref();
28586
+ }
28587
+ function createWebSocketLinkHandler(url) {
28588
+ invariant(url, "Expected a WebSocket server URL but got undefined");
28589
+ invariant(
28590
+ isPath(url),
28591
+ "Expected a WebSocket server URL to be a valid path but got %s",
28592
+ typeof url
28593
+ );
28594
+ const clientManager = new WebSocketClientManager(webSocketChannel);
28595
+ return {
28596
+ get clients() {
28597
+ return clientManager.clients;
28598
+ },
28599
+ addEventListener(event, listener) {
28600
+ const handler = new WebSocketHandler(url);
28601
+ handler[kEmitter].on("connection", async ({ client }) => {
28602
+ await clientManager.addConnection(client);
28603
+ });
28604
+ handler[kEmitter].on(event, listener);
28605
+ return handler;
28606
+ },
28607
+ broadcast(data) {
28608
+ this.broadcastExcept([], data);
28609
+ },
28610
+ broadcastExcept(clients, data) {
28611
+ const ignoreClients = Array.prototype.concat(clients).map((client) => client.id);
28612
+ clientManager.clients.forEach((otherClient) => {
28613
+ if (!ignoreClients.includes(otherClient.id)) {
28614
+ otherClient.send(data);
28615
+ }
28616
+ });
28617
+ }
28618
+ };
28619
+ }
28620
+ var ws = {
28621
+ link: createWebSocketLinkHandler
28622
+ };
28623
+
28157
28624
  // node_modules/.pnpm/@open-draft+until@2.1.0/node_modules/@open-draft/until/lib/index.mjs
28158
28625
  var until = async (promise) => {
28159
28626
  try {
@@ -28700,6 +29167,13 @@ Learn more about creating the Service Worker script: https://mswjs.io/docs/cli/i
28700
29167
  };
28701
29168
  }
28702
29169
 
29170
+ // src/core/utils/internal/isHandlerKind.ts
29171
+ function isHandlerKind(kind) {
29172
+ return (input) => {
29173
+ return input != null && typeof input === "object" && "__kind" in input && input.__kind === kind;
29174
+ };
29175
+ }
29176
+
28703
29177
  // src/browser/setupWorker/start/createRequestListener.ts
28704
29178
  var createRequestListener = (context, options) => {
28705
29179
  return async (event, message3) => {
@@ -28714,7 +29188,7 @@ Learn more about creating the Service Worker script: https://mswjs.io/docs/cli/i
28714
29188
  await handleRequest(
28715
29189
  request,
28716
29190
  requestId,
28717
- context.getRequestHandlers(),
29191
+ context.getRequestHandlers().filter(isHandlerKind("RequestHandler")),
28718
29192
  options,
28719
29193
  context.emitter,
28720
29194
  {
@@ -28892,6 +29366,7 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
28892
29366
  context.workerChannel.send("CLIENT_CLOSED");
28893
29367
  }
28894
29368
  window.clearInterval(context.keepAliveInterval);
29369
+ window.postMessage({ type: "msw/worker:stop" });
28895
29370
  });
28896
29371
  await checkWorkerIntegrity(context).catch((error3) => {
28897
29372
  devUtils.error(
@@ -28951,6 +29426,7 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
28951
29426
  context.workerChannel.send("MOCK_DEACTIVATE");
28952
29427
  context.isMockingEnabled = false;
28953
29428
  window.clearInterval(context.keepAliveInterval);
29429
+ window.postMessage({ type: "msw/worker:stop" });
28954
29430
  printStopMessage({ quiet: context.startOptions?.quiet });
28955
29431
  };
28956
29432
  };
@@ -28994,87 +29470,21 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
28994
29470
  }
28995
29471
  };
28996
29472
 
28997
- // node_modules/.pnpm/@open-draft+deferred-promise@2.2.0/node_modules/@open-draft/deferred-promise/build/index.mjs
28998
- function createDeferredExecutor() {
28999
- const executor = (resolve, reject) => {
29000
- executor.state = "pending";
29001
- executor.resolve = (data) => {
29002
- if (executor.state !== "pending") {
29003
- return;
29004
- }
29005
- executor.result = data;
29006
- const onFulfilled = (value) => {
29007
- executor.state = "fulfilled";
29008
- return value;
29009
- };
29010
- return resolve(
29011
- data instanceof Promise ? data : Promise.resolve(data).then(onFulfilled)
29012
- );
29013
- };
29014
- executor.reject = (reason) => {
29015
- if (executor.state !== "pending") {
29016
- return;
29017
- }
29018
- queueMicrotask(() => {
29019
- executor.state = "rejected";
29020
- });
29021
- return reject(executor.rejectionReason = reason);
29022
- };
29023
- };
29024
- return executor;
29025
- }
29026
- var DeferredPromise = class extends Promise {
29027
- #executor;
29028
- resolve;
29029
- reject;
29030
- constructor(executor = null) {
29031
- const deferredExecutor = createDeferredExecutor();
29032
- super((originalResolve, originalReject) => {
29033
- deferredExecutor(originalResolve, originalReject);
29034
- executor?.(deferredExecutor.resolve, deferredExecutor.reject);
29035
- });
29036
- this.#executor = deferredExecutor;
29037
- this.resolve = this.#executor.resolve;
29038
- this.reject = this.#executor.reject;
29039
- }
29040
- get state() {
29041
- return this.#executor.state;
29473
+ // node_modules/.pnpm/@mswjs+interceptors@0.36.5/node_modules/@mswjs/interceptors/lib/browser/chunk-THPGBWJQ.mjs
29474
+ var InterceptorError = class extends Error {
29475
+ constructor(message3) {
29476
+ super(message3);
29477
+ this.name = "InterceptorError";
29478
+ Object.setPrototypeOf(this, InterceptorError.prototype);
29042
29479
  }
29043
- get rejectionReason() {
29044
- return this.#executor.rejectionReason;
29045
- }
29046
- then(onFulfilled, onRejected) {
29047
- return this.#decorate(super.then(onFulfilled, onRejected));
29048
- }
29049
- catch(onRejected) {
29050
- return this.#decorate(super.catch(onRejected));
29051
- }
29052
- finally(onfinally) {
29053
- return this.#decorate(super.finally(onfinally));
29054
- }
29055
- #decorate(promise) {
29056
- return Object.defineProperties(promise, {
29057
- resolve: { configurable: true, value: this.resolve },
29058
- reject: { configurable: true, value: this.reject }
29059
- });
29060
- }
29061
- };
29062
-
29063
- // node_modules/.pnpm/@mswjs+interceptors@0.36.5/node_modules/@mswjs/interceptors/lib/browser/chunk-THPGBWJQ.mjs
29064
- var InterceptorError = class extends Error {
29065
- constructor(message3) {
29066
- super(message3);
29067
- this.name = "InterceptorError";
29068
- Object.setPrototypeOf(this, InterceptorError.prototype);
29069
- }
29070
- };
29071
- var kRequestHandled = Symbol("kRequestHandled");
29072
- var kResponsePromise = Symbol("kResponsePromise");
29073
- var RequestController = class {
29074
- constructor(request) {
29075
- this.request = request;
29076
- this[kRequestHandled] = false;
29077
- this[kResponsePromise] = new DeferredPromise();
29480
+ };
29481
+ var kRequestHandled = Symbol("kRequestHandled");
29482
+ var kResponsePromise = Symbol("kResponsePromise");
29483
+ var RequestController = class {
29484
+ constructor(request) {
29485
+ this.request = request;
29486
+ this[kRequestHandled] = false;
29487
+ this[kResponsePromise] = new DeferredPromise();
29078
29488
  }
29079
29489
  /**
29080
29490
  * Respond to this request with the given `Response` instance.
@@ -30221,7 +30631,7 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
30221
30631
  const response = await handleRequest(
30222
30632
  request,
30223
30633
  requestId,
30224
- context.getRequestHandlers(),
30634
+ context.getRequestHandlers().filter(isHandlerKind("RequestHandler")),
30225
30635
  options,
30226
30636
  context.emitter,
30227
30637
  {
@@ -30296,6 +30706,911 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
30296
30706
  }
30297
30707
  }
30298
30708
 
30709
+ // node_modules/.pnpm/@mswjs+interceptors@0.36.5/node_modules/@mswjs/interceptors/lib/browser/interceptors/WebSocket/index.mjs
30710
+ function bindEvent(target, event) {
30711
+ Object.defineProperties(event, {
30712
+ target: {
30713
+ value: target,
30714
+ enumerable: true,
30715
+ writable: true
30716
+ },
30717
+ currentTarget: {
30718
+ value: target,
30719
+ enumerable: true,
30720
+ writable: true
30721
+ }
30722
+ });
30723
+ return event;
30724
+ }
30725
+ var kCancelable = Symbol("kCancelable");
30726
+ var kDefaultPrevented = Symbol("kDefaultPrevented");
30727
+ var CancelableMessageEvent = class extends MessageEvent {
30728
+ constructor(type, init) {
30729
+ super(type, init);
30730
+ this[kCancelable] = !!init.cancelable;
30731
+ this[kDefaultPrevented] = false;
30732
+ }
30733
+ get cancelable() {
30734
+ return this[kCancelable];
30735
+ }
30736
+ set cancelable(nextCancelable) {
30737
+ this[kCancelable] = nextCancelable;
30738
+ }
30739
+ get defaultPrevented() {
30740
+ return this[kDefaultPrevented];
30741
+ }
30742
+ set defaultPrevented(nextDefaultPrevented) {
30743
+ this[kDefaultPrevented] = nextDefaultPrevented;
30744
+ }
30745
+ preventDefault() {
30746
+ if (this.cancelable && !this[kDefaultPrevented]) {
30747
+ this[kDefaultPrevented] = true;
30748
+ }
30749
+ }
30750
+ };
30751
+ var CloseEvent = class extends Event {
30752
+ constructor(type, init = {}) {
30753
+ super(type, init);
30754
+ this.code = init.code === void 0 ? 0 : init.code;
30755
+ this.reason = init.reason === void 0 ? "" : init.reason;
30756
+ this.wasClean = init.wasClean === void 0 ? false : init.wasClean;
30757
+ }
30758
+ };
30759
+ var CancelableCloseEvent = class extends CloseEvent {
30760
+ constructor(type, init = {}) {
30761
+ super(type, init);
30762
+ this[kCancelable] = !!init.cancelable;
30763
+ this[kDefaultPrevented] = false;
30764
+ }
30765
+ get cancelable() {
30766
+ return this[kCancelable];
30767
+ }
30768
+ set cancelable(nextCancelable) {
30769
+ this[kCancelable] = nextCancelable;
30770
+ }
30771
+ get defaultPrevented() {
30772
+ return this[kDefaultPrevented];
30773
+ }
30774
+ set defaultPrevented(nextDefaultPrevented) {
30775
+ this[kDefaultPrevented] = nextDefaultPrevented;
30776
+ }
30777
+ preventDefault() {
30778
+ if (this.cancelable && !this[kDefaultPrevented]) {
30779
+ this[kDefaultPrevented] = true;
30780
+ }
30781
+ }
30782
+ };
30783
+ var kEmitter2 = Symbol("kEmitter");
30784
+ var kBoundListener = Symbol("kBoundListener");
30785
+ var WebSocketClientConnection = class {
30786
+ constructor(socket, transport) {
30787
+ this.socket = socket;
30788
+ this.transport = transport;
30789
+ this.id = createRequestId();
30790
+ this.url = new URL(socket.url);
30791
+ this[kEmitter2] = new EventTarget();
30792
+ this.transport.addEventListener("outgoing", (event) => {
30793
+ const message3 = bindEvent(
30794
+ this.socket,
30795
+ new CancelableMessageEvent("message", {
30796
+ data: event.data,
30797
+ origin: event.origin,
30798
+ cancelable: true
30799
+ })
30800
+ );
30801
+ this[kEmitter2].dispatchEvent(message3);
30802
+ if (message3.defaultPrevented) {
30803
+ event.preventDefault();
30804
+ }
30805
+ });
30806
+ this.transport.addEventListener("close", (event) => {
30807
+ this[kEmitter2].dispatchEvent(
30808
+ bindEvent(this.socket, new CloseEvent("close", event))
30809
+ );
30810
+ });
30811
+ }
30812
+ /**
30813
+ * Listen for the outgoing events from the connected WebSocket client.
30814
+ */
30815
+ addEventListener(type, listener, options) {
30816
+ if (!Reflect.has(listener, kBoundListener)) {
30817
+ const boundListener = listener.bind(this.socket);
30818
+ Object.defineProperty(listener, kBoundListener, {
30819
+ value: boundListener,
30820
+ enumerable: false,
30821
+ configurable: false
30822
+ });
30823
+ }
30824
+ this[kEmitter2].addEventListener(
30825
+ type,
30826
+ Reflect.get(listener, kBoundListener),
30827
+ options
30828
+ );
30829
+ }
30830
+ /**
30831
+ * Removes the listener for the given event.
30832
+ */
30833
+ removeEventListener(event, listener, options) {
30834
+ this[kEmitter2].removeEventListener(
30835
+ event,
30836
+ Reflect.get(listener, kBoundListener),
30837
+ options
30838
+ );
30839
+ }
30840
+ /**
30841
+ * Send data to the connected client.
30842
+ */
30843
+ send(data) {
30844
+ this.transport.send(data);
30845
+ }
30846
+ /**
30847
+ * Close the WebSocket connection.
30848
+ * @param {number} code A status code (see https://www.rfc-editor.org/rfc/rfc6455#section-7.4.1).
30849
+ * @param {string} reason A custom connection close reason.
30850
+ */
30851
+ close(code, reason) {
30852
+ this.transport.close(code, reason);
30853
+ }
30854
+ };
30855
+ var WEBSOCKET_CLOSE_CODE_RANGE_ERROR = "InvalidAccessError: close code out of user configurable range";
30856
+ var kPassthroughPromise = Symbol("kPassthroughPromise");
30857
+ var kOnSend = Symbol("kOnSend");
30858
+ var kClose = Symbol("kClose");
30859
+ var WebSocketOverride = class extends EventTarget {
30860
+ constructor(url, protocols) {
30861
+ super();
30862
+ this.CONNECTING = 0;
30863
+ this.OPEN = 1;
30864
+ this.CLOSING = 2;
30865
+ this.CLOSED = 3;
30866
+ this._onopen = null;
30867
+ this._onmessage = null;
30868
+ this._onerror = null;
30869
+ this._onclose = null;
30870
+ this.url = url.toString();
30871
+ this.protocol = "";
30872
+ this.extensions = "";
30873
+ this.binaryType = "blob";
30874
+ this.readyState = this.CONNECTING;
30875
+ this.bufferedAmount = 0;
30876
+ this[kPassthroughPromise] = new DeferredPromise();
30877
+ queueMicrotask(async () => {
30878
+ if (await this[kPassthroughPromise]) {
30879
+ return;
30880
+ }
30881
+ this.protocol = typeof protocols === "string" ? protocols : Array.isArray(protocols) && protocols.length > 0 ? protocols[0] : "";
30882
+ if (this.readyState === this.CONNECTING) {
30883
+ this.readyState = this.OPEN;
30884
+ this.dispatchEvent(bindEvent(this, new Event("open")));
30885
+ }
30886
+ });
30887
+ }
30888
+ set onopen(listener) {
30889
+ this.removeEventListener("open", this._onopen);
30890
+ this._onopen = listener;
30891
+ if (listener !== null) {
30892
+ this.addEventListener("open", listener);
30893
+ }
30894
+ }
30895
+ get onopen() {
30896
+ return this._onopen;
30897
+ }
30898
+ set onmessage(listener) {
30899
+ this.removeEventListener(
30900
+ "message",
30901
+ this._onmessage
30902
+ );
30903
+ this._onmessage = listener;
30904
+ if (listener !== null) {
30905
+ this.addEventListener("message", listener);
30906
+ }
30907
+ }
30908
+ get onmessage() {
30909
+ return this._onmessage;
30910
+ }
30911
+ set onerror(listener) {
30912
+ this.removeEventListener("error", this._onerror);
30913
+ this._onerror = listener;
30914
+ if (listener !== null) {
30915
+ this.addEventListener("error", listener);
30916
+ }
30917
+ }
30918
+ get onerror() {
30919
+ return this._onerror;
30920
+ }
30921
+ set onclose(listener) {
30922
+ this.removeEventListener("close", this._onclose);
30923
+ this._onclose = listener;
30924
+ if (listener !== null) {
30925
+ this.addEventListener("close", listener);
30926
+ }
30927
+ }
30928
+ get onclose() {
30929
+ return this._onclose;
30930
+ }
30931
+ /**
30932
+ * @see https://websockets.spec.whatwg.org/#ref-for-dom-websocket-send%E2%91%A0
30933
+ */
30934
+ send(data) {
30935
+ if (this.readyState === this.CONNECTING) {
30936
+ this.close();
30937
+ throw new DOMException("InvalidStateError");
30938
+ }
30939
+ if (this.readyState === this.CLOSING || this.readyState === this.CLOSED) {
30940
+ return;
30941
+ }
30942
+ this.bufferedAmount += getDataSize(data);
30943
+ queueMicrotask(() => {
30944
+ var _a2;
30945
+ this.bufferedAmount = 0;
30946
+ (_a2 = this[kOnSend]) == null ? void 0 : _a2.call(this, data);
30947
+ });
30948
+ }
30949
+ close(code = 1e3, reason) {
30950
+ invariant(code, WEBSOCKET_CLOSE_CODE_RANGE_ERROR);
30951
+ invariant(
30952
+ code === 1e3 || code >= 3e3 && code <= 4999,
30953
+ WEBSOCKET_CLOSE_CODE_RANGE_ERROR
30954
+ );
30955
+ this[kClose](code, reason);
30956
+ }
30957
+ [(kPassthroughPromise, kOnSend, kClose)](code = 1e3, reason, wasClean = true) {
30958
+ if (this.readyState === this.CLOSING || this.readyState === this.CLOSED) {
30959
+ return;
30960
+ }
30961
+ this.readyState = this.CLOSING;
30962
+ queueMicrotask(() => {
30963
+ this.readyState = this.CLOSED;
30964
+ this.dispatchEvent(
30965
+ bindEvent(
30966
+ this,
30967
+ new CloseEvent("close", {
30968
+ code,
30969
+ reason,
30970
+ wasClean
30971
+ })
30972
+ )
30973
+ );
30974
+ this._onopen = null;
30975
+ this._onmessage = null;
30976
+ this._onerror = null;
30977
+ this._onclose = null;
30978
+ });
30979
+ }
30980
+ addEventListener(type, listener, options) {
30981
+ return super.addEventListener(
30982
+ type,
30983
+ listener,
30984
+ options
30985
+ );
30986
+ }
30987
+ removeEventListener(type, callback, options) {
30988
+ return super.removeEventListener(type, callback, options);
30989
+ }
30990
+ };
30991
+ WebSocketOverride.CONNECTING = 0;
30992
+ WebSocketOverride.OPEN = 1;
30993
+ WebSocketOverride.CLOSING = 2;
30994
+ WebSocketOverride.CLOSED = 3;
30995
+ function getDataSize(data) {
30996
+ if (typeof data === "string") {
30997
+ return data.length;
30998
+ }
30999
+ if (data instanceof Blob) {
31000
+ return data.size;
31001
+ }
31002
+ return data.byteLength;
31003
+ }
31004
+ var kEmitter22 = Symbol("kEmitter");
31005
+ var kBoundListener2 = Symbol("kBoundListener");
31006
+ var kSend = Symbol("kSend");
31007
+ var WebSocketServerConnection = class {
31008
+ constructor(client, transport, createConnection) {
31009
+ this.client = client;
31010
+ this.transport = transport;
31011
+ this.createConnection = createConnection;
31012
+ this[kEmitter22] = new EventTarget();
31013
+ this.mockCloseController = new AbortController();
31014
+ this.realCloseController = new AbortController();
31015
+ this.transport.addEventListener("outgoing", (event) => {
31016
+ if (typeof this.realWebSocket === "undefined") {
31017
+ return;
31018
+ }
31019
+ queueMicrotask(() => {
31020
+ if (!event.defaultPrevented) {
31021
+ this[kSend](event.data);
31022
+ }
31023
+ });
31024
+ });
31025
+ this.transport.addEventListener(
31026
+ "incoming",
31027
+ this.handleIncomingMessage.bind(this)
31028
+ );
31029
+ }
31030
+ /**
31031
+ * The `WebSocket` instance connected to the original server.
31032
+ * Accessing this before calling `server.connect()` will throw.
31033
+ */
31034
+ get socket() {
31035
+ invariant(
31036
+ this.realWebSocket,
31037
+ 'Cannot access "socket" on the original WebSocket server object: the connection is not open. Did you forget to call `server.connect()`?'
31038
+ );
31039
+ return this.realWebSocket;
31040
+ }
31041
+ /**
31042
+ * Open connection to the original WebSocket server.
31043
+ */
31044
+ connect() {
31045
+ invariant(
31046
+ !this.realWebSocket || this.realWebSocket.readyState !== WebSocket.OPEN,
31047
+ 'Failed to call "connect()" on the original WebSocket instance: the connection already open'
31048
+ );
31049
+ const realWebSocket = this.createConnection();
31050
+ realWebSocket.binaryType = this.client.binaryType;
31051
+ realWebSocket.addEventListener(
31052
+ "open",
31053
+ (event) => {
31054
+ this[kEmitter22].dispatchEvent(
31055
+ bindEvent(this.realWebSocket, new Event("open", event))
31056
+ );
31057
+ },
31058
+ { once: true }
31059
+ );
31060
+ realWebSocket.addEventListener("message", (event) => {
31061
+ this.transport.dispatchEvent(
31062
+ bindEvent(
31063
+ this.realWebSocket,
31064
+ new MessageEvent("incoming", {
31065
+ data: event.data,
31066
+ origin: event.origin
31067
+ })
31068
+ )
31069
+ );
31070
+ });
31071
+ this.client.addEventListener(
31072
+ "close",
31073
+ (event) => {
31074
+ this.handleMockClose(event);
31075
+ },
31076
+ {
31077
+ signal: this.mockCloseController.signal
31078
+ }
31079
+ );
31080
+ realWebSocket.addEventListener(
31081
+ "close",
31082
+ (event) => {
31083
+ this.handleRealClose(event);
31084
+ },
31085
+ {
31086
+ signal: this.realCloseController.signal
31087
+ }
31088
+ );
31089
+ realWebSocket.addEventListener("error", () => {
31090
+ const errorEvent = bindEvent(
31091
+ realWebSocket,
31092
+ new Event("error", { cancelable: true })
31093
+ );
31094
+ this[kEmitter22].dispatchEvent(errorEvent);
31095
+ if (!errorEvent.defaultPrevented) {
31096
+ this.client.dispatchEvent(bindEvent(this.client, new Event("error")));
31097
+ }
31098
+ });
31099
+ this.realWebSocket = realWebSocket;
31100
+ }
31101
+ /**
31102
+ * Listen for the incoming events from the original WebSocket server.
31103
+ */
31104
+ addEventListener(event, listener, options) {
31105
+ if (!Reflect.has(listener, kBoundListener2)) {
31106
+ const boundListener = listener.bind(this.client);
31107
+ Object.defineProperty(listener, kBoundListener2, {
31108
+ value: boundListener,
31109
+ enumerable: false
31110
+ });
31111
+ }
31112
+ this[kEmitter22].addEventListener(
31113
+ event,
31114
+ Reflect.get(listener, kBoundListener2),
31115
+ options
31116
+ );
31117
+ }
31118
+ /**
31119
+ * Remove the listener for the given event.
31120
+ */
31121
+ removeEventListener(event, listener, options) {
31122
+ this[kEmitter22].removeEventListener(
31123
+ event,
31124
+ Reflect.get(listener, kBoundListener2),
31125
+ options
31126
+ );
31127
+ }
31128
+ /**
31129
+ * Send data to the original WebSocket server.
31130
+ * @example
31131
+ * server.send('hello')
31132
+ * server.send(new Blob(['hello']))
31133
+ * server.send(new TextEncoder().encode('hello'))
31134
+ */
31135
+ send(data) {
31136
+ this[kSend](data);
31137
+ }
31138
+ [(kEmitter22, kSend)](data) {
31139
+ const { realWebSocket } = this;
31140
+ invariant(
31141
+ realWebSocket,
31142
+ 'Failed to call "server.send()" for "%s": the connection is not open. Did you forget to call "server.connect()"?',
31143
+ this.client.url
31144
+ );
31145
+ if (realWebSocket.readyState === WebSocket.CLOSING || realWebSocket.readyState === WebSocket.CLOSED) {
31146
+ return;
31147
+ }
31148
+ if (realWebSocket.readyState === WebSocket.CONNECTING) {
31149
+ realWebSocket.addEventListener(
31150
+ "open",
31151
+ () => {
31152
+ realWebSocket.send(data);
31153
+ },
31154
+ { once: true }
31155
+ );
31156
+ return;
31157
+ }
31158
+ realWebSocket.send(data);
31159
+ }
31160
+ /**
31161
+ * Close the actual server connection.
31162
+ */
31163
+ close() {
31164
+ const { realWebSocket } = this;
31165
+ invariant(
31166
+ realWebSocket,
31167
+ 'Failed to close server connection for "%s": the connection is not open. Did you forget to call "server.connect()"?',
31168
+ this.client.url
31169
+ );
31170
+ this.realCloseController.abort();
31171
+ if (realWebSocket.readyState === WebSocket.CLOSING || realWebSocket.readyState === WebSocket.CLOSED) {
31172
+ return;
31173
+ }
31174
+ realWebSocket.close();
31175
+ queueMicrotask(() => {
31176
+ this[kEmitter22].dispatchEvent(
31177
+ bindEvent(
31178
+ this.realWebSocket,
31179
+ new CancelableCloseEvent("close", {
31180
+ /**
31181
+ * @note `server.close()` in the interceptor
31182
+ * always results in clean closures.
31183
+ */
31184
+ code: 1e3,
31185
+ cancelable: true
31186
+ })
31187
+ )
31188
+ );
31189
+ });
31190
+ }
31191
+ handleIncomingMessage(event) {
31192
+ const messageEvent = bindEvent(
31193
+ event.target,
31194
+ new CancelableMessageEvent("message", {
31195
+ data: event.data,
31196
+ origin: event.origin,
31197
+ cancelable: true
31198
+ })
31199
+ );
31200
+ this[kEmitter22].dispatchEvent(messageEvent);
31201
+ if (!messageEvent.defaultPrevented) {
31202
+ this.client.dispatchEvent(
31203
+ bindEvent(
31204
+ /**
31205
+ * @note Bind the forwarded original server events
31206
+ * to the mock WebSocket instance so it would
31207
+ * dispatch them straight away.
31208
+ */
31209
+ this.client,
31210
+ // Clone the message event again to prevent
31211
+ // the "already being dispatched" exception.
31212
+ new MessageEvent("message", {
31213
+ data: event.data,
31214
+ origin: event.origin
31215
+ })
31216
+ )
31217
+ );
31218
+ }
31219
+ }
31220
+ handleMockClose(_event) {
31221
+ if (this.realWebSocket) {
31222
+ this.realWebSocket.close();
31223
+ }
31224
+ }
31225
+ handleRealClose(event) {
31226
+ this.mockCloseController.abort();
31227
+ const closeEvent = bindEvent(
31228
+ this.realWebSocket,
31229
+ new CancelableCloseEvent("close", {
31230
+ code: event.code,
31231
+ reason: event.reason,
31232
+ wasClean: event.wasClean,
31233
+ cancelable: true
31234
+ })
31235
+ );
31236
+ this[kEmitter22].dispatchEvent(closeEvent);
31237
+ if (!closeEvent.defaultPrevented) {
31238
+ this.client[kClose](event.code, event.reason);
31239
+ }
31240
+ }
31241
+ };
31242
+ var WebSocketClassTransport = class extends EventTarget {
31243
+ constructor(socket) {
31244
+ super();
31245
+ this.socket = socket;
31246
+ this.socket.addEventListener("close", (event) => {
31247
+ this.dispatchEvent(bindEvent(this.socket, new CloseEvent("close", event)));
31248
+ });
31249
+ this.socket[kOnSend] = (data) => {
31250
+ this.dispatchEvent(
31251
+ bindEvent(
31252
+ this.socket,
31253
+ // Dispatch this as cancelable because "client" connection
31254
+ // re-creates this message event (cannot dispatch the same event).
31255
+ new CancelableMessageEvent("outgoing", {
31256
+ data,
31257
+ origin: this.socket.url,
31258
+ cancelable: true
31259
+ })
31260
+ )
31261
+ );
31262
+ };
31263
+ }
31264
+ addEventListener(type, callback, options) {
31265
+ return super.addEventListener(type, callback, options);
31266
+ }
31267
+ dispatchEvent(event) {
31268
+ return super.dispatchEvent(event);
31269
+ }
31270
+ send(data) {
31271
+ queueMicrotask(() => {
31272
+ this.socket.dispatchEvent(
31273
+ bindEvent(
31274
+ /**
31275
+ * @note Setting this event's "target" to the
31276
+ * WebSocket override instance is important.
31277
+ * This way it can tell apart original incoming events
31278
+ * (must be forwarded to the transport) from the
31279
+ * mocked message events like the one below
31280
+ * (must be dispatched on the client instance).
31281
+ */
31282
+ this.socket,
31283
+ new MessageEvent("message", {
31284
+ data,
31285
+ origin: this.socket.url
31286
+ })
31287
+ )
31288
+ );
31289
+ });
31290
+ }
31291
+ close(code, reason) {
31292
+ this.socket[kClose](code, reason);
31293
+ }
31294
+ };
31295
+ var _WebSocketInterceptor = class extends Interceptor {
31296
+ constructor() {
31297
+ super(_WebSocketInterceptor.symbol);
31298
+ }
31299
+ checkEnvironment() {
31300
+ return typeof globalThis.WebSocket !== "undefined";
31301
+ }
31302
+ setup() {
31303
+ const originalWebSocket = globalThis.WebSocket;
31304
+ const webSocketProxy = new Proxy(globalThis.WebSocket, {
31305
+ construct: (target, args, newTarget) => {
31306
+ const [url, protocols] = args;
31307
+ const createConnection = () => {
31308
+ return Reflect.construct(target, args, newTarget);
31309
+ };
31310
+ const socket = new WebSocketOverride(url, protocols);
31311
+ const transport = new WebSocketClassTransport(socket);
31312
+ queueMicrotask(() => {
31313
+ try {
31314
+ const server = new WebSocketServerConnection(
31315
+ socket,
31316
+ transport,
31317
+ createConnection
31318
+ );
31319
+ const hasConnectionListeners = this.emitter.emit("connection", {
31320
+ client: new WebSocketClientConnection(socket, transport),
31321
+ server,
31322
+ info: {
31323
+ protocols
31324
+ }
31325
+ });
31326
+ if (hasConnectionListeners) {
31327
+ socket[kPassthroughPromise].resolve(false);
31328
+ } else {
31329
+ socket[kPassthroughPromise].resolve(true);
31330
+ server.connect();
31331
+ server.addEventListener("open", () => {
31332
+ socket.dispatchEvent(bindEvent(socket, new Event("open")));
31333
+ if (server["realWebSocket"]) {
31334
+ socket.protocol = server["realWebSocket"].protocol;
31335
+ }
31336
+ });
31337
+ }
31338
+ } catch (error3) {
31339
+ if (error3 instanceof Error) {
31340
+ socket.dispatchEvent(new Event("error"));
31341
+ if (socket.readyState !== WebSocket.CLOSING && socket.readyState !== WebSocket.CLOSED) {
31342
+ socket[kClose](1011, error3.message, false);
31343
+ }
31344
+ console.error(error3);
31345
+ }
31346
+ }
31347
+ });
31348
+ return socket;
31349
+ }
31350
+ });
31351
+ globalThis.WebSocket = webSocketProxy;
31352
+ this.subscriptions.push(() => {
31353
+ globalThis.WebSocket = originalWebSocket;
31354
+ });
31355
+ }
31356
+ };
31357
+ var WebSocketInterceptor = _WebSocketInterceptor;
31358
+ WebSocketInterceptor.symbol = Symbol("websocket");
31359
+
31360
+ // src/core/ws/webSocketInterceptor.ts
31361
+ var webSocketInterceptor = new WebSocketInterceptor();
31362
+
31363
+ // src/core/ws/handleWebSocketEvent.ts
31364
+ function handleWebSocketEvent(options) {
31365
+ webSocketInterceptor.on("connection", async (connection) => {
31366
+ const handlers = options.getHandlers();
31367
+ const connectionEvent = new MessageEvent("connection", {
31368
+ data: connection
31369
+ });
31370
+ const matchingHandlers = [];
31371
+ for (const handler of handlers) {
31372
+ if (isHandlerKind("EventHandler")(handler) && handler.predicate({
31373
+ event: connectionEvent,
31374
+ parsedResult: handler.parse({
31375
+ event: connectionEvent
31376
+ })
31377
+ })) {
31378
+ matchingHandlers.push(handler);
31379
+ }
31380
+ }
31381
+ if (matchingHandlers.length > 0) {
31382
+ options?.onMockedConnection(connection);
31383
+ for (const handler of matchingHandlers) {
31384
+ handler[kDispatchEvent](connectionEvent);
31385
+ }
31386
+ } else {
31387
+ const request = new Request(connection.client.url, {
31388
+ headers: {
31389
+ upgrade: "websocket",
31390
+ connection: "upgrade"
31391
+ }
31392
+ });
31393
+ await onUnhandledRequest(
31394
+ request,
31395
+ options.getUnhandledRequestStrategy()
31396
+ ).catch((error3) => {
31397
+ const errorEvent = new Event("error");
31398
+ Object.defineProperty(errorEvent, "cause", {
31399
+ enumerable: true,
31400
+ configurable: false,
31401
+ value: error3
31402
+ });
31403
+ connection.client.socket.dispatchEvent(errorEvent);
31404
+ });
31405
+ options?.onPassthroughConnection(connection);
31406
+ connection.server.connect();
31407
+ }
31408
+ });
31409
+ }
31410
+
31411
+ // src/core/ws/utils/getMessageLength.ts
31412
+ function getMessageLength(data) {
31413
+ if (data instanceof Blob) {
31414
+ return data.size;
31415
+ }
31416
+ if (data instanceof ArrayBuffer) {
31417
+ return data.byteLength;
31418
+ }
31419
+ return new Blob([data]).size;
31420
+ }
31421
+
31422
+ // src/core/ws/utils/truncateMessage.ts
31423
+ var MAX_LENGTH = 24;
31424
+ function truncateMessage(message3) {
31425
+ if (message3.length <= MAX_LENGTH) {
31426
+ return message3;
31427
+ }
31428
+ return `${message3.slice(0, MAX_LENGTH)}\u2026`;
31429
+ }
31430
+
31431
+ // src/core/ws/utils/getPublicData.ts
31432
+ async function getPublicData(data) {
31433
+ if (data instanceof Blob) {
31434
+ const text = await data.text();
31435
+ return `Blob(${truncateMessage(text)})`;
31436
+ }
31437
+ if (typeof data === "object" && "byteLength" in data) {
31438
+ const text = new TextDecoder().decode(data);
31439
+ return `ArrayBuffer(${truncateMessage(text)})`;
31440
+ }
31441
+ return truncateMessage(data);
31442
+ }
31443
+
31444
+ // src/core/ws/utils/attachWebSocketLogger.ts
31445
+ var colors = {
31446
+ system: "#3b82f6",
31447
+ outgoing: "#22c55e",
31448
+ incoming: "#ef4444",
31449
+ mocked: "#ff6a33"
31450
+ };
31451
+ function attachWebSocketLogger(connection) {
31452
+ const { client, server } = connection;
31453
+ logConnectionOpen(client);
31454
+ client.addEventListener("message", (event) => {
31455
+ logOutgoingClientMessage(event);
31456
+ });
31457
+ client.addEventListener("close", (event) => {
31458
+ logConnectionClose(event);
31459
+ });
31460
+ client.socket.addEventListener("error", (event) => {
31461
+ logClientError(event);
31462
+ });
31463
+ client.send = new Proxy(client.send, {
31464
+ apply(target, thisArg, args) {
31465
+ const [data] = args;
31466
+ const messageEvent = new MessageEvent("message", { data });
31467
+ Object.defineProperties(messageEvent, {
31468
+ currentTarget: {
31469
+ enumerable: true,
31470
+ writable: false,
31471
+ value: client.socket
31472
+ },
31473
+ target: {
31474
+ enumerable: true,
31475
+ writable: false,
31476
+ value: client.socket
31477
+ }
31478
+ });
31479
+ queueMicrotask(() => {
31480
+ logIncomingMockedClientMessage(messageEvent);
31481
+ });
31482
+ return Reflect.apply(target, thisArg, args);
31483
+ }
31484
+ });
31485
+ server.addEventListener(
31486
+ "open",
31487
+ () => {
31488
+ server.addEventListener("message", (event) => {
31489
+ logIncomingServerMessage(event);
31490
+ });
31491
+ },
31492
+ { once: true }
31493
+ );
31494
+ server.send = new Proxy(server.send, {
31495
+ apply(target, thisArg, args) {
31496
+ const [data] = args;
31497
+ const messageEvent = new MessageEvent("message", { data });
31498
+ Object.defineProperties(messageEvent, {
31499
+ currentTarget: {
31500
+ enumerable: true,
31501
+ writable: false,
31502
+ value: server.socket
31503
+ },
31504
+ target: {
31505
+ enumerable: true,
31506
+ writable: false,
31507
+ value: server.socket
31508
+ }
31509
+ });
31510
+ logOutgoingMockedClientMessage(messageEvent);
31511
+ return Reflect.apply(target, thisArg, args);
31512
+ }
31513
+ });
31514
+ }
31515
+ function logConnectionOpen(client) {
31516
+ const publicUrl = toPublicUrl(client.url);
31517
+ console.groupCollapsed(
31518
+ devUtils.formatMessage(`${getTimestamp()} %c\u25B6%c ${publicUrl}`),
31519
+ `color:${colors.system}`,
31520
+ "color:inherit"
31521
+ );
31522
+ console.log("Client:", client.socket);
31523
+ console.groupEnd();
31524
+ }
31525
+ function logConnectionClose(event) {
31526
+ const target = event.target;
31527
+ const publicUrl = toPublicUrl(target.url);
31528
+ console.groupCollapsed(
31529
+ devUtils.formatMessage(
31530
+ `${getTimestamp({ milliseconds: true })} %c\u25A0%c ${publicUrl}`
31531
+ ),
31532
+ `color:${colors.system}`,
31533
+ "color:inherit"
31534
+ );
31535
+ console.log(event);
31536
+ console.groupEnd();
31537
+ }
31538
+ function logClientError(event) {
31539
+ const socket = event.target;
31540
+ const publicUrl = toPublicUrl(socket.url);
31541
+ console.groupCollapsed(
31542
+ devUtils.formatMessage(
31543
+ `${getTimestamp({ milliseconds: true })} %c\xD7%c ${publicUrl}`
31544
+ ),
31545
+ `color:${colors.system}`,
31546
+ "color:inherit"
31547
+ );
31548
+ console.log(event);
31549
+ console.groupEnd();
31550
+ }
31551
+ async function logOutgoingClientMessage(event) {
31552
+ const byteLength = getMessageLength(event.data);
31553
+ const publicData = await getPublicData(event.data);
31554
+ const arrow = event.defaultPrevented ? "\u21E1" : "\u2B06";
31555
+ console.groupCollapsed(
31556
+ devUtils.formatMessage(
31557
+ `${getTimestamp({ milliseconds: true })} %c${arrow}%c ${publicData} %c${byteLength}%c`
31558
+ ),
31559
+ `color:${colors.outgoing}`,
31560
+ "color:inherit",
31561
+ "color:gray;font-weight:normal",
31562
+ "color:inherit;font-weight:inherit"
31563
+ );
31564
+ console.log(event);
31565
+ console.groupEnd();
31566
+ }
31567
+ async function logOutgoingMockedClientMessage(event) {
31568
+ const byteLength = getMessageLength(event.data);
31569
+ const publicData = await getPublicData(event.data);
31570
+ console.groupCollapsed(
31571
+ devUtils.formatMessage(
31572
+ `${getTimestamp({ milliseconds: true })} %c\u2B06%c ${publicData} %c${byteLength}%c`
31573
+ ),
31574
+ `color:${colors.mocked}`,
31575
+ "color:inherit",
31576
+ "color:gray;font-weight:normal",
31577
+ "color:inherit;font-weight:inherit"
31578
+ );
31579
+ console.log(event);
31580
+ console.groupEnd();
31581
+ }
31582
+ async function logIncomingMockedClientMessage(event) {
31583
+ const byteLength = getMessageLength(event.data);
31584
+ const publicData = await getPublicData(event.data);
31585
+ console.groupCollapsed(
31586
+ devUtils.formatMessage(
31587
+ `${getTimestamp({ milliseconds: true })} %c\u2B07%c ${publicData} %c${byteLength}%c`
31588
+ ),
31589
+ `color:${colors.mocked}`,
31590
+ "color:inherit",
31591
+ "color:gray;font-weight:normal",
31592
+ "color:inherit;font-weight:inherit"
31593
+ );
31594
+ console.log(event);
31595
+ console.groupEnd();
31596
+ }
31597
+ async function logIncomingServerMessage(event) {
31598
+ const byteLength = getMessageLength(event.data);
31599
+ const publicData = await getPublicData(event.data);
31600
+ const arrow = event.defaultPrevented ? "\u21E3" : "\u2B07";
31601
+ console.groupCollapsed(
31602
+ devUtils.formatMessage(
31603
+ `${getTimestamp({ milliseconds: true })} %c${arrow}%c ${publicData} %c${byteLength}%c`
31604
+ ),
31605
+ `color:${colors.incoming}`,
31606
+ "color:inherit",
31607
+ "color:gray;font-weight:normal",
31608
+ "color:inherit;font-weight:inherit"
31609
+ );
31610
+ console.log(event);
31611
+ console.groupEnd();
31612
+ }
31613
+
30299
31614
  // src/browser/setupWorker/setupWorker.ts
30300
31615
  var SetupWorkerApi = class extends SetupApi {
30301
31616
  context;
@@ -30412,6 +31727,25 @@ Please consider using a custom "serviceWorker.url" option to point to the actual
30412
31727
  DEFAULT_START_OPTIONS,
30413
31728
  options
30414
31729
  );
31730
+ handleWebSocketEvent({
31731
+ getUnhandledRequestStrategy: () => {
31732
+ return this.context.startOptions.onUnhandledRequest;
31733
+ },
31734
+ getHandlers: () => {
31735
+ return this.handlersController.currentHandlers();
31736
+ },
31737
+ onMockedConnection: (connection) => {
31738
+ if (!this.context.startOptions.quiet) {
31739
+ attachWebSocketLogger(connection);
31740
+ }
31741
+ },
31742
+ onPassthroughConnection() {
31743
+ }
31744
+ });
31745
+ webSocketInterceptor.apply();
31746
+ this.subscriptions.push(() => {
31747
+ webSocketInterceptor.dispose();
31748
+ });
30415
31749
  return await this.startHandler(this.context.startOptions, options);
30416
31750
  }
30417
31751
  stop() {