msw 2.12.13 → 2.13.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 (272) hide show
  1. package/lib/browser/index.d.mts +29 -19
  2. package/lib/browser/index.d.ts +29 -19
  3. package/lib/browser/index.js +1763 -1321
  4. package/lib/browser/index.js.map +1 -1
  5. package/lib/browser/index.mjs +1769 -1321
  6. package/lib/browser/index.mjs.map +1 -1
  7. package/lib/core/{HttpResponse-Dj6ibgFJ.d.ts → HttpResponse-CksOMVAa.d.ts} +5 -5
  8. package/lib/core/{HttpResponse-Be4eT3x6.d.mts → HttpResponse-DlRR1D-f.d.mts} +5 -5
  9. package/lib/core/HttpResponse.d.mts +1 -1
  10. package/lib/core/HttpResponse.d.ts +1 -1
  11. package/lib/core/experimental/compat.d.mts +17 -0
  12. package/lib/core/experimental/compat.d.ts +17 -0
  13. package/lib/core/experimental/compat.js +54 -0
  14. package/lib/core/experimental/compat.js.map +1 -0
  15. package/lib/core/experimental/compat.mjs +36 -0
  16. package/lib/core/experimental/compat.mjs.map +1 -0
  17. package/lib/core/experimental/define-network.d.mts +75 -0
  18. package/lib/core/experimental/define-network.d.ts +75 -0
  19. package/lib/core/experimental/define-network.js +124 -0
  20. package/lib/core/experimental/define-network.js.map +1 -0
  21. package/lib/core/experimental/define-network.mjs +107 -0
  22. package/lib/core/experimental/define-network.mjs.map +1 -0
  23. package/lib/core/experimental/frames/http-frame.d.mts +77 -0
  24. package/lib/core/experimental/frames/http-frame.d.ts +77 -0
  25. package/lib/core/experimental/frames/http-frame.js +194 -0
  26. package/lib/core/experimental/frames/http-frame.js.map +1 -0
  27. package/lib/core/experimental/frames/http-frame.mjs +176 -0
  28. package/lib/core/experimental/frames/http-frame.mjs.map +1 -0
  29. package/lib/core/experimental/frames/network-frame.d.mts +12 -0
  30. package/lib/core/experimental/frames/network-frame.d.ts +12 -0
  31. package/lib/core/{handlers/common.js → experimental/frames/network-frame.js} +19 -3
  32. package/lib/core/experimental/frames/network-frame.js.map +1 -0
  33. package/lib/core/experimental/frames/network-frame.mjs +13 -0
  34. package/lib/core/experimental/frames/network-frame.mjs.map +1 -0
  35. package/lib/core/experimental/frames/websocket-frame.d.mts +55 -0
  36. package/lib/core/experimental/frames/websocket-frame.d.ts +55 -0
  37. package/lib/core/experimental/frames/websocket-frame.js +129 -0
  38. package/lib/core/experimental/frames/websocket-frame.js.map +1 -0
  39. package/lib/core/experimental/frames/websocket-frame.mjs +116 -0
  40. package/lib/core/experimental/frames/websocket-frame.mjs.map +1 -0
  41. package/lib/core/experimental/handlers-controller.d.mts +35 -0
  42. package/lib/core/experimental/handlers-controller.d.ts +35 -0
  43. package/lib/core/experimental/handlers-controller.js +121 -0
  44. package/lib/core/experimental/handlers-controller.js.map +1 -0
  45. package/lib/core/experimental/handlers-controller.mjs +101 -0
  46. package/lib/core/experimental/handlers-controller.mjs.map +1 -0
  47. package/lib/core/experimental/index.d.mts +17 -0
  48. package/lib/core/experimental/index.d.ts +17 -0
  49. package/lib/core/experimental/index.js +36 -0
  50. package/lib/core/experimental/index.js.map +1 -0
  51. package/lib/core/experimental/index.mjs +20 -0
  52. package/lib/core/experimental/index.mjs.map +1 -0
  53. package/lib/core/experimental/on-unhandled-frame.d.mts +12 -0
  54. package/lib/core/experimental/on-unhandled-frame.d.ts +12 -0
  55. package/lib/core/experimental/on-unhandled-frame.js +90 -0
  56. package/lib/core/experimental/on-unhandled-frame.js.map +1 -0
  57. package/lib/core/experimental/on-unhandled-frame.mjs +70 -0
  58. package/lib/core/experimental/on-unhandled-frame.mjs.map +1 -0
  59. package/lib/core/experimental/request-utils.d.mts +12 -0
  60. package/lib/core/experimental/request-utils.d.ts +12 -0
  61. package/lib/core/experimental/request-utils.js +50 -0
  62. package/lib/core/experimental/request-utils.js.map +1 -0
  63. package/lib/core/experimental/request-utils.mjs +30 -0
  64. package/lib/core/experimental/request-utils.mjs.map +1 -0
  65. package/lib/core/experimental/setup-api.d.mts +33 -0
  66. package/lib/core/experimental/setup-api.d.ts +33 -0
  67. package/lib/core/experimental/setup-api.js +61 -0
  68. package/lib/core/experimental/setup-api.js.map +1 -0
  69. package/lib/core/experimental/setup-api.mjs +43 -0
  70. package/lib/core/experimental/setup-api.mjs.map +1 -0
  71. package/lib/core/experimental/sources/interceptor-source.d.mts +28 -0
  72. package/lib/core/experimental/sources/interceptor-source.d.ts +28 -0
  73. package/lib/core/experimental/sources/interceptor-source.js +142 -0
  74. package/lib/core/experimental/sources/interceptor-source.js.map +1 -0
  75. package/lib/core/experimental/sources/interceptor-source.mjs +124 -0
  76. package/lib/core/experimental/sources/interceptor-source.mjs.map +1 -0
  77. package/lib/core/experimental/sources/network-source.d.mts +31 -0
  78. package/lib/core/experimental/sources/network-source.d.ts +31 -0
  79. package/lib/core/experimental/sources/network-source.js +50 -0
  80. package/lib/core/experimental/sources/network-source.js.map +1 -0
  81. package/lib/core/experimental/sources/network-source.mjs +30 -0
  82. package/lib/core/experimental/sources/network-source.mjs.map +1 -0
  83. package/lib/core/getResponse.d.mts +1 -1
  84. package/lib/core/getResponse.d.ts +1 -1
  85. package/lib/core/graphql.d.mts +1 -1
  86. package/lib/core/graphql.d.ts +1 -1
  87. package/lib/core/handlers/GraphQLHandler.d.mts +1 -1
  88. package/lib/core/handlers/GraphQLHandler.d.ts +1 -1
  89. package/lib/core/handlers/HttpHandler.d.mts +1 -1
  90. package/lib/core/handlers/HttpHandler.d.ts +1 -1
  91. package/lib/core/handlers/RequestHandler.d.mts +1 -1
  92. package/lib/core/handlers/RequestHandler.d.ts +1 -1
  93. package/lib/core/handlers/RequestHandler.js +5 -6
  94. package/lib/core/handlers/RequestHandler.js.map +1 -1
  95. package/lib/core/handlers/RequestHandler.mjs +5 -6
  96. package/lib/core/handlers/RequestHandler.mjs.map +1 -1
  97. package/lib/core/handlers/WebSocketHandler.d.mts +8 -4
  98. package/lib/core/handlers/WebSocketHandler.d.ts +8 -4
  99. package/lib/core/handlers/WebSocketHandler.js +18 -5
  100. package/lib/core/handlers/WebSocketHandler.js.map +1 -1
  101. package/lib/core/handlers/WebSocketHandler.mjs +18 -5
  102. package/lib/core/handlers/WebSocketHandler.mjs.map +1 -1
  103. package/lib/core/http.d.mts +1 -1
  104. package/lib/core/http.d.ts +1 -1
  105. package/lib/core/index.d.mts +7 -12
  106. package/lib/core/index.d.ts +7 -12
  107. package/lib/core/index.js +2 -2
  108. package/lib/core/index.js.map +1 -1
  109. package/lib/core/index.mjs +1 -1
  110. package/lib/core/index.mjs.map +1 -1
  111. package/lib/core/network-frame-B7A0ggXE.d.mts +56 -0
  112. package/lib/core/network-frame-usYiHS0K.d.ts +56 -0
  113. package/lib/core/passthrough.d.mts +1 -1
  114. package/lib/core/passthrough.d.ts +1 -1
  115. package/lib/core/sharedOptions.d.mts +6 -2
  116. package/lib/core/sharedOptions.d.ts +6 -2
  117. package/lib/core/sharedOptions.js.map +1 -1
  118. package/lib/core/sse.d.mts +1 -1
  119. package/lib/core/sse.d.ts +1 -1
  120. package/lib/core/sse.js.map +1 -1
  121. package/lib/core/sse.mjs.map +1 -1
  122. package/lib/core/utils/HttpResponse/decorators.d.mts +1 -1
  123. package/lib/core/utils/HttpResponse/decorators.d.ts +1 -1
  124. package/lib/core/utils/cookieStore.js.map +1 -1
  125. package/lib/core/utils/cookieStore.mjs.map +1 -1
  126. package/lib/core/utils/executeHandlers.d.mts +1 -1
  127. package/lib/core/utils/executeHandlers.d.ts +1 -1
  128. package/lib/core/utils/handleRequest.d.mts +2 -1
  129. package/lib/core/utils/handleRequest.d.ts +2 -1
  130. package/lib/core/utils/internal/isHandlerKind.d.mts +3 -3
  131. package/lib/core/utils/internal/isHandlerKind.d.ts +3 -3
  132. package/lib/core/utils/internal/isHandlerKind.js +2 -1
  133. package/lib/core/utils/internal/isHandlerKind.js.map +1 -1
  134. package/lib/core/utils/internal/isHandlerKind.mjs +2 -1
  135. package/lib/core/utils/internal/isHandlerKind.mjs.map +1 -1
  136. package/lib/core/utils/internal/parseGraphQLRequest.d.mts +1 -1
  137. package/lib/core/utils/internal/parseGraphQLRequest.d.ts +1 -1
  138. package/lib/core/utils/internal/parseMultipartData.d.mts +1 -1
  139. package/lib/core/utils/internal/parseMultipartData.d.ts +1 -1
  140. package/lib/core/utils/internal/requestHandlerUtils.d.mts +1 -1
  141. package/lib/core/utils/internal/requestHandlerUtils.d.ts +1 -1
  142. package/lib/core/utils/matching/matchRequestUrl.js +1 -1
  143. package/lib/core/utils/matching/matchRequestUrl.js.map +1 -1
  144. package/lib/core/utils/matching/matchRequestUrl.mjs +1 -1
  145. package/lib/core/utils/matching/matchRequestUrl.mjs.map +1 -1
  146. package/lib/core/utils/request/onUnhandledRequest.d.mts +2 -2
  147. package/lib/core/utils/request/onUnhandledRequest.d.ts +2 -2
  148. package/lib/core/utils/request/onUnhandledRequest.js.map +1 -1
  149. package/lib/core/utils/request/onUnhandledRequest.mjs.map +1 -1
  150. package/lib/core/ws/handleWebSocketEvent.d.mts +1 -1
  151. package/lib/core/ws/handleWebSocketEvent.d.ts +1 -1
  152. package/lib/core/ws/handleWebSocketEvent.js +1 -1
  153. package/lib/core/ws/handleWebSocketEvent.js.map +1 -1
  154. package/lib/core/ws/handleWebSocketEvent.mjs +1 -1
  155. package/lib/core/ws/handleWebSocketEvent.mjs.map +1 -1
  156. package/lib/core/ws/utils/attachWebSocketLogger.d.mts +1 -1
  157. package/lib/core/ws/utils/attachWebSocketLogger.d.ts +1 -1
  158. package/lib/core/ws/utils/attachWebSocketLogger.js +39 -10
  159. package/lib/core/ws/utils/attachWebSocketLogger.js.map +1 -1
  160. package/lib/core/ws/utils/attachWebSocketLogger.mjs +39 -10
  161. package/lib/core/ws/utils/attachWebSocketLogger.mjs.map +1 -1
  162. package/lib/core/ws.d.mts +3 -3
  163. package/lib/core/ws.d.ts +3 -3
  164. package/lib/core/ws.js.map +1 -1
  165. package/lib/core/ws.mjs.map +1 -1
  166. package/lib/iife/index.js +2022 -1433
  167. package/lib/iife/index.js.map +1 -1
  168. package/lib/mockServiceWorker.js +1 -1
  169. package/lib/native/index.d.mts +21 -29
  170. package/lib/native/index.d.ts +21 -29
  171. package/lib/native/index.js +48 -116
  172. package/lib/native/index.js.map +1 -1
  173. package/lib/native/index.mjs +51 -118
  174. package/lib/native/index.mjs.map +1 -1
  175. package/lib/node/index.d.mts +55 -33
  176. package/lib/node/index.d.ts +55 -33
  177. package/lib/node/index.js +152 -154
  178. package/lib/node/index.js.map +1 -1
  179. package/lib/node/index.mjs +156 -156
  180. package/lib/node/index.mjs.map +1 -1
  181. package/package.json +10 -2
  182. package/src/browser/{setupWorker/glossary.ts → glossary.ts} +16 -33
  183. package/src/browser/index.ts +2 -3
  184. package/src/browser/{setupWorker/setupWorker.node.test.ts → setup-worker.node.test.ts} +2 -4
  185. package/src/browser/setup-worker.ts +148 -0
  186. package/src/browser/sources/fallback-http-source.ts +56 -0
  187. package/src/browser/sources/service-worker-source.ts +455 -0
  188. package/src/browser/tsconfig.browser.json +7 -2
  189. package/src/browser/utils/deserializeRequest.ts +1 -1
  190. package/src/browser/{setupWorker/start/utils/getWorkerByRegistration.ts → utils/get-worker-by-registration.ts} +3 -1
  191. package/src/browser/{setupWorker/start/utils/getWorkerInstance.ts → utils/get-worker-instance.ts} +4 -4
  192. package/src/browser/utils/pruneGetRequestBody.test.ts +1 -3
  193. package/src/browser/utils/pruneGetRequestBody.ts +1 -1
  194. package/src/browser/utils/validate-worker-scope.ts +19 -0
  195. package/src/browser/utils/workerChannel.ts +2 -2
  196. package/src/core/experimental/compat.ts +50 -0
  197. package/src/core/experimental/define-network.test.ts +124 -0
  198. package/src/core/experimental/define-network.ts +215 -0
  199. package/src/core/experimental/frames/http-frame.test.ts +360 -0
  200. package/src/core/experimental/frames/http-frame.ts +271 -0
  201. package/src/core/experimental/frames/network-frame.ts +64 -0
  202. package/src/core/experimental/frames/websocket-frame.test.ts +280 -0
  203. package/src/core/experimental/frames/websocket-frame.ts +188 -0
  204. package/src/core/experimental/handlers-controller.test.ts +198 -0
  205. package/src/core/experimental/handlers-controller.ts +145 -0
  206. package/src/core/experimental/index.ts +16 -0
  207. package/src/core/experimental/on-unhandled-frame.test.ts +360 -0
  208. package/src/core/experimental/on-unhandled-frame.ts +110 -0
  209. package/src/core/experimental/request-utils.test.ts +70 -0
  210. package/src/core/experimental/request-utils.ts +39 -0
  211. package/src/core/experimental/setup-api.ts +59 -0
  212. package/src/core/experimental/sources/interceptor-source.ts +185 -0
  213. package/src/core/experimental/sources/network-source.test.ts +74 -0
  214. package/src/core/experimental/sources/network-source.ts +56 -0
  215. package/src/core/handlers/RequestHandler.ts +9 -10
  216. package/src/core/handlers/WebSocketHandler.ts +27 -11
  217. package/src/core/index.ts +3 -7
  218. package/src/core/sharedOptions.ts +9 -4
  219. package/src/core/sse.ts +1 -1
  220. package/src/core/utils/cookieStore.ts +2 -1
  221. package/src/core/utils/internal/isHandlerKind.test.ts +20 -22
  222. package/src/core/utils/internal/isHandlerKind.ts +5 -9
  223. package/src/core/utils/matching/matchRequestUrl.test.ts +87 -3
  224. package/src/core/utils/matching/matchRequestUrl.ts +2 -2
  225. package/src/core/utils/request/onUnhandledRequest.ts +2 -2
  226. package/src/core/ws/WebSocketClientManager.test.ts +2 -10
  227. package/src/core/ws/handleWebSocketEvent.ts +5 -1
  228. package/src/core/ws/utils/attachWebSocketLogger.ts +43 -11
  229. package/src/core/ws.test.ts +1 -3
  230. package/src/core/ws.ts +6 -6
  231. package/src/iife/index.ts +1 -1
  232. package/src/native/index.ts +34 -11
  233. package/src/node/async-handlers-controller.test.ts +50 -0
  234. package/src/node/async-handlers-controller.ts +69 -0
  235. package/src/node/glossary.ts +19 -18
  236. package/src/node/index.ts +6 -2
  237. package/src/node/setup-server-common.ts +100 -0
  238. package/src/node/setup-server.ts +91 -0
  239. package/src/tsconfig.core.json +8 -0
  240. package/src/tsconfig.node.json +8 -3
  241. package/src/tsconfig.src.json +0 -2
  242. package/src/tsconfig.worker.json +2 -1
  243. package/lib/core/SetupApi.d.mts +0 -44
  244. package/lib/core/SetupApi.d.ts +0 -44
  245. package/lib/core/SetupApi.js +0 -112
  246. package/lib/core/SetupApi.js.map +0 -1
  247. package/lib/core/SetupApi.mjs +0 -92
  248. package/lib/core/SetupApi.mjs.map +0 -1
  249. package/lib/core/handlers/common.d.mts +0 -3
  250. package/lib/core/handlers/common.d.ts +0 -3
  251. package/lib/core/handlers/common.js.map +0 -1
  252. package/lib/core/handlers/common.mjs +0 -1
  253. package/lib/core/handlers/common.mjs.map +0 -1
  254. package/src/browser/setupWorker/setupWorker.ts +0 -184
  255. package/src/browser/setupWorker/start/createFallbackRequestListener.ts +0 -71
  256. package/src/browser/setupWorker/start/createRequestListener.ts +0 -138
  257. package/src/browser/setupWorker/start/createResponseListener.ts +0 -57
  258. package/src/browser/setupWorker/start/createStartHandler.ts +0 -137
  259. package/src/browser/setupWorker/start/utils/enableMocking.ts +0 -30
  260. package/src/browser/setupWorker/start/utils/prepareStartHandler.test.ts +0 -59
  261. package/src/browser/setupWorker/start/utils/prepareStartHandler.ts +0 -44
  262. package/src/browser/setupWorker/start/utils/printStartMessage.test.ts +0 -84
  263. package/src/browser/setupWorker/start/utils/printStartMessage.ts +0 -51
  264. package/src/browser/setupWorker/start/utils/validateWorkerScope.ts +0 -18
  265. package/src/browser/setupWorker/stop/utils/printStopMessage.test.ts +0 -26
  266. package/src/browser/setupWorker/stop/utils/printStopMessage.ts +0 -13
  267. package/src/browser/utils/checkWorkerIntegrity.ts +0 -42
  268. package/src/core/SetupApi.ts +0 -127
  269. package/src/core/handlers/common.ts +0 -1
  270. package/src/node/SetupServerApi.ts +0 -87
  271. package/src/node/SetupServerCommonApi.ts +0 -169
  272. package/src/node/setupServer.ts +0 -15
