@heojeongbo/wirestage 0.0.0-stage → 0.1.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 (489) hide show
  1. package/LICENSE +21 -0
  2. package/LICENSES.md +21 -0
  3. package/README.md +150 -2
  4. package/dist/app/playwright/index.d.ts +3 -0
  5. package/dist/app/playwright/index.d.ts.map +1 -0
  6. package/dist/app/playwright/index.js +2 -0
  7. package/dist/app/playwright/index.js.map +1 -0
  8. package/dist/app/playwright/lib/fixture.d.ts +61 -0
  9. package/dist/app/playwright/lib/fixture.d.ts.map +1 -0
  10. package/dist/app/playwright/lib/fixture.js +110 -0
  11. package/dist/app/playwright/lib/fixture.js.map +1 -0
  12. package/dist/connect.d.ts +7 -0
  13. package/dist/connect.d.ts.map +1 -0
  14. package/dist/connect.js +7 -0
  15. package/dist/connect.js.map +1 -0
  16. package/dist/entities/frame/@x/plugin.d.ts +9 -0
  17. package/dist/entities/frame/@x/plugin.d.ts.map +1 -0
  18. package/dist/entities/frame/@x/plugin.js +2 -0
  19. package/dist/entities/frame/@x/plugin.js.map +1 -0
  20. package/dist/entities/frame/index.d.ts +6 -0
  21. package/dist/entities/frame/index.d.ts.map +1 -0
  22. package/dist/entities/frame/index.js +4 -0
  23. package/dist/entities/frame/index.js.map +1 -0
  24. package/dist/entities/frame/lib/filter.d.ts +8 -0
  25. package/dist/entities/frame/lib/filter.d.ts.map +1 -0
  26. package/dist/entities/frame/lib/filter.js +62 -0
  27. package/dist/entities/frame/lib/filter.js.map +1 -0
  28. package/dist/entities/frame/lib/payload.d.ts +8 -0
  29. package/dist/entities/frame/lib/payload.d.ts.map +1 -0
  30. package/dist/entities/frame/lib/payload.js +42 -0
  31. package/dist/entities/frame/lib/payload.js.map +1 -0
  32. package/dist/entities/frame/lib/snapshot.d.ts +15 -0
  33. package/dist/entities/frame/lib/snapshot.d.ts.map +1 -0
  34. package/dist/entities/frame/lib/snapshot.js +90 -0
  35. package/dist/entities/frame/lib/snapshot.js.map +1 -0
  36. package/dist/entities/frame/lib/timeline.d.ts +23 -0
  37. package/dist/entities/frame/lib/timeline.d.ts.map +1 -0
  38. package/dist/entities/frame/lib/timeline.js +122 -0
  39. package/dist/entities/frame/lib/timeline.js.map +1 -0
  40. package/dist/entities/frame/model/frame.d.ts +182 -0
  41. package/dist/entities/frame/model/frame.d.ts.map +1 -0
  42. package/dist/entities/frame/model/frame.js +2 -0
  43. package/dist/entities/frame/model/frame.js.map +1 -0
  44. package/dist/entities/plugin/index.d.ts +9 -0
  45. package/dist/entities/plugin/index.d.ts.map +1 -0
  46. package/dist/entities/plugin/index.js +3 -0
  47. package/dist/entities/plugin/index.js.map +1 -0
  48. package/dist/entities/plugin/lib/define-plugin.d.ts +8 -0
  49. package/dist/entities/plugin/lib/define-plugin.d.ts.map +1 -0
  50. package/dist/entities/plugin/lib/define-plugin.js +9 -0
  51. package/dist/entities/plugin/lib/define-plugin.js.map +1 -0
  52. package/dist/entities/plugin/lib/named.d.ts +10 -0
  53. package/dist/entities/plugin/lib/named.d.ts.map +1 -0
  54. package/dist/entities/plugin/lib/named.js +17 -0
  55. package/dist/entities/plugin/lib/named.js.map +1 -0
  56. package/dist/entities/plugin/model/attachment.d.ts +18 -0
  57. package/dist/entities/plugin/model/attachment.d.ts.map +1 -0
  58. package/dist/entities/plugin/model/attachment.js +2 -0
  59. package/dist/entities/plugin/model/attachment.js.map +1 -0
  60. package/dist/entities/plugin/model/http.d.ts +126 -0
  61. package/dist/entities/plugin/model/http.d.ts.map +1 -0
  62. package/dist/entities/plugin/model/http.js +2 -0
  63. package/dist/entities/plugin/model/http.js.map +1 -0
  64. package/dist/entities/plugin/model/page.d.ts +100 -0
  65. package/dist/entities/plugin/model/page.d.ts.map +1 -0
  66. package/dist/entities/plugin/model/page.js +2 -0
  67. package/dist/entities/plugin/model/page.js.map +1 -0
  68. package/dist/entities/plugin/model/plugin.d.ts +83 -0
  69. package/dist/entities/plugin/model/plugin.d.ts.map +1 -0
  70. package/dist/entities/plugin/model/plugin.js +2 -0
  71. package/dist/entities/plugin/model/plugin.js.map +1 -0
  72. package/dist/entities/plugin/model/socket.d.ts +102 -0
  73. package/dist/entities/plugin/model/socket.d.ts.map +1 -0
  74. package/dist/entities/plugin/model/socket.js +2 -0
  75. package/dist/entities/plugin/model/socket.js.map +1 -0
  76. package/dist/entities/plugin/model/stream.d.ts +43 -0
  77. package/dist/entities/plugin/model/stream.d.ts.map +1 -0
  78. package/dist/entities/plugin/model/stream.js +2 -0
  79. package/dist/entities/plugin/model/stream.js.map +1 -0
  80. package/dist/features/connect/index.d.ts +5 -0
  81. package/dist/features/connect/index.d.ts.map +1 -0
  82. package/dist/features/connect/index.js +4 -0
  83. package/dist/features/connect/index.js.map +1 -0
  84. package/dist/features/connect/lib/calls.d.ts +9 -0
  85. package/dist/features/connect/lib/calls.d.ts.map +1 -0
  86. package/dist/features/connect/lib/calls.js +46 -0
  87. package/dist/features/connect/lib/calls.js.map +1 -0
  88. package/dist/features/connect/lib/client.d.ts +33 -0
  89. package/dist/features/connect/lib/client.d.ts.map +1 -0
  90. package/dist/features/connect/lib/client.js +147 -0
  91. package/dist/features/connect/lib/client.js.map +1 -0
  92. package/dist/features/connect/lib/create-connect.d.ts +14 -0
  93. package/dist/features/connect/lib/create-connect.d.ts.map +1 -0
  94. package/dist/features/connect/lib/create-connect.js +124 -0
  95. package/dist/features/connect/lib/create-connect.js.map +1 -0
  96. package/dist/features/connect/lib/faults.d.ts +18 -0
  97. package/dist/features/connect/lib/faults.d.ts.map +1 -0
  98. package/dist/features/connect/lib/faults.js +85 -0
  99. package/dist/features/connect/lib/faults.js.map +1 -0
  100. package/dist/features/connect/lib/protocol.d.ts +42 -0
  101. package/dist/features/connect/lib/protocol.d.ts.map +1 -0
  102. package/dist/features/connect/lib/protocol.js +228 -0
  103. package/dist/features/connect/lib/protocol.js.map +1 -0
  104. package/dist/features/connect/lib/record.d.ts +14 -0
  105. package/dist/features/connect/lib/record.d.ts.map +1 -0
  106. package/dist/features/connect/lib/record.js +36 -0
  107. package/dist/features/connect/lib/record.js.map +1 -0
  108. package/dist/features/connect/lib/recorder.d.ts +77 -0
  109. package/dist/features/connect/lib/recorder.d.ts.map +1 -0
  110. package/dist/features/connect/lib/recorder.js +209 -0
  111. package/dist/features/connect/lib/recorder.js.map +1 -0
  112. package/dist/features/connect/lib/rules.d.ts +51 -0
  113. package/dist/features/connect/lib/rules.d.ts.map +1 -0
  114. package/dist/features/connect/lib/rules.js +222 -0
  115. package/dist/features/connect/lib/rules.js.map +1 -0
  116. package/dist/features/connect/lib/serve.d.ts +10 -0
  117. package/dist/features/connect/lib/serve.d.ts.map +1 -0
  118. package/dist/features/connect/lib/serve.js +78 -0
  119. package/dist/features/connect/lib/serve.js.map +1 -0
  120. package/dist/features/connect/lib/status-of.d.ts +11 -0
  121. package/dist/features/connect/lib/status-of.d.ts.map +1 -0
  122. package/dist/features/connect/lib/status-of.js +22 -0
  123. package/dist/features/connect/lib/status-of.js.map +1 -0
  124. package/dist/features/connect/lib/stubs.d.ts +18 -0
  125. package/dist/features/connect/lib/stubs.d.ts.map +1 -0
  126. package/dist/features/connect/lib/stubs.js +174 -0
  127. package/dist/features/connect/lib/stubs.js.map +1 -0
  128. package/dist/features/connect/lib/universal.d.ts +19 -0
  129. package/dist/features/connect/lib/universal.d.ts.map +1 -0
  130. package/dist/features/connect/lib/universal.js +71 -0
  131. package/dist/features/connect/lib/universal.js.map +1 -0
  132. package/dist/features/connect/model/types.d.ts +247 -0
  133. package/dist/features/connect/model/types.d.ts.map +1 -0
  134. package/dist/features/connect/model/types.js +2 -0
  135. package/dist/features/connect/model/types.js.map +1 -0
  136. package/dist/features/rest/index.d.ts +5 -0
  137. package/dist/features/rest/index.d.ts.map +1 -0
  138. package/dist/features/rest/index.js +3 -0
  139. package/dist/features/rest/index.js.map +1 -0
  140. package/dist/features/rest/lib/calls.d.ts +8 -0
  141. package/dist/features/rest/lib/calls.d.ts.map +1 -0
  142. package/dist/features/rest/lib/calls.js +32 -0
  143. package/dist/features/rest/lib/calls.js.map +1 -0
  144. package/dist/features/rest/lib/create-rest.d.ts +8 -0
  145. package/dist/features/rest/lib/create-rest.d.ts.map +1 -0
  146. package/dist/features/rest/lib/create-rest.js +136 -0
  147. package/dist/features/rest/lib/create-rest.js.map +1 -0
  148. package/dist/features/rest/lib/path.d.ts +14 -0
  149. package/dist/features/rest/lib/path.d.ts.map +1 -0
  150. package/dist/features/rest/lib/path.js +58 -0
  151. package/dist/features/rest/lib/path.js.map +1 -0
  152. package/dist/features/rest/lib/reply.d.ts +25 -0
  153. package/dist/features/rest/lib/reply.d.ts.map +1 -0
  154. package/dist/features/rest/lib/reply.js +40 -0
  155. package/dist/features/rest/lib/reply.js.map +1 -0
  156. package/dist/features/rest/model/types.d.ts +74 -0
  157. package/dist/features/rest/model/types.d.ts.map +1 -0
  158. package/dist/features/rest/model/types.js +2 -0
  159. package/dist/features/rest/model/types.js.map +1 -0
  160. package/dist/features/sse/index.d.ts +4 -0
  161. package/dist/features/sse/index.d.ts.map +1 -0
  162. package/dist/features/sse/index.js +3 -0
  163. package/dist/features/sse/index.js.map +1 -0
  164. package/dist/features/sse/lib/create-sse.d.ts +9 -0
  165. package/dist/features/sse/lib/create-sse.d.ts.map +1 -0
  166. package/dist/features/sse/lib/create-sse.js +120 -0
  167. package/dist/features/sse/lib/create-sse.js.map +1 -0
  168. package/dist/features/sse/lib/encode.d.ts +8 -0
  169. package/dist/features/sse/lib/encode.d.ts.map +1 -0
  170. package/dist/features/sse/lib/encode.js +29 -0
  171. package/dist/features/sse/lib/encode.js.map +1 -0
  172. package/dist/features/sse/model/types.d.ts +62 -0
  173. package/dist/features/sse/model/types.d.ts.map +1 -0
  174. package/dist/features/sse/model/types.js +2 -0
  175. package/dist/features/sse/model/types.js.map +1 -0
  176. package/dist/features/webrtc/index.d.ts +3 -0
  177. package/dist/features/webrtc/index.d.ts.map +1 -0
  178. package/dist/features/webrtc/index.js +2 -0
  179. package/dist/features/webrtc/index.js.map +1 -0
  180. package/dist/features/webrtc/lib/create-webrtc.d.ts +9 -0
  181. package/dist/features/webrtc/lib/create-webrtc.d.ts.map +1 -0
  182. package/dist/features/webrtc/lib/create-webrtc.js +123 -0
  183. package/dist/features/webrtc/lib/create-webrtc.js.map +1 -0
  184. package/dist/features/webrtc/lib/rtc-page-module.d.ts +22 -0
  185. package/dist/features/webrtc/lib/rtc-page-module.d.ts.map +1 -0
  186. package/dist/features/webrtc/lib/rtc-page-module.js +161 -0
  187. package/dist/features/webrtc/lib/rtc-page-module.js.map +1 -0
  188. package/dist/features/webrtc/lib/to-frame.d.ts +9 -0
  189. package/dist/features/webrtc/lib/to-frame.d.ts.map +1 -0
  190. package/dist/features/webrtc/lib/to-frame.js +43 -0
  191. package/dist/features/webrtc/lib/to-frame.js.map +1 -0
  192. package/dist/features/webrtc/model/types.d.ts +70 -0
  193. package/dist/features/webrtc/model/types.d.ts.map +1 -0
  194. package/dist/features/webrtc/model/types.js +2 -0
  195. package/dist/features/webrtc/model/types.js.map +1 -0
  196. package/dist/features/websocket/index.d.ts +3 -0
  197. package/dist/features/websocket/index.d.ts.map +1 -0
  198. package/dist/features/websocket/index.js +2 -0
  199. package/dist/features/websocket/index.js.map +1 -0
  200. package/dist/features/websocket/lib/create-websocket.d.ts +9 -0
  201. package/dist/features/websocket/lib/create-websocket.d.ts.map +1 -0
  202. package/dist/features/websocket/lib/create-websocket.js +34 -0
  203. package/dist/features/websocket/lib/create-websocket.js.map +1 -0
  204. package/dist/features/websocket/lib/mock.d.ts +6 -0
  205. package/dist/features/websocket/lib/mock.d.ts.map +1 -0
  206. package/dist/features/websocket/lib/mock.js +96 -0
  207. package/dist/features/websocket/lib/mock.js.map +1 -0
  208. package/dist/features/websocket/lib/proxy.d.ts +9 -0
  209. package/dist/features/websocket/lib/proxy.d.ts.map +1 -0
  210. package/dist/features/websocket/lib/proxy.js +107 -0
  211. package/dist/features/websocket/lib/proxy.js.map +1 -0
  212. package/dist/features/websocket/lib/wire.d.ts +16 -0
  213. package/dist/features/websocket/lib/wire.d.ts.map +1 -0
  214. package/dist/features/websocket/lib/wire.js +46 -0
  215. package/dist/features/websocket/lib/wire.js.map +1 -0
  216. package/dist/features/websocket/model/types.d.ts +129 -0
  217. package/dist/features/websocket/model/types.d.ts.map +1 -0
  218. package/dist/features/websocket/model/types.js +2 -0
  219. package/dist/features/websocket/model/types.js.map +1 -0
  220. package/dist/index.d.ts +27 -0
  221. package/dist/index.d.ts.map +1 -0
  222. package/dist/index.js +16 -0
  223. package/dist/index.js.map +1 -0
  224. package/dist/playwright.d.ts +4 -0
  225. package/dist/playwright.d.ts.map +1 -0
  226. package/dist/playwright.js +2 -0
  227. package/dist/playwright.js.map +1 -0
  228. package/dist/rest.d.ts +3 -0
  229. package/dist/rest.d.ts.map +1 -0
  230. package/dist/rest.js +3 -0
  231. package/dist/rest.js.map +1 -0
  232. package/dist/shared/api/http-server/index.d.ts +3 -0
  233. package/dist/shared/api/http-server/index.d.ts.map +1 -0
  234. package/dist/shared/api/http-server/index.js +2 -0
  235. package/dist/shared/api/http-server/index.js.map +1 -0
  236. package/dist/shared/api/http-server/listen.d.ts +25 -0
  237. package/dist/shared/api/http-server/listen.d.ts.map +1 -0
  238. package/dist/shared/api/http-server/listen.js +44 -0
  239. package/dist/shared/api/http-server/listen.js.map +1 -0
  240. package/dist/shared/api/playwright/index.d.ts +2 -0
  241. package/dist/shared/api/playwright/index.d.ts.map +1 -0
  242. package/dist/shared/api/playwright/index.js +2 -0
  243. package/dist/shared/api/playwright/index.js.map +1 -0
  244. package/dist/shared/api/playwright/ports.d.ts +117 -0
  245. package/dist/shared/api/playwright/ports.d.ts.map +1 -0
  246. package/dist/shared/api/playwright/ports.js +11 -0
  247. package/dist/shared/api/playwright/ports.js.map +1 -0
  248. package/dist/shared/api/stream-server/index.d.ts +3 -0
  249. package/dist/shared/api/stream-server/index.d.ts.map +1 -0
  250. package/dist/shared/api/stream-server/index.js +2 -0
  251. package/dist/shared/api/stream-server/index.js.map +1 -0
  252. package/dist/shared/api/stream-server/stream-server.d.ts +43 -0
  253. package/dist/shared/api/stream-server/stream-server.d.ts.map +1 -0
  254. package/dist/shared/api/stream-server/stream-server.js +160 -0
  255. package/dist/shared/api/stream-server/stream-server.js.map +1 -0
  256. package/dist/shared/lib/async/arrivals.d.ts +31 -0
  257. package/dist/shared/lib/async/arrivals.d.ts.map +1 -0
  258. package/dist/shared/lib/async/arrivals.js +57 -0
  259. package/dist/shared/lib/async/arrivals.js.map +1 -0
  260. package/dist/shared/lib/async/async-queue.d.ts +23 -0
  261. package/dist/shared/lib/async/async-queue.d.ts.map +1 -0
  262. package/dist/shared/lib/async/async-queue.js +80 -0
  263. package/dist/shared/lib/async/async-queue.js.map +1 -0
  264. package/dist/shared/lib/async/deferred.d.ts +12 -0
  265. package/dist/shared/lib/async/deferred.d.ts.map +1 -0
  266. package/dist/shared/lib/async/deferred.js +34 -0
  267. package/dist/shared/lib/async/deferred.js.map +1 -0
  268. package/dist/shared/lib/async/index.d.ts +8 -0
  269. package/dist/shared/lib/async/index.d.ts.map +1 -0
  270. package/dist/shared/lib/async/index.js +5 -0
  271. package/dist/shared/lib/async/index.js.map +1 -0
  272. package/dist/shared/lib/async/run-all.d.ts +8 -0
  273. package/dist/shared/lib/async/run-all.d.ts.map +1 -0
  274. package/dist/shared/lib/async/run-all.js +22 -0
  275. package/dist/shared/lib/async/run-all.js.map +1 -0
  276. package/dist/shared/lib/bytes/bytes.d.ts +18 -0
  277. package/dist/shared/lib/bytes/bytes.d.ts.map +1 -0
  278. package/dist/shared/lib/bytes/bytes.js +48 -0
  279. package/dist/shared/lib/bytes/bytes.js.map +1 -0
  280. package/dist/shared/lib/bytes/index.d.ts +3 -0
  281. package/dist/shared/lib/bytes/index.d.ts.map +1 -0
  282. package/dist/shared/lib/bytes/index.js +2 -0
  283. package/dist/shared/lib/bytes/index.js.map +1 -0
  284. package/dist/shared/lib/clock/clock.d.ts +29 -0
  285. package/dist/shared/lib/clock/clock.d.ts.map +1 -0
  286. package/dist/shared/lib/clock/clock.js +85 -0
  287. package/dist/shared/lib/clock/clock.js.map +1 -0
  288. package/dist/shared/lib/clock/index.d.ts +3 -0
  289. package/dist/shared/lib/clock/index.d.ts.map +1 -0
  290. package/dist/shared/lib/clock/index.js +2 -0
  291. package/dist/shared/lib/clock/index.js.map +1 -0
  292. package/dist/shared/lib/cookies/index.d.ts +3 -0
  293. package/dist/shared/lib/cookies/index.d.ts.map +1 -0
  294. package/dist/shared/lib/cookies/index.js +2 -0
  295. package/dist/shared/lib/cookies/index.js.map +1 -0
  296. package/dist/shared/lib/cookies/set-cookie.d.ts +22 -0
  297. package/dist/shared/lib/cookies/set-cookie.d.ts.map +1 -0
  298. package/dist/shared/lib/cookies/set-cookie.js +89 -0
  299. package/dist/shared/lib/cookies/set-cookie.js.map +1 -0
  300. package/dist/shared/lib/envelope/envelope.d.ts +50 -0
  301. package/dist/shared/lib/envelope/envelope.d.ts.map +1 -0
  302. package/dist/shared/lib/envelope/envelope.js +111 -0
  303. package/dist/shared/lib/envelope/envelope.js.map +1 -0
  304. package/dist/shared/lib/envelope/index.d.ts +3 -0
  305. package/dist/shared/lib/envelope/index.d.ts.map +1 -0
  306. package/dist/shared/lib/envelope/index.js +2 -0
  307. package/dist/shared/lib/envelope/index.js.map +1 -0
  308. package/dist/shared/lib/errors/index.d.ts +3 -0
  309. package/dist/shared/lib/errors/index.d.ts.map +1 -0
  310. package/dist/shared/lib/errors/index.js +2 -0
  311. package/dist/shared/lib/errors/index.js.map +1 -0
  312. package/dist/shared/lib/errors/wirestage-error.d.ts +28 -0
  313. package/dist/shared/lib/errors/wirestage-error.d.ts.map +1 -0
  314. package/dist/shared/lib/errors/wirestage-error.js +16 -0
  315. package/dist/shared/lib/errors/wirestage-error.js.map +1 -0
  316. package/dist/shared/lib/id/id.d.ts +10 -0
  317. package/dist/shared/lib/id/id.d.ts.map +1 -0
  318. package/dist/shared/lib/id/id.js +26 -0
  319. package/dist/shared/lib/id/id.js.map +1 -0
  320. package/dist/shared/lib/id/index.d.ts +2 -0
  321. package/dist/shared/lib/id/index.d.ts.map +1 -0
  322. package/dist/shared/lib/id/index.js +2 -0
  323. package/dist/shared/lib/id/index.js.map +1 -0
  324. package/dist/shared/lib/logger/index.d.ts +3 -0
  325. package/dist/shared/lib/logger/index.d.ts.map +1 -0
  326. package/dist/shared/lib/logger/index.js +2 -0
  327. package/dist/shared/lib/logger/index.js.map +1 -0
  328. package/dist/shared/lib/logger/logger.d.ts +46 -0
  329. package/dist/shared/lib/logger/logger.d.ts.map +1 -0
  330. package/dist/shared/lib/logger/logger.js +67 -0
  331. package/dist/shared/lib/logger/logger.js.map +1 -0
  332. package/dist/shared/lib/match/index.d.ts +3 -0
  333. package/dist/shared/lib/match/index.d.ts.map +1 -0
  334. package/dist/shared/lib/match/index.js +2 -0
  335. package/dist/shared/lib/match/index.js.map +1 -0
  336. package/dist/shared/lib/match/url-matcher.d.ts +27 -0
  337. package/dist/shared/lib/match/url-matcher.d.ts.map +1 -0
  338. package/dist/shared/lib/match/url-matcher.js +88 -0
  339. package/dist/shared/lib/match/url-matcher.js.map +1 -0
  340. package/dist/sse.d.ts +3 -0
  341. package/dist/sse.d.ts.map +1 -0
  342. package/dist/sse.js +3 -0
  343. package/dist/sse.js.map +1 -0
  344. package/dist/webrtc.d.ts +3 -0
  345. package/dist/webrtc.d.ts.map +1 -0
  346. package/dist/webrtc.js +3 -0
  347. package/dist/webrtc.js.map +1 -0
  348. package/dist/websocket.d.ts +3 -0
  349. package/dist/websocket.d.ts.map +1 -0
  350. package/dist/websocket.js +3 -0
  351. package/dist/websocket.js.map +1 -0
  352. package/dist/widgets/stage/index.d.ts +3 -0
  353. package/dist/widgets/stage/index.d.ts.map +1 -0
  354. package/dist/widgets/stage/index.js +2 -0
  355. package/dist/widgets/stage/index.js.map +1 -0
  356. package/dist/widgets/stage/lib/attached-context.d.ts +10 -0
  357. package/dist/widgets/stage/lib/attached-context.d.ts.map +1 -0
  358. package/dist/widgets/stage/lib/attached-context.js +2 -0
  359. package/dist/widgets/stage/lib/attached-context.js.map +1 -0
  360. package/dist/widgets/stage/lib/create-stage.d.ts +12 -0
  361. package/dist/widgets/stage/lib/create-stage.d.ts.map +1 -0
  362. package/dist/widgets/stage/lib/create-stage.js +248 -0
  363. package/dist/widgets/stage/lib/create-stage.js.map +1 -0
  364. package/dist/widgets/stage/lib/http-router.d.ts +35 -0
  365. package/dist/widgets/stage/lib/http-router.d.ts.map +1 -0
  366. package/dist/widgets/stage/lib/http-router.js +455 -0
  367. package/dist/widgets/stage/lib/http-router.js.map +1 -0
  368. package/dist/widgets/stage/lib/page-host.d.ts +36 -0
  369. package/dist/widgets/stage/lib/page-host.d.ts.map +1 -0
  370. package/dist/widgets/stage/lib/page-host.js +240 -0
  371. package/dist/widgets/stage/lib/page-host.js.map +1 -0
  372. package/dist/widgets/stage/lib/page-runtime.d.ts +93 -0
  373. package/dist/widgets/stage/lib/page-runtime.d.ts.map +1 -0
  374. package/dist/widgets/stage/lib/page-runtime.js +247 -0
  375. package/dist/widgets/stage/lib/page-runtime.js.map +1 -0
  376. package/dist/widgets/stage/lib/reads.d.ts +21 -0
  377. package/dist/widgets/stage/lib/reads.d.ts.map +1 -0
  378. package/dist/widgets/stage/lib/reads.js +97 -0
  379. package/dist/widgets/stage/lib/reads.js.map +1 -0
  380. package/dist/widgets/stage/lib/response-stream.d.ts +9 -0
  381. package/dist/widgets/stage/lib/response-stream.d.ts.map +1 -0
  382. package/dist/widgets/stage/lib/response-stream.js +56 -0
  383. package/dist/widgets/stage/lib/response-stream.js.map +1 -0
  384. package/dist/widgets/stage/lib/socket-router.d.ts +25 -0
  385. package/dist/widgets/stage/lib/socket-router.d.ts.map +1 -0
  386. package/dist/widgets/stage/lib/socket-router.js +204 -0
  387. package/dist/widgets/stage/lib/socket-router.js.map +1 -0
  388. package/dist/widgets/stage/model/stage.d.ts +86 -0
  389. package/dist/widgets/stage/model/stage.d.ts.map +1 -0
  390. package/dist/widgets/stage/model/stage.js +2 -0
  391. package/dist/widgets/stage/model/stage.js.map +1 -0
  392. package/package.json +140 -5
  393. package/src/app/playwright/index.ts +7 -0
  394. package/src/app/playwright/lib/fixture.ts +201 -0
  395. package/src/connect.ts +6 -0
  396. package/src/entities/frame/@x/plugin.ts +8 -0
  397. package/src/entities/frame/index.ts +19 -0
  398. package/src/entities/frame/lib/filter.ts +58 -0
  399. package/src/entities/frame/lib/payload.ts +42 -0
  400. package/src/entities/frame/lib/snapshot.ts +105 -0
  401. package/src/entities/frame/lib/timeline.ts +147 -0
  402. package/src/entities/frame/model/frame.ts +191 -0
  403. package/src/entities/plugin/index.ts +36 -0
  404. package/src/entities/plugin/lib/define-plugin.ts +12 -0
  405. package/src/entities/plugin/lib/named.ts +21 -0
  406. package/src/entities/plugin/model/attachment.ts +18 -0
  407. package/src/entities/plugin/model/http.ts +147 -0
  408. package/src/entities/plugin/model/page.ts +110 -0
  409. package/src/entities/plugin/model/plugin.ts +96 -0
  410. package/src/entities/plugin/model/socket.ts +108 -0
  411. package/src/entities/plugin/model/stream.ts +43 -0
  412. package/src/features/connect/index.ts +23 -0
  413. package/src/features/connect/lib/calls.ts +58 -0
  414. package/src/features/connect/lib/client.ts +203 -0
  415. package/src/features/connect/lib/create-connect.ts +164 -0
  416. package/src/features/connect/lib/faults.ts +132 -0
  417. package/src/features/connect/lib/protocol.ts +321 -0
  418. package/src/features/connect/lib/record.ts +48 -0
  419. package/src/features/connect/lib/recorder.ts +306 -0
  420. package/src/features/connect/lib/rules.ts +385 -0
  421. package/src/features/connect/lib/serve.ts +114 -0
  422. package/src/features/connect/lib/status-of.ts +20 -0
  423. package/src/features/connect/lib/stubs.ts +282 -0
  424. package/src/features/connect/lib/universal.ts +100 -0
  425. package/src/features/connect/model/types.ts +305 -0
  426. package/src/features/rest/index.ts +23 -0
  427. package/src/features/rest/lib/calls.ts +31 -0
  428. package/src/features/rest/lib/create-rest.ts +169 -0
  429. package/src/features/rest/lib/path.ts +70 -0
  430. package/src/features/rest/lib/reply.ts +74 -0
  431. package/src/features/rest/model/types.ts +113 -0
  432. package/src/features/sse/index.ts +10 -0
  433. package/src/features/sse/lib/create-sse.ts +128 -0
  434. package/src/features/sse/lib/encode.ts +28 -0
  435. package/src/features/sse/model/types.ts +66 -0
  436. package/src/features/webrtc/index.ts +6 -0
  437. package/src/features/webrtc/lib/create-webrtc.ts +149 -0
  438. package/src/features/webrtc/lib/rtc-page-module.ts +189 -0
  439. package/src/features/webrtc/lib/to-frame.ts +63 -0
  440. package/src/features/webrtc/model/types.ts +80 -0
  441. package/src/features/websocket/index.ts +15 -0
  442. package/src/features/websocket/lib/create-websocket.ts +41 -0
  443. package/src/features/websocket/lib/mock.ts +114 -0
  444. package/src/features/websocket/lib/proxy.ts +141 -0
  445. package/src/features/websocket/lib/wire.ts +78 -0
  446. package/src/features/websocket/model/types.ts +130 -0
  447. package/src/index.ts +111 -0
  448. package/src/playwright.ts +8 -0
  449. package/src/rest.ts +2 -0
  450. package/src/shared/api/http-server/index.ts +2 -0
  451. package/src/shared/api/http-server/listen.ts +71 -0
  452. package/src/shared/api/playwright/index.ts +17 -0
  453. package/src/shared/api/playwright/ports.ts +145 -0
  454. package/src/shared/api/stream-server/index.ts +7 -0
  455. package/src/shared/api/stream-server/stream-server.ts +246 -0
  456. package/src/shared/lib/async/arrivals.ts +91 -0
  457. package/src/shared/lib/async/async-queue.ts +101 -0
  458. package/src/shared/lib/async/deferred.ts +38 -0
  459. package/src/shared/lib/async/index.ts +11 -0
  460. package/src/shared/lib/async/run-all.ts +19 -0
  461. package/src/shared/lib/bytes/bytes.ts +53 -0
  462. package/src/shared/lib/bytes/index.ts +9 -0
  463. package/src/shared/lib/clock/clock.ts +114 -0
  464. package/src/shared/lib/clock/index.ts +2 -0
  465. package/src/shared/lib/cookies/index.ts +2 -0
  466. package/src/shared/lib/cookies/set-cookie.ts +105 -0
  467. package/src/shared/lib/envelope/envelope.ts +133 -0
  468. package/src/shared/lib/envelope/index.ts +9 -0
  469. package/src/shared/lib/errors/index.ts +5 -0
  470. package/src/shared/lib/errors/wirestage-error.ts +50 -0
  471. package/src/shared/lib/id/id.ts +29 -0
  472. package/src/shared/lib/id/index.ts +1 -0
  473. package/src/shared/lib/logger/index.ts +12 -0
  474. package/src/shared/lib/logger/logger.ts +126 -0
  475. package/src/shared/lib/match/index.ts +6 -0
  476. package/src/shared/lib/match/url-matcher.ts +107 -0
  477. package/src/sse.ts +2 -0
  478. package/src/webrtc.ts +2 -0
  479. package/src/websocket.ts +2 -0
  480. package/src/widgets/stage/index.ts +9 -0
  481. package/src/widgets/stage/lib/attached-context.ts +10 -0
  482. package/src/widgets/stage/lib/create-stage.ts +305 -0
  483. package/src/widgets/stage/lib/http-router.ts +620 -0
  484. package/src/widgets/stage/lib/page-host.ts +375 -0
  485. package/src/widgets/stage/lib/page-runtime.ts +314 -0
  486. package/src/widgets/stage/lib/reads.ts +128 -0
  487. package/src/widgets/stage/lib/response-stream.ts +66 -0
  488. package/src/widgets/stage/lib/socket-router.ts +271 -0
  489. package/src/widgets/stage/model/stage.ts +108 -0
