msw 2.0.11 → 2.0.13

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 (405) hide show
  1. package/lib/browser/index.d.mts +104 -0
  2. package/lib/browser/index.d.ts +1 -1
  3. package/lib/browser/index.js +1 -0
  4. package/lib/browser/index.js.map +1 -0
  5. package/lib/browser/index.mjs +1 -0
  6. package/lib/browser/index.mjs.map +1 -0
  7. package/lib/core/{GraphQLHandler-907fc607.d.ts → GraphQLHandler-SHlRCcy4.d.ts} +9 -2
  8. package/lib/core/GraphQLHandler-zlmUDnN6.d.mts +97 -0
  9. package/lib/core/HttpResponse.d.mts +2 -0
  10. package/lib/core/HttpResponse.d.ts +1 -1
  11. package/lib/core/HttpResponse.js +1 -0
  12. package/lib/core/HttpResponse.js.map +1 -0
  13. package/lib/core/HttpResponse.mjs +1 -0
  14. package/lib/core/HttpResponse.mjs.map +1 -0
  15. package/lib/core/{RequestHandler-50ddea0c.d.ts → RequestHandler-rBDJQrEf.d.ts} +3 -1
  16. package/lib/core/RequestHandler-vxZdj6Tw.d.mts +179 -0
  17. package/lib/core/SetupApi.d.mts +26 -0
  18. package/lib/core/SetupApi.d.ts +1 -1
  19. package/lib/core/SetupApi.js +1 -0
  20. package/lib/core/SetupApi.js.map +1 -0
  21. package/lib/core/SetupApi.mjs +1 -0
  22. package/lib/core/SetupApi.mjs.map +1 -0
  23. package/lib/core/bypass.d.mts +16 -0
  24. package/lib/core/bypass.d.ts +1 -1
  25. package/lib/core/bypass.js +1 -0
  26. package/lib/core/bypass.js.map +1 -0
  27. package/lib/core/bypass.mjs +1 -0
  28. package/lib/core/bypass.mjs.map +1 -0
  29. package/lib/core/delay.d.mts +18 -0
  30. package/lib/core/delay.d.ts +1 -1
  31. package/lib/core/delay.js +1 -0
  32. package/lib/core/delay.js.map +1 -0
  33. package/lib/core/delay.mjs +1 -0
  34. package/lib/core/delay.mjs.map +1 -0
  35. package/lib/core/graphql.d.mts +109 -0
  36. package/lib/core/graphql.d.ts +3 -3
  37. package/lib/core/graphql.js +1 -0
  38. package/lib/core/graphql.js.map +1 -0
  39. package/lib/core/graphql.mjs +1 -0
  40. package/lib/core/graphql.mjs.map +1 -0
  41. package/lib/core/handlers/GraphQLHandler.d.mts +5 -0
  42. package/lib/core/handlers/GraphQLHandler.d.ts +2 -2
  43. package/lib/core/handlers/GraphQLHandler.js +28 -8
  44. package/lib/core/handlers/GraphQLHandler.js.map +1 -0
  45. package/lib/core/handlers/GraphQLHandler.mjs +28 -8
  46. package/lib/core/handlers/GraphQLHandler.mjs.map +1 -0
  47. package/lib/core/handlers/HttpHandler.d.mts +62 -0
  48. package/lib/core/handlers/HttpHandler.d.ts +2 -2
  49. package/lib/core/handlers/HttpHandler.js +1 -0
  50. package/lib/core/handlers/HttpHandler.js.map +1 -0
  51. package/lib/core/handlers/HttpHandler.mjs +1 -0
  52. package/lib/core/handlers/HttpHandler.mjs.map +1 -0
  53. package/lib/core/handlers/RequestHandler.d.mts +2 -0
  54. package/lib/core/handlers/RequestHandler.d.ts +1 -1
  55. package/lib/core/handlers/RequestHandler.js +19 -4
  56. package/lib/core/handlers/RequestHandler.js.map +1 -0
  57. package/lib/core/handlers/RequestHandler.mjs +19 -4
  58. package/lib/core/handlers/RequestHandler.mjs.map +1 -0
  59. package/lib/core/http.d.mts +26 -0
  60. package/lib/core/http.d.ts +1 -1
  61. package/lib/core/http.js +1 -0
  62. package/lib/core/http.js.map +1 -0
  63. package/lib/core/http.mjs +1 -0
  64. package/lib/core/http.mjs.map +1 -0
  65. package/lib/core/index.d.mts +18 -0
  66. package/lib/core/index.d.ts +2 -2
  67. package/lib/core/index.js +1 -0
  68. package/lib/core/index.js.map +1 -0
  69. package/lib/core/index.mjs +1 -0
  70. package/lib/core/index.mjs.map +1 -0
  71. package/lib/core/passthrough.d.mts +17 -0
  72. package/lib/core/passthrough.js +1 -0
  73. package/lib/core/passthrough.js.map +1 -0
  74. package/lib/core/passthrough.mjs +1 -0
  75. package/lib/core/passthrough.mjs.map +1 -0
  76. package/lib/core/sharedOptions.d.mts +66 -0
  77. package/lib/core/sharedOptions.d.ts +2 -2
  78. package/lib/core/sharedOptions.js +1 -0
  79. package/lib/core/sharedOptions.js.map +1 -0
  80. package/lib/core/sharedOptions.mjs +1 -0
  81. package/lib/core/sharedOptions.mjs.map +1 -0
  82. package/lib/core/typeUtils.d.mts +7 -0
  83. package/lib/core/typeUtils.d.ts +1 -1
  84. package/lib/core/typeUtils.js +1 -0
  85. package/lib/core/typeUtils.js.map +1 -0
  86. package/lib/core/typeUtils.mjs +1 -0
  87. package/lib/core/typeUtils.mjs.map +1 -0
  88. package/lib/core/utils/HttpResponse/decorators.d.mts +12 -0
  89. package/lib/core/utils/HttpResponse/decorators.d.ts +2 -2
  90. package/lib/core/utils/HttpResponse/decorators.js +1 -0
  91. package/lib/core/utils/HttpResponse/decorators.js.map +1 -0
  92. package/lib/core/utils/HttpResponse/decorators.mjs +1 -0
  93. package/lib/core/utils/HttpResponse/decorators.mjs.map +1 -0
  94. package/lib/core/utils/getResponse.d.mts +2 -0
  95. package/lib/core/utils/getResponse.d.ts +1 -1
  96. package/lib/core/utils/getResponse.js +1 -0
  97. package/lib/core/utils/getResponse.js.map +1 -0
  98. package/lib/core/utils/getResponse.mjs +1 -0
  99. package/lib/core/utils/getResponse.mjs.map +1 -0
  100. package/lib/core/utils/handleRequest.d.mts +37 -0
  101. package/lib/core/utils/handleRequest.d.ts +2 -2
  102. package/lib/core/utils/handleRequest.js +1 -0
  103. package/lib/core/utils/handleRequest.js.map +1 -0
  104. package/lib/core/utils/handleRequest.mjs +1 -0
  105. package/lib/core/utils/handleRequest.mjs.map +1 -0
  106. package/lib/core/utils/internal/Disposable.d.mts +7 -0
  107. package/lib/core/utils/internal/Disposable.d.ts +1 -1
  108. package/lib/core/utils/internal/Disposable.js +1 -0
  109. package/lib/core/utils/internal/Disposable.js.map +1 -0
  110. package/lib/core/utils/internal/Disposable.mjs +1 -0
  111. package/lib/core/utils/internal/Disposable.mjs.map +1 -0
  112. package/lib/core/utils/internal/checkGlobals.d.mts +3 -0
  113. package/lib/core/utils/internal/checkGlobals.js +1 -0
  114. package/lib/core/utils/internal/checkGlobals.js.map +1 -0
  115. package/lib/core/utils/internal/checkGlobals.mjs +1 -0
  116. package/lib/core/utils/internal/checkGlobals.mjs.map +1 -0
  117. package/lib/core/utils/internal/devUtils.d.mts +19 -0
  118. package/lib/core/utils/internal/devUtils.js +1 -0
  119. package/lib/core/utils/internal/devUtils.js.map +1 -0
  120. package/lib/core/utils/internal/devUtils.mjs +1 -0
  121. package/lib/core/utils/internal/devUtils.mjs.map +1 -0
  122. package/lib/core/utils/internal/getCallFrame.d.mts +6 -0
  123. package/lib/core/utils/internal/getCallFrame.js +1 -0
  124. package/lib/core/utils/internal/getCallFrame.js.map +1 -0
  125. package/lib/core/utils/internal/getCallFrame.mjs +1 -0
  126. package/lib/core/utils/internal/getCallFrame.mjs.map +1 -0
  127. package/lib/core/utils/internal/isIterable.d.mts +6 -0
  128. package/lib/core/utils/internal/isIterable.js +1 -0
  129. package/lib/core/utils/internal/isIterable.js.map +1 -0
  130. package/lib/core/utils/internal/isIterable.mjs +1 -0
  131. package/lib/core/utils/internal/isIterable.mjs.map +1 -0
  132. package/lib/core/utils/internal/isObject.d.mts +6 -0
  133. package/lib/core/utils/internal/isObject.js +1 -0
  134. package/lib/core/utils/internal/isObject.js.map +1 -0
  135. package/lib/core/utils/internal/isObject.mjs +1 -0
  136. package/lib/core/utils/internal/isObject.mjs.map +1 -0
  137. package/lib/core/utils/internal/isStringEqual.d.mts +6 -0
  138. package/lib/core/utils/internal/isStringEqual.js +1 -0
  139. package/lib/core/utils/internal/isStringEqual.js.map +1 -0
  140. package/lib/core/utils/internal/isStringEqual.mjs +1 -0
  141. package/lib/core/utils/internal/isStringEqual.mjs.map +1 -0
  142. package/lib/core/utils/internal/jsonParse.d.mts +7 -0
  143. package/lib/core/utils/internal/jsonParse.js +1 -0
  144. package/lib/core/utils/internal/jsonParse.js.map +1 -0
  145. package/lib/core/utils/internal/jsonParse.mjs +1 -0
  146. package/lib/core/utils/internal/jsonParse.mjs.map +1 -0
  147. package/lib/core/utils/internal/mergeRight.d.mts +7 -0
  148. package/lib/core/utils/internal/mergeRight.js +1 -0
  149. package/lib/core/utils/internal/mergeRight.js.map +1 -0
  150. package/lib/core/utils/internal/mergeRight.mjs +1 -0
  151. package/lib/core/utils/internal/mergeRight.mjs.map +1 -0
  152. package/lib/core/utils/internal/parseGraphQLRequest.d.mts +5 -0
  153. package/lib/core/utils/internal/parseGraphQLRequest.d.ts +2 -2
  154. package/lib/core/utils/internal/parseGraphQLRequest.js +1 -0
  155. package/lib/core/utils/internal/parseGraphQLRequest.js.map +1 -0
  156. package/lib/core/utils/internal/parseGraphQLRequest.mjs +1 -0
  157. package/lib/core/utils/internal/parseGraphQLRequest.mjs.map +1 -0
  158. package/lib/core/utils/internal/parseMultipartData.d.mts +10 -0
  159. package/lib/core/utils/internal/parseMultipartData.d.ts +1 -1
  160. package/lib/core/utils/internal/parseMultipartData.js +1 -0
  161. package/lib/core/utils/internal/parseMultipartData.js.map +1 -0
  162. package/lib/core/utils/internal/parseMultipartData.mjs +1 -0
  163. package/lib/core/utils/internal/parseMultipartData.mjs.map +1 -0
  164. package/lib/core/utils/internal/pipeEvents.d.mts +8 -0
  165. package/lib/core/utils/internal/pipeEvents.js +1 -0
  166. package/lib/core/utils/internal/pipeEvents.js.map +1 -0
  167. package/lib/core/utils/internal/pipeEvents.mjs +1 -0
  168. package/lib/core/utils/internal/pipeEvents.mjs.map +1 -0
  169. package/lib/core/utils/internal/requestHandlerUtils.d.mts +8 -0
  170. package/lib/core/utils/internal/requestHandlerUtils.d.ts +1 -1
  171. package/lib/core/utils/internal/requestHandlerUtils.js +1 -0
  172. package/lib/core/utils/internal/requestHandlerUtils.js.map +1 -0
  173. package/lib/core/utils/internal/requestHandlerUtils.mjs +1 -0
  174. package/lib/core/utils/internal/requestHandlerUtils.mjs.map +1 -0
  175. package/lib/core/utils/internal/toReadonlyArray.d.mts +6 -0
  176. package/lib/core/utils/internal/toReadonlyArray.js +1 -0
  177. package/lib/core/utils/internal/toReadonlyArray.js.map +1 -0
  178. package/lib/core/utils/internal/toReadonlyArray.mjs +1 -0
  179. package/lib/core/utils/internal/toReadonlyArray.mjs.map +1 -0
  180. package/lib/core/utils/internal/tryCatch.d.mts +3 -0
  181. package/lib/core/utils/internal/tryCatch.js +1 -0
  182. package/lib/core/utils/internal/tryCatch.js.map +1 -0
  183. package/lib/core/utils/internal/tryCatch.mjs +1 -0
  184. package/lib/core/utils/internal/tryCatch.mjs.map +1 -0
  185. package/lib/core/utils/internal/uuidv4.d.mts +3 -0
  186. package/lib/core/utils/internal/uuidv4.js +1 -0
  187. package/lib/core/utils/internal/uuidv4.js.map +1 -0
  188. package/lib/core/utils/internal/uuidv4.mjs +1 -0
  189. package/lib/core/utils/internal/uuidv4.mjs.map +1 -0
  190. package/lib/core/utils/logging/getStatusCodeColor.d.mts +11 -0
  191. package/lib/core/utils/logging/getStatusCodeColor.js +1 -0
  192. package/lib/core/utils/logging/getStatusCodeColor.js.map +1 -0
  193. package/lib/core/utils/logging/getStatusCodeColor.mjs +1 -0
  194. package/lib/core/utils/logging/getStatusCodeColor.mjs.map +1 -0
  195. package/lib/core/utils/logging/getTimestamp.d.mts +6 -0
  196. package/lib/core/utils/logging/getTimestamp.js +1 -0
  197. package/lib/core/utils/logging/getTimestamp.js.map +1 -0
  198. package/lib/core/utils/logging/getTimestamp.mjs +1 -0
  199. package/lib/core/utils/logging/getTimestamp.mjs.map +1 -0
  200. package/lib/core/utils/logging/serializeRequest.d.mts +12 -0
  201. package/lib/core/utils/logging/serializeRequest.d.ts +1 -1
  202. package/lib/core/utils/logging/serializeRequest.js +1 -0
  203. package/lib/core/utils/logging/serializeRequest.js.map +1 -0
  204. package/lib/core/utils/logging/serializeRequest.mjs +1 -0
  205. package/lib/core/utils/logging/serializeRequest.mjs.map +1 -0
  206. package/lib/core/utils/logging/serializeResponse.d.mts +9 -0
  207. package/lib/core/utils/logging/serializeResponse.d.ts +1 -1
  208. package/lib/core/utils/logging/serializeResponse.js +1 -0
  209. package/lib/core/utils/logging/serializeResponse.js.map +1 -0
  210. package/lib/core/utils/logging/serializeResponse.mjs +1 -0
  211. package/lib/core/utils/logging/serializeResponse.mjs.map +1 -0
  212. package/lib/core/utils/matching/matchRequestUrl.d.mts +19 -0
  213. package/lib/core/utils/matching/matchRequestUrl.d.ts +1 -1
  214. package/lib/core/utils/matching/matchRequestUrl.js +1 -0
  215. package/lib/core/utils/matching/matchRequestUrl.js.map +1 -0
  216. package/lib/core/utils/matching/matchRequestUrl.mjs +1 -0
  217. package/lib/core/utils/matching/matchRequestUrl.mjs.map +1 -0
  218. package/lib/core/utils/matching/normalizePath.d.mts +12 -0
  219. package/lib/core/utils/matching/normalizePath.js +1 -0
  220. package/lib/core/utils/matching/normalizePath.js.map +1 -0
  221. package/lib/core/utils/matching/normalizePath.mjs +1 -0
  222. package/lib/core/utils/matching/normalizePath.mjs.map +1 -0
  223. package/lib/core/utils/request/getPublicUrlFromRequest.d.mts +7 -0
  224. package/lib/core/utils/request/getPublicUrlFromRequest.js +1 -0
  225. package/lib/core/utils/request/getPublicUrlFromRequest.js.map +1 -0
  226. package/lib/core/utils/request/getPublicUrlFromRequest.mjs +1 -0
  227. package/lib/core/utils/request/getPublicUrlFromRequest.mjs.map +1 -0
  228. package/lib/core/utils/request/getRequestCookies.d.mts +8 -0
  229. package/lib/core/utils/request/getRequestCookies.js +1 -0
  230. package/lib/core/utils/request/getRequestCookies.js.map +1 -0
  231. package/lib/core/utils/request/getRequestCookies.mjs +1 -0
  232. package/lib/core/utils/request/getRequestCookies.mjs.map +1 -0
  233. package/lib/core/utils/request/onUnhandledRequest.d.mts +12 -0
  234. package/lib/core/utils/request/onUnhandledRequest.d.ts +2 -2
  235. package/lib/core/utils/request/onUnhandledRequest.js +1 -0
  236. package/lib/core/utils/request/onUnhandledRequest.js.map +1 -0
  237. package/lib/core/utils/request/onUnhandledRequest.mjs +1 -0
  238. package/lib/core/utils/request/onUnhandledRequest.mjs.map +1 -0
  239. package/lib/core/utils/request/readResponseCookies.d.mts +3 -0
  240. package/lib/core/utils/request/readResponseCookies.js +1 -0
  241. package/lib/core/utils/request/readResponseCookies.js.map +1 -0
  242. package/lib/core/utils/request/readResponseCookies.mjs +1 -0
  243. package/lib/core/utils/request/readResponseCookies.mjs.map +1 -0
  244. package/lib/core/utils/toResponseInit.d.mts +3 -0
  245. package/lib/core/utils/toResponseInit.js +1 -0
  246. package/lib/core/utils/toResponseInit.js.map +1 -0
  247. package/lib/core/utils/toResponseInit.mjs +1 -0
  248. package/lib/core/utils/toResponseInit.mjs.map +1 -0
  249. package/lib/core/utils/url/cleanUrl.d.mts +7 -0
  250. package/lib/core/utils/url/cleanUrl.js +1 -0
  251. package/lib/core/utils/url/cleanUrl.js.map +1 -0
  252. package/lib/core/utils/url/cleanUrl.mjs +1 -0
  253. package/lib/core/utils/url/cleanUrl.mjs.map +1 -0
  254. package/lib/core/utils/url/getAbsoluteUrl.d.mts +6 -0
  255. package/lib/core/utils/url/getAbsoluteUrl.js +1 -0
  256. package/lib/core/utils/url/getAbsoluteUrl.js.map +1 -0
  257. package/lib/core/utils/url/getAbsoluteUrl.mjs +1 -0
  258. package/lib/core/utils/url/getAbsoluteUrl.mjs.map +1 -0
  259. package/lib/core/utils/url/isAbsoluteUrl.d.mts +6 -0
  260. package/lib/core/utils/url/isAbsoluteUrl.js +1 -0
  261. package/lib/core/utils/url/isAbsoluteUrl.js.map +1 -0
  262. package/lib/core/utils/url/isAbsoluteUrl.mjs +1 -0
  263. package/lib/core/utils/url/isAbsoluteUrl.mjs.map +1 -0
  264. package/lib/iife/index.js +59 -25
  265. package/lib/iife/index.js.map +1 -0
  266. package/lib/mockServiceWorker.js +1 -1
  267. package/lib/native/index.d.mts +75 -0
  268. package/lib/native/index.d.ts +0 -1
  269. package/lib/native/index.js +1 -3
  270. package/lib/native/index.js.map +1 -0
  271. package/lib/native/index.mjs +1 -3
  272. package/lib/native/index.mjs.map +1 -0
  273. package/lib/node/index.d.mts +75 -0
  274. package/lib/node/index.d.ts +1 -2
  275. package/lib/node/index.js +2 -35
  276. package/lib/node/index.js.map +1 -0
  277. package/lib/node/index.mjs +2 -35
  278. package/lib/node/index.mjs.map +1 -0
  279. package/package.json +6 -5
  280. package/src/browser/global.browser.d.ts +1 -0
  281. package/src/browser/index.ts +3 -0
  282. package/src/browser/setupWorker/glossary.ts +259 -0
  283. package/src/browser/setupWorker/setupWorker.node.test.ts +10 -0
  284. package/src/browser/setupWorker/setupWorker.ts +199 -0
  285. package/src/browser/setupWorker/start/createFallbackRequestListener.ts +67 -0
  286. package/src/browser/setupWorker/start/createFallbackStart.ts +21 -0
  287. package/src/browser/setupWorker/start/createRequestListener.ts +127 -0
  288. package/src/browser/setupWorker/start/createResponseListener.ts +58 -0
  289. package/src/browser/setupWorker/start/createStartHandler.ts +143 -0
  290. package/src/browser/setupWorker/start/utils/createMessageChannel.ts +32 -0
  291. package/src/browser/setupWorker/start/utils/enableMocking.ts +32 -0
  292. package/src/browser/setupWorker/start/utils/getWorkerByRegistration.ts +25 -0
  293. package/src/browser/setupWorker/start/utils/getWorkerInstance.ts +94 -0
  294. package/src/browser/setupWorker/start/utils/prepareStartHandler.test.ts +59 -0
  295. package/src/browser/setupWorker/start/utils/prepareStartHandler.ts +44 -0
  296. package/src/browser/setupWorker/start/utils/printStartMessage.test.ts +84 -0
  297. package/src/browser/setupWorker/start/utils/printStartMessage.ts +40 -0
  298. package/src/browser/setupWorker/start/utils/validateWorkerScope.ts +18 -0
  299. package/src/browser/setupWorker/stop/createFallbackStop.ts +11 -0
  300. package/src/browser/setupWorker/stop/createStop.ts +29 -0
  301. package/src/browser/setupWorker/stop/utils/printStopMessage.test.ts +26 -0
  302. package/src/browser/setupWorker/stop/utils/printStopMessage.ts +12 -0
  303. package/src/browser/tsconfig.browser.build.json +6 -0
  304. package/src/browser/tsconfig.browser.json +9 -0
  305. package/src/browser/utils/deferNetworkRequestsUntil.test.ts +48 -0
  306. package/src/browser/utils/deferNetworkRequestsUntil.ts +29 -0
  307. package/src/browser/utils/getAbsoluteWorkerUrl.test.ts +31 -0
  308. package/src/browser/utils/getAbsoluteWorkerUrl.ts +7 -0
  309. package/src/browser/utils/parseWorkerRequest.ts +15 -0
  310. package/src/browser/utils/pruneGetRequestBody.test.ts +53 -0
  311. package/src/browser/utils/pruneGetRequestBody.ts +21 -0
  312. package/src/browser/utils/requestIntegrityCheck.ts +23 -0
  313. package/src/browser/utils/supportsReadableStreamTransfer.ts +17 -0
  314. package/src/core/HttpResponse.test.ts +200 -0
  315. package/src/core/HttpResponse.ts +134 -0
  316. package/src/core/SetupApi.ts +95 -0
  317. package/src/core/bypass.test.ts +47 -0
  318. package/src/core/bypass.ts +36 -0
  319. package/src/core/delay.ts +70 -0
  320. package/src/core/graphql.test.ts +11 -0
  321. package/src/core/graphql.ts +138 -0
  322. package/src/core/handlers/GraphQLHandler.test.ts +820 -0
  323. package/src/core/handlers/GraphQLHandler.ts +263 -0
  324. package/src/core/handlers/HttpHandler.test.ts +218 -0
  325. package/src/core/handlers/HttpHandler.ts +169 -0
  326. package/src/core/handlers/RequestHandler.ts +338 -0
  327. package/src/core/http.test.ts +15 -0
  328. package/src/core/http.ts +51 -0
  329. package/src/core/index.ts +56 -0
  330. package/src/core/passthrough.test.ts +13 -0
  331. package/src/core/passthrough.ts +23 -0
  332. package/src/core/sharedOptions.ts +66 -0
  333. package/src/core/typeUtils.ts +20 -0
  334. package/src/core/utils/HttpResponse/decorators.ts +56 -0
  335. package/src/core/utils/getResponse.ts +55 -0
  336. package/src/core/utils/handleRequest.test.ts +554 -0
  337. package/src/core/utils/handleRequest.ts +132 -0
  338. package/src/core/utils/internal/Disposable.ts +9 -0
  339. package/src/core/utils/internal/checkGlobals.ts +17 -0
  340. package/src/core/utils/internal/devUtils.ts +31 -0
  341. package/src/core/utils/internal/getCallFrame.test.ts +154 -0
  342. package/src/core/utils/internal/getCallFrame.ts +35 -0
  343. package/src/core/utils/internal/isIterable.test.ts +23 -0
  344. package/src/core/utils/internal/isIterable.ts +12 -0
  345. package/src/core/utils/internal/isObject.test.ts +20 -0
  346. package/src/core/utils/internal/isObject.ts +6 -0
  347. package/src/core/utils/internal/isStringEqual.test.ts +45 -0
  348. package/src/core/utils/internal/isStringEqual.ts +6 -0
  349. package/src/core/utils/internal/jsonParse.test.ts +13 -0
  350. package/src/core/utils/internal/jsonParse.ts +13 -0
  351. package/src/core/utils/internal/mergeRight.test.ts +43 -0
  352. package/src/core/utils/internal/mergeRight.ts +27 -0
  353. package/src/core/utils/internal/parseGraphQLRequest.test.ts +99 -0
  354. package/src/core/utils/internal/parseGraphQLRequest.ts +205 -0
  355. package/src/core/utils/internal/parseMultipartData.test.ts +76 -0
  356. package/src/core/utils/internal/parseMultipartData.ts +104 -0
  357. package/src/core/utils/internal/pipeEvents.test.ts +14 -0
  358. package/src/core/utils/internal/pipeEvents.ts +25 -0
  359. package/src/core/utils/internal/requestHandlerUtils.ts +21 -0
  360. package/src/core/utils/internal/toReadonlyArray.test.ts +30 -0
  361. package/src/core/utils/internal/toReadonlyArray.ts +8 -0
  362. package/src/core/utils/internal/tryCatch.test.ts +29 -0
  363. package/src/core/utils/internal/tryCatch.ts +11 -0
  364. package/src/core/utils/internal/uuidv4.ts +3 -0
  365. package/src/core/utils/logging/getStatusCodeColor.test.ts +22 -0
  366. package/src/core/utils/logging/getStatusCodeColor.ts +20 -0
  367. package/src/core/utils/logging/getTimestamp.test.ts +18 -0
  368. package/src/core/utils/logging/getTimestamp.ts +12 -0
  369. package/src/core/utils/logging/serializeRequest.test.ts +23 -0
  370. package/src/core/utils/logging/serializeRequest.ts +23 -0
  371. package/src/core/utils/logging/serializeResponse.test.ts +77 -0
  372. package/src/core/utils/logging/serializeResponse.ts +31 -0
  373. package/src/core/utils/matching/matchRequestUrl.test.ts +114 -0
  374. package/src/core/utils/matching/matchRequestUrl.ts +73 -0
  375. package/src/core/utils/matching/normalizePath.node.test.ts +44 -0
  376. package/src/core/utils/matching/normalizePath.test.ts +50 -0
  377. package/src/core/utils/matching/normalizePath.ts +21 -0
  378. package/src/core/utils/request/getPublicUrlFromRequest.test.ts +26 -0
  379. package/src/core/utils/request/getPublicUrlFromRequest.ts +15 -0
  380. package/src/core/utils/request/getRequestCookies.node.test.ts +29 -0
  381. package/src/core/utils/request/getRequestCookies.test.ts +64 -0
  382. package/src/core/utils/request/getRequestCookies.ts +75 -0
  383. package/src/core/utils/request/onUnhandledRequest.test.ts +215 -0
  384. package/src/core/utils/request/onUnhandledRequest.ts +247 -0
  385. package/src/core/utils/request/readResponseCookies.ts +9 -0
  386. package/src/core/utils/toResponseInit.ts +7 -0
  387. package/src/core/utils/url/cleanUrl.test.ts +17 -0
  388. package/src/core/utils/url/cleanUrl.ts +12 -0
  389. package/src/core/utils/url/getAbsoluteUrl.node.test.ts +19 -0
  390. package/src/core/utils/url/getAbsoluteUrl.test.ts +29 -0
  391. package/src/core/utils/url/getAbsoluteUrl.ts +26 -0
  392. package/src/core/utils/url/isAbsoluteUrl.test.ts +32 -0
  393. package/src/core/utils/url/isAbsoluteUrl.ts +6 -0
  394. package/src/iife/index.ts +2 -0
  395. package/src/mockServiceWorker.js +287 -0
  396. package/src/native/index.ts +17 -0
  397. package/src/node/SetupServerApi.ts +113 -0
  398. package/src/node/glossary.ts +62 -0
  399. package/src/node/index.ts +3 -0
  400. package/src/node/setupServer.ts +21 -0
  401. package/src/node/utils/isNodeExceptionLike.ts +14 -0
  402. package/src/tsconfig.core.build.json +6 -0
  403. package/src/tsconfig.node.build.json +6 -0
  404. package/src/tsconfig.node.json +8 -0
  405. package/src/tsconfig.src.json +15 -0