@@ -5,14 +5,12 @@ import { WebSocketHandler } from '../../handlers/WebSocketHandler'
5
5
  import { isHandlerKind } from './isHandlerKind'
6
6
 
7
7
  it('returns true if expected a request handler and given a request handler', () => {
8
- expect(
9
- isHandlerKind('RequestHandler')(new HttpHandler('*', '*', () => {})),
10
- ).toBe(true)
8
+ expect(isHandlerKind('request')(new HttpHandler('*', '*', () => {}))).toBe(
9
+ true,
10
+ )
11
11
 
12
12
  expect(
13
- isHandlerKind('RequestHandler')(
14
- new GraphQLHandler('all', '*', '*', () => {}),
15
- ),
13
+ isHandlerKind('request')(new GraphQLHandler('all', '*', '*', () => {})),
16
14
  ).toBe(true)
17
15
  })
18
16
 
@@ -25,24 +23,24 @@ it('returns true if expected a request handler and given a custom request handle
25
23
  log() {}
26
24
  }
27
25
 
28
- expect(isHandlerKind('RequestHandler')(new MyHandler())).toBe(true)
26
+ expect(isHandlerKind('request')(new MyHandler())).toBe(true)
29
27
  })
30
28
 
31
29
  it('returns false if expected a request handler but given event handler', () => {
32
- expect(isHandlerKind('RequestHandler')(new WebSocketHandler('*'))).toBe(false)
30
+ expect(isHandlerKind('request')(new WebSocketHandler('*'))).toBe(false)
33
31
  })
