@heojeongbo/wirestage 0.0.0-stage → 0.1.1

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 +135 -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 +107 -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 +46 -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 +121 -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 +68 -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 +120 -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 +133 -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 +126 -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 +45 -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 +167 -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 +250 -0
  363. package/dist/widgets/stage/lib/create-stage.js.map +1 -0
  364. package/dist/widgets/stage/lib/http-router.d.ts +44 -0
  365. package/dist/widgets/stage/lib/http-router.d.ts.map +1 -0
  366. package/dist/widgets/stage/lib/http-router.js +696 -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 +23 -0
  381. package/dist/widgets/stage/lib/response-stream.d.ts.map +1 -0
  382. package/dist/widgets/stage/lib/response-stream.js +108 -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 +233 -0
  387. package/dist/widgets/stage/lib/socket-router.js.map +1 -0
  388. package/dist/widgets/stage/model/stage.d.ts +88 -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 +156 -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 +113 -0
  411. package/src/entities/plugin/model/stream.ts +46 -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 +129 -0
  434. package/src/features/sse/lib/encode.ts +28 -0
  435. package/src/features/sse/model/types.ts +72 -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 +153 -0
  445. package/src/features/websocket/lib/wire.ts +78 -0
  446. package/src/features/websocket/model/types.ts +134 -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 +150 -0
  454. package/src/shared/api/stream-server/index.ts +7 -0
  455. package/src/shared/api/stream-server/stream-server.ts +254 -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 +307 -0
  483. package/src/widgets/stage/lib/http-router.ts +954 -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 +139 -0
  488. package/src/widgets/stage/lib/socket-router.ts +300 -0
  489. package/src/widgets/stage/model/stage.ts +110 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../../../src/features/connect/lib/rules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAgB,MAAM,oBAAoB,CAAC;AAEhF,OAAO,EAIN,KAAK,cAAc,EACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAErE,OAAO,KAAK,EACX,WAAW,EACX,eAAe,EACf,cAAc,EAEd,aAAa,EACb,MAAM,mCAAmC,CAAC;AAE3C,OAAO,KAAK,EACX,cAAc,EACd,WAAW,EAEX,MAAM,mBAAmB,CAAC;AAQ3B,OAAO,EACN,KAAK,QAAQ,EAGb,KAAK,QAAQ,EAEb,MAAM,eAAe,CAAC;AAOvB,MAAM,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC;AAEzE,4DAA4D;AAC5D,MAAM,WAAW,QAAQ,CAAC,CAAC,SAAS,WAAW;IAC9C,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG;QAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IAC7E;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,kEAAkE;IAClE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,OAAO,CACN,IAAI,EAAE,eAAe,EACrB,QAAQ,EAAE,SAAS,OAAO,EAAE,GAC1B,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,QAAQ;IACxB;;;;;OAKG;IACH,GAAG,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACvE;;;OAGG;IACH,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,GAAG,gBAAgB,CAAC;IAC7D,uCAAuC;IACvC,MAAM,CACL,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,eAAe,GACnB,OAAO,CAAC,WAAW,CAAC,CAAC;IACxB,mDAAmD;IACnD,MAAM,CAAC,IAAI,EAAE,eAAe,GAAG,QAAQ,CAAC;CACxC;AA2BD;;;GAGG;AACH,wBAAgB,cAAc,CAC7B,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,GACd,QAAQ,CAoQV"}
