@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,33 @@
1
+ import type { DescService } from "@bufbuild/protobuf";
2
+ import { type Client, type Transport } from "@connectrpc/connect";
3
+ import { Http2SessionManager } from "@connectrpc/connect-node";
4
+ import type { CookieJarPort } from "../../../shared/api/playwright/index.js";
5
+ import type { StandaloneClientOptions } from "../model/types.js";
6
+ import { type Recorder } from "./recorder.js";
7
+ export interface ClientDeps {
8
+ /** Resolved per call, so a context attached after the client exists still counts. */
9
+ readonly session: () => CookieJarPort | undefined;
10
+ /** The time cookies are stamped against; the stage's clock in a stage. */
11
+ readonly now?: () => number;
12
+ readonly recorder?: Recorder;
13
+ readonly correlation?: () => string;
14
+ /**
15
+ * Handed the HTTP/2 connection a gRPC client opens, so its owner can close
16
+ * it. connect-node keeps an idle one for 15 minutes, and a server in the
17
+ * same process cannot finish closing while it is open (Node 22 waits).
18
+ */
19
+ readonly onConnection?: (connection: Http2SessionManager) => void;
20
+ }
21
+ export declare function createTransport(options: StandaloneClientOptions, deps: ClientDeps): Transport;
22
+ /**
23
+ * A typed client for a real backend, outside any stage: the `rpc` helper an
24
+ * e2e suite otherwise writes by hand — framing, status parsing and all — per
25
+ * protocol. Errors arrive as `ConnectError` with the server's code.
26
+ *
27
+ * Over gRPC it holds an HTTP/2 connection, which connect-node keeps for 15
28
+ * minutes once idle. It does not keep the process alive, but a server in the
29
+ * same process waits for it before it finishes closing. A stage's client is
30
+ * closed with the stage.
31
+ */
32
+ export declare function createRpcClient<S extends DescService>(service: S, options: StandaloneClientOptions): Client<S>;
33
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/features/connect/lib/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EACN,KAAK,MAAM,EAIX,KAAK,SAAS,EACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAIN,mBAAmB,EACnB,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAE7E,OAAO,KAAK,EAAe,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAiB,KAAK,QAAQ,EAAe,MAAM,eAAe,CAAC;AAE1E,MAAM,WAAW,UAAU;IAC1B,qFAAqF;IACrF,QAAQ,CAAC,OAAO,EAAE,MAAM,aAAa,GAAG,SAAS,CAAC;IAClD,0EAA0E;IAC1E,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,MAAM,CAAC;IACpC;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,UAAU,EAAE,mBAAmB,KAAK,IAAI,CAAC;CAClE;AAgHD,wBAAgB,eAAe,CAC9B,OAAO,EAAE,uBAAuB,EAChC,IAAI,EAAE,UAAU,GACd,SAAS,CAkCX;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,WAAW,EACpD,OAAO,EAAE,CAAC,EACV,OAAO,EAAE,uBAAuB,GAC9B,MAAM,CAAC,CAAC,CAAC,CAKX"}
@@ -0,0 +1,147 @@
1
+ import { ConnectError, createClient, } from "@connectrpc/connect";
2
+ import { createConnectTransport, createGrpcTransport, createGrpcWebTransport, Http2SessionManager, } from "@connectrpc/connect-node";
3
+ import { parseSetCookie } from "../../../shared/lib/cookies/index.js";
4
+ import { tapIterable } from "./recorder.js";
5
+ /** Sent with every call that did not set the header itself. */
6
+ function headersInterceptor(headers) {
7
+ return (next) => (request) => {
8
+ for (const [name, value] of Object.entries(headers))
9
+ if (!request.header.has(name))
10
+ request.header.set(name, value);
11
+ return next(request);
12
+ };
13
+ }
14
+ /**
15
+ * Shares a context's cookie jar both ways, as Playwright's own request
16
+ * context does — the reason hand-rolled gRPC-web helpers go through it. The
17
+ * jar's cookies go out on the call, read per call: a sign-in during the test
18
+ * is picked up, and a cookie scoped to another host or path is not sent. The
19
+ * cookies a response sets come back into the jar — an error response's too,
20
+ * which is how a sign-out or a refused sign-in clears a session.
21
+ *
22
+ * Cookies are scoped to the host the request names: its `host` header when
23
+ * one was set, since that is the site the server takes it for.
24
+ */
25
+ function sessionInterceptor(session, now) {
26
+ return (next) => async (request) => {
27
+ const jar = session();
28
+ if (jar === undefined)
29
+ return next(request);
30
+ const named = request.header.get("host");
31
+ const site = new URL(request.url);
32
+ if (named !== null)
33
+ site.host = named;
34
+ const cookies = await jar.cookies(site.href);
35
+ if (cookies.length > 0 && !request.header.has("cookie"))
36
+ request.header.set("cookie", cookies.map((c) => `${c.name}=${c.value}`).join("; "));
37
+ const keep = async (headers) => {
38
+ const set = headers
39
+ .getSetCookie()
40
+ .flatMap((line) => parseSetCookie(line, site.href, now()) ?? []);
41
+ if (set.length > 0)
42
+ await jar.addCookies?.(set);
43
+ };
44
+ try {
45
+ const response = await next(request);
46
+ await keep(response.header);
47
+ return response;
48
+ }
49
+ catch (error) {
50
+ // A failed call's headers ride on its error; one that never reached
51
+ // the server has none.
52
+ await keep(ConnectError.from(error).metadata);
53
+ throw error;
54
+ }
55
+ };
56
+ }
57
+ /** Records drive calls on the timeline: the test's requests, the backend's answers. */
58
+ function recordingInterceptor(recorder, correlation, protocol) {
59
+ return (next) => async (request) => {
60
+ const call = {
61
+ correlation: correlation(),
62
+ from: "test",
63
+ answeredBy: "network",
64
+ rpcProtocol: protocol,
65
+ };
66
+ const method = request.method;
67
+ try {
68
+ if (!request.stream)
69
+ recorder.out(call, method, request.message, true);
70
+ const response = await next(request.stream
71
+ ? {
72
+ ...request,
73
+ message: tapIterable(request.message, (m, i) => recorder.out(call, method, m, i === 0)),
74
+ }
75
+ : request);
76
+ if (!response.stream) {
77
+ recorder.in(call, method, response.message);
78
+ recorder.status(call, method);
79
+ return response;
80
+ }
81
+ return {
82
+ ...response,
83
+ message: (async function* () {
84
+ try {
85
+ for await (const message of response.message) {
86
+ recorder.in(call, method, message);
87
+ yield message;
88
+ }
89
+ recorder.status(call, method);
90
+ }
91
+ catch (error) {
92
+ recorder.status(call, method, ConnectError.from(error));
93
+ throw error;
94
+ }
95
+ })(),
96
+ };
97
+ }
98
+ catch (error) {
99
+ recorder.status(call, method, ConnectError.from(error));
100
+ throw error;
101
+ }
102
+ };
103
+ }
104
+ export function createTransport(options, deps) {
105
+ const protocol = options.protocol ?? "connect";
106
+ // Outermost first: the defaults, then the session (which reads the `host`
107
+ // the defaults may have named), then the recorder, closest to the wire.
108
+ const interceptors = [];
109
+ if (options.headers !== undefined)
110
+ interceptors.push(headersInterceptor(options.headers));
111
+ interceptors.push(sessionInterceptor(deps.session, deps.now ?? Date.now));
112
+ if (deps.recorder !== undefined && deps.correlation !== undefined)
113
+ interceptors.push(recordingInterceptor(deps.recorder, deps.correlation, protocol));
114
+ const nodeOptions = options.ignoreHttpsErrors
115
+ ? { rejectUnauthorized: false }
116
+ : undefined;
117
+ const common = {
118
+ baseUrl: options.baseURL,
119
+ interceptors,
120
+ useBinaryFormat: options.binary ?? true,
121
+ };
122
+ if (protocol === "grpc") {
123
+ // The transport's own session manager would be out of reach; this one
124
+ // is handed to whoever has to close it.
125
+ const sessionManager = new Http2SessionManager(options.baseURL, undefined, nodeOptions);
126
+ deps.onConnection?.(sessionManager);
127
+ return createGrpcTransport({ ...common, sessionManager });
128
+ }
129
+ const http1 = { ...common, httpVersion: "1.1", nodeOptions };
130
+ if (protocol === "grpc-web")
131
+ return createGrpcWebTransport(http1);
132
+ return createConnectTransport(http1);
133
+ }
134
+ /**
135
+ * A typed client for a real backend, outside any stage: the `rpc` helper an
136
+ * e2e suite otherwise writes by hand — framing, status parsing and all — per
137
+ * protocol. Errors arrive as `ConnectError` with the server's code.
138
+ *
139
+ * Over gRPC it holds an HTTP/2 connection, which connect-node keeps for 15
140
+ * minutes once idle. It does not keep the process alive, but a server in the
141
+ * same process waits for it before it finishes closing. A stage's client is
142
+ * closed with the stage.
143
+ */
144
+ export function createRpcClient(service, options) {
145
+ return createClient(service, createTransport(options, { session: () => options.session }));
146
+ }
147
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/features/connect/lib/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type WirePlugin } from "../../../entities/plugin/index.js";
2
+ import type { ConnectApi, ConnectOptions } from "../model/types.js";
3
+ /**
4
+ * Connect, gRPC-web and gRPC: stubs answered by connect-es's own protocol
5
+ * handlers, recording of real traffic, drive clients, and out-of-process
6
+ * servers.
7
+ *
8
+ * The stubs never encode a frame by hand. Each one is a one-method Connect
9
+ * router whose handler runs the real server-side protocol, so the bytes the
10
+ * page receives are exactly what a Connect server would send — errors,
11
+ * trailers, JSON and binary alike.
12
+ */
13
+ export declare function connect(options?: ConnectOptions): WirePlugin<"connect", ConnectApi>;
14
+ //# sourceMappingURL=create-connect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-connect.d.ts","sourceRoot":"","sources":["../../../../src/features/connect/lib/create-connect.ts"],"names":[],"mappings":"AAIA,OAAO,EAGN,KAAK,UAAU,EACf,MAAM,mCAAmC,CAAC;AAG3C,OAAO,KAAK,EAEX,UAAU,EACV,cAAc,EAEd,MAAM,mBAAmB,CAAC;AAU3B;;;;;;;;;GASG;AACH,wBAAgB,OAAO,CACtB,OAAO,GAAE,cAAmB,GAC1B,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,CAMnC"}
@@ -0,0 +1,124 @@
1
+ import { createClient } from "@connectrpc/connect";
2
+ import { definePlugin, } from "../../../entities/plugin/index.js";
3
+ import { WirestageError } from "../../../shared/lib/errors/index.js";
4
+ import { createSequence } from "../../../shared/lib/id/index.js";
5
+ import { assembleCalls } from "./calls.js";
6
+ import { createTransport } from "./client.js";
7
+ import { stubAbort, stubHold } from "./faults.js";
8
+ import { recordService } from "./record.js";
9
+ import { createRecorder, endpointOf } from "./recorder.js";
10
+ import { createRpcRules } from "./rules.js";
11
+ import { serveRoutes } from "./serve.js";
12
+ import { stubFailure, stubService, stubStream, stubUnary } from "./stubs.js";
13
+ /**
14
+ * Connect, gRPC-web and gRPC: stubs answered by connect-es's own protocol
15
+ * handlers, recording of real traffic, drive clients, and out-of-process
16
+ * servers.
17
+ *
18
+ * The stubs never encode a frame by hand. Each one is a one-method Connect
19
+ * router whose handler runs the real server-side protocol, so the bytes the
20
+ * page receives are exactly what a Connect server would send — errors,
21
+ * trailers, JSON and binary alike.
22
+ */
23
+ export function connect(options = {}) {
24
+ return definePlugin({
25
+ name: "connect",
26
+ scope: "Connect",
27
+ setup: (context) => createConnect(context, options),
28
+ });
29
+ }
30
+ function createConnect(context, options) {
31
+ const protocol = context.name;
32
+ const live = (options.streaming ?? "live") === "live";
33
+ const recorder = createRecorder(context.timeline, protocol);
34
+ const rules = createRpcRules(context, options, recorder, protocol);
35
+ const testCorrelation = createSequence("t");
36
+ const serverCorrelation = createSequence("s");
37
+ const servers = new Set();
38
+ /** Lets go of each call a hold still has, when the stage goes away. */
39
+ const heldCalls = new Set();
40
+ /** The drive clients' HTTP/2 connections, closed with the stage. */
41
+ const connections = new Set();
42
+ /** The record rules being added, once: every context gets them. */
43
+ let recording;
44
+ const api = {
45
+ service: (service, impl, stubOptions = {}) => stubService(rules, service, impl, stubOptions),
46
+ unary: (method, reply, stubOptions = {}) => stubUnary(context, rules, method, reply, stubOptions),
47
+ stream: (method, stubOptions = {}) => stubStream(context, rules, recorder, method, stubOptions, live),
48
+ fail: (method, code, message, stubOptions = {}) => stubFailure(rules, method, code, message, stubOptions),
49
+ abort: (method, abortOptions = {}) => stubAbort(rules, recorder, method, abortOptions),
50
+ hold: (method, holdOptions = {}) => stubHold(context, rules, recorder, method, holdOptions, heldCalls),
51
+ record: (service) => recordService(rules, service),
52
+ async calls(method) {
53
+ await context.sync();
54
+ return assembleCalls(context.timeline.frames({ protocol, endpoint: endpointOf(method) }));
55
+ },
56
+ client(service, clientOptions = {}) {
57
+ const { session, baseURL: requested, ...transportOptions } = clientOptions;
58
+ const base = requested ?? options.baseURL ?? "/";
59
+ const origin = context.attachments()[0]?.baseURL ?? context.baseURL;
60
+ if (!/^https?:\/\//.test(base) && origin === undefined)
61
+ throw new WirestageError("INVALID_ARGUMENT", `client(${service.typeName}): "${base}" is relative and the stage has no baseURL; pass an absolute baseURL or give the stage one`);
62
+ return createClient(service, createTransport({
63
+ ...transportOptions,
64
+ baseURL: new URL(base, origin).href.replace(/\/+$/, ""),
65
+ protocol: transportOptions.protocol ?? options.clientProtocol ?? "connect",
66
+ }, {
67
+ // Resolved per call: a context attached after the client was made
68
+ // still lends it its session.
69
+ session: () => session === null
70
+ ? undefined
71
+ : (session ?? context.attachments()[0]?.cookies),
72
+ now: () => context.clock.now(),
73
+ recorder,
74
+ correlation: testCorrelation,
75
+ onConnection: (connection) => connections.add(connection),
76
+ }));
77
+ },
78
+ async serve(routes, serveOptions = {}) {
79
+ const server = await serveRoutes(routes, serveOptions, {
80
+ recorder,
81
+ correlation: serverCorrelation,
82
+ });
83
+ const tracked = {
84
+ url: server.url,
85
+ port: server.port,
86
+ close: async () => {
87
+ servers.delete(tracked);
88
+ await server.close();
89
+ },
90
+ };
91
+ servers.add(tracked);
92
+ return tracked;
93
+ },
94
+ };
95
+ return {
96
+ api,
97
+ async attach() {
98
+ const services = options.record;
99
+ if (services === undefined)
100
+ return;
101
+ recording ??= (async () => {
102
+ for (const service of services)
103
+ await api.record(service);
104
+ })().catch((error) => {
105
+ // Only the first rule can fail, installing the context's route, and
106
+ // the router takes it back: the next attach starts over.
107
+ recording = undefined;
108
+ throw error;
109
+ });
110
+ await recording;
111
+ },
112
+ async dispose() {
113
+ for (const letGo of [...heldCalls])
114
+ letGo();
115
+ // A drive client's connection outlives its calls; left open, a
116
+ // server in the test's own process would wait for it on close.
117
+ for (const connection of connections)
118
+ connection.abort();
119
+ connections.clear();
120
+ await Promise.all([...servers].map((server) => server.close()));
121
+ },
122
+ };
123
+ }
124
+ //# sourceMappingURL=create-connect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-connect.js","sourceRoot":"","sources":["../../../../src/features/connect/lib/create-connect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { DescMessage, DescMethod, DescMethodServerStreaming, DescMethodUnary } from "@bufbuild/protobuf";
2
+ import type { AbortErrorCode, PluginContext } from "../../../entities/plugin/index.js";
3
+ import type { HoldOptions, HoldStub, StubHandle, StubOptions } from "../model/types.js";
4
+ import { type Recorder } from "./recorder.js";
5
+ import type { RpcRules } from "./rules.js";
6
+ /** Fail every call to a method at the network level. */
7
+ export declare function stubAbort<I extends DescMessage>(rules: RpcRules, recorder: Recorder, method: DescMethod & {
8
+ readonly input: I;
9
+ }, options: StubOptions<I> & {
10
+ readonly error?: AbortErrorCode;
11
+ }): Promise<StubHandle>;
12
+ /**
13
+ * Hold calls at the network boundary until the test decides each one. The
14
+ * returned `abandon` lets go of whatever is still held, for the stage's
15
+ * disposal: a route left undecided would keep its request open for good.
16
+ */
17
+ export declare function stubHold<I extends DescMessage, O extends DescMessage>(context: PluginContext, rules: RpcRules, recorder: Recorder, method: DescMethodUnary<I, O> | DescMethodServerStreaming<I, O>, options: HoldOptions<I>, pending: Set<() => void>): Promise<HoldStub<I, O>>;
18
+ //# sourceMappingURL=faults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faults.d.ts","sourceRoot":"","sources":["../../../../src/features/connect/lib/faults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,WAAW,EACX,UAAU,EACV,yBAAyB,EACzB,eAAe,EAGf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EACX,cAAc,EAEd,aAAa,EACb,MAAM,mCAAmC,CAAC;AAK3C,OAAO,KAAK,EAEX,WAAW,EACX,QAAQ,EACR,UAAU,EACV,WAAW,EACX,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,KAAK,EAAW,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGpD,wDAAwD;AACxD,wBAAsB,SAAS,CAAC,CAAC,SAAS,WAAW,EACpD,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,UAAU,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,EAC1C,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,CAAA;CAAE,GAC3D,OAAO,CAAC,UAAU,CAAC,CAarB;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,SAAS,WAAW,EAC1E,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,yBAAyB,CAAC,CAAC,EAAE,CAAC,CAAC,EAC/D,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,EACvB,OAAO,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,GACtB,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAqEzB"}
@@ -0,0 +1,85 @@
1
+ import { createArrivals, createDeferred, } from "../../../shared/lib/async/index.js";
2
+ import { endpointOf } from "./recorder.js";
3
+ import { failingImpl, handleOf } from "./stubs.js";
4
+ /** Fail every call to a method at the network level. */
5
+ export async function stubAbort(rules, recorder, method, options) {
6
+ const error = options.error ?? "failed";
7
+ return handleOf(await rules.add({
8
+ method,
9
+ label: `abort ${endpointOf(method)}`,
10
+ options,
11
+ respond(view) {
12
+ recorder.fault(rules.callOf(view), method, "abort", { error });
13
+ return { type: "abort", error };
14
+ },
15
+ }));
16
+ }
17
+ /**
18
+ * Hold calls at the network boundary until the test decides each one. The
19
+ * returned `abandon` lets go of whatever is still held, for the stage's
20
+ * disposal: a route left undecided would keep its request open for good.
21
+ */
22
+ export async function stubHold(context, rules, recorder, method, options, pending) {
23
+ const calls = createArrivals({
24
+ clock: context.clock,
25
+ label: `${endpointOf(method)} held call`,
26
+ });
27
+ const rule = await rules.add({
28
+ method,
29
+ label: `hold ${endpointOf(method)}`,
30
+ options,
31
+ observe: true,
32
+ async respond(view, [request]) {
33
+ const decision = createDeferred();
34
+ const carried = createDeferred();
35
+ /** The first decision stands; each resolves once it is carried out. */
36
+ const decide = (make) => {
37
+ decision.resolve(make);
38
+ return carried.promise;
39
+ };
40
+ const aborted = (error) => () => {
41
+ recorder.fault(rules.callOf(view), method, "abort", { error });
42
+ return { type: "abort", error };
43
+ };
44
+ const answered = (impl) => () => rules.answer(rules.handler(method, impl), method, view);
45
+ const abandon = () => void decide(aborted("aborted"));
46
+ pending.add(abandon);
47
+ calls.push({
48
+ request: request,
49
+ view,
50
+ release: () => decide(() => ({ type: "fallback" })),
51
+ reply: (message) => decide(answered((method.methodKind === "server_streaming"
52
+ ? async function* () {
53
+ yield message;
54
+ }
55
+ : async () => message))),
56
+ fail: (code, message) => decide(answered(failingImpl(method, code, message))),
57
+ abort: (error) => decide(aborted(error ?? "failed")),
58
+ });
59
+ try {
60
+ return await (await decision.promise)();
61
+ }
62
+ finally {
63
+ pending.delete(abandon);
64
+ carried.resolve();
65
+ }
66
+ },
67
+ });
68
+ return {
69
+ ...handleOf(rule),
70
+ get hits() {
71
+ return rule.hits;
72
+ },
73
+ next: (waitOptions) => calls.next(waitOptions),
74
+ get calls() {
75
+ return calls.items;
76
+ },
77
+ async releaseAll() {
78
+ // Removed first: a call on its way in as this runs is not the
79
+ // rule's any more, and goes straight on instead of being held.
80
+ await rule.remove();
81
+ await Promise.all(calls.items.map((call) => call.release()));
82
+ },
83
+ };
84
+ }
85
+ //# sourceMappingURL=faults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faults.js","sourceRoot":"","sources":["../../../../src/features/connect/lib/faults.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { type DescMessage, type JsonReadOptions, type MessageShape } from "@bufbuild/protobuf";
2
+ import type { HttpRequestView, PassthroughResponse } from "../../../entities/plugin/index.js";
3
+ import type { RpcProtocol } from "../model/types.js";
4
+ /** How one request (and so its response) is encoded on the wire. */
5
+ export interface WireFormat {
6
+ readonly protocol: RpcProtocol;
7
+ /** Protobuf binary, or JSON. */
8
+ readonly binary: boolean;
9
+ /** gRPC-web-text: the whole body is base64. */
10
+ readonly base64: boolean;
11
+ /** Length-prefixed envelopes (every protocol's streaming form). */
12
+ readonly enveloped: boolean;
13
+ }
14
+ /**
15
+ * Read the format off a request, the way a Connect server negotiates it.
16
+ * Undefined means "not an RPC this plugin understands" — a rule then falls
17
+ * through instead of mangling, say, a REST call that shares the path prefix.
18
+ */
19
+ export declare function detectFormat(request: Pick<HttpRequestView, "method" | "url" | "headers">): WireFormat | undefined;
20
+ export interface RpcStatus {
21
+ /** 0 is OK; otherwise the gRPC / Connect code number. */
22
+ readonly code: number;
23
+ readonly message: string;
24
+ }
25
+ export interface DecodedBody {
26
+ /** Message payloads, decompressed when the encoding is gzip. */
27
+ readonly messages: readonly Uint8Array[];
28
+ readonly status: RpcStatus | undefined;
29
+ }
30
+ /** The request's messages, from its body or (Connect GET) its query. */
31
+ export declare function decodeRequestBody(format: WireFormat, request: Pick<HttpRequestView, "url" | "headers" | "body">): Uint8Array[];
32
+ /** Messages and status from a response the real backend sent. */
33
+ export declare function decodeResponseBody(format: WireFormat, response: PassthroughResponse): DecodedBody;
34
+ /** Parse a message payload with the request's format. */
35
+ export declare function parseMessage<Desc extends DescMessage>(schema: Desc, bytes: Uint8Array, binary: boolean, jsonOptions?: Partial<JsonReadOptions>): MessageShape<Desc>;
36
+ /**
37
+ * Connect's `{ "code": "not_found", "message": "..." }` error body. A body
38
+ * that is not one came from something on the way, and the HTTP status is all
39
+ * there is to go by — which is how a Connect client reads it too.
40
+ */
41
+ export declare function connectError(body: Uint8Array, httpStatus: number): RpcStatus;
42
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../../src/features/connect/lib/protocol.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,KAAK,WAAW,EAGhB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,MAAM,oBAAoB,CAAC;AAQ5B,OAAO,KAAK,EACX,eAAe,EACf,mBAAmB,EACnB,MAAM,mCAAmC,CAAC;AAW3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,oEAAoE;AACpE,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,gCAAgC;IAChC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,+CAA+C;IAC/C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,mEAAmE;IACnE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC3B,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC,GAC1D,UAAU,GAAG,SAAS,CAqDxB;AAED,MAAM,WAAW,SAAS;IACzB,yDAAyD;IACzD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC3B,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,EAAE,SAAS,UAAU,EAAE,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;CACvC;AAID,wEAAwE;AACxE,wBAAgB,iBAAiB,CAChC,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,GAAG,SAAS,GAAG,MAAM,CAAC,GACxD,UAAU,EAAE,CAwBd;AAED,iEAAiE;AACjE,wBAAgB,kBAAkB,CACjC,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,mBAAmB,GAC3B,WAAW,CAqDb;AAED,yDAAyD;AACzD,wBAAgB,YAAY,CAAC,IAAI,SAAS,WAAW,EACpD,MAAM,EAAE,IAAI,EACZ,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,OAAO,EACf,WAAW,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GACpC,YAAY,CAAC,IAAI,CAAC,CAOpB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,CAW5E"}