@depup/msw 2.12.13-depup.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (590) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +40 -0
  3. package/browser/package.json +31 -0
  4. package/changes.json +46 -0
  5. package/cli/index.js +35 -0
  6. package/cli/init.js +226 -0
  7. package/cli/invariant.js +9 -0
  8. package/cli/package.json +3 -0
  9. package/config/constants.js +13 -0
  10. package/config/package.json +3 -0
  11. package/config/scripts/postinstall.js +36 -0
  12. package/lib/browser/index.d.mts +102 -0
  13. package/lib/browser/index.d.ts +102 -0
  14. package/lib/browser/index.js +2911 -0
  15. package/lib/browser/index.js.map +1 -0
  16. package/lib/browser/index.mjs +2888 -0
  17. package/lib/browser/index.mjs.map +1 -0
  18. package/lib/core/HttpResponse-Be4eT3x6.d.mts +338 -0
  19. package/lib/core/HttpResponse-Dj6ibgFJ.d.ts +338 -0
  20. package/lib/core/HttpResponse.d.mts +6 -0
  21. package/lib/core/HttpResponse.d.ts +6 -0
  22. package/lib/core/HttpResponse.js +176 -0
  23. package/lib/core/HttpResponse.js.map +1 -0
  24. package/lib/core/HttpResponse.mjs +159 -0
  25. package/lib/core/HttpResponse.mjs.map +1 -0
  26. package/lib/core/SetupApi.d.mts +44 -0
  27. package/lib/core/SetupApi.d.ts +44 -0
  28. package/lib/core/SetupApi.js +112 -0
  29. package/lib/core/SetupApi.js.map +1 -0
  30. package/lib/core/SetupApi.mjs +92 -0
  31. package/lib/core/SetupApi.mjs.map +1 -0
  32. package/lib/core/bypass.d.mts +16 -0
  33. package/lib/core/bypass.d.ts +16 -0
  34. package/lib/core/bypass.js +42 -0
  35. package/lib/core/bypass.js.map +1 -0
  36. package/lib/core/bypass.mjs +22 -0
  37. package/lib/core/bypass.mjs.map +1 -0
  38. package/lib/core/delay.d.mts +18 -0
  39. package/lib/core/delay.d.ts +18 -0
  40. package/lib/core/delay.js +77 -0
  41. package/lib/core/delay.js.map +1 -0
  42. package/lib/core/delay.mjs +57 -0
  43. package/lib/core/delay.mjs.map +1 -0
  44. package/lib/core/getResponse.d.mts +18 -0
  45. package/lib/core/getResponse.d.ts +18 -0
  46. package/lib/core/getResponse.js +35 -0
  47. package/lib/core/getResponse.js.map +1 -0
  48. package/lib/core/getResponse.mjs +17 -0
  49. package/lib/core/getResponse.mjs.map +1 -0
  50. package/lib/core/graphql.d.mts +76 -0
  51. package/lib/core/graphql.d.ts +76 -0
  52. package/lib/core/graphql.js +90 -0
  53. package/lib/core/graphql.js.map +1 -0
  54. package/lib/core/graphql.mjs +72 -0
  55. package/lib/core/graphql.mjs.map +1 -0
  56. package/lib/core/handlers/GraphQLHandler.d.mts +6 -0
  57. package/lib/core/handlers/GraphQLHandler.d.ts +6 -0
  58. package/lib/core/handlers/GraphQLHandler.js +231 -0
  59. package/lib/core/handlers/GraphQLHandler.js.map +1 -0
  60. package/lib/core/handlers/GraphQLHandler.mjs +218 -0
  61. package/lib/core/handlers/GraphQLHandler.mjs.map +1 -0
  62. package/lib/core/handlers/HttpHandler.d.mts +75 -0
  63. package/lib/core/handlers/HttpHandler.d.ts +75 -0
  64. package/lib/core/handlers/HttpHandler.js +128 -0
  65. package/lib/core/handlers/HttpHandler.js.map +1 -0
  66. package/lib/core/handlers/HttpHandler.mjs +112 -0
  67. package/lib/core/handlers/HttpHandler.mjs.map +1 -0
  68. package/lib/core/handlers/RequestHandler.d.mts +6 -0
  69. package/lib/core/handlers/RequestHandler.d.ts +6 -0
  70. package/lib/core/handlers/RequestHandler.js +173 -0
  71. package/lib/core/handlers/RequestHandler.js.map +1 -0
  72. package/lib/core/handlers/RequestHandler.mjs +155 -0
  73. package/lib/core/handlers/RequestHandler.mjs.map +1 -0
  74. package/lib/core/handlers/WebSocketHandler.d.mts +42 -0
  75. package/lib/core/handlers/WebSocketHandler.d.ts +42 -0
  76. package/lib/core/handlers/WebSocketHandler.js +147 -0
  77. package/lib/core/handlers/WebSocketHandler.js.map +1 -0
  78. package/lib/core/handlers/WebSocketHandler.mjs +129 -0
  79. package/lib/core/handlers/WebSocketHandler.mjs.map +1 -0
  80. package/lib/core/handlers/common.d.mts +3 -0
  81. package/lib/core/handlers/common.d.ts +3 -0
  82. package/lib/core/handlers/common.js +17 -0
  83. package/lib/core/handlers/common.js.map +1 -0
  84. package/lib/core/handlers/common.mjs +1 -0
  85. package/lib/core/handlers/common.mjs.map +1 -0
  86. package/lib/core/http.d.mts +31 -0
  87. package/lib/core/http.d.ts +31 -0
  88. package/lib/core/http.js +40 -0
  89. package/lib/core/http.js.map +1 -0
  90. package/lib/core/http.mjs +23 -0
  91. package/lib/core/http.mjs.map +1 -0
  92. package/lib/core/index.d.mts +32 -0
  93. package/lib/core/index.d.ts +32 -0
  94. package/lib/core/index.js +64 -0
  95. package/lib/core/index.js.map +1 -0
  96. package/lib/core/index.mjs +52 -0
  97. package/lib/core/index.mjs.map +1 -0
  98. package/lib/core/isCommonAssetRequest.d.mts +20 -0
  99. package/lib/core/isCommonAssetRequest.d.ts +20 -0
  100. package/lib/core/isCommonAssetRequest.js +42 -0
  101. package/lib/core/isCommonAssetRequest.js.map +1 -0
  102. package/lib/core/isCommonAssetRequest.mjs +22 -0
  103. package/lib/core/isCommonAssetRequest.mjs.map +1 -0
  104. package/lib/core/passthrough.d.mts +24 -0
  105. package/lib/core/passthrough.d.ts +24 -0
  106. package/lib/core/passthrough.js +33 -0
  107. package/lib/core/passthrough.js.map +1 -0
  108. package/lib/core/passthrough.mjs +13 -0
  109. package/lib/core/passthrough.mjs.map +1 -0
  110. package/lib/core/sharedOptions.d.mts +64 -0
  111. package/lib/core/sharedOptions.d.ts +64 -0
  112. package/lib/core/sharedOptions.js +17 -0
  113. package/lib/core/sharedOptions.js.map +1 -0
  114. package/lib/core/sharedOptions.mjs +1 -0
  115. package/lib/core/sharedOptions.mjs.map +1 -0
  116. package/lib/core/sse.d.mts +116 -0
  117. package/lib/core/sse.d.ts +116 -0
  118. package/lib/core/sse.js +607 -0
  119. package/lib/core/sse.js.map +1 -0
  120. package/lib/core/sse.mjs +589 -0
  121. package/lib/core/sse.mjs.map +1 -0
  122. package/lib/core/typeUtils.d.mts +12 -0
  123. package/lib/core/typeUtils.d.ts +12 -0
  124. package/lib/core/typeUtils.js +17 -0
  125. package/lib/core/typeUtils.js.map +1 -0
  126. package/lib/core/typeUtils.mjs +1 -0
  127. package/lib/core/typeUtils.mjs.map +1 -0
  128. package/lib/core/utils/HttpResponse/decorators.d.mts +17 -0
  129. package/lib/core/utils/HttpResponse/decorators.d.ts +17 -0
  130. package/lib/core/utils/HttpResponse/decorators.js +77 -0
  131. package/lib/core/utils/HttpResponse/decorators.js.map +1 -0
  132. package/lib/core/utils/HttpResponse/decorators.mjs +47 -0
  133. package/lib/core/utils/HttpResponse/decorators.mjs.map +1 -0
  134. package/lib/core/utils/cookieStore.d.mts +13 -0
  135. package/lib/core/utils/cookieStore.d.ts +13 -0
  136. package/lib/core/utils/cookieStore.js +90 -0
  137. package/lib/core/utils/cookieStore.js.map +1 -0
  138. package/lib/core/utils/cookieStore.mjs +74 -0
  139. package/lib/core/utils/cookieStore.mjs.map +1 -0
  140. package/lib/core/utils/executeHandlers.d.mts +6 -0
  141. package/lib/core/utils/executeHandlers.d.ts +6 -0
  142. package/lib/core/utils/executeHandlers.js +50 -0
  143. package/lib/core/utils/executeHandlers.js.map +1 -0
  144. package/lib/core/utils/executeHandlers.mjs +30 -0
  145. package/lib/core/utils/executeHandlers.mjs.map +1 -0
  146. package/lib/core/utils/handleRequest.d.mts +29 -0
  147. package/lib/core/utils/handleRequest.d.ts +29 -0
  148. package/lib/core/utils/handleRequest.js +76 -0
  149. package/lib/core/utils/handleRequest.js.map +1 -0
  150. package/lib/core/utils/handleRequest.mjs +58 -0
  151. package/lib/core/utils/handleRequest.mjs.map +1 -0
  152. package/lib/core/utils/internal/Disposable.d.mts +7 -0
  153. package/lib/core/utils/internal/Disposable.d.ts +7 -0
  154. package/lib/core/utils/internal/Disposable.js +33 -0
  155. package/lib/core/utils/internal/Disposable.js.map +1 -0
  156. package/lib/core/utils/internal/Disposable.mjs +13 -0
  157. package/lib/core/utils/internal/Disposable.mjs.map +1 -0
  158. package/lib/core/utils/internal/checkGlobals.d.mts +3 -0
  159. package/lib/core/utils/internal/checkGlobals.d.ts +3 -0
  160. package/lib/core/utils/internal/checkGlobals.js +34 -0
  161. package/lib/core/utils/internal/checkGlobals.js.map +1 -0
  162. package/lib/core/utils/internal/checkGlobals.mjs +14 -0
  163. package/lib/core/utils/internal/checkGlobals.mjs.map +1 -0
  164. package/lib/core/utils/internal/devUtils.d.mts +28 -0
  165. package/lib/core/utils/internal/devUtils.d.ts +28 -0
  166. package/lib/core/utils/internal/devUtils.js +48 -0
  167. package/lib/core/utils/internal/devUtils.js.map +1 -0
  168. package/lib/core/utils/internal/devUtils.mjs +28 -0
  169. package/lib/core/utils/internal/devUtils.mjs.map +1 -0
  170. package/lib/core/utils/internal/getCallFrame.d.mts +6 -0
  171. package/lib/core/utils/internal/getCallFrame.d.ts +6 -0
  172. package/lib/core/utils/internal/getCallFrame.js +41 -0
  173. package/lib/core/utils/internal/getCallFrame.js.map +1 -0
  174. package/lib/core/utils/internal/getCallFrame.mjs +21 -0
  175. package/lib/core/utils/internal/getCallFrame.mjs.map +1 -0
  176. package/lib/core/utils/internal/hasRefCounted.d.mts +3 -0
  177. package/lib/core/utils/internal/hasRefCounted.d.ts +3 -0
  178. package/lib/core/utils/internal/hasRefCounted.js +27 -0
  179. package/lib/core/utils/internal/hasRefCounted.js.map +1 -0
  180. package/lib/core/utils/internal/hasRefCounted.mjs +7 -0
  181. package/lib/core/utils/internal/hasRefCounted.mjs.map +1 -0
  182. package/lib/core/utils/internal/isHandlerKind.d.mts +19 -0
  183. package/lib/core/utils/internal/isHandlerKind.d.ts +19 -0
  184. package/lib/core/utils/internal/isHandlerKind.js +29 -0
  185. package/lib/core/utils/internal/isHandlerKind.js.map +1 -0
  186. package/lib/core/utils/internal/isHandlerKind.mjs +9 -0
  187. package/lib/core/utils/internal/isHandlerKind.mjs.map +1 -0
  188. package/lib/core/utils/internal/isIterable.d.mts +20 -0
  189. package/lib/core/utils/internal/isIterable.d.ts +20 -0
  190. package/lib/core/utils/internal/isIterable.js +30 -0
  191. package/lib/core/utils/internal/isIterable.js.map +1 -0
  192. package/lib/core/utils/internal/isIterable.mjs +10 -0
  193. package/lib/core/utils/internal/isIterable.mjs.map +1 -0
  194. package/lib/core/utils/internal/isObject.d.mts +6 -0
  195. package/lib/core/utils/internal/isObject.d.ts +6 -0
  196. package/lib/core/utils/internal/isObject.js +27 -0
  197. package/lib/core/utils/internal/isObject.js.map +1 -0
  198. package/lib/core/utils/internal/isObject.mjs +7 -0
  199. package/lib/core/utils/internal/isObject.mjs.map +1 -0
  200. package/lib/core/utils/internal/isStringEqual.d.mts +6 -0
  201. package/lib/core/utils/internal/isStringEqual.d.ts +6 -0
  202. package/lib/core/utils/internal/isStringEqual.js +27 -0
  203. package/lib/core/utils/internal/isStringEqual.js.map +1 -0
  204. package/lib/core/utils/internal/isStringEqual.mjs +7 -0
  205. package/lib/core/utils/internal/isStringEqual.mjs.map +1 -0
  206. package/lib/core/utils/internal/jsonParse.d.mts +7 -0
  207. package/lib/core/utils/internal/jsonParse.d.ts +7 -0
  208. package/lib/core/utils/internal/jsonParse.js +31 -0
  209. package/lib/core/utils/internal/jsonParse.js.map +1 -0
  210. package/lib/core/utils/internal/jsonParse.mjs +11 -0
  211. package/lib/core/utils/internal/jsonParse.mjs.map +1 -0
  212. package/lib/core/utils/internal/mergeRight.d.mts +7 -0
  213. package/lib/core/utils/internal/mergeRight.d.ts +7 -0
  214. package/lib/core/utils/internal/mergeRight.js +43 -0
  215. package/lib/core/utils/internal/mergeRight.js.map +1 -0
  216. package/lib/core/utils/internal/mergeRight.mjs +23 -0
  217. package/lib/core/utils/internal/mergeRight.mjs.map +1 -0
  218. package/lib/core/utils/internal/parseGraphQLRequest.d.mts +6 -0
  219. package/lib/core/utils/internal/parseGraphQLRequest.d.ts +6 -0
  220. package/lib/core/utils/internal/parseGraphQLRequest.js +146 -0
  221. package/lib/core/utils/internal/parseGraphQLRequest.js.map +1 -0
  222. package/lib/core/utils/internal/parseGraphQLRequest.mjs +129 -0
  223. package/lib/core/utils/internal/parseGraphQLRequest.mjs.map +1 -0
  224. package/lib/core/utils/internal/parseMultipartData.d.mts +14 -0
  225. package/lib/core/utils/internal/parseMultipartData.d.ts +14 -0
  226. package/lib/core/utils/internal/parseMultipartData.js +83 -0
  227. package/lib/core/utils/internal/parseMultipartData.js.map +1 -0
  228. package/lib/core/utils/internal/parseMultipartData.mjs +63 -0
  229. package/lib/core/utils/internal/parseMultipartData.mjs.map +1 -0
  230. package/lib/core/utils/internal/pipeEvents.d.mts +8 -0
  231. package/lib/core/utils/internal/pipeEvents.d.ts +8 -0
  232. package/lib/core/utils/internal/pipeEvents.js +36 -0
  233. package/lib/core/utils/internal/pipeEvents.js.map +1 -0
  234. package/lib/core/utils/internal/pipeEvents.mjs +16 -0
  235. package/lib/core/utils/internal/pipeEvents.mjs.map +1 -0
  236. package/lib/core/utils/internal/requestHandlerUtils.d.mts +12 -0
  237. package/lib/core/utils/internal/requestHandlerUtils.d.ts +12 -0
  238. package/lib/core/utils/internal/requestHandlerUtils.js +37 -0
  239. package/lib/core/utils/internal/requestHandlerUtils.js.map +1 -0
  240. package/lib/core/utils/internal/requestHandlerUtils.mjs +17 -0
  241. package/lib/core/utils/internal/requestHandlerUtils.mjs.map +1 -0
  242. package/lib/core/utils/internal/toReadonlyArray.d.mts +6 -0
  243. package/lib/core/utils/internal/toReadonlyArray.d.ts +6 -0
  244. package/lib/core/utils/internal/toReadonlyArray.js +29 -0
  245. package/lib/core/utils/internal/toReadonlyArray.js.map +1 -0
  246. package/lib/core/utils/internal/toReadonlyArray.mjs +9 -0
  247. package/lib/core/utils/internal/toReadonlyArray.mjs.map +1 -0
  248. package/lib/core/utils/internal/tryCatch.d.mts +3 -0
  249. package/lib/core/utils/internal/tryCatch.d.ts +3 -0
  250. package/lib/core/utils/internal/tryCatch.js +32 -0
  251. package/lib/core/utils/internal/tryCatch.js.map +1 -0
  252. package/lib/core/utils/internal/tryCatch.mjs +12 -0
  253. package/lib/core/utils/internal/tryCatch.mjs.map +1 -0
  254. package/lib/core/utils/logging/getStatusCodeColor.d.mts +11 -0
  255. package/lib/core/utils/logging/getStatusCodeColor.d.ts +11 -0
  256. package/lib/core/utils/logging/getStatusCodeColor.js +40 -0
  257. package/lib/core/utils/logging/getStatusCodeColor.js.map +1 -0
  258. package/lib/core/utils/logging/getStatusCodeColor.mjs +20 -0
  259. package/lib/core/utils/logging/getStatusCodeColor.mjs.map +1 -0
  260. package/lib/core/utils/logging/getTimestamp.d.mts +9 -0
  261. package/lib/core/utils/logging/getTimestamp.d.ts +9 -0
  262. package/lib/core/utils/logging/getTimestamp.js +32 -0
  263. package/lib/core/utils/logging/getTimestamp.js.map +1 -0
  264. package/lib/core/utils/logging/getTimestamp.mjs +12 -0
  265. package/lib/core/utils/logging/getTimestamp.mjs.map +1 -0
  266. package/lib/core/utils/logging/serializeRequest.d.mts +12 -0
  267. package/lib/core/utils/logging/serializeRequest.d.ts +12 -0
  268. package/lib/core/utils/logging/serializeRequest.js +34 -0
  269. package/lib/core/utils/logging/serializeRequest.js.map +1 -0
  270. package/lib/core/utils/logging/serializeRequest.mjs +14 -0
  271. package/lib/core/utils/logging/serializeRequest.mjs.map +1 -0
  272. package/lib/core/utils/logging/serializeResponse.d.mts +9 -0
  273. package/lib/core/utils/logging/serializeResponse.d.ts +9 -0
  274. package/lib/core/utils/logging/serializeResponse.js +48 -0
  275. package/lib/core/utils/logging/serializeResponse.js.map +1 -0
  276. package/lib/core/utils/logging/serializeResponse.mjs +18 -0
  277. package/lib/core/utils/logging/serializeResponse.mjs.map +1 -0
  278. package/lib/core/utils/matching/matchRequestUrl.d.mts +20 -0
  279. package/lib/core/utils/matching/matchRequestUrl.d.ts +20 -0
  280. package/lib/core/utils/matching/matchRequestUrl.js +55 -0
  281. package/lib/core/utils/matching/matchRequestUrl.js.map +1 -0
  282. package/lib/core/utils/matching/matchRequestUrl.mjs +35 -0
  283. package/lib/core/utils/matching/matchRequestUrl.mjs.map +1 -0
  284. package/lib/core/utils/matching/normalizePath.d.mts +13 -0
  285. package/lib/core/utils/matching/normalizePath.d.ts +13 -0
  286. package/lib/core/utils/matching/normalizePath.js +33 -0
  287. package/lib/core/utils/matching/normalizePath.js.map +1 -0
  288. package/lib/core/utils/matching/normalizePath.mjs +13 -0
  289. package/lib/core/utils/matching/normalizePath.mjs.map +1 -0
  290. package/lib/core/utils/request/getAllAcceptedMimeTypes.d.mts +14 -0
  291. package/lib/core/utils/request/getAllAcceptedMimeTypes.d.ts +14 -0
  292. package/lib/core/utils/request/getAllAcceptedMimeTypes.js +61 -0
  293. package/lib/core/utils/request/getAllAcceptedMimeTypes.js.map +1 -0
  294. package/lib/core/utils/request/getAllAcceptedMimeTypes.mjs +41 -0
  295. package/lib/core/utils/request/getAllAcceptedMimeTypes.mjs.map +1 -0
  296. package/lib/core/utils/request/getRequestCookies.d.mts +3 -0
  297. package/lib/core/utils/request/getRequestCookies.d.ts +3 -0
  298. package/lib/core/utils/request/getRequestCookies.js +79 -0
  299. package/lib/core/utils/request/getRequestCookies.js.map +1 -0
  300. package/lib/core/utils/request/getRequestCookies.mjs +62 -0
  301. package/lib/core/utils/request/getRequestCookies.mjs.map +1 -0
  302. package/lib/core/utils/request/onUnhandledRequest.d.mts +9 -0
  303. package/lib/core/utils/request/onUnhandledRequest.d.ts +9 -0
  304. package/lib/core/utils/request/onUnhandledRequest.js +76 -0
  305. package/lib/core/utils/request/onUnhandledRequest.js.map +1 -0
  306. package/lib/core/utils/request/onUnhandledRequest.mjs +56 -0
  307. package/lib/core/utils/request/onUnhandledRequest.mjs.map +1 -0
  308. package/lib/core/utils/request/storeResponseCookies.d.mts +3 -0
  309. package/lib/core/utils/request/storeResponseCookies.d.ts +3 -0
  310. package/lib/core/utils/request/storeResponseCookies.js +32 -0
  311. package/lib/core/utils/request/storeResponseCookies.js.map +1 -0
  312. package/lib/core/utils/request/storeResponseCookies.mjs +12 -0
  313. package/lib/core/utils/request/storeResponseCookies.mjs.map +1 -0
  314. package/lib/core/utils/request/toPublicUrl.d.mts +7 -0
  315. package/lib/core/utils/request/toPublicUrl.d.ts +7 -0
  316. package/lib/core/utils/request/toPublicUrl.js +31 -0
  317. package/lib/core/utils/request/toPublicUrl.js.map +1 -0
  318. package/lib/core/utils/request/toPublicUrl.mjs +11 -0
  319. package/lib/core/utils/request/toPublicUrl.mjs.map +1 -0
  320. package/lib/core/utils/toResponseInit.d.mts +3 -0
  321. package/lib/core/utils/toResponseInit.d.ts +3 -0
  322. package/lib/core/utils/toResponseInit.js +31 -0
  323. package/lib/core/utils/toResponseInit.js.map +1 -0
  324. package/lib/core/utils/toResponseInit.mjs +11 -0
  325. package/lib/core/utils/toResponseInit.mjs.map +1 -0
  326. package/lib/core/utils/url/cleanUrl.d.mts +7 -0
  327. package/lib/core/utils/url/cleanUrl.d.ts +7 -0
  328. package/lib/core/utils/url/cleanUrl.js +31 -0
  329. package/lib/core/utils/url/cleanUrl.js.map +1 -0
  330. package/lib/core/utils/url/cleanUrl.mjs +11 -0
  331. package/lib/core/utils/url/cleanUrl.mjs.map +1 -0
  332. package/lib/core/utils/url/getAbsoluteUrl.d.mts +6 -0
  333. package/lib/core/utils/url/getAbsoluteUrl.d.ts +6 -0
  334. package/lib/core/utils/url/getAbsoluteUrl.js +38 -0
  335. package/lib/core/utils/url/getAbsoluteUrl.js.map +1 -0
  336. package/lib/core/utils/url/getAbsoluteUrl.mjs +18 -0
  337. package/lib/core/utils/url/getAbsoluteUrl.mjs.map +1 -0
  338. package/lib/core/utils/url/isAbsoluteUrl.d.mts +6 -0
  339. package/lib/core/utils/url/isAbsoluteUrl.d.ts +6 -0
  340. package/lib/core/utils/url/isAbsoluteUrl.js +27 -0
  341. package/lib/core/utils/url/isAbsoluteUrl.js.map +1 -0
  342. package/lib/core/utils/url/isAbsoluteUrl.mjs +7 -0
  343. package/lib/core/utils/url/isAbsoluteUrl.mjs.map +1 -0
  344. package/lib/core/ws/WebSocketClientManager.d.mts +65 -0
  345. package/lib/core/ws/WebSocketClientManager.d.ts +65 -0
  346. package/lib/core/ws/WebSocketClientManager.js +159 -0
  347. package/lib/core/ws/WebSocketClientManager.js.map +1 -0
  348. package/lib/core/ws/WebSocketClientManager.mjs +139 -0
  349. package/lib/core/ws/WebSocketClientManager.mjs.map +1 -0
  350. package/lib/core/ws/WebSocketClientStore.d.mts +13 -0
  351. package/lib/core/ws/WebSocketClientStore.d.ts +13 -0
  352. package/lib/core/ws/WebSocketClientStore.js +26 -0
  353. package/lib/core/ws/WebSocketClientStore.js.map +1 -0
  354. package/lib/core/ws/WebSocketClientStore.mjs +6 -0
  355. package/lib/core/ws/WebSocketClientStore.mjs.map +1 -0
  356. package/lib/core/ws/WebSocketIndexedDBClientStore.d.mts +14 -0
  357. package/lib/core/ws/WebSocketIndexedDBClientStore.d.ts +14 -0
  358. package/lib/core/ws/WebSocketIndexedDBClientStore.js +130 -0
  359. package/lib/core/ws/WebSocketIndexedDBClientStore.js.map +1 -0
  360. package/lib/core/ws/WebSocketIndexedDBClientStore.mjs +110 -0
  361. package/lib/core/ws/WebSocketIndexedDBClientStore.mjs.map +1 -0
  362. package/lib/core/ws/WebSocketMemoryClientStore.d.mts +12 -0
  363. package/lib/core/ws/WebSocketMemoryClientStore.d.ts +12 -0
  364. package/lib/core/ws/WebSocketMemoryClientStore.js +41 -0
  365. package/lib/core/ws/WebSocketMemoryClientStore.js.map +1 -0
  366. package/lib/core/ws/WebSocketMemoryClientStore.mjs +21 -0
  367. package/lib/core/ws/WebSocketMemoryClientStore.mjs.map +1 -0
  368. package/lib/core/ws/handleWebSocketEvent.d.mts +20 -0
  369. package/lib/core/ws/handleWebSocketEvent.d.ts +20 -0
  370. package/lib/core/ws/handleWebSocketEvent.js +61 -0
  371. package/lib/core/ws/handleWebSocketEvent.js.map +1 -0
  372. package/lib/core/ws/handleWebSocketEvent.mjs +43 -0
  373. package/lib/core/ws/handleWebSocketEvent.mjs.map +1 -0
  374. package/lib/core/ws/utils/attachWebSocketLogger.d.mts +18 -0
  375. package/lib/core/ws/utils/attachWebSocketLogger.d.ts +18 -0
  376. package/lib/core/ws/utils/attachWebSocketLogger.js +199 -0
  377. package/lib/core/ws/utils/attachWebSocketLogger.js.map +1 -0
  378. package/lib/core/ws/utils/attachWebSocketLogger.mjs +179 -0
  379. package/lib/core/ws/utils/attachWebSocketLogger.mjs.map +1 -0
  380. package/lib/core/ws/utils/getMessageLength.d.mts +11 -0
  381. package/lib/core/ws/utils/getMessageLength.d.ts +11 -0
  382. package/lib/core/ws/utils/getMessageLength.js +34 -0
  383. package/lib/core/ws/utils/getMessageLength.js.map +1 -0
  384. package/lib/core/ws/utils/getMessageLength.mjs +14 -0
  385. package/lib/core/ws/utils/getMessageLength.mjs.map +1 -0
  386. package/lib/core/ws/utils/getPublicData.d.mts +5 -0
  387. package/lib/core/ws/utils/getPublicData.d.ts +5 -0
  388. package/lib/core/ws/utils/getPublicData.js +37 -0
  389. package/lib/core/ws/utils/getPublicData.js.map +1 -0
  390. package/lib/core/ws/utils/getPublicData.mjs +17 -0
  391. package/lib/core/ws/utils/getPublicData.mjs.map +1 -0
  392. package/lib/core/ws/utils/truncateMessage.d.mts +3 -0
  393. package/lib/core/ws/utils/truncateMessage.d.ts +3 -0
  394. package/lib/core/ws/utils/truncateMessage.js +31 -0
  395. package/lib/core/ws/utils/truncateMessage.js.map +1 -0
  396. package/lib/core/ws/utils/truncateMessage.mjs +11 -0
  397. package/lib/core/ws/utils/truncateMessage.mjs.map +1 -0
  398. package/lib/core/ws/webSocketInterceptor.d.mts +5 -0
  399. package/lib/core/ws/webSocketInterceptor.d.ts +5 -0
  400. package/lib/core/ws/webSocketInterceptor.js +26 -0
  401. package/lib/core/ws/webSocketInterceptor.js.map +1 -0
  402. package/lib/core/ws/webSocketInterceptor.mjs +6 -0
  403. package/lib/core/ws/webSocketInterceptor.mjs.map +1 -0
  404. package/lib/core/ws.d.mts +75 -0
  405. package/lib/core/ws.d.ts +75 -0
  406. package/lib/core/ws.js +69 -0
  407. package/lib/core/ws.js.map +1 -0
  408. package/lib/core/ws.mjs +52 -0
  409. package/lib/core/ws.mjs.map +1 -0
  410. package/lib/iife/index.js +23752 -0
  411. package/lib/iife/index.js.map +1 -0
  412. package/lib/mockServiceWorker.js +349 -0
  413. package/lib/native/index.d.mts +74 -0
  414. package/lib/native/index.d.ts +74 -0
  415. package/lib/native/index.js +156 -0
  416. package/lib/native/index.js.map +1 -0
  417. package/lib/native/index.mjs +134 -0
  418. package/lib/native/index.mjs.map +1 -0
  419. package/lib/node/index.d.mts +91 -0
  420. package/lib/node/index.d.ts +91 -0
  421. package/lib/node/index.js +209 -0
  422. package/lib/node/index.js.map +1 -0
  423. package/lib/node/index.mjs +184 -0
  424. package/lib/node/index.mjs.map +1 -0
  425. package/lib/shims/cookie.d.mts +7 -0
  426. package/lib/shims/cookie.d.ts +7 -0
  427. package/lib/shims/cookie.js +204 -0
  428. package/lib/shims/cookie.mjs +196 -0
  429. package/lib/shims/statuses.d.mts +6 -0
  430. package/lib/shims/statuses.d.ts +6 -0
  431. package/lib/shims/statuses.js +195 -0
  432. package/lib/shims/statuses.mjs +187 -0
  433. package/native/package.json +30 -0
  434. package/node/package.json +33 -0
  435. package/package.json +381 -0
  436. package/src/browser/global.browser.d.ts +1 -0
  437. package/src/browser/index.ts +3 -0
  438. package/src/browser/setupWorker/glossary.ts +138 -0
  439. package/src/browser/setupWorker/setupWorker.node.test.ts +10 -0
  440. package/src/browser/setupWorker/setupWorker.ts +184 -0
  441. package/src/browser/setupWorker/start/createFallbackRequestListener.ts +71 -0
  442. package/src/browser/setupWorker/start/createRequestListener.ts +138 -0
  443. package/src/browser/setupWorker/start/createResponseListener.ts +57 -0
  444. package/src/browser/setupWorker/start/createStartHandler.ts +137 -0
  445. package/src/browser/setupWorker/start/utils/enableMocking.ts +30 -0
  446. package/src/browser/setupWorker/start/utils/getWorkerByRegistration.ts +25 -0
  447. package/src/browser/setupWorker/start/utils/getWorkerInstance.ts +97 -0
  448. package/src/browser/setupWorker/start/utils/prepareStartHandler.test.ts +59 -0
  449. package/src/browser/setupWorker/start/utils/prepareStartHandler.ts +44 -0
  450. package/src/browser/setupWorker/start/utils/printStartMessage.test.ts +84 -0
  451. package/src/browser/setupWorker/start/utils/printStartMessage.ts +51 -0
  452. package/src/browser/setupWorker/start/utils/validateWorkerScope.ts +18 -0
  453. package/src/browser/setupWorker/stop/utils/printStopMessage.test.ts +26 -0
  454. package/src/browser/setupWorker/stop/utils/printStopMessage.ts +13 -0
  455. package/src/browser/tsconfig.browser.build.json +6 -0
  456. package/src/browser/tsconfig.browser.json +9 -0
  457. package/src/browser/utils/checkWorkerIntegrity.ts +42 -0
  458. package/src/browser/utils/deserializeRequest.ts +15 -0
  459. package/src/browser/utils/getAbsoluteWorkerUrl.test.ts +29 -0
  460. package/src/browser/utils/getAbsoluteWorkerUrl.ts +7 -0
  461. package/src/browser/utils/pruneGetRequestBody.test.ts +53 -0
  462. package/src/browser/utils/pruneGetRequestBody.ts +21 -0
  463. package/src/browser/utils/supports.ts +30 -0
  464. package/src/browser/utils/workerChannel.ts +159 -0
  465. package/src/core/HttpResponse.test.ts +378 -0
  466. package/src/core/HttpResponse.ts +248 -0
  467. package/src/core/SetupApi.ts +127 -0
  468. package/src/core/bypass.test.ts +80 -0
  469. package/src/core/bypass.ts +46 -0
  470. package/src/core/delay.ts +82 -0
  471. package/src/core/getResponse.test.ts +74 -0
  472. package/src/core/getResponse.ts +29 -0
  473. package/src/core/graphql.test.ts +11 -0
  474. package/src/core/graphql.ts +136 -0
  475. package/src/core/handlers/GraphQLHandler.test.ts +873 -0
  476. package/src/core/handlers/GraphQLHandler.ts +437 -0
  477. package/src/core/handlers/HttpHandler.test.ts +253 -0
  478. package/src/core/handlers/HttpHandler.ts +214 -0
  479. package/src/core/handlers/RequestHandler.ts +391 -0
  480. package/src/core/handlers/WebSocketHandler.test.ts +127 -0
  481. package/src/core/handlers/WebSocketHandler.ts +209 -0
  482. package/src/core/handlers/common.ts +1 -0
  483. package/src/core/http.test.ts +15 -0
  484. package/src/core/http.ts +64 -0
  485. package/src/core/index.ts +110 -0
  486. package/src/core/isCommonAssetRequest.ts +45 -0
  487. package/src/core/passthrough.test.ts +11 -0
  488. package/src/core/passthrough.ts +25 -0
  489. package/src/core/sharedOptions.ts +66 -0
  490. package/src/core/sse.ts +916 -0
  491. package/src/core/typeUtils.ts +26 -0
  492. package/src/core/utils/HttpResponse/decorators.ts +76 -0
  493. package/src/core/utils/cookieStore.ts +94 -0
  494. package/src/core/utils/executeHandlers.ts +69 -0
  495. package/src/core/utils/handleRequest.test.ts +573 -0
  496. package/src/core/utils/handleRequest.ts +117 -0
  497. package/src/core/utils/internal/Disposable.ts +12 -0
  498. package/src/core/utils/internal/checkGlobals.ts +17 -0
  499. package/src/core/utils/internal/devUtils.test.ts +21 -0
  500. package/src/core/utils/internal/devUtils.ts +44 -0
  501. package/src/core/utils/internal/getCallFrame.test.ts +154 -0
  502. package/src/core/utils/internal/getCallFrame.ts +35 -0
  503. package/src/core/utils/internal/hasRefCounted.test.ts +16 -0
  504. package/src/core/utils/internal/hasRefCounted.ts +8 -0
  505. package/src/core/utils/internal/isHandlerKind.test.ts +64 -0
  506. package/src/core/utils/internal/isHandlerKind.ts +21 -0
  507. package/src/core/utils/internal/isIterable.test.ts +23 -0
  508. package/src/core/utils/internal/isIterable.ts +32 -0
  509. package/src/core/utils/internal/isObject.test.ts +20 -0
  510. package/src/core/utils/internal/isObject.ts +6 -0
  511. package/src/core/utils/internal/isStringEqual.test.ts +45 -0
  512. package/src/core/utils/internal/isStringEqual.ts +6 -0
  513. package/src/core/utils/internal/jsonParse.test.ts +13 -0
  514. package/src/core/utils/internal/jsonParse.ts +13 -0
  515. package/src/core/utils/internal/mergeRight.test.ts +43 -0
  516. package/src/core/utils/internal/mergeRight.ts +30 -0
  517. package/src/core/utils/internal/parseGraphQLRequest.test.ts +99 -0
  518. package/src/core/utils/internal/parseGraphQLRequest.ts +214 -0
  519. package/src/core/utils/internal/parseMultipartData.test.ts +76 -0
  520. package/src/core/utils/internal/parseMultipartData.ts +106 -0
  521. package/src/core/utils/internal/pipeEvents.test.ts +14 -0
  522. package/src/core/utils/internal/pipeEvents.ts +25 -0
  523. package/src/core/utils/internal/requestHandlerUtils.ts +21 -0
  524. package/src/core/utils/internal/toReadonlyArray.test.ts +30 -0
  525. package/src/core/utils/internal/toReadonlyArray.ts +8 -0
  526. package/src/core/utils/internal/tryCatch.test.ts +29 -0
  527. package/src/core/utils/internal/tryCatch.ts +11 -0
  528. package/src/core/utils/logging/getStatusCodeColor.test.ts +22 -0
  529. package/src/core/utils/logging/getStatusCodeColor.ts +20 -0
  530. package/src/core/utils/logging/getTimestamp.test.ts +32 -0
  531. package/src/core/utils/logging/getTimestamp.ts +17 -0
  532. package/src/core/utils/logging/serializeRequest.test.ts +23 -0
  533. package/src/core/utils/logging/serializeRequest.ts +23 -0
  534. package/src/core/utils/logging/serializeResponse.test.ts +77 -0
  535. package/src/core/utils/logging/serializeResponse.ts +31 -0
  536. package/src/core/utils/matching/matchRequestUrl.test.ts +183 -0
  537. package/src/core/utils/matching/matchRequestUrl.ts +77 -0
  538. package/src/core/utils/matching/normalizePath.node.test.ts +44 -0
  539. package/src/core/utils/matching/normalizePath.test.ts +56 -0
  540. package/src/core/utils/matching/normalizePath.ts +22 -0
  541. package/src/core/utils/request/getAllAcceptedMimeTypes.test.ts +86 -0
  542. package/src/core/utils/request/getAllAcceptedMimeTypes.ts +70 -0
  543. package/src/core/utils/request/getRequestCookies.ts +88 -0
  544. package/src/core/utils/request/onUnhandledRequest.node.test.ts +62 -0
  545. package/src/core/utils/request/onUnhandledRequest.test.ts +228 -0
  546. package/src/core/utils/request/onUnhandledRequest.ts +81 -0
  547. package/src/core/utils/request/storeResponseCookies.ts +17 -0
  548. package/src/core/utils/request/toPublicUrl.node.test.ts +17 -0
  549. package/src/core/utils/request/toPublicUrl.test.ts +16 -0
  550. package/src/core/utils/request/toPublicUrl.ts +16 -0
  551. package/src/core/utils/toResponseInit.ts +7 -0
  552. package/src/core/utils/url/cleanUrl.test.ts +22 -0
  553. package/src/core/utils/url/cleanUrl.ts +16 -0
  554. package/src/core/utils/url/getAbsoluteUrl.node.test.ts +19 -0
  555. package/src/core/utils/url/getAbsoluteUrl.test.ts +47 -0
  556. package/src/core/utils/url/getAbsoluteUrl.ts +25 -0
  557. package/src/core/utils/url/isAbsoluteUrl.test.ts +32 -0
  558. package/src/core/utils/url/isAbsoluteUrl.ts +6 -0
  559. package/src/core/ws/WebSocketClientManager.test.ts +164 -0
  560. package/src/core/ws/WebSocketClientManager.ts +241 -0
  561. package/src/core/ws/WebSocketClientStore.ts +14 -0
  562. package/src/core/ws/WebSocketIndexedDBClientStore.ts +140 -0
  563. package/src/core/ws/WebSocketMemoryClientStore.ts +27 -0
  564. package/src/core/ws/handleWebSocketEvent.ts +64 -0
  565. package/src/core/ws/utils/attachWebSocketLogger.ts +245 -0
  566. package/src/core/ws/utils/getMessageLength.test.ts +16 -0
  567. package/src/core/ws/utils/getMessageLength.ts +20 -0
  568. package/src/core/ws/utils/getPublicData.test.ts +38 -0
  569. package/src/core/ws/utils/getPublicData.ts +18 -0
  570. package/src/core/ws/utils/truncateMessage.test.ts +12 -0
  571. package/src/core/ws/utils/truncateMessage.ts +9 -0
  572. package/src/core/ws/webSocketInterceptor.ts +3 -0
  573. package/src/core/ws.test.ts +23 -0
  574. package/src/core/ws.ts +161 -0
  575. package/src/iife/index.ts +2 -0
  576. package/src/mockServiceWorker.js +349 -0
  577. package/src/native/index.ts +21 -0
  578. package/src/node/SetupServerApi.ts +87 -0
  579. package/src/node/SetupServerCommonApi.ts +169 -0
  580. package/src/node/glossary.ts +74 -0
  581. package/src/node/index.ts +3 -0
  582. package/src/node/setupServer.ts +15 -0
  583. package/src/package.json +3 -0
  584. package/src/shims/cookie.ts +7 -0
  585. package/src/shims/statuses.ts +6 -0
  586. package/src/tsconfig.core.build.json +6 -0
  587. package/src/tsconfig.node.build.json +6 -0
  588. package/src/tsconfig.node.json +8 -0
  589. package/src/tsconfig.src.json +10 -0
  590. package/src/tsconfig.worker.json +13 -0