34
32
 
35
33
  it('returns false if expected a request handler but given arbitrary object', () => {
36
- expect(isHandlerKind('RequestHandler')(undefined)).toBe(false)
37
- expect(isHandlerKind('RequestHandler')(null)).toBe(false)
38
- expect(isHandlerKind('RequestHandler')({})).toBe(false)
39
- expect(isHandlerKind('RequestHandler')([])).toBe(false)
40
- expect(isHandlerKind('RequestHandler')(123)).toBe(false)
41
- expect(isHandlerKind('RequestHandler')('hello')).toBe(false)
34
+ expect(isHandlerKind('request')(undefined)).toBe(false)
35
+ expect(isHandlerKind('request')(null)).toBe(false)
36
+ expect(isHandlerKind('request')({})).toBe(false)
37
+ expect(isHandlerKind('request')([])).toBe(false)
38
+ expect(isHandlerKind('request')(123)).toBe(false)
39
+ expect(isHandlerKind('request')('hello')).toBe(false)
42
40
  })
43
41
 
44
42
  it('returns true if expected an event handler and given an event handler', () => {
45
- expect(isHandlerKind('EventHandler')(new WebSocketHandler('*'))).toBe(true)
43
+ expect(isHandlerKind('websocket')(new WebSocketHandler('*'))).toBe(true)
46
44
  })