@@ -0,0 +1,259 @@
1
+ import { Emitter } from 'strict-event-emitter'
2
+ import {
3
+ LifeCycleEventEmitter,
4
+ LifeCycleEventsMap,
5
+ SharedOptions,
6
+ } from '~/core/sharedOptions'
7
+ import { ServiceWorkerMessage } from './start/utils/createMessageChannel'
8
+ import {
9
+ RequestHandler,
10
+ RequestHandlerDefaultInfo,
11
+ } from '~/core/handlers/RequestHandler'
12
+ import type { HttpRequestEventMap, Interceptor } from '@mswjs/interceptors'
13
+ import { Path } from '~/core/utils/matching/matchRequestUrl'
14
+ import { RequiredDeep } from '~/core/typeUtils'
15
+
16
+ export type ResolvedPath = Path | URL
17
+
18
+ type RequestWithoutMethods = Omit<
19
+ Request,
20
+ | 'text'
21
+ | 'body'
22
+ | 'json'
23
+ | 'blob'
24
+ | 'arrayBuffer'
25
+ | 'formData'
26
+ | 'clone'
27
+ | 'signal'
28
+ | 'isHistoryNavigation'
29
+ | 'isReloadNavigation'
30
+ >
31
+
32
+ /**
33
+ * Request representation received from the worker message event.
34
+ */
35
+ export interface ServiceWorkerIncomingRequest extends RequestWithoutMethods {
36
+ /**
37
+ * Unique ID of the request generated once the request is
38
+ * intercepted by the "fetch" event in the Service Worker.
39
+ */
40
+ id: string
41
+ body?: ArrayBuffer | null
42
+ }
43
+
44
+ export type ServiceWorkerIncomingResponse = Pick<
45
+ Response,
46
+ 'type' | 'ok' | 'status' | 'statusText' | 'body' | 'headers' | 'redirected'
47
+ > & {
48
+ requestId: string
49
+ isMockedResponse: boolean
50
+ }
51
+
52
+ /**
53
+ * Map of the events that can be received from the Service Worker.
54
+ */
55
+ export interface ServiceWorkerIncomingEventsMap {
56
+ MOCKING_ENABLED: boolean
57
+ INTEGRITY_CHECK_RESPONSE: string
58
+ KEEPALIVE_RESPONSE: never
59
+ REQUEST: ServiceWorkerIncomingRequest
60
+ RESPONSE: ServiceWorkerIncomingResponse
61
+ }
62
+
63
+ /**
64
+ * Map of the events that can be sent to the Service Worker
65
+ * from any execution context.
66
+ */
67
+ export type ServiceWorkerOutgoingEventTypes =
68
+ | 'MOCK_ACTIVATE'
69
+ | 'MOCK_DEACTIVATE'
70
+ | 'INTEGRITY_CHECK_REQUEST'
71
+ | 'KEEPALIVE_REQUEST'
72
+ | 'CLIENT_CLOSED'
73
+
74
+ export interface StringifiedResponse extends ResponseInit {
75
+ body: string | ArrayBuffer | ReadableStream<Uint8Array> | null
76
+ }
77
+
78
+ /**
79
+ * Map of the events that can be sent to the Service Worker
80
+ * only as a part of a single `fetch` event handler.
81
+ */
82
+ export interface ServiceWorkerFetchEventMap {
83
+ MOCK_RESPONSE(payload: StringifiedResponse): void
84
+ MOCK_RESPONSE_START(payload: StringifiedResponse): void
85
+
86
+ MOCK_NOT_FOUND(): void
87
+ NETWORK_ERROR(payload: { name: string; message: string }): void
88
+ INTERNAL_ERROR(payload: { status: number; body: string }): void
89
+ }
90
+
91
+ export interface ServiceWorkerBroadcastChannelMessageMap {
92
+ MOCK_RESPONSE_CHUNK(payload: Uint8Array): void
93
+ MOCK_RESPONSE_END(): void
94
+ }
95
+
96
+ export interface StrictEventListener<EventType extends Event> {
97
+ (event: EventType): void
98
+ }
99
+
100
+ export interface SetupWorkerInternalContext {
101
+ isMockingEnabled: boolean
102
+ startOptions: RequiredDeep<StartOptions>
103
+ worker: ServiceWorker | null
104
+ registration: ServiceWorkerRegistration | null
105
+ requestHandlers: Array<RequestHandler>
106
+ emitter: Emitter<LifeCycleEventsMap>
107
+ keepAliveInterval?: number
108
+ workerChannel: {
109
+ /**
110
+ * Adds a Service Worker event listener.
111
+ */
112
+ on<EventType extends keyof ServiceWorkerIncomingEventsMap>(
113
+ eventType: EventType,
114
+ callback: (
115
+ event: MessageEvent,
116
+ message: ServiceWorkerMessage<
117
+ EventType,
118
+ ServiceWorkerIncomingEventsMap[EventType]
119
+ >,
120
+ ) => void,
121
+ ): void
122
+ send<EventType extends ServiceWorkerOutgoingEventTypes>(
123
+ eventType: EventType,
124
+ ): void
125
+ }
126
+ events: {
127
+ /**
128
+ * Adds an event listener on the given target.
129
+ * Returns a clean-up function that removes that listener.
130
+ */
131
+ addListener<EventType extends Event>(
132
+ target: EventTarget,
133
+ eventType: string,
134
+ callback: StrictEventListener<EventType>,
135
+ ): () => void
136
+ /**
137
+ * Removes all currently attached listeners.
138
+ */
139
+ removeAllListeners(): void
140
+ /**
141
+ * Awaits a given message type from the Service Worker.
142
+ */
143
+ once<EventType extends keyof ServiceWorkerIncomingEventsMap>(
144
+ eventType: EventType,
145
+ ): Promise<
146
+ ServiceWorkerMessage<EventType, ServiceWorkerIncomingEventsMap[EventType]>
147
+ >
148
+ }
149
+ supports: {
150
+ serviceWorkerApi: boolean
151
+ readableStreamTransfer: boolean
152
+ }
153
+ fallbackInterceptor?: Interceptor<HttpRequestEventMap>
154
+ }
155
+
156
+ export type ServiceWorkerInstanceTuple = [
157
+ ServiceWorker | null,
158
+ ServiceWorkerRegistration,
159
+ ]
160
+
161
+ export type FindWorker = (
162
+ scriptUrl: string,
163
+ mockServiceWorkerUrl: string,
164
+ ) => boolean
165
+
166
+ export interface StartOptions extends SharedOptions {
167
+ /**
168
+ * Service Worker registration options.
169
+ */
170
+ serviceWorker?: {
171
+ /**
172
+ * Custom url to the worker script.
173
+ * @default "/mockServiceWorker.js"
174
+ */
175
+ url?: string
176
+ options?: RegistrationOptions
177
+ }
178
+
179
+ /**
180
+ * Disables the logging of the intercepted requests
181
+ * into browser's console.
182
+ * @default false
183
+ */
184
+ quiet?: boolean
185
+
186
+ /**
187
+ * Defers any network requests until the Service Worker
188
+ * instance is activated.
189
+ * @default true
190
+ */
191
+ waitUntilReady?: boolean
192
+
193
+ /**
194
+ * A custom lookup function to find a Mock Service Worker in the list
195
+ * of all registered Service Workers on the page.
196
+ */
197
+ findWorker?: FindWorker
198
+ }
199
+
200
+ export type StartReturnType = Promise<ServiceWorkerRegistration | undefined>
201
+ export type StartHandler = (
202
+ options: RequiredDeep<StartOptions>,
203
+ initialOptions: StartOptions,
204
+ ) => StartReturnType
205
+ export type StopHandler = () => void
206
+
207
+ export interface SetupWorker {
208
+ /**
209
+ * Registers and activates the mock Service Worker.
210
+ *
211
+ * @see {@link https://mswjs.io/docs/api/setup-worker/start `worker.start()` API reference}
212
+ */
213
+ start: (options?: StartOptions) => StartReturnType
214
+
215
+ /**
216
+ * Stops requests interception for the current client.
217
+ *
218
+ * @see {@link https://mswjs.io/docs/api/setup-worker/stop `worker.stop()` API reference}
219
+ */
220
+ stop: StopHandler
221
+
222
+ /**
223
+ * Prepends given request handlers to the list of existing handlers.
224
+ * @param {RequestHandler[]} handlers List of runtime request handlers.
225
+ *
226
+ * @see {@link https://mswjs.io/docs/api/setup-worker/use `worker.use()` API reference}
227
+ */
228
+ use: (...handlers: RequestHandler[]) => void
229
+
230
+ /**
231
+ * Marks all request handlers that respond using `res.once()` as unused.
232
+ *
233
+ * @see {@link https://mswjs.io/docs/api/setup-worker/restore-handlers `worker.restoreHandlers()` API reference}
234
+ */
235
+ restoreHandlers: () => void
236
+
237
+ /**
238
+ * Resets request handlers to the initial list given to the `setupWorker` call, or to the explicit next request handlers list, if given.
239
+ * @param {RequestHandler[]} nextHandlers List of the new initial request handlers.
240
+ *
241
+ * @see {@link https://mswjs.io/docs/api/setup-worker/reset-handlers `worker.resetHandlers()` API reference}
242
+ */
243
+ resetHandlers: (...nextHandlers: RequestHandler[]) => void
244
+
245
+ /**
246
+ * Returns a readonly list of currently active request handlers.
247
+ *
248
+ * @see {@link https://mswjs.io/docs/api/setup-worker/list-handlers `worker.listHandlers()` API reference}
249
+ */
250
+ listHandlers(): ReadonlyArray<RequestHandler<RequestHandlerDefaultInfo, any>>
251
+
252
+ /**
253
+ * Life-cycle events.
254
+ * Life-cycle events allow you to subscribe to the internal library events occurring during the request/response handling.
255
+ *
256
+ * @see {@link https://mswjs.io/docs/api/life-cycle-events Life-cycle Events API reference}
257
+ */
258
+ events: LifeCycleEventEmitter<LifeCycleEventsMap>
259
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @vitest-environment node
3
+ */
4
+ import { setupWorker } from './setupWorker'
5
+
6
+ test('returns an error when run in a Node.js environment', () => {
7
+ expect(setupWorker).toThrow(
8
+ '[MSW] Failed to execute `setupWorker` in a non-browser environment',
9
+ )
10
+ })
@@ -0,0 +1,199 @@
1
+ import { invariant } from 'outvariant'
2
+ import { isNodeProcess } from 'is-node-process'
3
+ import {
4
+ SetupWorkerInternalContext,
5
+ ServiceWorkerIncomingEventsMap,
6
+ StartReturnType,
7
+ StopHandler,
8
+ StartHandler,
9
+ StartOptions,
10
+ } from './glossary'
11
+ import { createStartHandler } from './start/createStartHandler'
12
+ import { createStop } from './stop/createStop'
13
+ import { ServiceWorkerMessage } from './start/utils/createMessageChannel'
14
+ import { RequestHandler } from '~/core/handlers/RequestHandler'
15
+ import { DEFAULT_START_OPTIONS } from './start/utils/prepareStartHandler'
16
+ import { createFallbackStart } from './start/createFallbackStart'
17
+ import { createFallbackStop } from './stop/createFallbackStop'
18
+ import { devUtils } from '~/core/utils/internal/devUtils'
19
+ import { SetupApi } from '~/core/SetupApi'
20
+ import { mergeRight } from '~/core/utils/internal/mergeRight'
21
+ import { LifeCycleEventsMap } from '~/core/sharedOptions'
22
+ import { SetupWorker } from './glossary'
23
+ import { supportsReadableStreamTransfer } from '../utils/supportsReadableStreamTransfer'
24
+
25
+ interface Listener {
26
+ target: EventTarget
27
+ eventType: string
28
+ callback: EventListenerOrEventListenerObject
29
+ }
30
+
31
+ export class SetupWorkerApi
32
+ extends SetupApi<LifeCycleEventsMap>
33
+ implements SetupWorker
34
+ {
35
+ private context: SetupWorkerInternalContext
36
+ private startHandler: StartHandler = null as any
37
+ private stopHandler: StopHandler = null as any
38
+ private listeners: Array<Listener>
39
+
40
+ constructor(...handlers: Array<RequestHandler>) {
41
+ super(...handlers)
42
+
43
+ invariant(
44
+ !isNodeProcess(),
45
+ devUtils.formatMessage(
46
+ 'Failed to execute `setupWorker` in a non-browser environment. Consider using `setupServer` for Node.js environment instead.',
47
+ ),
48
+ )
49
+
50
+ this.listeners = []
51
+ this.context = this.createWorkerContext()
52
+ }
53
+
54
+ private createWorkerContext(): SetupWorkerInternalContext {
55
+ const context: SetupWorkerInternalContext = {
56
+ // Mocking is not considered enabled until the worker
57
+ // signals back the successful activation event.
58
+ isMockingEnabled: false,
59
+ startOptions: null as any,
60
+ worker: null,
61
+ registration: null,
62
+ requestHandlers: this.currentHandlers,
63
+ emitter: this.emitter,
64
+ workerChannel: {
65
+ on: (eventType, callback) => {
66
+ this.context.events.addListener<
67
+ MessageEvent<ServiceWorkerMessage<typeof eventType, any>>
68
+ >(navigator.serviceWorker, 'message', (event) => {
69
+ // Avoid messages broadcasted from unrelated workers.
70
+ if (event.source !== this.context.worker) {
71
+ return
72
+ }
73
+
74
+ const message = event.data
75
+
76
+ if (!message) {
77
+ return
78
+ }
79
+
80
+ if (message.type === eventType) {
81
+ callback(event, message)
82
+ }
83
+ })
84
+ },
85
+ send: (type) => {
86
+ this.context.worker?.postMessage(type)
87
+ },
88
+ },
89
+ events: {
90
+ addListener: (target, eventType, callback) => {
91
+ target.addEventListener(eventType, callback as EventListener)
92
+ this.listeners.push({
93
+ eventType,
94
+ target,
95
+ callback: callback as EventListener,
96
+ })
97
+
98
+ return () => {
99
+ target.removeEventListener(eventType, callback as EventListener)
100
+ }
101
+ },
102
+ removeAllListeners: () => {
103
+ for (const { target, eventType, callback } of this.listeners) {
104
+ target.removeEventListener(eventType, callback)
105
+ }
106
+ this.listeners = []
107
+ },
108
+ once: (eventType) => {
109
+ const bindings: Array<() => void> = []
110
+
111
+ return new Promise<
112
+ ServiceWorkerMessage<
113
+ typeof eventType,
114
+ ServiceWorkerIncomingEventsMap[typeof eventType]
115
+ >
116
+ >((resolve, reject) => {
117
+ const handleIncomingMessage = (event: MessageEvent) => {
118
+ try {
119
+ const message = event.data
120
+
121
+ if (message.type === eventType) {
122
+ resolve(message)
123
+ }
124
+ } catch (error) {
125
+ reject(error)
126
+ }
127
+ }
128
+
129
+ bindings.push(
130
+ this.context.events.addListener(
131
+ navigator.serviceWorker,
132
+ 'message',
133
+ handleIncomingMessage,
134
+ ),
135
+ this.context.events.addListener(
136
+ navigator.serviceWorker,
137
+ 'messageerror',
138
+ reject,
139
+ ),
140
+ )
141
+ }).finally(() => {
142
+ bindings.forEach((unbind) => unbind())
143
+ })
144
+ },
145
+ },
146
+ supports: {
147
+ serviceWorkerApi:
148
+ !('serviceWorker' in navigator) || location.protocol === 'file:',
149
+ readableStreamTransfer: supportsReadableStreamTransfer(),
150
+ },
151
+ }
152
+
153
+ /**
154
+ * @todo Not sure I like this but "this.currentHandlers"
155
+ * updates never bubble to "this.context.requestHandlers".
156
+ */
157
+ Object.defineProperties(context, {
158
+ requestHandlers: {
159
+ get: () => this.currentHandlers,
160
+ },
161
+ })
162
+
163
+ this.startHandler = context.supports.serviceWorkerApi
164
+ ? createFallbackStart(context)
165
+ : createStartHandler(context)
166
+
167
+ this.stopHandler = context.supports.serviceWorkerApi
168
+ ? createFallbackStop(context)
169
+ : createStop(context)
170
+
171
+ return context
172
+ }
173
+
174
+ public async start(options: StartOptions = {}): StartReturnType {
175
+ this.context.startOptions = mergeRight(
176
+ DEFAULT_START_OPTIONS,
177
+ options,
178
+ ) as SetupWorkerInternalContext['startOptions']
179
+
180
+ return await this.startHandler(this.context.startOptions, options)
181
+ }
182
+
183
+ public stop(): void {
184
+ super.dispose()
185
+ this.context.events.removeAllListeners()
186
+ this.context.emitter.removeAllListeners()
187
+ this.stopHandler()
188
+ }
189
+ }
190
+
191
+ /**
192
+ * Sets up a requests interception in the browser with the given request handlers.
193
+ * @param {RequestHandler[]} handlers List of request handlers.
194
+ *
195
+ * @see {@link https://mswjs.io/docs/api/setup-worker `setupWorker()` API reference}
196
+ */
197
+ export function setupWorker(...handlers: Array<RequestHandler>): SetupWorker {
198
+ return new SetupWorkerApi(...handlers)
199
+ }
@@ -0,0 +1,67 @@
1
+ import {
2
+ Interceptor,
3
+ BatchInterceptor,
4
+ HttpRequestEventMap,
5
+ } from '@mswjs/interceptors'
6
+ import { FetchInterceptor } from '@mswjs/interceptors/fetch'
7
+ import { XMLHttpRequestInterceptor } from '@mswjs/interceptors/XMLHttpRequest'
8
+ import { SetupWorkerInternalContext, StartOptions } from '../glossary'
9
+ import type { RequiredDeep } from '~/core/typeUtils'
10
+ import { handleRequest } from '~/core/utils/handleRequest'
11
+
12
+ export function createFallbackRequestListener(
13
+ context: SetupWorkerInternalContext,
14
+ options: RequiredDeep<StartOptions>,
15
+ ): Interceptor<HttpRequestEventMap> {
16
+ const interceptor = new BatchInterceptor({
17
+ name: 'fallback',
18
+ interceptors: [new FetchInterceptor(), new XMLHttpRequestInterceptor()],
19
+ })
20
+
21
+ interceptor.on('request', async ({ request, requestId }) => {
22
+ const requestCloneForLogs = request.clone()
23
+
24
+ const response = await handleRequest(
25
+ request,
26
+ requestId,
27
+ context.requestHandlers,
28
+ options,
29
+ context.emitter,
30
+ {
31
+ onMockedResponse(_, { handler, parsedResult }) {
32
+ if (!options.quiet) {
33
+ context.emitter.once('response:mocked', ({ response }) => {
34
+ handler.log({
35
+ request: requestCloneForLogs,
36
+ response,
37
+ parsedResult,
38
+ })
39
+ })
40
+ }
41
+ },
42
+ },
43
+ )
44
+
45
+ if (response) {
46
+ request.respondWith(response)
47
+ }
48
+ })
49
+
50
+ interceptor.on(
51
+ 'response',
52
+ ({ response, isMockedResponse, request, requestId }) => {
53
+ context.emitter.emit(
54
+ isMockedResponse ? 'response:mocked' : 'response:bypass',
55
+ {
56
+ response,
57
+ request,
58
+ requestId,
59
+ },
60
+ )
61
+ },
62
+ )
63
+
64
+ interceptor.apply()
65
+
66
+ return interceptor
67
+ }
@@ -0,0 +1,21 @@
1
+ import { createFallbackRequestListener } from './createFallbackRequestListener'
2
+ import { SetupWorkerInternalContext, StartHandler } from '../glossary'
3
+ import { printStartMessage } from './utils/printStartMessage'
4
+
5
+ export function createFallbackStart(
6
+ context: SetupWorkerInternalContext,
7
+ ): StartHandler {
8
+ return async function start(options) {
9
+ context.fallbackInterceptor = createFallbackRequestListener(
10
+ context,
11
+ options,
12
+ )
13
+
14
+ printStartMessage({
15
+ message: 'Mocking enabled (fallback mode).',
16
+ quiet: options.quiet,
17
+ })
18
+
19
+ return undefined
20
+ }
21
+ }
@@ -0,0 +1,127 @@
1
+ import {
2
+ StartOptions,
3
+ SetupWorkerInternalContext,
4
+ ServiceWorkerIncomingEventsMap,
5
+ } from '../glossary'
6
+ import {
7
+ ServiceWorkerMessage,
8
+ WorkerChannel,
9
+ } from './utils/createMessageChannel'
10
+ import { parseWorkerRequest } from '../../utils/parseWorkerRequest'
11
+ import { handleRequest } from '~/core/utils/handleRequest'
12
+ import { RequiredDeep } from '~/core/typeUtils'
13
+ import { devUtils } from '~/core/utils/internal/devUtils'
14
+ import { toResponseInit } from '~/core/utils/toResponseInit'
15
+
16
+ export const createRequestListener = (
17
+ context: SetupWorkerInternalContext,
18
+ options: RequiredDeep<StartOptions>,
19
+ ) => {
20
+ return async (
21
+ event: MessageEvent,
22
+ message: ServiceWorkerMessage<
23
+ 'REQUEST',
24
+ ServiceWorkerIncomingEventsMap['REQUEST']
25
+ >,
26
+ ) => {
27
+ const messageChannel = new WorkerChannel(event.ports[0])
28
+
29
+ const requestId = message.payload.id
30
+ const request = parseWorkerRequest(message.payload)
31
+ const requestCloneForLogs = request.clone()
32
+
33
+ try {
34
+ await handleRequest(
35
+ request,
36
+ requestId,
37
+ context.requestHandlers,
38
+ options,
39
+ context.emitter,
40
+ {
41
+ onPassthroughResponse() {
42
+ messageChannel.postMessage('NOT_FOUND')
43
+ },
44
+ async onMockedResponse(response, { handler, parsedResult }) {
45
+ // Clone the mocked response so its body could be read
46
+ // to buffer to be sent to the worker and also in the
47
+ // ".log()" method of the request handler.
48
+ const responseClone = response.clone()
49
+ const responseCloneForLogs = response.clone()
50
+ const responseInit = toResponseInit(response)
51
+
52
+ /**
53
+ * @note Safari doesn't support transferring a "ReadableStream".
54
+ * Check that the browser supports that before sending it to the worker.
55
+ */
56
+ if (context.supports.readableStreamTransfer) {
57
+ const responseStreamOrNull = response.body
58
+
59
+ messageChannel.postMessage(
60
+ 'MOCK_RESPONSE',
61
+ {
62
+ ...responseInit,
63
+ body: responseStreamOrNull,
64
+ },
65
+ responseStreamOrNull ? [responseStreamOrNull] : undefined,
66
+ )
67
+ } else {
68
+ /**
69
+ * @note If we are here, this means the current environment doesn't
70
+ * support "ReadableStream" as transferable. In that case,
71
+ * attempt to read the non-empty response body as ArrayBuffer, if it's not empty.
72
+ * @see https://github.com/mswjs/msw/issues/1827
73
+ */
74
+ const responseBufferOrNull =
75
+ response.body === null
76
+ ? null
77
+ : await responseClone.arrayBuffer()
78
+
79
+ messageChannel.postMessage('MOCK_RESPONSE', {
80
+ ...responseInit,
81
+ body: responseBufferOrNull,
82
+ })
83
+ }
84
+
85
+ if (!options.quiet) {
86
+ context.emitter.once('response:mocked', () => {
87
+ handler.log({
88
+ request: requestCloneForLogs,
89
+ response: responseCloneForLogs,
90
+ parsedResult,
91
+ })
92
+ })
93
+ }
94
+ },
95
+ },
96
+ )
97
+ } catch (error) {
98
+ if (error instanceof Error) {
99
+ devUtils.error(
100
+ `Uncaught exception in the request handler for "%s %s":
101
+
102
+ %s
103
+
104
+ This exception has been gracefully handled as a 500 response, however, it's strongly recommended to resolve this error, as it indicates a mistake in your code. If you wish to mock an error response, please see this guide: https://mswjs.io/docs/recipes/mocking-error-responses`,
105
+ request.method,
106
+ request.url,
107
+ error.stack ?? error,
108
+ )
109
+
110
+ // Treat all other exceptions in a request handler as unintended,
111
+ // alerting that there is a problem that needs fixing.
112
+ messageChannel.postMessage('MOCK_RESPONSE', {
113
+ status: 500,
114
+ statusText: 'Request Handler Error',
115
+ headers: {
116
+ 'Content-Type': 'application/json',
117
+ },
118
+ body: JSON.stringify({
119
+ name: error.name,
120
+ message: error.message,
121
+ stack: error.stack,
122
+ }),
123
+ })
124
+ }
125
+ }
126
+ }
127
+ }