msw 2.12.14 → 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 (266) 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/request/onUnhandledRequest.d.mts +2 -2
  143. package/lib/core/utils/request/onUnhandledRequest.d.ts +2 -2
  144. package/lib/core/utils/request/onUnhandledRequest.js.map +1 -1
  145. package/lib/core/utils/request/onUnhandledRequest.mjs.map +1 -1
  146. package/lib/core/ws/handleWebSocketEvent.d.mts +1 -1
  147. package/lib/core/ws/handleWebSocketEvent.d.ts +1 -1
  148. package/lib/core/ws/handleWebSocketEvent.js +1 -1
  149. package/lib/core/ws/handleWebSocketEvent.js.map +1 -1
  150. package/lib/core/ws/handleWebSocketEvent.mjs +1 -1
  151. package/lib/core/ws/handleWebSocketEvent.mjs.map +1 -1
  152. package/lib/core/ws/utils/attachWebSocketLogger.d.mts +1 -1
  153. package/lib/core/ws/utils/attachWebSocketLogger.d.ts +1 -1
  154. package/lib/core/ws/utils/attachWebSocketLogger.js +39 -10
  155. package/lib/core/ws/utils/attachWebSocketLogger.js.map +1 -1
  156. package/lib/core/ws/utils/attachWebSocketLogger.mjs +39 -10
  157. package/lib/core/ws/utils/attachWebSocketLogger.mjs.map +1 -1
  158. package/lib/core/ws.d.mts +3 -3
  159. package/lib/core/ws.d.ts +3 -3
  160. package/lib/core/ws.js.map +1 -1
  161. package/lib/core/ws.mjs.map +1 -1
  162. package/lib/iife/index.js +2021 -1432
  163. package/lib/iife/index.js.map +1 -1
  164. package/lib/mockServiceWorker.js +1 -1
  165. package/lib/native/index.d.mts +21 -29
  166. package/lib/native/index.d.ts +21 -29
  167. package/lib/native/index.js +48 -116
  168. package/lib/native/index.js.map +1 -1
  169. package/lib/native/index.mjs +51 -118
  170. package/lib/native/index.mjs.map +1 -1
  171. package/lib/node/index.d.mts +55 -33
  172. package/lib/node/index.d.ts +55 -33
  173. package/lib/node/index.js +152 -154
  174. package/lib/node/index.js.map +1 -1
  175. package/lib/node/index.mjs +156 -156
  176. package/lib/node/index.mjs.map +1 -1
  177. package/package.json +10 -2
  178. package/src/browser/{setupWorker/glossary.ts → glossary.ts} +16 -33
  179. package/src/browser/index.ts +2 -3
  180. package/src/browser/{setupWorker/setupWorker.node.test.ts → setup-worker.node.test.ts} +2 -4
  181. package/src/browser/setup-worker.ts +148 -0
  182. package/src/browser/sources/fallback-http-source.ts +56 -0
  183. package/src/browser/sources/service-worker-source.ts +455 -0
  184. package/src/browser/tsconfig.browser.json +7 -2
  185. package/src/browser/utils/deserializeRequest.ts +1 -1
  186. package/src/browser/{setupWorker/start/utils/getWorkerByRegistration.ts → utils/get-worker-by-registration.ts} +3 -1
  187. package/src/browser/{setupWorker/start/utils/getWorkerInstance.ts → utils/get-worker-instance.ts} +4 -4
  188. package/src/browser/utils/pruneGetRequestBody.test.ts +1 -3
  189. package/src/browser/utils/pruneGetRequestBody.ts +1 -1
  190. package/src/browser/utils/validate-worker-scope.ts +19 -0
  191. package/src/browser/utils/workerChannel.ts +2 -2
  192. package/src/core/experimental/compat.ts +50 -0
  193. package/src/core/experimental/define-network.test.ts +124 -0
  194. package/src/core/experimental/define-network.ts +215 -0
  195. package/src/core/experimental/frames/http-frame.test.ts +360 -0
  196. package/src/core/experimental/frames/http-frame.ts +271 -0
  197. package/src/core/experimental/frames/network-frame.ts +64 -0
  198. package/src/core/experimental/frames/websocket-frame.test.ts +280 -0
  199. package/src/core/experimental/frames/websocket-frame.ts +188 -0
  200. package/src/core/experimental/handlers-controller.test.ts +198 -0
  201. package/src/core/experimental/handlers-controller.ts +145 -0
  202. package/src/core/experimental/index.ts +16 -0
  203. package/src/core/experimental/on-unhandled-frame.test.ts +360 -0
  204. package/src/core/experimental/on-unhandled-frame.ts +110 -0
  205. package/src/core/experimental/request-utils.test.ts +70 -0
  206. package/src/core/experimental/request-utils.ts +39 -0
  207. package/src/core/experimental/setup-api.ts +59 -0
  208. package/src/core/experimental/sources/interceptor-source.ts +185 -0
  209. package/src/core/experimental/sources/network-source.test.ts +74 -0
  210. package/src/core/experimental/sources/network-source.ts +56 -0
  211. package/src/core/handlers/RequestHandler.ts +9 -10
  212. package/src/core/handlers/WebSocketHandler.ts +27 -11
  213. package/src/core/index.ts +3 -7
  214. package/src/core/sharedOptions.ts +9 -4
  215. package/src/core/sse.ts +1 -1
  216. package/src/core/utils/cookieStore.ts +2 -1
  217. package/src/core/utils/internal/isHandlerKind.test.ts +20 -22
  218. package/src/core/utils/internal/isHandlerKind.ts +5 -9
  219. package/src/core/utils/request/onUnhandledRequest.ts +2 -2
  220. package/src/core/ws/WebSocketClientManager.test.ts +2 -10
  221. package/src/core/ws/handleWebSocketEvent.ts +5 -1
  222. package/src/core/ws/utils/attachWebSocketLogger.ts +43 -11
  223. package/src/core/ws.test.ts +1 -3
  224. package/src/core/ws.ts +6 -6
  225. package/src/iife/index.ts +1 -1
  226. package/src/native/index.ts +34 -11
  227. package/src/node/async-handlers-controller.test.ts +50 -0
  228. package/src/node/async-handlers-controller.ts +69 -0
  229. package/src/node/glossary.ts +19 -18
  230. package/src/node/index.ts +6 -2
  231. package/src/node/setup-server-common.ts +100 -0
  232. package/src/node/setup-server.ts +91 -0
  233. package/src/tsconfig.core.json +8 -0
  234. package/src/tsconfig.node.json +8 -3
  235. package/src/tsconfig.src.json +0 -2
  236. package/src/tsconfig.worker.json +2 -1
  237. package/lib/core/SetupApi.d.mts +0 -44
  238. package/lib/core/SetupApi.d.ts +0 -44
  239. package/lib/core/SetupApi.js +0 -112
  240. package/lib/core/SetupApi.js.map +0 -1
  241. package/lib/core/SetupApi.mjs +0 -92
  242. package/lib/core/SetupApi.mjs.map +0 -1
  243. package/lib/core/handlers/common.d.mts +0 -3
  244. package/lib/core/handlers/common.d.ts +0 -3
  245. package/lib/core/handlers/common.js.map +0 -1
  246. package/lib/core/handlers/common.mjs +0 -1
  247. package/lib/core/handlers/common.mjs.map +0 -1
  248. package/src/browser/setupWorker/setupWorker.ts +0 -184
  249. package/src/browser/setupWorker/start/createFallbackRequestListener.ts +0 -71
  250. package/src/browser/setupWorker/start/createRequestListener.ts +0 -138
  251. package/src/browser/setupWorker/start/createResponseListener.ts +0 -57
  252. package/src/browser/setupWorker/start/createStartHandler.ts +0 -137
  253. package/src/browser/setupWorker/start/utils/enableMocking.ts +0 -30
  254. package/src/browser/setupWorker/start/utils/prepareStartHandler.test.ts +0 -59
  255. package/src/browser/setupWorker/start/utils/prepareStartHandler.ts +0 -44
  256. package/src/browser/setupWorker/start/utils/printStartMessage.test.ts +0 -84
  257. package/src/browser/setupWorker/start/utils/printStartMessage.ts +0 -51
  258. package/src/browser/setupWorker/start/utils/validateWorkerScope.ts +0 -18
  259. package/src/browser/setupWorker/stop/utils/printStopMessage.test.ts +0 -26
  260. package/src/browser/setupWorker/stop/utils/printStopMessage.ts +0 -13
  261. package/src/browser/utils/checkWorkerIntegrity.ts +0 -42
  262. package/src/core/SetupApi.ts +0 -127
  263. package/src/core/handlers/common.ts +0 -1
  264. package/src/node/SetupServerApi.ts +0 -87
  265. package/src/node/SetupServerCommonApi.ts +0 -169
  266. 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
  }