47
45
 
48
46
  it('returns true if expected an event handler and given a custom event handler', () => {
@@ -51,14 +49,14 @@ it('returns true if expected an event handler and given a custom event handler',
51
49
  super('*')
52
50
  }
53
51
  }
54
- expect(isHandlerKind('EventHandler')(new MyEventHandler())).toBe(true)
52
+ expect(isHandlerKind('websocket')(new MyEventHandler())).toBe(true)
55
53
  })
56
54
 
57
55
  it('returns false if expected an event handler but given arbitrary object', () => {
58
- expect(isHandlerKind('EventHandler')(undefined)).toBe(false)
59
- expect(isHandlerKind('EventHandler')(null)).toBe(false)
60
- expect(isHandlerKind('EventHandler')({})).toBe(false)
61
- expect(isHandlerKind('EventHandler')([])).toBe(false)
62
- expect(isHandlerKind('EventHandler')(123)).toBe(false)
63
- expect(isHandlerKind('EventHandler')('hello')).toBe(false)
56
+ expect(isHandlerKind('websocket')(undefined)).toBe(false)
57
+ expect(isHandlerKind('websocket')(null)).toBe(false)
58
+ expect(isHandlerKind('websocket')({})).toBe(false)
59
+ expect(isHandlerKind('websocket')([])).toBe(false)
60
+ expect(isHandlerKind('websocket')(123)).toBe(false)
61
+ expect(isHandlerKind('websocket')('hello')).toBe(false)
64
62
  })
