@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,916 @@
1
+ import { invariant } from 'outvariant'
2
+ import { Emitter } from 'strict-event-emitter'
3
+ import type { ResponseResolver } from './handlers/RequestHandler'
4
+ import {
5
+ HttpHandler,
6
+ type HttpRequestResolverExtras,
7
+ type HttpRequestParsedResult,
8
+ } from './handlers/HttpHandler'
9
+ import type { ResponseResolutionContext } from '~/core/utils/executeHandlers'
10
+ import type { Path, PathParams } from './utils/matching/matchRequestUrl'
11
+ import { delay } from './delay'
12
+ import { getTimestamp } from './utils/logging/getTimestamp'
13
+ import { devUtils } from './utils/internal/devUtils'
14
+ import { colors } from './ws/utils/attachWebSocketLogger'
15
+ import { toPublicUrl } from './utils/request/toPublicUrl'
16
+
17
+ type EventMapConstraint = {
18
+ message?: unknown
19
+ [key: string]: unknown
20
+ [key: symbol | number]: never
21
+ }
22
+
23
+ export type ServerSentEventResolverExtras<
24
+ EventMap extends EventMapConstraint,
25
+ Params extends PathParams,
26
+ > = HttpRequestResolverExtras<Params> & {
27
+ client: ServerSentEventClient<EventMap>
28
+ server: ServerSentEventServer
29
+ }
30
+
31
+ export type ServerSentEventResolver<
32
+ EventMap extends EventMapConstraint,
33
+ Params extends PathParams,
34
+ > = ResponseResolver<ServerSentEventResolverExtras<EventMap, Params>, any, any>
35
+
36
+ export type ServerSentEventRequestHandler = <
37
+ EventMap extends EventMapConstraint = { message: unknown },
38
+ Params extends PathParams<keyof Params> = PathParams,
39
+ RequestPath extends Path = Path,
40
+ >(
41
+ path: RequestPath,
42
+ resolver: ServerSentEventResolver<EventMap, Params>,
43
+ ) => HttpHandler
44
+
45
+ export type ServerSentEventMessage<
46
+ EventMap extends EventMapConstraint = { message: unknown },
47
+ > =
48
+ | ToEventDiscriminatedUnion<EventMap & { message: unknown }>
49
+ | {
50
+ id?: never
51
+ event?: never
52
+ data?: never
53
+ retry: number
54
+ }
55
+
56
+ /**
57
+ * Intercept Server-Sent Events (SSE).
58
+ *
59
+ * @example
60
+ * sse('http://localhost:4321', ({ client }) => {
61
+ * client.send({ data: 'hello world' })
62
+ * })
63
+ *
64
+ * @see {@link https://mswjs.io/docs/sse/ Mocking Server-Sent Events}
65
+ * @see {@link https://mswjs.io/docs/api/sse `sse()` API reference}
66
+ */
67
+ export const sse: ServerSentEventRequestHandler = (path, resolver) => {
68
+ return new ServerSentEventHandler(path, resolver)
69
+ }
70
+
71
+ const SSE_RESPONSE_INIT: ResponseInit = {
72
+ headers: {
73
+ 'content-type': 'text/event-stream',
74
+ 'cache-control': 'no-cache',
75
+ connection: 'keep-alive',
76
+ },
77
+ }
78
+
79
+ class ServerSentEventHandler<
80
+ EventMap extends EventMapConstraint,
81
+ > extends HttpHandler {
82
+ #emitter: Emitter<ServerSentEventClientEventMap>
83
+
84
+ constructor(path: Path, resolver: ServerSentEventResolver<EventMap, any>) {
85
+ invariant(
86
+ typeof EventSource !== 'undefined',
87
+ 'Failed to construct a Server-Sent Event handler for path "%s": the EventSource API is not supported in this environment',
88
+ path,
89
+ )
90
+
91
+ super('GET', path, async (info) => {
92
+ const stream = new ReadableStream({
93
+ start: async (controller) => {
94
+ const client = new ServerSentEventClient<EventMap>({
95
+ controller,
96
+ emitter: this.#emitter,
97
+ })
98
+ const server = new ServerSentEventServer({
99
+ request: info.request,
100
+ client,
101
+ })
102
+
103
+ await resolver({
104
+ ...info,
105
+ client,
106
+ server,
107
+ })
108
+ },
109
+ })
110
+
111
+ return new Response(stream, SSE_RESPONSE_INIT)
112
+ })
113
+
114
+ this.#emitter = new Emitter<ServerSentEventClientEventMap>()
115
+ }
116
+
117
+ async predicate(args: {
118
+ request: Request
119
+ parsedResult: HttpRequestParsedResult
120
+ resolutionContext?: ResponseResolutionContext
121
+ }) {
122
+ if (args.request.headers.get('accept') !== 'text/event-stream') {
123
+ return false
124
+ }
125
+
126
+ const matches = await super.predicate(args)
127
+
128
+ if (matches && !args.resolutionContext?.quiet) {
129
+ /**
130
+ * @note Log the intercepted request early.
131
+ * Normally, the `this.log()` method is called when the handler returns a response.
132
+ * For SSE, call that method earlier so the logs are in correct order.
133
+ */
134
+ await super.log({
135
+ request: args.request,
136
+ /**
137
+ * @note Construct a placeholder response since SSE response
138
+ * is being streamed and cannot be cloned/consumed for logging.
139
+ */
140
+ response: new Response('[streaming]', SSE_RESPONSE_INIT),
141
+ })
142
+
143
+ this.#attachClientLogger(args.request, this.#emitter)
144
+ }
145
+
146
+ return matches
147
+ }
148
+
149
+ async log(_args: { request: Request; response: Response }): Promise<void> {
150
+ /**
151
+ * @note Skip the default `this.log()` logic so that when this handler is logged
152
+ * upon handling the request, nothing is printed (we log SSE requests early).
153
+ */
154
+ return
155
+ }
156
+
157
+ #attachClientLogger(
158
+ request: Request,
159
+ emitter: Emitter<ServerSentEventClientEventMap>,
160
+ ): void {
161
+ const publicUrl = toPublicUrl(request.url)
162
+
163
+ /* eslint-disable no-console */
164
+ emitter.on('message', (payload) => {
165
+ console.groupCollapsed(
166
+ devUtils.formatMessage(
167
+ `${getTimestamp()} SSE %s %c⇣%c ${payload.event}`,
168
+ ),
169
+ publicUrl,
170
+ `color:${colors.mocked}`,
171
+ 'color:inherit',
172
+ )
173
+ console.log(payload.frames)
174
+ console.groupEnd()
175
+ })
176
+
177
+ emitter.on('error', () => {
178
+ console.groupCollapsed(
179
+ devUtils.formatMessage(`${getTimestamp()} SSE %s %c\u00D7%c error`),
180
+ publicUrl,
181
+ `color: ${colors.system}`,
182
+ 'color:inherit',
183
+ )
184
+ console.log('Handler:', this)
185
+ console.groupEnd()
186
+ })
187
+
188
+ emitter.on('close', () => {
189
+ console.groupCollapsed(
190
+ devUtils.formatMessage(`${getTimestamp()} SSE %s %c■%c close`),
191
+ publicUrl,
192
+ `colors:${colors.system}`,
193
+ 'color:inherit',
194
+ )
195
+ console.log('Handler:', this)
196
+ console.groupEnd()
197
+ })
198
+ /* eslint-enable no-console */
199
+ }
200
+ }
201
+
202
+ type Values<T> = T[keyof T]
203
+ type Identity<T> = { [K in keyof T]: T[K] } & unknown
204
+ type ToEventDiscriminatedUnion<T> = Values<{
205
+ [K in keyof T]: Identity<
206
+ (K extends 'message'
207
+ ? {
208
+ id?: string
209
+ event?: K
210
+ data?: T[K]
211
+ retry?: never
212
+ }
213
+ : {
214
+ id?: string
215
+ event: K
216
+ data?: T[K]
217
+ retry?: never
218
+ }) &
219
+ // Make the `data` field conditionally required through an intersection.
220
+ (undefined extends T[K] ? unknown : { data: unknown })
221
+ >
222
+ }>
223
+
224
+ type ServerSentEventClientEventMap = {
225
+ message: [
226
+ payload: {
227
+ id?: string
228
+ event: string
229
+ data?: unknown
230
+ frames: Array<string>
231
+ },
232
+ ]
233
+ error: []
234
+ close: []
235
+ }
236
+
237
+ class ServerSentEventClient<
238
+ EventMap extends EventMapConstraint = { message: unknown },
239
+ > {
240
+ #encoder: TextEncoder
241
+ #controller: ReadableStreamDefaultController
242
+ #emitter: Emitter<ServerSentEventClientEventMap>
243
+
244
+ constructor(args: {
245
+ controller: ReadableStreamDefaultController
246
+ emitter: Emitter<ServerSentEventClientEventMap>
247
+ }) {
248
+ this.#encoder = new TextEncoder()
249
+ this.#controller = args.controller
250
+ this.#emitter = args.emitter
251
+ }
252
+
253
+ /**
254
+ * Sends the given payload to the intercepted `EventSource`.
255
+ */
256
+ public send(payload: ServerSentEventMessage<EventMap>): void {
257
+ if ('retry' in payload && payload.retry != null) {
258
+ this.#sendRetry(payload.retry)
259
+ return
260
+ }
261
+
262
+ this.#sendMessage({
263
+ id: payload.id,
264
+ event: payload.event,
265
+ data:
266
+ typeof payload.data === 'object'
267
+ ? JSON.stringify(payload.data)
268
+ : payload.data,
269
+ })
270
+ }
271
+
272
+ /**
273
+ * Dispatches the given event on the intercepted `EventSource`.
274
+ */
275
+ public dispatchEvent(event: Event) {
276
+ if (event instanceof MessageEvent) {
277
+ /**
278
+ * @note Use the internal send mechanism to skip normalization
279
+ * of the message data (already normalized by the server).
280
+ */
281
+ this.#sendMessage({
282
+ id: event.lastEventId || undefined,
283
+ event: event.type === 'message' ? undefined : event.type,
284
+ data: event.data,
285
+ })
286
+ return
287
+ }
288
+
289
+ if (event.type === 'error') {
290
+ this.error()
291
+ return
292
+ }
293
+
294
+ if (event.type === 'close') {
295
+ this.close()
296
+ return
297
+ }
298
+ }
299
+
300
+ /**
301
+ * Errors the underlying `EventSource`, closing the connection with an error.
302
+ * This is equivalent to aborting the connection and will produce a `TypeError: Failed to fetch`
303
+ * error.
304
+ */
305
+ public error(): void {
306
+ this.#controller.error()
307
+ this.#emitter.emit('error')
308
+ }
309
+
310
+ /**
311
+ * Closes the underlying `EventSource`, closing the connection.
312
+ */
313
+ public close(): void {
314
+ this.#controller.close()
315
+ this.#emitter.emit('close')
316
+ }
317
+
318
+ #sendRetry(retry: number): void {
319
+ if (typeof retry === 'number') {
320
+ this.#controller.enqueue(this.#encoder.encode(`retry:${retry}\n\n`))
321
+ }
322
+ }
323
+
324
+ #sendMessage(message: {
325
+ id?: string
326
+ event?: unknown
327
+ data: unknown | undefined
328
+ }): void {
329
+ const frames: Array<string> = []
330
+
331
+ if (message.id) {
332
+ frames.push(`id:${message.id}`)
333
+ }
334
+
335
+ if (message.event) {
336
+ frames.push(`event:${message.event.toString()}`)
337
+ }
338
+
339
+ if (message.data != null) {
340
+ /**
341
+ * Split data on line terminators (LF, CR, or CRLF) and translate them to individual frames.
342
+ * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#event-stream-interpretation
343
+ * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream
344
+ */
345
+ for (const line of message.data.toString().split(/\r\n|\r|\n/)) {
346
+ frames.push(`data:${line}`)
347
+ }
348
+ }
349
+
350
+ frames.push('', '')
351
+
352
+ this.#controller.enqueue(this.#encoder.encode(frames.join('\n')))
353
+
354
+ this.#emitter.emit('message', {
355
+ id: message.id,
356
+ event: message.event?.toString() || 'message',
357
+ data: message.data,
358
+ frames,
359
+ })
360
+ }
361
+ }
362
+
363
+ class ServerSentEventServer {
364
+ #request: Request
365
+ #client: ServerSentEventClient<ServerSentEventClientEventMap>
366
+
367
+ constructor(args: { request: Request; client: ServerSentEventClient<any> }) {
368
+ this.#request = args.request
369
+ this.#client = args.client
370
+ }
371
+
372
+ /**
373
+ * Establishes the actual connection for this SSE request
374
+ * and returns the `EventSource` instance.
375
+ */
376
+ public connect(): EventSource {
377
+ const source = new ObservableEventSource(this.#request.url, {
378
+ withCredentials: this.#request.credentials === 'include',
379
+ headers: {
380
+ /**
381
+ * @note Mark this request as passthrough so it doesn't trigger
382
+ * an infinite loop matching against the existing request handler.
383
+ */
384
+ accept: 'msw/passthrough',
385
+ },
386
+ })
387
+
388
+ source[kOnAnyMessage] = (event) => {
389
+ Object.defineProperties(event, {
390
+ target: {
391
+ value: this,
392
+ enumerable: true,
393
+ writable: true,
394
+ configurable: true,
395
+ },
396
+ })
397
+
398
+ // Schedule the server-to-client forwarding for the next tick
399
+ // so the user can prevent the message event.
400
+ queueMicrotask(() => {
401
+ if (!event.defaultPrevented) {
402
+ this.#client.dispatchEvent(event)
403
+ }
404
+ })
405
+ }
406
+
407
+ // Forward stream errors from the actual server to the client.
408
+ source.addEventListener('error', (event) => {
409
+ Object.defineProperties(event, {
410
+ target: {
411
+ value: this,
412
+ enumerable: true,
413
+ writable: true,
414
+ configurable: true,
415
+ },
416
+ })
417
+
418
+ queueMicrotask(() => {
419
+ // Allow the user to opt-out from this forwarding.
420
+ if (!event.defaultPrevented) {
421
+ this.#client.dispatchEvent(event)
422
+ }
423
+ })
424
+ })
425
+
426
+ return source
427
+ }
428
+ }
429
+
430
+ interface ObservableEventSourceInit extends EventSourceInit {
431
+ headers?: HeadersInit
432
+ }
433
+
434
+ type EventHandler<EventType extends Event> = (
435
+ this: EventSource,
436
+ event: EventType,
437
+ ) => any
438
+
439
+ const kRequest = Symbol('kRequest')
440
+ const kReconnectionTime = Symbol('kReconnectionTime')
441
+ const kLastEventId = Symbol('kLastEventId')
442
+ const kAbortController = Symbol('kAbortController')
443
+ const kOnOpen = Symbol('kOnOpen')
444
+ const kOnMessage = Symbol('kOnMessage')
445
+ const kOnAnyMessage = Symbol('kOnAnyMessage')
446
+ const kOnError = Symbol('kOnError')
447
+
448
+ class ObservableEventSource extends EventTarget implements EventSource {
449
+ static readonly CONNECTING = 0
450
+ static readonly OPEN = 1
451
+ static readonly CLOSED = 2
452
+
453
+ public readonly CONNECTING = ObservableEventSource.CONNECTING
454
+ public readonly OPEN = ObservableEventSource.OPEN
455
+ public readonly CLOSED = ObservableEventSource.CLOSED
456
+
457
+ public readyState: number
458
+ public url: string
459
+ public withCredentials: boolean
460
+
461
+ private [kRequest]: Request
462
+ private [kReconnectionTime]: number
463
+ private [kLastEventId]: string
464
+ private [kAbortController]: AbortController
465
+ private [kOnOpen]: EventHandler<Event> | null = null
466
+ private [kOnMessage]: EventHandler<MessageEvent> | null = null
467
+ private [kOnAnyMessage]: EventHandler<MessageEvent> | null = null
468
+ private [kOnError]: EventHandler<Event> | null = null
469
+
470
+ constructor(url: string | URL, init?: ObservableEventSourceInit) {
471
+ super()
472
+
473
+ this.url = new URL(url).href
474
+ this.withCredentials = init?.withCredentials ?? false
475
+
476
+ this.readyState = this.CONNECTING
477
+
478
+ // Support custom request init.
479
+ const headers = new Headers(init?.headers || {})
480
+ headers.append('accept', 'text/event-stream')
481
+
482
+ this[kAbortController] = new AbortController()
483
+ this[kReconnectionTime] = 2000
484
+ this[kLastEventId] = ''
485
+ this[kRequest] = new Request(this.url, {
486
+ method: 'GET',
487
+ headers,
488
+ credentials: this.withCredentials ? 'include' : 'omit',
489
+ signal: this[kAbortController].signal,
490
+ })
491
+
492
+ this.connect()
493
+ }
494
+
495
+ get onopen(): EventHandler<Event> | null {
496
+ return this[kOnOpen]
497
+ }
498
+
499
+ set onopen(handler: EventHandler<Event>) {
500
+ if (this[kOnOpen]) {
501
+ this.removeEventListener('open', this[kOnOpen])
502
+ }
503
+ this[kOnOpen] = handler.bind(this)
504
+ this.addEventListener('open', this[kOnOpen])
505
+ }
506
+
507
+ get onmessage(): EventHandler<MessageEvent> | null {
508
+ return this[kOnMessage]
509
+ }
510
+ set onmessage(handler: EventHandler<MessageEvent>) {
511
+ if (this[kOnMessage]) {
512
+ this.removeEventListener('message', { handleEvent: this[kOnMessage] })
513
+ }
514
+ this[kOnMessage] = handler.bind(this)
515
+ this.addEventListener('message', { handleEvent: this[kOnMessage] })
516
+ }
517
+
518
+ get onerror(): EventHandler<Event> | null {
519
+ return this[kOnError]
520
+ }
521
+ set oneerror(handler: EventHandler<Event>) {
522
+ if (this[kOnError]) {
523
+ this.removeEventListener('error', { handleEvent: this[kOnError] })
524
+ }
525
+ this[kOnError] = handler.bind(this)
526
+ this.addEventListener('error', { handleEvent: this[kOnError] })
527
+ }
528
+
529
+ public addEventListener<K extends keyof EventSourceEventMap>(
530
+ type: K,
531
+ listener: EventHandler<EventSourceEventMap[K]>,
532
+ options?: boolean | AddEventListenerOptions,
533
+ ): void
534
+ public addEventListener(
535
+ type: string,
536
+ listener: EventHandler<MessageEvent>,
537
+ options?: boolean | AddEventListenerOptions,
538
+ ): void
539
+ public addEventListener(
540
+ type: string,
541
+ listener: EventListenerOrEventListenerObject,
542
+ options?: boolean | AddEventListenerOptions,
543
+ ): void
544
+
545
+ public addEventListener(
546
+ type: string,
547
+ listener: EventHandler<MessageEvent> | EventListenerOrEventListenerObject,
548
+ options?: boolean | AddEventListenerOptions,
549
+ ): void {
550
+ super.addEventListener(
551
+ type,
552
+ listener as EventListenerOrEventListenerObject,
553
+ options,
554
+ )
555
+ }
556
+
557
+ public removeEventListener<K extends keyof EventSourceEventMap>(
558
+ type: K,
559
+ listener: (this: EventSource, ev: EventSourceEventMap[K]) => any,
560
+ options?: boolean | EventListenerOptions,
561
+ ): void
562
+ public removeEventListener(
563
+ type: string,
564
+ listener: (this: EventSource, event: MessageEvent) => any,
565
+ options?: boolean | EventListenerOptions,
566
+ ): void
567
+ public removeEventListener(
568
+ type: string,
569
+ listener: EventListenerOrEventListenerObject,
570
+ options?: boolean | EventListenerOptions,
571
+ ): void
572
+
573
+ public removeEventListener(
574
+ type: string,
575
+ listener: EventHandler<MessageEvent> | EventListenerOrEventListenerObject,
576
+ options?: boolean | AddEventListenerOptions,
577
+ ): void {
578
+ super.removeEventListener(
579
+ type,
580
+ listener as EventListenerOrEventListenerObject,
581
+ options,
582
+ )
583
+ }
584
+
585
+ public dispatchEvent(event: Event): boolean {
586
+ return super.dispatchEvent(event)
587
+ }
588
+
589
+ public close(): void {
590
+ this[kAbortController].abort()
591
+ this.readyState = this.CLOSED
592
+ }
593
+
594
+ private async connect() {
595
+ await fetch(this[kRequest])
596
+ .then((response) => {
597
+ this.processResponse(response)
598
+ })
599
+ .catch(() => {
600
+ // Fail the connection on request errors instead of
601
+ // throwing a generic "Failed to fetch" error.
602
+ this.failConnection()
603
+ })
604
+ }
605
+
606
+ private processResponse(response: Response): void {
607
+ if (!response.body) {
608
+ this.failConnection()
609
+ return
610
+ }
611
+
612
+ if (isNetworkError(response)) {
613
+ this.reestablishConnection()
614
+ return
615
+ }
616
+
617
+ if (
618
+ response.status !== 200 ||
619
+ response.headers.get('content-type') !== 'text/event-stream'
620
+ ) {
621
+ this.failConnection()
622
+ return
623
+ }
624
+
625
+ this.announceConnection()
626
+ this.interpretResponseBody(response)
627
+ }
628
+
629
+ private announceConnection(): void {
630
+ queueMicrotask(() => {
631
+ if (this.readyState !== this.CLOSED) {
632
+ this.readyState = this.OPEN
633
+ this.dispatchEvent(new Event('open'))
634
+ }
635
+ })
636
+ }
637
+
638
+ private interpretResponseBody(response: Response): void {
639
+ const parsingStream = new EventSourceParsingStream({
640
+ message: (message) => {
641
+ if (message.id) {
642
+ this[kLastEventId] = message.id
643
+ }
644
+
645
+ if (message.retry) {
646
+ this[kReconnectionTime] = message.retry
647
+ }
648
+
649
+ const messageEvent = new MessageEvent(
650
+ message.event ? message.event : 'message',
651
+ {
652
+ data: message.data,
653
+ origin: this[kRequest].url,
654
+ lastEventId: this[kLastEventId],
655
+ cancelable: true,
656
+ },
657
+ )
658
+
659
+ this[kOnAnyMessage]?.(messageEvent)
660
+ this.dispatchEvent(messageEvent)
661
+ },
662
+ abort: () => {
663
+ throw new Error('Stream abort is not implemented')
664
+ },
665
+ close: () => {
666
+ this.failConnection()
667
+ },
668
+ })
669
+
670
+ response
671
+ .body!.pipeTo(parsingStream)
672
+ .then(() => {
673
+ this.processResponseEndOfBody(response)
674
+ })
675
+ .catch(() => {
676
+ this.failConnection()
677
+ })
678
+ }
679
+
680
+ private processResponseEndOfBody(response: Response): void {
681
+ if (!isNetworkError(response)) {
682
+ this.reestablishConnection()
683
+ }
684
+ }
685
+
686
+ private async reestablishConnection(): Promise<void> {
687
+ queueMicrotask(() => {
688
+ if (this.readyState === this.CLOSED) {
689
+ return
690
+ }
691
+
692
+ this.readyState = this.CONNECTING
693
+ this.dispatchEvent(new Event('error'))
694
+ })
695
+
696
+ await delay(this[kReconnectionTime])
697
+
698
+ queueMicrotask(async () => {
699
+ if (this.readyState !== this.CONNECTING) {
700
+ return
701
+ }
702
+
703
+ if (this[kLastEventId] !== '') {
704
+ this[kRequest].headers.set('last-event-id', this[kLastEventId])
705
+ }
706
+
707
+ await this.connect()
708
+ })
709
+ }
710
+
711
+ private failConnection(): void {
712
+ queueMicrotask(() => {
713
+ if (this.readyState !== this.CLOSED) {
714
+ this.readyState = this.CLOSED
715
+ this.dispatchEvent(new Event('error'))
716
+ }
717
+ })
718
+ }
719
+ }
720
+
721
+ /**
722
+ * Checks if the given `Response` instance is a network error.
723
+ * @see https://fetch.spec.whatwg.org/#concept-network-error
724
+ */
725
+ function isNetworkError(response: Response): boolean {
726
+ return (
727
+ response.type === 'error' &&
728
+ response.status === 0 &&
729
+ response.statusText === '' &&
730
+ Array.from(response.headers.entries()).length === 0 &&
731
+ response.body === null
732
+ )
733
+ }
734
+
735
+ const enum ControlCharacters {
736
+ NewLine = 10,
737
+ CarriageReturn = 13,
738
+ Space = 32,
739
+ Colon = 58,
740
+ }
741
+
742
+ interface EventSourceMessage {
743
+ id?: string
744
+ event?: string
745
+ data?: string
746
+ retry?: number
747
+ }
748
+
749
+ class EventSourceParsingStream extends WritableStream {
750
+ private decoder: TextDecoder
751
+
752
+ private buffer?: Uint8Array
753
+ private position: number
754
+ private fieldLength?: number
755
+ private discardTrailingNewline = false
756
+
757
+ private message: EventSourceMessage = {
758
+ id: undefined,
759
+ event: undefined,
760
+ data: undefined,
761
+ retry: undefined,
762
+ }
763
+
764
+ constructor(
765
+ private underlyingSink: {
766
+ message: (message: EventSourceMessage) => void
767
+ abort?: (reason: any) => void
768
+ close?: () => void
769
+ },
770
+ ) {
771
+ super({
772
+ write: (chunk) => {
773
+ this.processResponseBodyChunk(chunk)
774
+ },
775
+ abort: (reason) => {
776
+ this.underlyingSink.abort?.(reason)
777
+ },
778
+ close: () => {
779
+ this.underlyingSink.close?.()
780
+ },
781
+ })
782
+
783
+ this.decoder = new TextDecoder()
784
+ this.position = 0
785
+ }
786
+
787
+ private resetMessage(): void {
788
+ this.message = {
789
+ id: undefined,
790
+ event: undefined,
791
+ data: undefined,
792
+ retry: undefined,
793
+ }
794
+ }
795
+
796
+ private processResponseBodyChunk(chunk: Uint8Array): void {
797
+ if (this.buffer == null) {
798
+ this.buffer = chunk
799
+ this.position = 0
800
+ this.fieldLength = -1
801
+ } else {
802
+ const nextBuffer = new Uint8Array(this.buffer.length + chunk.length)
803
+ nextBuffer.set(this.buffer)
804
+ nextBuffer.set(chunk, this.buffer.length)
805
+ this.buffer = nextBuffer
806
+ }
807
+
808
+ const bufferLength = this.buffer.length
809
+ let lineStart = 0
810
+
811
+ while (this.position < bufferLength) {
812
+ if (this.discardTrailingNewline) {
813
+ if (this.buffer[this.position] === ControlCharacters.NewLine) {
814
+ lineStart = ++this.position
815
+ }
816
+
817
+ this.discardTrailingNewline = false
818
+ }
819
+
820
+ let lineEnd = -1
821
+
822
+ for (; this.position < bufferLength && lineEnd === -1; ++this.position) {
823
+ switch (this.buffer[this.position]) {
824
+ case ControlCharacters.Colon: {
825
+ if (this.fieldLength === -1) {
826
+ this.fieldLength = this.position - lineStart
827
+ }
828
+ break
829
+ }
830
+
831
+ case ControlCharacters.CarriageReturn: {
832
+ this.discardTrailingNewline = true
833
+ break
834
+ }
835
+
836
+ case ControlCharacters.NewLine: {
837
+ lineEnd = this.position
838
+ break
839
+ }
840
+ }
841
+ }
842
+
843
+ if (lineEnd === -1) {
844
+ break
845
+ }
846
+
847
+ this.processLine(
848
+ this.buffer.subarray(lineStart, lineEnd),
849
+ this.fieldLength!,
850
+ )
851
+
852
+ lineStart = this.position
853
+ this.fieldLength = -1
854
+ }
855
+
856
+ if (lineStart === bufferLength) {
857
+ this.buffer = undefined
858
+ } else if (lineStart !== 0) {
859
+ this.buffer = this.buffer.subarray(lineStart)
860
+ this.position -= lineStart
861
+ }
862
+ }
863
+
864
+ private processLine(line: Uint8Array, fieldLength: number): void {
865
+ // New line indicates the end of the message. Dispatch it.
866
+ if (line.length === 0) {
867
+ // Prevent dispatching the message if the data is an empty string.
868
+ // That is a no-op per spec.
869
+ if (this.message.data === undefined) {
870
+ this.message.event = undefined
871
+ return
872
+ }
873
+
874
+ this.underlyingSink.message(this.message)
875
+ this.resetMessage()
876
+ return
877
+ }
878
+
879
+ // Otherwise, keep accumulating message fields until the new line.
880
+ if (fieldLength > 0) {
881
+ const field = this.decoder.decode(line.subarray(0, fieldLength))
882
+ const valueOffset =
883
+ fieldLength +
884
+ (line[fieldLength + 1] === ControlCharacters.Space ? 2 : 1)
885
+ const value = this.decoder.decode(line.subarray(valueOffset))
886
+
887
+ switch (field) {
888
+ case 'data': {
889
+ this.message.data = this.message.data
890
+ ? this.message.data + '\n' + value
891
+ : value
892
+ break
893
+ }
894
+
895
+ case 'event': {
896
+ this.message.event = value
897
+ break
898
+ }
899
+
900
+ case 'id': {
901
+ this.message.id = value
902
+ break
903
+ }
904
+
905
+ case 'retry': {
906
+ const retry = parseInt(value, 10)
907
+
908
+ if (!isNaN(retry)) {
909
+ this.message.retry = retry
910
+ }
911
+ break
912
+ }
913
+ }
914
+ }
915
+ }
916
+ }