@@ -0,0 +1,123 @@
1
+ import { definePlugin, } from "../../../entities/plugin/index.js";
2
+ import { toBase64, toBytes } from "../../../shared/lib/bytes/index.js";
3
+ import { WirestageError } from "../../../shared/lib/errors/index.js";
4
+ import { installWebRtc } from "./rtc-page-module.js";
5
+ import { toFrame } from "./to-frame.js";
6
+ /**
7
+ * WebRTC data channels: record what the page sends and receives, drop
8
+ * messages on one channel while it stays open, and inject messages as the
9
+ * remote peer.
10
+ */
11
+ export function webrtc(options = {}) {
12
+ return definePlugin({
13
+ name: "webrtc",
14
+ scope: "Rtc",
15
+ setup(context) {
16
+ const { name } = context;
17
+ const suppressIn = new Map();
18
+ const blockOut = new Map();
19
+ const directions = options.record ?? ["in", "out"];
20
+ const config = {
21
+ labels: options.labels ?? null,
22
+ recordIn: directions.includes("in"),
23
+ recordOut: directions.includes("out"),
24
+ lifecycle: options.lifecycle ?? true,
25
+ };
26
+ context.pages.register({
27
+ id: name,
28
+ install: installWebRtc,
29
+ config,
30
+ state: () => ({
31
+ suppressIn: [...suppressIn.keys()],
32
+ blockOut: [...blockOut.keys()],
33
+ }),
34
+ receive(entries, origin) {
35
+ for (const entry of entries)
36
+ context.timeline.append(toFrame(name, entry, origin));
37
+ },
38
+ });
39
+ const refresh = () => context.pages.refresh(name);
40
+ const hold = (held, label, token) => {
41
+ const tokens = held.get(label) ?? new Set();
42
+ tokens.add(token);
43
+ held.set(label, tokens);
44
+ };
45
+ const release = (held, label, token) => {
46
+ const tokens = held.get(label);
47
+ // Gone already when `restore` cleared the label first.
48
+ if (tokens === undefined)
49
+ return;
50
+ tokens.delete(token);
51
+ if (tokens.size === 0)
52
+ held.delete(label);
53
+ };
54
+ const api = {
55
+ async frames(filter = {}) {
56
+ await context.sync();
57
+ return context.timeline.frames({ ...filter, protocol: name });
58
+ },
59
+ async messages(label, messageOptions = {}) {
60
+ await context.sync();
61
+ return context.timeline.frames({
62
+ protocol: name,
63
+ kind: "message",
64
+ endpoint: label,
65
+ ...(messageOptions.direction === undefined
66
+ ? {}
67
+ : { direction: messageOptions.direction }),
68
+ });
69
+ },
70
+ async suppress(label, suppressOptions = {}) {
71
+ const direction = suppressOptions.direction ?? "in";
72
+ const token = Symbol(label);
73
+ if (direction !== "out")
74
+ hold(suppressIn, label, token);
75
+ if (direction !== "in")
76
+ hold(blockOut, label, token);
77
+ await refresh();
78
+ return async () => {
79
+ release(suppressIn, label, token);
80
+ release(blockOut, label, token);
81
+ await refresh();
82
+ };
83
+ },
84
+ async restore(label) {
85
+ if (label === undefined) {
86
+ suppressIn.clear();
87
+ blockOut.clear();
88
+ }
89
+ else {
90
+ suppressIn.delete(label);
91
+ blockOut.delete(label);
92
+ }
93
+ await refresh();
94
+ },
95
+ async inject(label, data, injectOptions = {}) {
96
+ const args = typeof data === "string"
97
+ ? { label, text: data }
98
+ : { label, data: toBase64(toBytes(data)) };
99
+ const results = await context.pages.command(name, "inject", args, injectOptions.page === undefined
100
+ ? {}
101
+ : { page: context.pages.pageId(injectOptions.page) });
102
+ return results.reduce((sum, delivered) => sum + Number(delivered), 0);
103
+ },
104
+ async waitForChannel(label, waitOptions = {}) {
105
+ if (!config.lifecycle)
106
+ // It would only ever time out: there is no open frame to wait for.
107
+ throw new WirestageError("INVALID_STATE", `waitForChannel("${label}") needs lifecycle frames, and this plugin was created with \`lifecycle: false\``);
108
+ const [frame] = await context.waitFor({
109
+ protocol: name,
110
+ kind: "lifecycle",
111
+ endpoint: label,
112
+ where: (f) => f.meta["event"] === "open",
113
+ }, waitOptions.timeout === undefined
114
+ ? {}
115
+ : { timeout: waitOptions.timeout });
116
+ return frame;
117
+ },
118
+ };
119
+ return { api };
120
+ },
121
+ });
122
+ }
123
+ //# sourceMappingURL=create-webrtc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-webrtc.js","sourceRoot":"","sources":["../../../../src/features/webrtc/lib/create-webrtc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { PageModuleEnv } from "../../../entities/plugin/index.js";
2
+ import type { RtcPageConfig, RtcPageState } from "../model/types.js";
3
+ /**
4
+ * Runs INSIDE the page (serialized): self-contained, `function` declaration.
5
+ *
6
+ * Three hooks, each placed so the page's own code is untouched:
7
+ *
8
+ * - `RTCDataChannel.prototype.send` is wrapped, so every send on every channel
9
+ * is seen as it leaves — the last point the page and a real peer agree on.
10
+ * - `createDataChannel` is wrapped and the constructor is replaced by one that
11
+ * adds a `datachannel` listener first, so every channel — page-created or
12
+ * remote-created — gets OUR `message` listener before the page's. Only a
13
+ * first listener can `stopImmediatePropagation()` the rest, which is what
14
+ * suppression needs; wrapping `onmessage` instead would race the page's own
15
+ * assignment of it.
16
+ * - Injected messages are dispatched as real `MessageEvent`s on the channel,
17
+ * so the page's handlers cannot tell them from the peer's.
18
+ *
19
+ * All three come off again when the stage detaches.
20
+ */
21
+ export declare function installWebRtc(env: PageModuleEnv<RtcPageState, RtcPageConfig>): void;
22
+ //# sourceMappingURL=rtc-page-module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rtc-page-module.d.ts","sourceRoot":"","sources":["../../../../src/features/webrtc/lib/rtc-page-module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,KAAK,EAEX,aAAa,EACb,YAAY,EACZ,MAAM,mBAAmB,CAAC;AAE3B;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAC5B,GAAG,EAAE,aAAa,CAAC,YAAY,EAAE,aAAa,CAAC,GAC7C,IAAI,CAiKN"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Runs INSIDE the page (serialized): self-contained, `function` declaration.
3
+ *
4
+ * Three hooks, each placed so the page's own code is untouched:
5
+ *
6
+ * - `RTCDataChannel.prototype.send` is wrapped, so every send on every channel
7
+ * is seen as it leaves — the last point the page and a real peer agree on.
8
+ * - `createDataChannel` is wrapped and the constructor is replaced by one that
9
+ * adds a `datachannel` listener first, so every channel — page-created or
10
+ * remote-created — gets OUR `message` listener before the page's. Only a
11
+ * first listener can `stopImmediatePropagation()` the rest, which is what
12
+ * suppression needs; wrapping `onmessage` instead would race the page's own
13
+ * assignment of it.
14
+ * - Injected messages are dispatched as real `MessageEvent`s on the channel,
15
+ * so the page's handlers cannot tell them from the peer's.
16
+ *
17
+ * All three come off again when the stage detaches.
18
+ */
19
+ export function installWebRtc(env) {
20
+ const win = env.window;
21
+ const PeerConnection = win.RTCPeerConnection;
22
+ const DataChannel = win.RTCDataChannel;
23
+ if (typeof PeerConnection !== "function" || typeof DataChannel !== "function")
24
+ return;
25
+ const config = env.config;
26
+ let suppressIn = new Set();
27
+ let blockOut = new Set();
28
+ const open = new Map();
29
+ const watched = new WeakSet();
30
+ const injected = new WeakSet();
31
+ /** Listeners added to the page's channels, to take off on detach. */
32
+ const unwatch = [];
33
+ const wanted = (label) => config.labels === null || config.labels.includes(label);
34
+ const emit = (type, label, data, extra = {}) => {
35
+ const meta = { label, ...extra };
36
+ let payload = {};
37
+ if (typeof data === "string")
38
+ payload = { text: data };
39
+ else if (data instanceof ArrayBuffer)
40
+ payload = { data: env.encode(new Uint8Array(data)) };
41
+ else if (ArrayBuffer.isView(data))
42
+ payload = {
43
+ data: env.encode(new Uint8Array(data.buffer, data.byteOffset, data.byteLength)),
44
+ };
45
+ // A Blob would need an async read, which would put it out of order with
46
+ // the frames around it; it is recorded as skipped instead.
47
+ else if (data !== undefined)
48
+ meta["skipped"] = "blob";
49
+ env.emit({ type, at: env.now(), ...payload, meta });
50
+ };
51
+ const watch = (channel) => {
52
+ if (watched.has(channel))
53
+ return;
54
+ watched.add(channel);
55
+ const label = channel.label;
56
+ const track = () => {
57
+ let set = open.get(label);
58
+ if (set === undefined) {
59
+ set = new Set();
60
+ open.set(label, set);
61
+ }
62
+ set.add(channel);
63
+ if (config.lifecycle && wanted(label))
64
+ emit("open", label, undefined, { id: channel.id });
65
+ };
66
+ const untrack = () => {
67
+ open.get(label)?.delete(channel);
68
+ if (config.lifecycle && wanted(label))
69
+ emit("close", label, undefined, { id: channel.id });
70
+ };
71
+ const onMessage = (event) => {
72
+ const mine = injected.has(event);
73
+ // What the test injects is the point of suppressing the peer:
74
+ // silence the real one, speak in its place.
75
+ if (suppressIn.has(label) && !mine) {
76
+ event.stopImmediatePropagation();
77
+ if (wanted(label))
78
+ emit("suppressed", label, event.data);
79
+ return;
80
+ }
81
+ if (config.recordIn && wanted(label))
82
+ emit("in", label, event.data, mine ? { injected: true } : {});
83
+ };
84
+ if (channel.readyState === "open")
85
+ track();
86
+ else
87
+ channel.addEventListener("open", track, { once: true });
88
+ channel.addEventListener("close", untrack, { once: true });
89
+ channel.addEventListener("message", onMessage);
90
+ unwatch.push(() => {
91
+ channel.removeEventListener("open", track);
92
+ channel.removeEventListener("close", untrack);
93
+ channel.removeEventListener("message", onMessage);
94
+ });
95
+ };
96
+ const send = DataChannel.prototype.send;
97
+ DataChannel.prototype.send = function wirestageSend(data) {
98
+ const label = this.label;
99
+ if (blockOut.has(label)) {
100
+ if (wanted(label))
101
+ emit("blocked", label, data);
102
+ return;
103
+ }
104
+ // Recorded once it has left: a send the browser refuses (a channel not
105
+ // open yet) throws here, and must not land on the timeline as sent.
106
+ send.call(this, data);
107
+ if (config.recordOut && wanted(label))
108
+ emit("out", label, data);
109
+ };
110
+ const createDataChannel = PeerConnection.prototype.createDataChannel;
111
+ PeerConnection.prototype.createDataChannel = function wirestageCreate(label, init) {
112
+ const channel = createDataChannel.call(this, label, init);
113
+ watch(channel);
114
+ return channel;
115
+ };
116
+ function WirestagePeerConnection(...args) {
117
+ // `new.target`, so a page's own subclass still gets its prototype —
118
+ // and, as with the real constructor, calling it without `new` throws.
119
+ const connection = Reflect.construct(PeerConnection, args, new.target);
120
+ connection.addEventListener("datachannel", (event) => watch(event.channel));
121
+ return connection;
122
+ }
123
+ // Same prototype, so `instanceof RTCPeerConnection` and the patched
124
+ // methods above keep working; statics such as generateCertificate come
125
+ // through the prototype chain of the function itself.
126
+ WirestagePeerConnection.prototype = PeerConnection.prototype;
127
+ Object.setPrototypeOf(WirestagePeerConnection, PeerConnection);
128
+ win.RTCPeerConnection =
129
+ WirestagePeerConnection;
130
+ env.onState((state) => {
131
+ suppressIn = new Set(state.suppressIn);
132
+ blockOut = new Set(state.blockOut);
133
+ });
134
+ env.onCommand("inject", (args) => {
135
+ let delivered = 0;
136
+ for (const channel of open.get(args.label) ?? []) {
137
+ if (channel.readyState !== "open")
138
+ continue;
139
+ let data = args.text;
140
+ if (data === undefined) {
141
+ const buffer = env.decode(args.data ?? "").buffer;
142
+ data = channel.binaryType === "blob" ? new win.Blob([buffer]) : buffer;
143
+ }
144
+ const event = new win.MessageEvent("message", { data });
145
+ injected.add(event);
146
+ channel.dispatchEvent(event);
147
+ delivered += 1;
148
+ }
149
+ return delivered;
150
+ });
151
+ env.onDetach(() => {
152
+ DataChannel.prototype.send = send;
153
+ PeerConnection.prototype.createDataChannel = createDataChannel;
154
+ win.RTCPeerConnection = PeerConnection;
155
+ for (const undo of unwatch.splice(0))
156
+ undo();
157
+ suppressIn = new Set();
158
+ blockOut = new Set();
159
+ });
160
+ }
161
+ //# sourceMappingURL=rtc-page-module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rtc-page-module.js","sourceRoot":"","sources":["../../../../src/features/webrtc/lib/rtc-page-module.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { FrameInit } from "../../../entities/frame/index.js";
2
+ import type { PageEntry, PageSource } from "../../../entities/plugin/index.js";
3
+ /**
4
+ * One page entry as a frame. A lifecycle frame says which `event` it was, a
5
+ * fault says its `reason`, as every protocol's do, and an unknown type (the
6
+ * runtime's own `error`) still lands as a fault instead of vanishing.
7
+ */
8
+ export declare function toFrame(protocol: string, entry: PageEntry, origin: PageSource): FrameInit;
9
+ //# sourceMappingURL=to-frame.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-frame.d.ts","sourceRoot":"","sources":["../../../../src/features/webrtc/lib/to-frame.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEX,SAAS,EAGT,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAuB/E;;;;GAIG;AACH,wBAAgB,OAAO,CACtB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,UAAU,GAChB,SAAS,CAwBX"}
@@ -0,0 +1,43 @@
1
+ import { fromBase64 } from "../../../shared/lib/bytes/index.js";
2
+ /** Page entry types, as the page module emits them. */
3
+ const SHAPES = {
4
+ out: { kind: "message", direction: "out", source: "page" },
5
+ in: { kind: "message", direction: "in", source: "network" },
6
+ open: { kind: "lifecycle", direction: "none", source: "page" },
7
+ close: { kind: "lifecycle", direction: "none", source: "page" },
8
+ suppressed: { kind: "fault", direction: "in", source: "stub" },
9
+ blocked: { kind: "fault", direction: "out", source: "stub" },
10
+ };
11
+ /** An entry type nobody declared: the page runtime's own `error`. */
12
+ const BROKEN = { kind: "fault", direction: "none", source: "page" };
13
+ /**
14
+ * One page entry as a frame. A lifecycle frame says which `event` it was, a
15
+ * fault says its `reason`, as every protocol's do, and an unknown type (the
16
+ * runtime's own `error`) still lands as a fault instead of vanishing.
17
+ */
18
+ export function toFrame(protocol, entry, origin) {
19
+ const shape = SHAPES[entry.type] ?? BROKEN;
20
+ const label = entry.meta?.["label"];
21
+ return {
22
+ protocol,
23
+ kind: shape.kind,
24
+ direction: shape.direction,
25
+ endpoint: typeof label === "string" ? label : "",
26
+ // A message the test injected is the test's, not the peer's.
27
+ source: entry.meta?.["injected"] === true ? "test" : shape.source,
28
+ at: entry.at,
29
+ ...(entry.data === undefined
30
+ ? entry.text === undefined
31
+ ? {}
32
+ : { data: entry.text }
33
+ : { data: fromBase64(entry.data) }),
34
+ meta: {
35
+ ...entry.meta,
36
+ ...(shape.kind === "lifecycle" ? { event: entry.type } : {}),
37
+ ...(shape.kind === "fault" ? { reason: entry.type } : {}),
38
+ },
39
+ page: origin.page,
40
+ context: origin.context,
41
+ };
42
+ }
43
+ //# sourceMappingURL=to-frame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-frame.js","sourceRoot":"","sources":["../../../../src/features/webrtc/lib/to-frame.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAShE,uDAAuD;AACvD,MAAM,MAAM,GAAoC;IAC/C,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE;IAC1D,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE;IAC3D,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;IAC9D,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;IAC/D,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE;IAC9D,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE;CAC5D,CAAC;AAEF,qEAAqE;AACrE,MAAM,MAAM,GAAU,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAE3E;;;;GAIG;AACH,MAAM,UAAU,OAAO,CACtB,QAAgB,EAChB,KAAgB,EAChB,MAAkB;IAElB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC;IAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC;IACpC,OAAO;QACN,QAAQ;QACR,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,QAAQ,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;QAChD,6DAA6D;QAC7D,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM;QACjE,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS;YAC3B,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS;gBACzB,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE;YACvB,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,EAAE;YACL,GAAG,KAAK,CAAC,IAAI;YACb,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5D,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzD;QACD,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,MAAM,CAAC,OAAO;KACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1,70 @@
1
+ import type { Frame, FrameFilter } from "../../../entities/frame/index.js";
2
+ import type { PagePort } from "../../../shared/api/playwright/index.js";
3
+ export interface WebRtcOptions {
4
+ /**
5
+ * Data channel labels to record. Every channel when omitted. Recording a
6
+ * 60 Hz channel nobody asserts on costs a base64 copy per frame.
7
+ */
8
+ readonly labels?: readonly string[];
9
+ /** Directions to record. Both by default. */
10
+ readonly record?: readonly ("in" | "out")[];
11
+ /** Record channel open/close as lifecycle frames. Default true. */
12
+ readonly lifecycle?: boolean;
13
+ }
14
+ export type RtcDirection = "in" | "out" | "both";
15
+ export interface WebRtcApi {
16
+ /** Every WebRTC frame (messages, lifecycle, faults), narrowed by `filter`. */
17
+ frames(filter?: Omit<FrameFilter, "protocol">): Promise<Frame[]>;
18
+ /** Messages on one channel, oldest first. */
19
+ messages(label: string, options?: {
20
+ readonly direction?: "in" | "out";
21
+ }): Promise<Frame[]>;
22
+ /**
23
+ * Drop messages on `label` while the channel stays open — the lossy-link
24
+ * case no server-side knob can produce, because the server is behaving.
25
+ * `in` (the default) swallows what the peer sends the page; `out` swallows
26
+ * what the page sends. Injected messages still get through, so a test can
27
+ * silence the real peer and speak in its place.
28
+ *
29
+ * Returns a function that undoes exactly this call: the label stays
30
+ * suppressed for as long as another call on it is still in force.
31
+ */
32
+ suppress(label: string, options?: {
33
+ readonly direction?: RtcDirection;
34
+ }): Promise<() => Promise<void>>;
35
+ /** Undo every suppression on `label`, or on every label. */
36
+ restore(label?: string): Promise<void>;
37
+ /**
38
+ * Deliver a message to the page as if the remote peer sent it, on every
39
+ * open channel with this label (or one page's). Returns how many channels
40
+ * received it.
41
+ */
42
+ inject(label: string, data: Uint8Array | string, options?: {
43
+ readonly page?: PagePort;
44
+ }): Promise<number>;
45
+ /**
46
+ * Resolve with the channel's open frame. Needs `lifecycle` recording, and
47
+ * says so at once when it is off.
48
+ */
49
+ waitForChannel(label: string, options?: {
50
+ readonly timeout?: number;
51
+ }): Promise<Frame>;
52
+ }
53
+ /** The page module's fixed configuration. */
54
+ export interface RtcPageConfig {
55
+ readonly labels: readonly string[] | null;
56
+ readonly recordIn: boolean;
57
+ readonly recordOut: boolean;
58
+ readonly lifecycle: boolean;
59
+ }
60
+ /** The page module's live state, pushed to every page on change. */
61
+ export interface RtcPageState {
62
+ readonly suppressIn: readonly string[];
63
+ readonly blockOut: readonly string[];
64
+ }
65
+ export interface RtcInjectArgs {
66
+ readonly label: string;
67
+ readonly data?: string;
68
+ readonly text?: string;
69
+ }
70
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/features/webrtc/model/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yCAAyC,CAAC;AAExE,MAAM,WAAW,aAAa;IAC7B;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,6CAA6C;IAC7C,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;IAC5C,mEAAmE;IACnE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC;AAEjD,MAAM,WAAW,SAAS;IACzB,8EAA8E;IAC9E,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACjE,6CAA6C;IAC7C,QAAQ,CACP,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,GAAG,KAAK,CAAA;KAAE,GAC7C,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACpB;;;;;;;;;OASG;IACH,QAAQ,CACP,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,YAAY,CAAA;KAAE,GAC7C,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAChC,4DAA4D;IAC5D,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC;;;;OAIG;IACH,MAAM,CACL,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,UAAU,GAAG,MAAM,EACzB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAA;KAAE,GACpC,OAAO,CAAC,MAAM,CAAC,CAAC;IACnB;;;OAGG;IACH,cAAc,CACb,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GACrC,OAAO,CAAC,KAAK,CAAC,CAAC;CAClB;AAED,6CAA6C;AAC7C,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAC1C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC5B;AAED,oEAAoE;AACpE,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACvB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/features/webrtc/model/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export { websocket } from "./lib/create-websocket.js";
2
+ export type { WebSocketApi, WebSocketOptions, WsCloseInfo, WsCloseOptions, WsConnection, WsData, WsMessage, WsMock, WsMockOptions, WsProxy, WsProxyConnection, WsProxyOptions, } from "./model/types.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/features/websocket/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,YAAY,EACX,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,YAAY,EACZ,MAAM,EACN,SAAS,EACT,MAAM,EACN,aAAa,EACb,OAAO,EACP,iBAAiB,EACjB,cAAc,GACd,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { websocket } from "./lib/create-websocket.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/features/websocket/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type WirePlugin } from "../../../entities/plugin/index.js";
2
+ import type { WebSocketApi, WebSocketOptions } from "../model/types.js";
3
+ /**
4
+ * WebSockets: fake servers driven from the test, and pass-through proxies
5
+ * that record and can drop messages. Both are rules on the stage's socket
6
+ * router, which owns the browser's side of it.
7
+ */
8
+ export declare function websocket(options?: WebSocketOptions): WirePlugin<"websocket", WebSocketApi>;
9
+ //# sourceMappingURL=create-websocket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-websocket.d.ts","sourceRoot":"","sources":["../../../../src/features/websocket/lib/create-websocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,UAAU,EACf,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAIxE;;;;GAIG;AACH,wBAAgB,SAAS,CACxB,OAAO,GAAE,gBAAqB,GAC5B,UAAU,CAAC,WAAW,EAAE,YAAY,CAAC,CAyBvC"}
@@ -0,0 +1,34 @@
1
+ import { definePlugin, } from "../../../entities/plugin/index.js";
2
+ import { createMock } from "./mock.js";
3
+ import { createProxy } from "./proxy.js";
4
+ /**
5
+ * WebSockets: fake servers driven from the test, and pass-through proxies
6
+ * that record and can drop messages. Both are rules on the stage's socket
7
+ * router, which owns the browser's side of it.
8
+ */
9
+ export function websocket(options = {}) {
10
+ return definePlugin({
11
+ name: "websocket",
12
+ scope: "Ws",
13
+ setup(context) {
14
+ const { name } = context;
15
+ if (!options.lazy)
16
+ context.sockets.prepare();
17
+ const api = {
18
+ mock: (url, mockOptions = {}) => createMock(context, name, url, mockOptions),
19
+ proxy: (url, proxyOptions = {}) => createProxy(context, name, url, proxyOptions),
20
+ async frames(filter = {}) {
21
+ await context.sync();
22
+ return context.timeline.frames({
23
+ protocol: name,
24
+ ...(filter.endpoint === undefined
25
+ ? {}
26
+ : { endpoint: filter.endpoint }),
27
+ });
28
+ },
29
+ };
30
+ return { api };
31
+ },
32
+ });
33
+ }
34
+ //# sourceMappingURL=create-websocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-websocket.js","sourceRoot":"","sources":["../../../../src/features/websocket/lib/create-websocket.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,YAAY,GAEZ,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC;;;;GAIG;AACH,MAAM,UAAU,SAAS,CACxB,UAA4B,EAAE;IAE9B,OAAO,YAAY,CAAC;QACnB,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,IAAI;QACX,KAAK,CAAC,OAAO;YACZ,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;YACzB,IAAI,CAAC,OAAO,CAAC,IAAI;gBAAE,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAC7C,MAAM,GAAG,GAAiB;gBACzB,IAAI,EAAE,CAAC,GAAG,EAAE,WAAW,GAAG,EAAE,EAAE,EAAE,CAC/B,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,CAAC;gBAC5C,KAAK,EAAE,CAAC,GAAG,EAAE,YAAY,GAAG,EAAE,EAAE,EAAE,CACjC,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,YAAY,CAAC;gBAC9C,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE;oBACvB,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;oBACrB,OAAO,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;wBAC9B,QAAQ,EAAE,IAAI;wBACd,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS;4BAChC,CAAC,CAAC,EAAE;4BACJ,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;qBACjC,CAAC,CAAC;gBACJ,CAAC;aACD,CAAC;YACF,OAAO,EAAE,GAAG,EAAE,CAAC;QAChB,CAAC;KACD,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { PluginContext } from "../../../entities/plugin/index.js";
2
+ import type { UrlMatcher } from "../../../shared/lib/match/index.js";
3
+ import type { WsMock, WsMockOptions } from "../model/types.js";
4
+ /** A fake server: every matching socket becomes a connection the test drives. */
5
+ export declare function createMock(context: PluginContext, protocol: string, url: UrlMatcher, options: WsMockOptions): Promise<WsMock>;
6
+ //# sourceMappingURL=mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../../../src/features/websocket/lib/mock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAKvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,KAAK,EAIX,MAAM,EACN,aAAa,EACb,MAAM,mBAAmB,CAAC;AAQ3B,iFAAiF;AACjF,wBAAsB,UAAU,CAC/B,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,aAAa,GACpB,OAAO,CAAC,MAAM,CAAC,CAuFjB"}