@@ -0,0 +1,47 @@
1
+ // @vitest-environment jsdom
2
+ import { getAbsoluteUrl } from './getAbsoluteUrl'
3
+
4
+ const rawLocation = window.location
5
+
6
+ afterAll(() => {
7
+ Object.defineProperty(window, 'location', {
8
+ value: rawLocation,
9
+ })
10
+ })
11
+
12
+ it('resolves a relative URL against the current location (default)', () => {
13
+ expect(getAbsoluteUrl('/reviews')).toBe('http://localhost/reviews')
14
+ })
15
+
16
+ it('supports relative URLs starting with search parameters', () => {
17
+ Object.defineProperty(window, 'location', {
18
+ value: {
19
+ href: 'http://localhost/nested',
20
+ },
21
+ })
22
+
23
+ expect(getAbsoluteUrl('?resourceId=abc-123')).toBe(
24
+ 'http://localhost/nested?resourceId=abc-123',
25
+ )
26
+ })
27
+
28
+ it('resolves a relative URL against a custom base URL', () => {
29
+ expect(getAbsoluteUrl('/user', 'https://api.github.com')).toBe(
30
+ 'https://api.github.com/user',
31
+ )
32
+ })
33
+
34
+ it('returns a given absolute URL as-is', () => {
35
+ expect(getAbsoluteUrl('https://api.mswjs.io/users')).toBe(
36
+ 'https://api.mswjs.io/users',
37
+ )
38
+ })
39
+
40
+ it('returns an absolute URL given a relative path without a leading slash', () => {
41
+ expect(getAbsoluteUrl('users')).toBe('http://localhost/users')
42
+ })
43
+
44
+ it('returns a path with a pattern as-is', () => {
45
+ expect(getAbsoluteUrl(':api/user')).toBe('http://localhost/:api/user')
46
+ expect(getAbsoluteUrl('*/resource/*')).toBe('*/resource/*')
47
+ })
@@ -0,0 +1,25 @@
1
+ import { isAbsoluteUrl } from './isAbsoluteUrl'
2
+
3
+ /**
4
+ * Returns an absolute URL based on the given path.
5
+ */
6
+ export function getAbsoluteUrl(path: string, baseUrl?: string): string {
7
+ // already absolute URL
8
+ if (isAbsoluteUrl(path)) {
9
+ return path
10
+ }
11
+
12
+ // Ignore path with pattern start with *
13
+ if (path.startsWith('*')) {
14
+ return path
15
+ }
16
+
17
+ // Resolve a relative request URL against a given custom "baseUrl"
18
+ // or the document baseURI (in the case of browser/browser-like environments).
19
+ const origin = baseUrl || (typeof location !== 'undefined' && location.href)
20
+
21
+ return origin
22
+ ? // Encode and decode the path to preserve escaped characters.
23
+ decodeURI(new URL(encodeURI(path), origin).href)
24
+ : path
25
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @vitest-environment node
3
+ */
4
+ import { isAbsoluteUrl } from './isAbsoluteUrl'
5
+
6
+ it('returns true for the "http" scheme', () => {
7
+ expect(isAbsoluteUrl('http://www.domain.com')).toEqual(true)
8
+ })
9
+
10
+ it('returns true for the "https" scheme', () => {
11
+ expect(isAbsoluteUrl('https://www.domain.com')).toEqual(true)
12
+ })
13
+
14
+ it('returns true for the "ws" scheme', () => {
15
+ expect(isAbsoluteUrl('ws://www.domain.com')).toEqual(true)
16
+ })
17
+
18
+ it('returns true for the "ftp" scheme', () => {
19
+ expect(isAbsoluteUrl('ftp://www.domain.com')).toEqual(true)
20
+ })
21
+
22
+ it('returns true for the custom scheme', () => {
23
+ expect(isAbsoluteUrl('web+my://www.example.com')).toEqual(true)
24
+ })
25
+
26
+ it('returns false for the relative URL', () => {
27
+ expect(isAbsoluteUrl('/test')).toEqual(false)
28
+ })
29
+
30
+ it('returns false for the relative URL without a leading slash', () => {
31
+ expect(isAbsoluteUrl('test')).toEqual(false)
32
+ })
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Determines if the given URL string is an absolute URL.
3
+ */
4
+ export function isAbsoluteUrl(url: string): boolean {
5
+ return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url)
6
+ }
@@ -0,0 +1,164 @@
1
+ // @vitest-environment node-websocket
2
+ import { setMaxListeners } from 'node:events'
3
+ import {
4
+ WebSocketClientConnection,
5
+ WebSocketData,
6
+ WebSocketTransport,
7
+ } from '@mswjs/interceptors/WebSocket'
8
+ import {
9
+ WebSocketClientManager,
10
+ WebSocketBroadcastChannelMessage,
11
+ } from './WebSocketClientManager'
12
+
13
+ const channel = new BroadcastChannel('test:channel')
14
+
15
+ /**
16
+ * @note Increase the number of maximum event listeners
17
+ * because the same channel is shared between different
18
+ * manager instances in different tests.
19
+ */
20
+ setMaxListeners(Number.MAX_SAFE_INTEGER, channel)
21
+
22
+ vi.spyOn(channel, 'postMessage')
23
+
24
+ const socket = new WebSocket('ws://localhost')
25
+
26
+ class TestWebSocketTransport extends EventTarget implements WebSocketTransport {
27
+ send(_data: WebSocketData): void {}
28
+ close(_code?: number | undefined, _reason?: string | undefined): void {}
29
+ }
30
+
31
+ afterEach(() => {
32
+ vi.resetAllMocks()
33
+ })
34
+
35
+ it('adds a client from this runtime to the list of clients', async () => {
36
+ const manager = new WebSocketClientManager(channel)
37
+ const connection = new WebSocketClientConnection(
38
+ socket,
39
+ new TestWebSocketTransport(),
40
+ )
41
+
42
+ await manager.addConnection(connection)
43
+
44
+ // Must add the client to the list of clients.
45
+ expect(Array.from(manager.clients.values())).toEqual([connection])
46
+ })
47
+
48
+ it('adds multiple clients from this runtime to the list of clients', async () => {
49
+ const manager = new WebSocketClientManager(channel)
50
+ const connectionOne = new WebSocketClientConnection(
51
+ socket,
52
+ new TestWebSocketTransport(),
53
+ )
54
+ await manager.addConnection(connectionOne)
55
+
56
+ // Must add the client to the list of clients.
57
+ expect(Array.from(manager.clients.values())).toEqual([connectionOne])
58
+
59
+ const connectionTwo = new WebSocketClientConnection(
60
+ socket,
61
+ new TestWebSocketTransport(),
62
+ )
63
+ await manager.addConnection(connectionTwo)
64
+
65
+ // Must add the new client to the list as well.
66
+ expect(Array.from(manager.clients.values())).toEqual([
67
+ connectionOne,
68
+ connectionTwo,
69
+ ])
70
+ })
71
+
72
+ it('replays a "send" event coming from another runtime', async () => {
73
+ const manager = new WebSocketClientManager(channel)
74
+ const connection = new WebSocketClientConnection(
75
+ socket,
76
+ new TestWebSocketTransport(),
77
+ )
78
+ await manager.addConnection(connection)
79
+ vi.spyOn(connection, 'send')
80
+
81
+ // Emulate another runtime signaling this connection to receive data.
82
+ channel.dispatchEvent(
83
+ new MessageEvent<WebSocketBroadcastChannelMessage>('message', {
84
+ data: {
85
+ type: 'extraneous:send',
86
+ payload: {
87
+ clientId: connection.id,
88
+ data: 'hello',
89
+ },
90
+ },
91
+ }),
92
+ )
93
+
94
+ await vi.waitFor(() => {
95
+ // Must execute the requested operation on the connection.
96
+ expect(connection.send).toHaveBeenCalledWith('hello')
97
+ expect(connection.send).toHaveBeenCalledTimes(1)
98
+ })
99
+ })
100
+
101
+ it('replays a "close" event coming from another runtime', async () => {
102
+ const manager = new WebSocketClientManager(channel)
103
+ const connection = new WebSocketClientConnection(
104
+ socket,
105
+ new TestWebSocketTransport(),
106
+ )
107
+ await manager.addConnection(connection)
108
+ vi.spyOn(connection, 'close')
109
+
110
+ // Emulate another runtime signaling this connection to close.
111
+ channel.dispatchEvent(
112
+ new MessageEvent<WebSocketBroadcastChannelMessage>('message', {
113
+ data: {
114
+ type: 'extraneous:close',
115
+ payload: {
116
+ clientId: connection.id,
117
+ code: 1000,
118
+ reason: 'Normal closure',
119
+ },
120
+ },
121
+ }),
122
+ )
123
+
124
+ await vi.waitFor(() => {
125
+ // Must execute the requested operation on the connection.
126
+ expect(connection.close).toHaveBeenCalledWith(1000, 'Normal closure')
127
+ expect(connection.close).toHaveBeenCalledTimes(1)
128
+ })
129
+ })
130
+
131
+ it('removes the extraneous message listener when the connection closes', async () => {
132
+ const manager = new WebSocketClientManager(channel)
133
+ const transport = new TestWebSocketTransport()
134
+ const connection = new WebSocketClientConnection(socket, transport)
135
+ vi.spyOn(connection, 'close').mockImplementationOnce(() => {
136
+ /**
137
+ * @note This is a nasty hack so we don't have to uncouple
138
+ * the connection from transport. Creating a mock transport
139
+ * is difficult because it relies on the `WebSocketOverride` class.
140
+ * All we care here is that closing the connection triggers
141
+ * the transport closure, which it always does.
142
+ */
143
+ transport.dispatchEvent(new Event('close'))
144
+ })
145
+ vi.spyOn(connection, 'send')
146
+
147
+ await manager.addConnection(connection)
148
+ connection.close()
149
+
150
+ // Signals from other runtimes have no effect on the closed connection.
151
+ channel.dispatchEvent(
152
+ new MessageEvent<WebSocketBroadcastChannelMessage>('message', {
153
+ data: {
154
+ type: 'extraneous:send',
155
+ payload: {
156
+ clientId: connection.id,
157
+ data: 'hello',
158
+ },
159
+ },
160
+ }),
161
+ )
162
+
163
+ expect(connection.send).not.toHaveBeenCalled()
164
+ })
@@ -0,0 +1,241 @@
1
+ import type {
2
+ WebSocketData,
3
+ WebSocketClientConnectionProtocol,
4
+ WebSocketClientEventMap,
5
+ } from '@mswjs/interceptors/WebSocket'
6
+ import { WebSocketClientStore } from './WebSocketClientStore'
7
+ import { WebSocketMemoryClientStore } from './WebSocketMemoryClientStore'
8
+ import { WebSocketIndexedDBClientStore } from './WebSocketIndexedDBClientStore'
9
+
10
+ export type WebSocketBroadcastChannelMessage =
11
+ | {
12
+ type: 'extraneous:send'
13
+ payload: {
14
+ clientId: string
15
+ data: WebSocketData
16
+ }
17
+ }
18
+ | {
19
+ type: 'extraneous:close'
20
+ payload: {
21
+ clientId: string
22
+ code?: number
23
+ reason?: string
24
+ }
25
+ }
26
+
27
+ /**
28
+ * A manager responsible for accumulating WebSocket client
29
+ * connections across different browser runtimes.
30
+ */
31
+ export class WebSocketClientManager {
32
+ private store: WebSocketClientStore
33
+ private runtimeClients: Map<string, WebSocketClientConnectionProtocol>
34
+ private allClients: Set<WebSocketClientConnectionProtocol>
35
+
36
+ constructor(private channel: BroadcastChannel) {
37
+ // Store the clients in the IndexedDB in the browser,
38
+ // otherwise, store the clients in memory.
39
+ this.store =
40
+ typeof indexedDB !== 'undefined'
41
+ ? new WebSocketIndexedDBClientStore()
42
+ : new WebSocketMemoryClientStore()
43
+
44
+ this.runtimeClients = new Map()
45
+ this.allClients = new Set()
46
+
47
+ this.channel.addEventListener('message', (message) => {
48
+ if (message.data?.type === 'db:update') {
49
+ this.flushDatabaseToMemory()
50
+ }
51
+ })
52
+
53
+ if (typeof window !== 'undefined') {
54
+ window.addEventListener('message', async (message) => {
55
+ if (message.data?.type === 'msw/worker:stop') {
56
+ await this.removeRuntimeClients()
57
+ }
58
+ })
59
+ }
60
+ }
61
+
62
+ private async flushDatabaseToMemory() {
63
+ const storedClients = await this.store.getAll()
64
+
65
+ this.allClients = new Set(
66
+ storedClients.map((client) => {
67
+ const runtimeClient = this.runtimeClients.get(client.id)
68
+
69
+ /**
70
+ * @note For clients originating in this runtime, use their
71
+ * direct references. No need to wrap them in a remote connection.
72
+ */
73
+ if (runtimeClient) {
74
+ return runtimeClient
75
+ }
76
+
77
+ return new WebSocketRemoteClientConnection(
78
+ client.id,
79
+ new URL(client.url),
80
+ this.channel,
81
+ )
82
+ }),
83
+ )
84
+ }
85
+
86
+ private async removeRuntimeClients(): Promise<void> {
87
+ await this.store.deleteMany(Array.from(this.runtimeClients.keys()))
88
+ this.runtimeClients.clear()
89
+ await this.flushDatabaseToMemory()
90
+ this.notifyOthersAboutDatabaseUpdate()
91
+ }
92
+
93
+ /**
94
+ * All active WebSocket client connections.
95
+ */
96
+ get clients(): Set<WebSocketClientConnectionProtocol> {
97
+ return this.allClients
98
+ }
99
+
100
+ /**
101
+ * Notify other runtimes about the database update
102
+ * using the shared `BroadcastChannel` instance.
103
+ */
104
+ private notifyOthersAboutDatabaseUpdate(): void {
105
+ this.channel.postMessage({ type: 'db:update' })
106
+ }
107
+
108
+ private async addClient(
109
+ client: WebSocketClientConnectionProtocol,
110
+ ): Promise<void> {
111
+ await this.store.add(client)
112
+ // Sync the in-memory clients in this runtime with the
113
+ // updated database. This pulls in all the stored clients.
114
+ await this.flushDatabaseToMemory()
115
+ this.notifyOthersAboutDatabaseUpdate()
116
+ }
117
+
118
+ /**
119
+ * Adds the given `WebSocket` client connection to the set
120
+ * of all connections. The given connection is always the complete
121
+ * connection object because `addConnection()` is called only
122
+ * for the opened connections in the same runtime.
123
+ */
124
+ public async addConnection(
125
+ client: WebSocketClientConnectionProtocol,
126
+ ): Promise<void> {
127
+ // Store this client in the map of clients created in this runtime.
128
+ // This way, the manager can distinguish between this runtime clients
129
+ // and extraneous runtime clients when synchronizing clients storage.
130
+ this.runtimeClients.set(client.id, client)
131
+
132
+ // Add the new client to the storage.
133
+ await this.addClient(client)
134
+
135
+ // Handle the incoming BroadcastChannel messages from other runtimes
136
+ // that attempt to control this runtime (via a remote connection wrapper).
137
+ // E.g. another runtime calling `client.send()` for the client in this runtime.
138
+ const handleExtraneousMessage = (
139
+ message: MessageEvent<WebSocketBroadcastChannelMessage>,
140
+ ) => {
141
+ const { type, payload } = message.data
142
+
143
+ // Ignore broadcasted messages for other clients.
144
+ if (
145
+ typeof payload === 'object' &&
146
+ 'clientId' in payload &&
147
+ payload.clientId !== client.id
148
+ ) {
149
+ return
150
+ }
151
+
152
+ switch (type) {
153
+ case 'extraneous:send': {
154
+ client.send(payload.data)
155
+ break
156
+ }
157
+
158
+ case 'extraneous:close': {
159
+ client.close(payload.code, payload.reason)
160
+ break
161
+ }
162
+ }
163
+ }
164
+
165
+ const abortController = new AbortController()
166
+
167
+ this.channel.addEventListener('message', handleExtraneousMessage, {
168
+ signal: abortController.signal,
169
+ })
170
+
171
+ // Once closed, this connection cannot be operated on.
172
+ // This must include the extraneous runtimes as well.
173
+ client.addEventListener('close', () => abortController.abort(), {
174
+ once: true,
175
+ })
176
+ }
177
+ }
178
+
179
+ /**
180
+ * A wrapper class to operate with WebSocket client connections
181
+ * from other runtimes. This class maintains 1-1 public API
182
+ * compatibility to the `WebSocketClientConnection` but relies
183
+ * on the given `BroadcastChannel` to communicate instructions
184
+ * with the client connections from other runtimes.
185
+ */
186
+ export class WebSocketRemoteClientConnection
187
+ implements WebSocketClientConnectionProtocol
188
+ {
189
+ constructor(
190
+ public readonly id: string,
191
+ public readonly url: URL,
192
+ private channel: BroadcastChannel,
193
+ ) {}
194
+
195
+ send(data: WebSocketData): void {
196
+ this.channel.postMessage({
197
+ type: 'extraneous:send',
198
+ payload: {
199
+ clientId: this.id,
200
+ data,
201
+ },
202
+ } as WebSocketBroadcastChannelMessage)
203
+ }
204
+
205
+ close(code?: number | undefined, reason?: string | undefined): void {
206
+ this.channel.postMessage({
207
+ type: 'extraneous:close',
208
+ payload: {
209
+ clientId: this.id,
210
+ code,
211
+ reason,
212
+ },
213
+ } as WebSocketBroadcastChannelMessage)
214
+ }
215
+
216
+ addEventListener<EventType extends keyof WebSocketClientEventMap>(
217
+ _type: EventType,
218
+ _listener: (
219
+ this: WebSocket,
220
+ event: WebSocketClientEventMap[EventType],
221
+ ) => void,
222
+ _options?: AddEventListenerOptions | boolean,
223
+ ): void {
224
+ throw new Error(
225
+ 'WebSocketRemoteClientConnection.addEventListener is not supported',
226
+ )
227
+ }
228
+
229
+ removeEventListener<EventType extends keyof WebSocketClientEventMap>(
230
+ _event: EventType,
231
+ _listener: (
232
+ this: WebSocket,
233
+ event: WebSocketClientEventMap[EventType],
234
+ ) => void,
235
+ _options?: EventListenerOptions | boolean,
236
+ ): void {
237
+ throw new Error(
238
+ 'WebSocketRemoteClientConnection.removeEventListener is not supported',
239
+ )
240
+ }
241
+ }
@@ -0,0 +1,14 @@
1
+ import type { WebSocketClientConnectionProtocol } from '@mswjs/interceptors/WebSocket'
2
+
3
+ export interface SerializedWebSocketClient {
4
+ id: string
5
+ url: string
6
+ }
7
+
8
+ export abstract class WebSocketClientStore {
9
+ public abstract add(client: WebSocketClientConnectionProtocol): Promise<void>
10
+
11
+ public abstract getAll(): Promise<Array<SerializedWebSocketClient>>
12
+
13
+ public abstract deleteMany(clientIds: Array<string>): Promise<void>
14
+ }
@@ -0,0 +1,140 @@
1
+ import { DeferredPromise } from '@open-draft/deferred-promise'
2
+ import { WebSocketClientConnectionProtocol } from '@mswjs/interceptors/WebSocket'
3
+ import {
4
+ type SerializedWebSocketClient,
5
+ WebSocketClientStore,
6
+ } from './WebSocketClientStore'
7
+
8
+ const DB_NAME = 'msw-websocket-clients'
9
+ const DB_STORE_NAME = 'clients'
10
+
11
+ export class WebSocketIndexedDBClientStore implements WebSocketClientStore {
12
+ private db: Promise<IDBDatabase>
13
+
14
+ constructor() {
15
+ this.db = this.createDatabase()
16
+ }
17
+
18
+ public async add(client: WebSocketClientConnectionProtocol): Promise<void> {
19
+ const promise = new DeferredPromise<void>()
20
+ const store = await this.getStore()
21
+
22
+ /**
23
+ * @note Use `.put()` instead of `.add()` to allow setting clients
24
+ * that already exist in the database. This can happen if a single page
25
+ * has multiple event handlers. Each handler will receive the "connection"
26
+ * event in parallel, and try to set that WebSocket client in the database.
27
+ */
28
+ const request = store.put({
29
+ id: client.id,
30
+ url: client.url.href,
31
+ } satisfies SerializedWebSocketClient)
32
+
33
+ request.onsuccess = () => {
34
+ promise.resolve()
35
+ }
36
+ request.onerror = () => {
37
+ console.error(request.error)
38
+ promise.reject(
39
+ new Error(
40
+ `Failed to add WebSocket client "${client.id}". There is likely an additional output above.`,
41
+ ),
42
+ )
43
+ }
44
+
45
+ return promise
46
+ }
47
+
48
+ public async getAll(): Promise<Array<SerializedWebSocketClient>> {
49
+ const promise = new DeferredPromise<Array<SerializedWebSocketClient>>()
50
+ const store = await this.getStore()
51
+ const request = store.getAll() as IDBRequest<
52
+ Array<SerializedWebSocketClient>
53
+ >
54
+
55
+ request.onsuccess = () => {
56
+ promise.resolve(request.result)
57
+ }
58
+ request.onerror = () => {
59
+ console.error(request.error)
60
+ promise.reject(
61
+ new Error(
62
+ `Failed to get all WebSocket clients. There is likely an additional output above.`,
63
+ ),
64
+ )
65
+ }
66
+
67
+ return promise
68
+ }
69
+
70
+ public async deleteMany(clientIds: Array<string>): Promise<void> {
71
+ const promise = new DeferredPromise<void>()
72
+ const store = await this.getStore()
73
+
74
+ for (const clientId of clientIds) {
75
+ store.delete(clientId)
76
+ }
77
+
78
+ store.transaction.oncomplete = () => {
79
+ promise.resolve()
80
+ }
81
+ store.transaction.onerror = () => {
82
+ console.error(store.transaction.error)
83
+ promise.reject(
84
+ new Error(
85
+ `Failed to delete WebSocket clients [${clientIds.join(', ')}]. There is likely an additional output above.`,
86
+ ),
87
+ )
88
+ }
89
+
90
+ return promise
91
+ }
92
+
93
+ private async createDatabase(): Promise<IDBDatabase> {
94
+ const promise = new DeferredPromise<IDBDatabase>()
95
+ const request = indexedDB.open(DB_NAME, 1)
96
+
97
+ request.onsuccess = ({ currentTarget }) => {
98
+ const db = Reflect.get(currentTarget!, 'result') as IDBDatabase
99
+
100
+ if (db.objectStoreNames.contains(DB_STORE_NAME)) {
101
+ return promise.resolve(db)
102
+ }
103
+ }
104
+
105
+ request.onupgradeneeded = async ({ currentTarget }) => {
106
+ const db = Reflect.get(currentTarget!, 'result') as IDBDatabase
107
+ if (db.objectStoreNames.contains(DB_STORE_NAME)) {
108
+ return
109
+ }
110
+
111
+ const store = db.createObjectStore(DB_STORE_NAME, { keyPath: 'id' })
112
+ store.transaction.oncomplete = () => {
113
+ promise.resolve(db)
114
+ }
115
+ store.transaction.onerror = () => {
116
+ console.error(store.transaction.error)
117
+ promise.reject(
118
+ new Error(
119
+ 'Failed to create WebSocket client store. There is likely an additional output above.',
120
+ ),
121
+ )
122
+ }
123
+ }
124
+ request.onerror = () => {
125
+ console.error(request.error)
126
+ promise.reject(
127
+ new Error(
128
+ 'Failed to open an IndexedDB database. There is likely an additional output above.',
129
+ ),
130
+ )
131
+ }
132
+
133
+ return promise
134
+ }
135
+
136
+ private async getStore(): Promise<IDBObjectStore> {
137
+ const db = await this.db
138
+ return db.transaction(DB_STORE_NAME, 'readwrite').objectStore(DB_STORE_NAME)
139
+ }
140
+ }
@@ -0,0 +1,27 @@
1
+ import { WebSocketClientConnectionProtocol } from '@mswjs/interceptors/WebSocket'
2
+ import {
3
+ SerializedWebSocketClient,
4
+ WebSocketClientStore,
5
+ } from './WebSocketClientStore'
6
+
7
+ export class WebSocketMemoryClientStore implements WebSocketClientStore {
8
+ private store: Map<string, SerializedWebSocketClient>
9
+
10
+ constructor() {
11
+ this.store = new Map()
12
+ }
13
+
14
+ public async add(client: WebSocketClientConnectionProtocol): Promise<void> {
15
+ this.store.set(client.id, { id: client.id, url: client.url.href })
16
+ }
17
+
18
+ public getAll(): Promise<Array<SerializedWebSocketClient>> {
19
+ return Promise.resolve(Array.from(this.store.values()))
20
+ }
21
+
22
+ public async deleteMany(clientIds: Array<string>): Promise<void> {
23
+ for (const clientId of clientIds) {
24
+ this.store.delete(clientId)
25
+ }
26
+ }
27
+ }