@@ -0,0 +1,222 @@
1
+ import { MethodOptions_IdempotencyLevel } from "@bufbuild/protobuf/wkt";
2
+ import { Code, createConnectRouter, createContextValues, } from "@connectrpc/connect";
3
+ import { WirestageError } from "../../../shared/lib/errors/index.js";
4
+ import { decodeRequestBody, decodeResponseBody, detectFormat, parseMessage, } from "./protocol.js";
5
+ import { endpointOf, kCall, recordingImpl, } from "./recorder.js";
6
+ import { collectResponse, pipeResponse, toUniversalRequest, } from "./universal.js";
7
+ /** Method kinds a page can call: fetch sends one request body, not a stream. */
8
+ const callable = (method) => method.methodKind === "unary" || method.methodKind === "server_streaming";
9
+ /**
10
+ * Whether a request in `format` is a call `method` can be made with. Connect
11
+ * names unary and streaming calls by content type — a stream's is not a
12
+ * unary method's, nor the reverse — and offers GET only for a unary method
13
+ * declared free of side effects; gRPC and gRPC-web make no such distinction.
14
+ */
15
+ const speaks = (method, format, view) => {
16
+ const unary = method.methodKind === "unary";
17
+ if (view.method === "GET")
18
+ return (unary &&
19
+ method.idempotency === MethodOptions_IdempotencyLevel.NO_SIDE_EFFECTS);
20
+ if (view.method !== "POST")
21
+ return false;
22
+ return format.protocol !== "connect" || format.enveloped !== unary;
23
+ };
24
+ /**
25
+ * How an RPC method becomes an HTTP rule, and how its traffic is recorded.
26
+ * The one place that knows both, shared by every stub of the plugin.
27
+ */
28
+ export function createRpcRules(context, options, recorder, protocol) {
29
+ const protocols = new Set(options.protocols ?? ["connect", "grpc-web"]);
30
+ const live = (options.streaming ?? "live") === "live";
31
+ const base = options.baseURL?.replace(/\/+$/, "");
32
+ const absolute = base !== undefined && /^[a-z][a-z\d+.-]*:\/\//i.test(base);
33
+ /** What each request decodes to, worked out once however many rules ask. */
34
+ const decoded = new WeakMap();
35
+ /** Requests whose request side is on the timeline. */
36
+ const recorded = new WeakSet();
37
+ const matchesPath = (requestPath) => (url) => {
38
+ if (base === undefined)
39
+ return url.pathname.endsWith(requestPath);
40
+ const subject = absolute ? `${url.origin}${url.pathname}` : url.pathname;
41
+ return subject === `${base}${requestPath}`;
42
+ };
43
+ /** The format of a call this rule may take. */
44
+ const accepts = (view, anyProtocol) => {
45
+ const format = detectFormat(view);
46
+ if (format === undefined || anyProtocol)
47
+ return format;
48
+ // gRPC-web-text is base64 on the wire, which Connect's handlers do
49
+ // not speak: such a call is left to the real backend, not answered
50
+ // with a 415.
51
+ return protocols.has(format.protocol) && !format.base64
52
+ ? format
53
+ : undefined;
54
+ };
55
+ const decode = (method, view) => {
56
+ let result = decoded.get(view);
57
+ if (result === undefined) {
58
+ // `accepts` passed before any rule decodes: the request has a format.
59
+ const format = detectFormat(view);
60
+ try {
61
+ result = {
62
+ messages: decodeRequestBody(format, view).map((bytes) => parseMessage(method.input, bytes, format.binary, options.jsonOptions)),
63
+ };
64
+ }
65
+ catch (error) {
66
+ result = { error };
67
+ }
68
+ decoded.set(view, result);
69
+ }
70
+ return result;
71
+ };
72
+ const callOf = (view) => ({
73
+ correlation: view.correlation,
74
+ from: "page",
75
+ answeredBy: "stub",
76
+ rpcProtocol: detectFormat(view)?.protocol,
77
+ page: view.page,
78
+ context: view.context,
79
+ requestRecorded: true,
80
+ });
81
+ /** Put the request side on the timeline, once per request. */
82
+ const recordRequest = (method, view) => {
83
+ const result = decode(method, view);
84
+ const failed = "error" in result;
85
+ if (!recorded.has(view)) {
86
+ recorded.add(view);
87
+ const call = callOf(view);
88
+ if (failed) {
89
+ // It would not decode; it still lands, raw, so nothing vanishes.
90
+ context.log.debug("could not decode an RPC request", { endpoint: endpointOf(method) }, result.error);
91
+ context.timeline.append({
92
+ protocol,
93
+ kind: "request",
94
+ direction: "out",
95
+ endpoint: endpointOf(method),
96
+ source: call.from,
97
+ correlation: call.correlation,
98
+ data: view.body(),
99
+ meta: {
100
+ rpcProtocol: call.rpcProtocol,
101
+ decodeError: String(result.error),
102
+ },
103
+ page: call.page,
104
+ context: call.context,
105
+ });
106
+ }
107
+ else
108
+ for (const [index, message] of result.messages.entries())
109
+ recorder.out(call, method, message, index === 0);
110
+ }
111
+ return failed ? [] : result.messages;
112
+ };
113
+ /** Record what the real backend answered a call this plugin let through. */
114
+ const recordResponse = (method, view, response) => {
115
+ const format = detectFormat(view);
116
+ const call = { ...callOf(view), answeredBy: "network" };
117
+ const body = decodeResponseBody(format, response);
118
+ for (const bytes of body.messages) {
119
+ try {
120
+ recorder.in(call, method, parseMessage(method.output, bytes, format.binary, options.jsonOptions));
121
+ }
122
+ catch (error) {
123
+ context.log.debug("could not decode an RPC response", { endpoint: endpointOf(method) }, error);
124
+ context.timeline.append({
125
+ protocol,
126
+ kind: "message",
127
+ direction: "in",
128
+ endpoint: endpointOf(method),
129
+ source: call.answeredBy,
130
+ correlation: call.correlation,
131
+ data: bytes,
132
+ meta: {
133
+ rpcProtocol: call.rpcProtocol,
134
+ decodeError: String(error),
135
+ },
136
+ page: call.page,
137
+ context: call.context,
138
+ });
139
+ }
140
+ }
141
+ recorder.statusOf(call, method, body.status ?? { code: Code.Internal, message: "missing trailer" });
142
+ };
143
+ const createHandler = (method, impl) => {
144
+ const router = createConnectRouter({
145
+ connect: protocols.has("connect"),
146
+ grpcWeb: protocols.has("grpc-web"),
147
+ grpc: protocols.has("grpc"),
148
+ ...(options.jsonOptions === undefined
149
+ ? {}
150
+ : { jsonOptions: options.jsonOptions }),
151
+ });
152
+ router.rpc(method, recordingImpl(method, impl, recorder));
153
+ return router.handlers[0];
154
+ };
155
+ return {
156
+ callOf,
157
+ handler: createHandler,
158
+ async answer(handler, method, view) {
159
+ const call = callOf(view);
160
+ const values = createContextValues().set(kCall, call);
161
+ if (!live || method.methodKind !== "server_streaming")
162
+ return {
163
+ type: "fulfill",
164
+ ...(await collectResponse(await handler(toUniversalRequest(view, values)))),
165
+ };
166
+ return {
167
+ type: "stream",
168
+ async open(stream) {
169
+ call.cut = () => stream.cut();
170
+ call.over = stream.closed;
171
+ // The page letting go of the stream is the call's cancellation.
172
+ const gone = new AbortController();
173
+ void stream.closed.then(() => gone.abort());
174
+ await pipeResponse(await handler(toUniversalRequest(view, values, gone.signal)), stream);
175
+ },
176
+ };
177
+ },
178
+ async add(spec) {
179
+ const { method, options: stub } = spec;
180
+ if (!callable(method))
181
+ throw new WirestageError("UNSUPPORTED", `${endpointOf(method)} is a ${method.methodKind.replace("_", "-")} method, which a page cannot call through fetch; fake it for clients outside the browser with serve()`);
182
+ const anyProtocol = spec.anyProtocol === true;
183
+ return context.http.add({
184
+ protocol,
185
+ label: spec.label,
186
+ url: matchesPath(`/${method.parent.typeName}/${method.name}`),
187
+ record: false,
188
+ ...(stub.times === undefined ? {} : { times: stub.times }),
189
+ endpoint: () => endpointOf(method),
190
+ match(view) {
191
+ const format = accepts(view, anyProtocol);
192
+ if (format === undefined)
193
+ return false;
194
+ if (anyProtocol)
195
+ return true;
196
+ if (!speaks(method, format, view))
197
+ return false;
198
+ if (stub.match === undefined)
199
+ return true;
200
+ const result = decode(method, view);
201
+ // A request that does not decode is not this stub's to answer.
202
+ return ("messages" in result &&
203
+ result.messages[0] !== undefined &&
204
+ stub.match(result.messages[0], view));
205
+ },
206
+ async handle(view) {
207
+ const messages = recordRequest(method, view);
208
+ if (stub.delayMs !== undefined)
209
+ await context.clock.sleep(stub.delayMs);
210
+ return spec.respond(view, messages);
211
+ },
212
+ ...(spec.observe
213
+ ? {
214
+ onPassthroughResponse: (response, view) => recordResponse(method, view, response),
215
+ onPassthroughFailure: (error, view) => recorder.fault({ ...callOf(view), answeredBy: "network" }, method, "network", { error }),
216
+ }
217
+ : {}),
218
+ });
219
+ },
220
+ };
221
+ }
222
+ //# sourceMappingURL=rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../../../src/features/connect/lib/rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type ConnectRouter } from "@connectrpc/connect";
2
+ import type { RpcServer, ServeOptions } from "../model/types.js";
3
+ import { type Recorder } from "./recorder.js";
4
+ export interface ServeDeps {
5
+ readonly recorder: Recorder;
6
+ readonly correlation: () => string;
7
+ }
8
+ /** Serve Connect routes on a port of their own, recording every call. */
9
+ export declare function serveRoutes(routes: (router: ConnectRouter) => void, options: ServeOptions, deps: ServeDeps): Promise<RpcServer>;
10
+ //# sourceMappingURL=serve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../../../src/features/connect/lib/serve.ts"],"names":[],"mappings":"AAKA,OAAO,EACN,KAAK,aAAa,EAGlB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjE,OAAO,EAAS,KAAK,QAAQ,EAAiB,MAAM,eAAe,CAAC;AAEpE,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,MAAM,CAAC;CACnC;AA+CD,yEAAyE;AACzE,wBAAsB,WAAW,CAChC,MAAM,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,EACvC,OAAO,EAAE,YAAY,EACrB,IAAI,EAAE,SAAS,GACb,OAAO,CAAC,SAAS,CAAC,CAyCpB"}
@@ -0,0 +1,78 @@
1
+ import { createServer as createHttpServer } from "node:http";
2
+ import { createServer as createHttp2Server } from "node:http2";
3
+ import { createContextValues, } from "@connectrpc/connect";
4
+ import { connectNodeAdapter } from "@connectrpc/connect-node";
5
+ import { listen } from "../../../shared/api/http-server/index.js";
6
+ import { detectFormat } from "./protocol.js";
7
+ import { kCall, recordingImpl } from "./recorder.js";
8
+ /**
9
+ * Route registrations, with every implementation wrapped for recording.
10
+ * The caller writes ordinary Connect routes; nothing about recording leaks
11
+ * into its code.
12
+ */
13
+ function recordingRouter(router, deps) {
14
+ // Bound to the object it came from: a class instance or a stateful fake
15
+ // reads its own fields, and Connect would have called it that way.
16
+ const wrap = (method, impl, owner) => recordingImpl(method, impl.bind(owner), deps.recorder);
17
+ const proxy = {
18
+ get handlers() {
19
+ return router.handlers;
20
+ },
21
+ service(service, implementation, options) {
22
+ const wrapped = {};
23
+ for (const method of service.methods) {
24
+ const impl = implementation[method.localName];
25
+ if (impl !== undefined)
26
+ wrapped[method.localName] = wrap(method, impl, implementation);
27
+ }
28
+ router.service(service, wrapped, options);
29
+ return proxy;
30
+ },
31
+ rpc(method, impl, options) {
32
+ router.rpc(method, wrap(method, impl), options);
33
+ return proxy;
34
+ },
35
+ };
36
+ return proxy;
37
+ }
38
+ /** Serve Connect routes on a port of their own, recording every call. */
39
+ export async function serveRoutes(routes, options, deps) {
40
+ const protocols = new Set(options.protocols ?? ["connect", "grpc-web", "grpc"]);
41
+ const handler = connectNodeAdapter({
42
+ connect: protocols.has("connect"),
43
+ grpcWeb: protocols.has("grpc-web"),
44
+ grpc: protocols.has("grpc"),
45
+ routes: (router) => routes(recordingRouter(router, deps)),
46
+ contextValues: (request) => createContextValues().set(kCall, {
47
+ correlation: deps.correlation(),
48
+ // A client outside the browser, answered by the served fake.
49
+ from: "network",
50
+ answeredBy: "server",
51
+ // Node always sets method and url on a server request; the types do
52
+ // not say so. A Connect GET carries no content type at all.
53
+ rpcProtocol: detectFormat({
54
+ method: String(request.method),
55
+ url: new URL(String(request.url), "http://localhost"),
56
+ headers: {
57
+ "content-type": String(request.headers["content-type"] ?? ""),
58
+ },
59
+ })?.protocol,
60
+ }),
61
+ });
62
+ const http2 = options.http2 ?? protocols.has("grpc");
63
+ const server = http2
64
+ ? createHttp2Server(handler)
65
+ : createHttpServer(handler);
66
+ const listening = await listen(server, {
67
+ name: "wirestage rpc server",
68
+ protocol: "http",
69
+ host: options.host,
70
+ port: options.port,
71
+ });
72
+ return {
73
+ url: listening.url,
74
+ port: listening.port,
75
+ close: () => listening.close(),
76
+ };
77
+ }
78
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../../src/features/connect/lib/serve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * The gRPC status a call ended with: 0 when it resolved, the server's code
3
+ * when it failed. For asserting a refusal without a try/catch:
4
+ *
5
+ * expect(await statusOf(orders.cancel(ref))).toBe(Code.PermissionDenied);
6
+ *
7
+ * Anything that is not a `ConnectError` -- a bug in the test, say -- is
8
+ * rethrown rather than read as a status.
9
+ */
10
+ export declare function statusOf(call: Promise<unknown>): Promise<number>;
11
+ //# sourceMappingURL=status-of.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-of.d.ts","sourceRoot":"","sources":["../../../../src/features/connect/lib/status-of.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAQtE"}
@@ -0,0 +1,22 @@
1
+ import { ConnectError } from "@connectrpc/connect";
2
+ /**
3
+ * The gRPC status a call ended with: 0 when it resolved, the server's code
4
+ * when it failed. For asserting a refusal without a try/catch:
5
+ *
6
+ * expect(await statusOf(orders.cancel(ref))).toBe(Code.PermissionDenied);
7
+ *
8
+ * Anything that is not a `ConnectError` -- a bug in the test, say -- is
9
+ * rethrown rather than read as a status.
10
+ */
11
+ export async function statusOf(call) {
12
+ try {
13
+ await call;
14
+ return 0;
15
+ }
16
+ catch (error) {
17
+ if (error instanceof ConnectError)
18
+ return error.code;
19
+ throw error;
20
+ }
21
+ }
22
+ //# sourceMappingURL=status-of.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-of.js","sourceRoot":"","sources":["../../../../src/features/connect/lib/status-of.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAsB;IACpD,IAAI,CAAC;QACJ,MAAM,IAAI,CAAC;QACX,OAAO,CAAC,CAAC;IACV,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,KAAK,YAAY,YAAY;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC;QACrD,MAAM,KAAK,CAAC;IACb,CAAC;AACF,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { DescMessage, DescMethod, DescMethodServerStreaming, DescMethodUnary, DescService } from "@bufbuild/protobuf";
2
+ import { type Code, ConnectError, type ServiceImpl } from "@connectrpc/connect";
3
+ import type { HttpRuleHandle, PluginContext } from "../../../entities/plugin/index.js";
4
+ import type { StreamStub, StubHandle, StubOptions, UnaryReply, UnaryStub } from "../model/types.js";
5
+ import { type Recorder } from "./recorder.js";
6
+ import type { AnyImpl, RpcRules } from "./rules.js";
7
+ export declare const handleOf: (rule: HttpRuleHandle) => StubHandle;
8
+ /** The status a stub fails a call with. */
9
+ export declare const failure: (code: Code, message: string | undefined) => ConnectError;
10
+ /** An implementation that fails every call, for either kind a page can call. */
11
+ export declare const failingImpl: (method: DescMethod, code: Code, message: string | undefined) => AnyImpl;
12
+ export declare function stubService<S extends DescService>(rules: RpcRules, service: S, impl: Partial<ServiceImpl<S>>, options: StubOptions): Promise<StubHandle>;
13
+ export declare function stubUnary<I extends DescMessage, O extends DescMessage>(context: PluginContext, rules: RpcRules, method: DescMethodUnary<I, O>, reply: UnaryReply<I, O>, options: StubOptions<I>): Promise<UnaryStub<I>>;
14
+ export declare function stubStream<I extends DescMessage, O extends DescMessage>(context: PluginContext, rules: RpcRules, recorder: Recorder, method: DescMethodServerStreaming<I, O>, options: StubOptions<I>, live: boolean): Promise<StreamStub<I, O>>;
15
+ export declare function stubFailure<I extends DescMessage>(rules: RpcRules, method: DescMethod & {
16
+ readonly input: I;
17
+ }, code: Code, message: string | undefined, options: StubOptions<I>): Promise<StubHandle>;
18
+ //# sourceMappingURL=stubs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stubs.d.ts","sourceRoot":"","sources":["../../../../src/features/connect/lib/stubs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,WAAW,EACX,UAAU,EACV,yBAAyB,EACzB,eAAe,EACf,WAAW,EAGX,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACN,KAAK,IAAI,EAET,YAAY,EAEZ,KAAK,WAAW,EAChB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EACX,cAAc,EACd,aAAa,EACb,MAAM,mCAAmC,CAAC;AAQ3C,OAAO,KAAK,EAGX,UAAU,EACV,UAAU,EACV,WAAW,EACX,UAAU,EACV,SAAS,EACT,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAqB,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEpD,eAAO,MAAM,QAAQ,GAAI,MAAM,cAAc,KAAG,UAK9C,CAAC;AAEH,2CAA2C;AAC3C,eAAO,MAAM,OAAO,GACnB,MAAM,IAAI,EACV,SAAS,MAAM,GAAG,SAAS,KACzB,YAA2E,CAAC;AAE/E,gFAAgF;AAChF,eAAO,MAAM,WAAW,GACvB,QAAQ,UAAU,EAClB,MAAM,IAAI,EACV,SAAS,MAAM,GAAG,SAAS,KACzB,OAQa,CAAC;AAmBjB,wBAAsB,WAAW,CAAC,CAAC,SAAS,WAAW,EACtD,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,CAAC,EACV,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAC7B,OAAO,EAAE,WAAW,GAClB,OAAO,CAAC,UAAU,CAAC,CAsCrB;AAED,wBAAsB,SAAS,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,SAAS,WAAW,EAC3E,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,EAC7B,KAAK,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,EACvB,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,GACrB,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CA0BvB;AAED,wBAAsB,UAAU,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,SAAS,WAAW,EAC5E,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,yBAAyB,CAAC,CAAC,EAAE,CAAC,CAAC,EACvC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,EACvB,IAAI,EAAE,OAAO,GACX,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CA4F3B;AAED,wBAAsB,WAAW,CAAC,CAAC,SAAS,WAAW,EACtD,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,UAAU,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,EAC1C,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,GACrB,OAAO,CAAC,UAAU,CAAC,CAUrB"}
@@ -0,0 +1,174 @@
1
+ import { Code as Codes, ConnectError, } from "@connectrpc/connect";
2
+ import { createArrivals, createAsyncQueue, createDeferred, } from "../../../shared/lib/async/index.js";
3
+ import { WirestageError } from "../../../shared/lib/errors/index.js";
4
+ import { endpointOf, kCall } from "./recorder.js";
5
+ export const handleOf = (rule) => ({
6
+ get hits() {
7
+ return rule.hits;
8
+ },
9
+ remove: () => rule.remove(),
10
+ });
11
+ /** The status a stub fails a call with. */
12
+ export const failure = (code, message) => new ConnectError(message ?? `stubbed ${Codes[code]}`, code);
13
+ /** An implementation that fails every call, for either kind a page can call. */
14
+ export const failingImpl = (method, code, message) => (method.methodKind === "server_streaming"
15
+ ? async function* () {
16
+ yield* [];
17
+ throw failure(code, message);
18
+ }
19
+ : async () => {
20
+ throw failure(code, message);
21
+ });
22
+ /** One method answered by one implementation. */
23
+ const stubMethod = (rules, method, impl, options, label) => {
24
+ const handler = rules.handler(method, impl);
25
+ return rules.add({
26
+ method,
27
+ label,
28
+ options,
29
+ respond: (view) => rules.answer(handler, method, view),
30
+ });
31
+ };
32
+ export async function stubService(rules, service, impl, options) {
33
+ const added = [];
34
+ const remove = async () => {
35
+ await Promise.all(added.map((rule) => rule.remove()));
36
+ };
37
+ try {
38
+ for (const method of service.methods) {
39
+ const own = impl[method.localName];
40
+ if (own !== undefined)
41
+ added.push(await stubMethod(rules, method,
42
+ // A class instance or a stateful object: its methods need it.
43
+ own.bind(impl), options, `stub ${endpointOf(method)}`));
44
+ }
45
+ }
46
+ catch (error) {
47
+ // All of the service or none of it.
48
+ await remove();
49
+ throw error;
50
+ }
51
+ if (added.length === 0)
52
+ throw new WirestageError("INVALID_ARGUMENT", `stub for ${service.typeName} implements none of its methods`);
53
+ return {
54
+ get hits() {
55
+ return added.reduce((sum, rule) => sum + rule.hits, 0);
56
+ },
57
+ remove,
58
+ };
59
+ }
60
+ export async function stubUnary(context, rules, method, reply, options) {
61
+ const requests = createArrivals({
62
+ clock: context.clock,
63
+ label: `${endpointOf(method)} request`,
64
+ });
65
+ const impl = async (request, handler) => {
66
+ requests.push(request);
67
+ return typeof reply === "function" ? reply(request, handler) : reply;
68
+ };
69
+ const rule = await stubMethod(rules, method, impl, options, `unary ${endpointOf(method)}`);
70
+ return {
71
+ ...handleOf(rule),
72
+ get hits() {
73
+ return rule.hits;
74
+ },
75
+ get requests() {
76
+ return requests.items;
77
+ },
78
+ next: (waitOptions) => requests.next(waitOptions),
79
+ };
80
+ }
81
+ export async function stubStream(context, rules, recorder, method, options, live) {
82
+ if (!live)
83
+ throw new WirestageError("UNSUPPORTED", "stream() needs live streaming; it was configured as `buffered`");
84
+ /** Calls the stub took: each should become a stream. */
85
+ let taken = 0;
86
+ const calls = createArrivals({
87
+ clock: context.clock,
88
+ label: `${endpointOf(method)} stream`,
89
+ // The stub took the call, yet no stream came of it: the redirect to
90
+ // the stream server is what went missing.
91
+ hint: () => taken > calls.items.length
92
+ ? `${taken - calls.items.length} call(s) matched but never reached the local stream server — see "Live streams" in docs/troubleshooting.md`
93
+ : undefined,
94
+ });
95
+ const impl = async function* (request, handler) {
96
+ const info = handler.values.get(kCall);
97
+ const queue = createAsyncQueue();
98
+ const closed = createDeferred();
99
+ /** Once the response itself is over, not merely decided. */
100
+ const over = async () => {
101
+ await info.over;
102
+ };
103
+ const call = {
104
+ request,
105
+ requestHeaders: handler.requestHeader,
106
+ protocol: info.rpcProtocol,
107
+ send: (message) => queue.push(message),
108
+ async end() {
109
+ queue.close();
110
+ await over();
111
+ },
112
+ async fail(code, message) {
113
+ queue.fail(failure(code, message));
114
+ await over();
115
+ },
116
+ async cut() {
117
+ // Settled and recorded here, not by what follows: the connection
118
+ // resets asynchronously, after the queue has already ended, and
119
+ // the implementation returning then must not read as an OK.
120
+ closed.resolve("cut");
121
+ recorder.fault(info, method, "cut");
122
+ info.cut?.();
123
+ queue.close();
124
+ await over();
125
+ },
126
+ closed: closed.promise,
127
+ };
128
+ handler.signal.addEventListener("abort", () => {
129
+ if (closed.settled)
130
+ return;
131
+ closed.resolve("cancelled");
132
+ recorder.fault(info, method, "cancelled", { by: "page" });
133
+ queue.close();
134
+ });
135
+ calls.push(call);
136
+ try {
137
+ for await (const message of queue)
138
+ yield message;
139
+ closed.resolve("ended");
140
+ }
141
+ catch (error) {
142
+ closed.resolve("failed");
143
+ throw error;
144
+ }
145
+ };
146
+ const handler = rules.handler(method, impl);
147
+ const rule = await rules.add({
148
+ method,
149
+ label: `stream ${endpointOf(method)}`,
150
+ options,
151
+ respond(view) {
152
+ taken += 1;
153
+ return rules.answer(handler, method, view);
154
+ },
155
+ });
156
+ return {
157
+ ...handleOf(rule),
158
+ get hits() {
159
+ return rule.hits;
160
+ },
161
+ next: (waitOptions) => calls.next(waitOptions),
162
+ get calls() {
163
+ return calls.items;
164
+ },
165
+ async broadcast(message) {
166
+ for (const call of calls.items)
167
+ await call.send(message).catch(() => { });
168
+ },
169
+ };
170
+ }
171
+ export async function stubFailure(rules, method, code, message, options) {
172
+ return handleOf(await stubMethod(rules, method, failingImpl(method, code, message), options, `fail ${endpointOf(method)}`));
173
+ }
174
+ //# sourceMappingURL=stubs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stubs.js","sourceRoot":"","sources":["../../../../src/features/connect/lib/stubs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { ContextValues } from "@connectrpc/connect";
2
+ import type { UniversalServerRequest, UniversalServerResponse } from "@connectrpc/connect/protocol";
3
+ import type { HttpRequestView, ResponseStream } from "../../../entities/plugin/index.js";
4
+ /** A Playwright request, as the request Connect's handlers expect. */
5
+ export declare function toUniversalRequest(view: HttpRequestView, contextValues: ContextValues, signal?: AbortSignal): UniversalServerRequest;
6
+ export interface CollectedResponse {
7
+ readonly status: number;
8
+ readonly headers: Readonly<Record<string, string>>;
9
+ readonly body: Uint8Array;
10
+ }
11
+ /** Read a handler's whole response, for `route.fulfill`. */
12
+ export declare function collectResponse(response: UniversalServerResponse): Promise<CollectedResponse>;
13
+ /**
14
+ * Write a handler's response to an open stream as the handler produces it:
15
+ * the head with the first chunk, as a real Connect server sends it, and each
16
+ * message as soon as the implementation yields it.
17
+ */
18
+ export declare function pipeResponse(response: UniversalServerResponse, stream: ResponseStream): Promise<void>;
19
+ //# sourceMappingURL=universal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"universal.d.ts","sourceRoot":"","sources":["../../../../src/features/connect/lib/universal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EACX,sBAAsB,EACtB,uBAAuB,EACvB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EACX,eAAe,EACf,cAAc,EACd,MAAM,mCAAmC,CAAC;AAI3C,sEAAsE;AACtE,wBAAgB,kBAAkB,CACjC,IAAI,EAAE,eAAe,EACrB,aAAa,EAAE,aAAa,EAC5B,MAAM,GAAE,WAA0C,GAChD,sBAAsB,CAaxB;AAiCD,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;CAC1B;AAED,4DAA4D;AAC5D,wBAAsB,eAAe,CACpC,QAAQ,EAAE,uBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAS5B;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CACjC,QAAQ,EAAE,uBAAuB,EACjC,MAAM,EAAE,cAAc,GACpB,OAAO,CAAC,IAAI,CAAC,CAOf"}