@@ -1,21 +1,17 @@
1
- import type { HandlerKind } from '../../handlers/common'
1
+ import type { AnyHandler } from '../../experimental/handlers-controller'
2
2
  import type { RequestHandler } from '../../handlers/RequestHandler'
3
3
  import type { WebSocketHandler } from '../../handlers/WebSocketHandler'
4
+ import { isObject } from './isObject'
4
5
 
5
6
  /**
6
7
  * A filter function that ensures that the provided argument
7
8
  * is a handler of the given kind. This helps differentiate
8
9
  * between different kinds of handlers, e.g. request and event handlers.
9
10
  */
10
- export function isHandlerKind<K extends HandlerKind>(kind: K) {
11
+ export function isHandlerKind<K extends AnyHandler['kind']>(kind: K) {
11
12
  return (
12
13
  input: unknown,
13
- ): input is K extends 'EventHandler' ? WebSocketHandler : RequestHandler => {
14
- return (
15
- input != null &&
16
- typeof input === 'object' &&
17
- '__kind' in input &&
18
- input.__kind === kind
19
- )
14
+ ): input is K extends 'websocket' ? WebSocketHandler : RequestHandler => {
15
+ return isObject(input) && 'kind' in input && input.kind === kind
20
16
  }
21
17
  }
@@ -1,6 +1,4 @@
1
- /**
2
- * @vitest-environment jsdom
3
- */
1
+ // @vitest-environment jsdom
4
2
  import { coercePath, matchRequestUrl } from './matchRequestUrl'
5
3
 
6
4
  describe('matchRequestUrl', () => {
@@ -87,6 +85,77 @@ describe('matchRequestUrl', () => {
87
85
  })
88
86
  })
89
87
 
88
+ test('returns true when matching URLs with wildcard ports', () => {
89
+ expect
90
+ .soft(
91
+ matchRequestUrl(new URL('http://localhost:3000'), 'http://localhost:*'),
92
+ )
93
+ .toEqual({
94
+ matches: true,
95
+ params: {
96
+ '0': '3000/',
97
+ },
98
+ })
99
+
100
+ expect
101
+ .soft(
102
+ matchRequestUrl(
103
+ new URL('http://localhost:3000'),
104
+ 'http://localhost:*/',
105
+ ),
106
+ )
107
+ .toEqual({
108
+ matches: true,
109
+ params: {
110
+ '0': '3000',
111
+ },
112
+ })
113
+ })
114
+
115
+ test('returns true when matching URLs with wildcard ports and pathnames', () => {
116
+ expect(
117
+ matchRequestUrl(
118
+ new URL('http://localhost:3000/resource'),
119
+ 'http://localhost:*/resource',
120
+ ),
121
+ ).toEqual({
122
+ matches: true,
123
+ params: {
124
+ '0': '3000',
125
+ },
126
+ })
127
+ })
128
+
129
+ test('matches wildcard ports with other wildcard parameters', () => {
130
+ expect(
131
+ matchRequestUrl(
132
+ new URL('http://subdomain.localhost:3000/user/settings'),
133
+ 'http://*.localhost:*/user/*',
134
+ ),
135
+ ).toEqual({
136
+ matches: true,
137
+ params: {
138
+ '0': 'subdomain',
139
+ '1': '3000',
140
+ '2': 'settings',
141
+ },
142
+ })
143
+ })
144
+
145
+ test('matches wildcard ports that also match a part of the pathname', () => {
146
+ expect(
147
+ matchRequestUrl(
148
+ new URL('http://localhost:3000/user/settings'),
149
+ 'http://localhost:*/settings',
150
+ ),
151
+ ).toEqual({
152
+ matches: true,
153
+ params: {
154
+ '0': '3000/user',
155
+ },
156
+ })
157
+ })
158
+
90
159
  test('returns true for matching WebSocket URL', () => {
91
160
  expect(
92
161
  matchRequestUrl(new URL('ws://test.mswjs.io'), 'ws://test.mswjs.io'),
@@ -130,6 +199,17 @@ describe('matchRequestUrl', () => {
130
199
  },
131
200
  })
132
201
  })
202
+
203
+ test('returns true for matching WebSocket URLs with wildcard ports', () => {
204
+ expect(
205
+ matchRequestUrl(new URL('ws://localhost:3000'), 'ws://localhost:*'),
206
+ ).toEqual({
207
+ matches: true,
208
+ params: {
209
+ '0': '3000/',
210
+ },
211
+ })
212
+ })
133
213
  })