@@ -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
+ }
@@ -1,54 +1,53 @@
1
1
  import type { PartialDeep } from 'type-fest'
2
- import type { RequestHandler } from '~/core/handlers/RequestHandler'
3
- import type { WebSocketHandler } from '~/core/handlers/WebSocketHandler'
4
- import type {
5
- LifeCycleEventEmitter,
6
- LifeCycleEventsMap,
7
- SharedOptions,
8
- } from '~/core/sharedOptions'
2
+ import type { HttpNetworkFrameEventMap } from '#core/experimental/frames/http-frame'
3
+ import type { WebSocketNetworkFrameEventMap } from '#core/experimental/frames/websocket-frame'
4
+ import type { AnyHandler } from '#core/experimental/handlers-controller'
5
+ import type { LifeCycleEventEmitter, SharedOptions } from '#core/sharedOptions'
6
+
7
+ export interface ListenOptions extends SharedOptions {}
9
8
 
10
9
  export interface SetupServerCommon {
11
10
  /**
12
- * Starts requests interception based on the previously provided request handlers.
11
+ * Starts the request interception based on the previously provided request handlers.
13
12
  *
14
13
  * @see {@link https://mswjs.io/docs/api/setup-server/listen `server.listen()` API reference}
15
14
  */
16
- listen(options?: PartialDeep<SharedOptions>): void
15
+ listen: (options?: PartialDeep<ListenOptions>) => void
17
16
 
18
17
  /**
19
- * Stops requests interception by restoring all augmented modules.
18
+ * Stops the request interception by restoring all augmented modules.
20
19
  *
21
20
  * @see {@link https://mswjs.io/docs/api/setup-server/close `server.close()` API reference}
22
21
  */
23
- close(): void
22
+ close: () => void
24
23
 
25
24
  /**
26
25
  * Prepends given request handlers to the list of existing handlers.
27
26
  *
28
27
  * @see {@link https://mswjs.io/docs/api/setup-server/use `server.use()` API reference}
29
28
  */
30
- use(...handlers: Array<RequestHandler | WebSocketHandler>): void
29
+ use: (...handlers: Array<AnyHandler>) => void
31
30
 
32
31
  /**
33
32
  * Marks all request handlers that respond using `res.once()` as unused.
34
33
  *
35
34
  * @see {@link https://mswjs.io/docs/api/setup-server/restore-handlers `server.restore-handlers()` API reference}
36
35
  */
37
- restoreHandlers(): void
36
+ restoreHandlers: () => void
38
37
 
39
38
  /**
40
39
  * Resets request handlers to the initial list given to the `setupServer` call, or to the explicit next request handlers list, if given.
41
40
  *
42
41
  * @see {@link https://mswjs.io/docs/api/setup-server/reset-handlers `server.reset-handlers()` API reference}
43
42
  */
44
- resetHandlers(...nextHandlers: Array<RequestHandler | WebSocketHandler>): void
43
+ resetHandlers: (...nextHandlers: Array<AnyHandler>) => void
45
44
 
46
45
  /**
47
46
  * Returns a readonly list of currently active request handlers.
48
47
  *
49
48
  * @see {@link https://mswjs.io/docs/api/setup-server/list-handlers `server.listHandlers()` API reference}
50
49
  */
51
- listHandlers(): ReadonlyArray<RequestHandler | WebSocketHandler>
50
+ listHandlers: () => ReadonlyArray<AnyHandler>
52
51
 
53
52
  /**
54
53
  * Life-cycle events.
@@ -56,7 +55,9 @@ export interface SetupServerCommon {
56
55
  *
57
56
  * @see {@link https://mswjs.io/docs/api/life-cycle-events Life-cycle Events API reference}
58
57
  */
59
- events: LifeCycleEventEmitter<LifeCycleEventsMap>
58
+ events: LifeCycleEventEmitter<
59
+ HttpNetworkFrameEventMap | WebSocketNetworkFrameEventMap
60
+ >
60
61
  }
61
62
 
62
63
  export interface SetupServer extends SetupServerCommon {
@@ -68,7 +69,7 @@ export interface SetupServer extends SetupServerCommon {
68
69
  *
69
70
  * @see {@link https://mswjs.io/docs/api/setup-server/boundary `server.boundary()` API reference}
70
71
  */
71
- boundary<Args extends Array<any>, R>(
72
+ boundary: <Args extends Array<any>, R>(
72
73
  callback: (...args: Args) => R,
73
- ): (...args: Args) => R
74
+ ) => (...args: Args) => R
74
75
  }
package/src/node/index.ts CHANGED
@@ -1,3 +1,7 @@
1
1
  export type { SetupServer } from './glossary'
2
- export { SetupServerApi } from './SetupServerApi'
3
- export { setupServer } from './setupServer'
2
+ export {
3
+ setupServer,
4
+ SetupServerApi,
5
+ defaultNetworkOptions,
6
+ } from './setup-server'
7
+ export { SetupServerCommonApi } from './setup-server-common'