134
214
 
135
215
  describe('coercePath', () => {
@@ -156,6 +236,10 @@ describe('coercePath', () => {
156
236
  expect(coercePath('https://example.com:8080/:5678')).toEqual(
157
237
  'https\\://example.com\\:8080/:5678',
158
238
  )
239
+ expect(coercePath('http://localhost:*')).toEqual(
240
+ 'http\\://localhost\\:(.*)',
241
+ )
242
+ expect(coercePath('ws://localhost:*')).toEqual('ws\\://localhost\\:(.*)')
159
243
  })
160
244
 
161
245
  test('replaces wildcard with an unnnamed capturing group', () => {
@@ -40,9 +40,9 @@ export function coercePath(path: string): string {
40
40
  )
41
41
  /**
42
42
  * Escape the port so that "path-to-regexp" can match
43
- * absolute URLs including port numbers.
43
+ * absolute URLs with numeric or wildcard ports.
44
44
  */
45
- .replace(/([^/])(:)(?=\d+)/, '$1\\$2')
45
+ .replace(/([^/])(:)(?=(?:\d+|\(\.\*\))(?=\/|$))/, '$1\\$2')
46
46
  /**
47
47
  * Escape the protocol so that "path-to-regexp" could match
48
48
  * absolute URL.
@@ -3,8 +3,8 @@ import { InternalError, devUtils } from '../internal/devUtils'
3
3
  import { isCommonAssetRequest } from '../../isCommonAssetRequest'
4
4
 
5
5
  export interface UnhandledRequestPrint {
6
- warning(): void
7
- error(): void
6
+ warning: () => void
7
+ error: () => void
8
8
  }
9
9
 
10
10
  export type UnhandledRequestCallback = (
@@ -1,14 +1,11 @@
1
1
  // @vitest-environment node-websocket
2
2
  import { setMaxListeners } from 'node:events'
3
- import {
4
- WebSocketClientConnection,
5
- WebSocketData,
6
- WebSocketTransport,
7
- } from '@mswjs/interceptors/WebSocket'
3
+ import { WebSocketClientConnection } from '@mswjs/interceptors/WebSocket'
8
4
  import {
9
5
  WebSocketClientManager,
10
6
  WebSocketBroadcastChannelMessage,
11
7
  } from './WebSocketClientManager'
8
+ import { TestWebSocketTransport } from '../../../test/support/ws-test-utils'
12
9
 
13
10
  const channel = new BroadcastChannel('test:channel')
14
11
 
@@ -23,11 +20,6 @@ vi.spyOn(channel, 'postMessage')
23
20
 
24
21
  const socket = new WebSocket('ws://localhost')
25
22
 
26
- class TestWebSocketTransport extends EventTarget implements WebSocketTransport {
27
- send(_data: WebSocketData): void {}
28
- close(_code?: number | undefined, _reason?: string | undefined): void {}
29
- }
30
-
31
23
  afterEach(() => {
32
24
  vi.resetAllMocks()
33
25
  })
@@ -17,7 +17,11 @@ interface HandleWebSocketEventOptions {
17
17
 
18
18
  export function handleWebSocketEvent(options: HandleWebSocketEventOptions) {
19
19
  webSocketInterceptor.on('connection', async (connection) => {
20
- const handlers = options.getHandlers().filter(isHandlerKind('EventHandler'))
20
+ /**
21
+ * @todo @fixme Reference the handlers controller here and use `.getHandlersByKind`.
22
+ * That one relies on the pre-grouped handlers map and will be more performant.
23
+ */
24
+ const handlers = options.getHandlers().filter(isHandlerKind('websocket'))
21
25
 
22
26
  // Ignore this connection if the user hasn't defined any handlers.
23
27
  if (handlers.length > 0) {
@@ -18,8 +18,9 @@ export const colors = {
18
18
 
19
19
  export function attachWebSocketLogger(
20
20
  connection: WebSocketConnectionData,
21
- ): void {
21
+ ): () => void {
22
22
  const { client, server } = connection
23
+ const controller = new AbortController()
23
24
 
24
25
  logConnectionOpen(client)
25
26
 
@@ -30,19 +31,32 @@ export function attachWebSocketLogger(
30
31
  * @todo Provide the reference to the exact event handler
31
32
  * that called this `client.send()`.
32
33
  */
33
- client.addEventListener('message', (event) => {
34
- logOutgoingClientMessage(event)
35
- })
34
+ client.addEventListener(
35
+ 'message',
36
+ (event) => {
37
+ logOutgoingClientMessage(event)
38
+ },
39
+ { signal: controller.signal },
40
+ )
36
41
 
37
- client.addEventListener('close', (event) => {
38
- logConnectionClose(event)
39
- })
42
+ client.addEventListener(
43
+ 'close',
44
+ (event) => {
45
+ logConnectionClose(event)
46
+ },
47
+ { signal: controller.signal },
48
+ )
40
49
 
41
50
  // Log client errors (connection closures due to errors).
42
- client.socket.addEventListener('error', (event) => {
43
- logClientError(event)
44
- })
51
+ client.socket.addEventListener(
52
+ 'error',
53
+ (event) => {
54
+ logClientError(event)
55
+ },
56
+ { signal: controller.signal },
57
+ )
45
58
 
59
+ const { send: originalClientSend } = client
46
60
  client.send = new Proxy(client.send, {
47
61
  apply(target, thisArg, args) {
48
62
  const [data] = args
@@ -75,11 +89,15 @@ export function attachWebSocketLogger(
75
89
  logIncomingServerMessage(event)
76
90
  })
77
91
  },
78
- { once: true },
92
+ {
93
+ once: true,
94
+ signal: controller.signal,
95
+ },
79
96
  )
80
97
 
81
98
  // Log outgoing client events initiated by the event handler.
82
99
  // The actual client never sent these but the handler did.
100
+ const { send: originalServerSend } = server
83
101
  server.send = new Proxy(server.send, {
84
102
  apply(target, thisArg, args) {
85
103
  const [data] = args
@@ -102,6 +120,20 @@ export function attachWebSocketLogger(
102
120
  return Reflect.apply(target, thisArg, args)
103
121
  },
104
122
  })
123
+
124
+ // Undo method proxies.
125
+ controller.signal.addEventListener(
126
+ 'abort',
127
+ () => {
128
+ client.send = originalClientSend
129
+ server.send = originalServerSend
130
+ },
131
+ { once: true },
132
+ )
133
+
134
+ return () => {
135
+ controller.abort()
136
+ }
105
137
  }
106
138
 
107
139
  /**
@@ -1,6 +1,4 @@
1
- /**
2
- * @vitest-environment node-websocket
3
- */
1
+ // @vitest-environment node-websocket
4
2
  import { ws } from './ws'
5
3
 
6
4
  it('exports the "link()" method', () => {
package/src/core/ws.ts CHANGED
@@ -9,7 +9,7 @@ import {
9
9
  type WebSocketHandlerEventMap,
10
10
  } from './handlers/WebSocketHandler'
11
11
  import { hasRefCounted } from './utils/internal/hasRefCounted'
12
- import { Path, isPath } from './utils/matching/matchRequestUrl'
12
+ import { type Path, isPath } from './utils/matching/matchRequestUrl'
13
13
  import { WebSocketClientManager } from './ws/WebSocketClientManager'
14
14
 
15
15
  const webSocketChannel = new BroadcastChannel('msw:websocket-client-manager')
@@ -42,10 +42,10 @@ export type WebSocketLink = {
42
42
  *
43
43
  * @see {@link https://mswjs.io/docs/api/ws#onevent-listener `on()` API reference}
44
44
  */
45
- addEventListener<EventType extends keyof WebSocketHandlerEventMap>(
45
+ addEventListener: <EventType extends keyof WebSocketHandlerEventMap>(
46
46
  event: EventType,
47
47
  listener: WebSocketEventListener<EventType>,
48
- ): WebSocketHandler
48
+ ) => WebSocketHandler
49
49
 
50
50
  /**
51
51
  * Broadcasts the given data to all WebSocket clients.
@@ -58,7 +58,7 @@ export type WebSocketLink = {
58
58
  *
59
59
  * @see {@link https://mswjs.io/docs/api/ws#broadcastdata `broadcast()` API reference}
60
60
  */
61
- broadcast(data: WebSocketData): void
61
+ broadcast: (data: WebSocketData) => void
62
62
 
63
63
  /**
64
64
  * Broadcasts the given data to all WebSocket clients
@@ -72,12 +72,12 @@ export type WebSocketLink = {
72
72
  *
73
73
  * @see {@link https://mswjs.io/docs/api/ws#broadcastexceptclients-data `broadcast()` API reference}
74
74
  */
75
- broadcastExcept(
75
+ broadcastExcept: (
76
76
  clients:
77
77
  | WebSocketClientConnectionProtocol
78
78
  | Array<WebSocketClientConnectionProtocol>,
79
79
  data: WebSocketData,
80
- ): void
80
+ ) => void
81
81
  }
82
82
 
83
83
  /**
package/src/iife/index.ts CHANGED
@@ -1,2 +1,2 @@
1
- export * from '~/core'
1
+ export * from '#core'
2
2
  export * from '../browser'
@@ -1,21 +1,44 @@
1
+ import type { Interceptor } from '@mswjs/interceptors'
1
2
  import { FetchInterceptor } from '@mswjs/interceptors/fetch'
2
3
  import { XMLHttpRequestInterceptor } from '@mswjs/interceptors/XMLHttpRequest'
3
- import type { RequestHandler } from '~/core/handlers/RequestHandler'
4
- import { SetupServerCommonApi } from '../node/SetupServerCommonApi'
4
+ import { type AnyHandler } from '#core/experimental/handlers-controller'
5
+ import {
6
+ defineNetwork,
7
+ DefineNetworkOptions,
8
+ } from '#core/experimental/define-network'
9
+ import { InterceptorSource } from '#core/experimental/sources/interceptor-source'
10
+ import { type SetupServerCommon } from '../node/glossary'
11
+ import { defineSetupServerApi } from '../node/setup-server-common'
12
+
13
+ const defaultInterceptors: Array<Interceptor<any>> = [
14
+ new FetchInterceptor(),
15
+ new XMLHttpRequestInterceptor(),
16
+ ]
17
+
18
+ export const defaultNetworkOptions: DefineNetworkOptions<[InterceptorSource]> =
19
+ {
20
+ sources: [
21
+ new InterceptorSource({
22
+ interceptors: defaultInterceptors,
23
+ }),
24
+ ],
25
+ onUnhandledFrame: 'warn',
26
+ context: {
27
+ quiet: true,
28
+ },
29
+ }
5
30
 
6
31
  /**
7
32
  * Sets up a requests interception in React Native with the given request handlers.
8
- * @param {RequestHandler[]} handlers List of request handlers.
33
+ * @param {Array<AnyHandler>} handlers List of request handlers.
9
34
  *
10
35
  * @see {@link https://mswjs.io/docs/api/setup-server `setupServer()` API reference}
11
36
  */
12
- export function setupServer(
13
- ...handlers: Array<RequestHandler>
14
- ): SetupServerCommonApi {
15
- // Provision request interception via patching the `XMLHttpRequest` class only
16
- // in React Native. There is no `http`/`https` modules in that environment.
17
- return new SetupServerCommonApi(
18
- [new FetchInterceptor(), new XMLHttpRequestInterceptor()],
37
+ export function setupServer(...handlers: Array<AnyHandler>): SetupServerCommon {
38
+ const network = defineNetwork({
39
+ ...defaultNetworkOptions,
19
40
  handlers,
20
- )
41
+ })
42
+
43
+ return defineSetupServerApi(network)
21
44
  }
@@ -0,0 +1,50 @@
1
+ import { http } from '../core/http'
2
+ import { AsyncHandlersController } from './async-handlers-controller'
3
+
4
+ it('respects initial handlers in the boundary', () => {
5
+ {
6
+ const controller = new AsyncHandlersController([])
7
+ controller.boundary(() => {
8
+ expect(controller.currentHandlers()).toEqual([])
9
+ })()
10
+ }
11
+
12
+ {
13
+ const initialHandlers = [http.get('/', () => {})]
14
+ const controller = new AsyncHandlersController(initialHandlers)
15
+ controller.boundary(() => {
16
+ expect(controller.currentHandlers()).toEqual(initialHandlers)
17
+ })()
18
+ }
19
+ })
20
+
21
+ it('provides boundary-specific overrides', () => {
22
+ const initialHandlers = [http.get('/one', () => {})]
23
+ const controller = new AsyncHandlersController(initialHandlers)
24
+
25
+ controller.boundary(() => {
26
+ const runtimeHandlers = [http.get('/two', () => {})]
27
+ controller.use(runtimeHandlers)
28
+ expect(controller.currentHandlers()).toEqual([
29
+ ...runtimeHandlers,
30
+ ...initialHandlers,
31
+ ])
32
+ })()
33
+
34
+ expect(controller.currentHandlers()).toEqual(initialHandlers)
35
+ })
36
+
37
+ it('resets the handlers in the boundary', () => {
38
+ const initialHandlers = [http.get('/one', () => {})]
39
+ const controller = new AsyncHandlersController(initialHandlers)
40
+
41
+ controller.boundary(() => {
42
+ const runtimeHandlers = [http.get('/two', () => {})]
43
+ controller.use(runtimeHandlers)
44
+ controller.reset([])
45
+
46
+ expect(controller.currentHandlers()).toEqual(initialHandlers)
47
+ })()
48
+
49
+ expect(controller.currentHandlers()).toEqual(initialHandlers)
50
+ })
@@ -0,0 +1,69 @@
1
+ import { AsyncLocalStorage } from 'node:async_hooks'
2
+ import {
3
+ type AnyHandler,
4
+ type HandlersMap,
5
+ HandlersController,
6
+ HandlersControllerState,
7
+ } from '#core/experimental/handlers-controller'
8
+
9
+ export interface AsyncHandlersControllerContext {
10
+ initialHandlers: HandlersMap
11
+ handlers: HandlersMap
12
+ }
13
+
14
+ export class AsyncHandlersController extends HandlersController {
15
+ #asyncContext: AsyncLocalStorage<AsyncHandlersControllerContext>
16
+ #fallbackContext: AsyncHandlersControllerContext
17
+
18
+ constructor(initialHandlers: Array<AnyHandler>) {
19
+ super()
20
+
21
+ const initialState = this.getInitialState(initialHandlers)
22
+
23
+ this.#asyncContext = new AsyncLocalStorage()
24
+ this.#fallbackContext = {
25
+ initialHandlers: initialState.initialHandlers,
26
+ handlers: initialState.handlers,
27
+ }
28
+ }
29
+
30
+ protected getState() {
31
+ const { initialHandlers, handlers } = this.#getContext()
32
+
33
+ return {
34
+ initialHandlers,
35
+ handlers,
36
+ }
37
+ }
38
+
39
+ protected setState(nextState: HandlersControllerState): void {
40
+ const context = this.#getContext()
41
+
42
+ if (nextState.initialHandlers) {
43
+ context.initialHandlers = nextState.initialHandlers
44
+ }
45
+
46
+ if (nextState.handlers) {
47
+ context.handlers = nextState.handlers
48
+ }
49
+ }
50
+
51
+ public boundary<Args extends Array<any>, R>(callback: (...args: Args) => R) {
52
+ return (...args: Args) => {
53
+ const initialHandlers = { ...this.getState().handlers }
54
+
55
+ return this.#asyncContext.run(
56
+ {
57
+ initialHandlers,
58
+ handlers: { ...initialHandlers },
59
+ },
60
+ callback,
61
+ ...args,
62
+ )
63
+ }
64
+ }
65
+
66
+ #getContext() {
67
+ return this.#asyncContext.getStore() || this.#fallbackContext
68
+ }
69
+ }