@heojeongbo/wirestage 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (489) hide show
  1. package/LICENSE +21 -0
  2. package/LICENSES.md +21 -0
  3. package/README.md +150 -2
  4. package/dist/app/playwright/index.d.ts +3 -0
  5. package/dist/app/playwright/index.d.ts.map +1 -0
  6. package/dist/app/playwright/index.js +2 -0
  7. package/dist/app/playwright/index.js.map +1 -0
  8. package/dist/app/playwright/lib/fixture.d.ts +61 -0
  9. package/dist/app/playwright/lib/fixture.d.ts.map +1 -0
  10. package/dist/app/playwright/lib/fixture.js +110 -0
  11. package/dist/app/playwright/lib/fixture.js.map +1 -0
  12. package/dist/connect.d.ts +7 -0
  13. package/dist/connect.d.ts.map +1 -0
  14. package/dist/connect.js +7 -0
  15. package/dist/connect.js.map +1 -0
  16. package/dist/entities/frame/@x/plugin.d.ts +9 -0
  17. package/dist/entities/frame/@x/plugin.d.ts.map +1 -0
  18. package/dist/entities/frame/@x/plugin.js +2 -0
  19. package/dist/entities/frame/@x/plugin.js.map +1 -0
  20. package/dist/entities/frame/index.d.ts +6 -0
  21. package/dist/entities/frame/index.d.ts.map +1 -0
  22. package/dist/entities/frame/index.js +4 -0
  23. package/dist/entities/frame/index.js.map +1 -0
  24. package/dist/entities/frame/lib/filter.d.ts +8 -0
  25. package/dist/entities/frame/lib/filter.d.ts.map +1 -0
  26. package/dist/entities/frame/lib/filter.js +62 -0
  27. package/dist/entities/frame/lib/filter.js.map +1 -0
  28. package/dist/entities/frame/lib/payload.d.ts +8 -0
  29. package/dist/entities/frame/lib/payload.d.ts.map +1 -0
  30. package/dist/entities/frame/lib/payload.js +42 -0
  31. package/dist/entities/frame/lib/payload.js.map +1 -0
  32. package/dist/entities/frame/lib/snapshot.d.ts +15 -0
  33. package/dist/entities/frame/lib/snapshot.d.ts.map +1 -0
  34. package/dist/entities/frame/lib/snapshot.js +90 -0
  35. package/dist/entities/frame/lib/snapshot.js.map +1 -0
  36. package/dist/entities/frame/lib/timeline.d.ts +23 -0
  37. package/dist/entities/frame/lib/timeline.d.ts.map +1 -0
  38. package/dist/entities/frame/lib/timeline.js +122 -0
  39. package/dist/entities/frame/lib/timeline.js.map +1 -0
  40. package/dist/entities/frame/model/frame.d.ts +182 -0
  41. package/dist/entities/frame/model/frame.d.ts.map +1 -0
  42. package/dist/entities/frame/model/frame.js +2 -0
  43. package/dist/entities/frame/model/frame.js.map +1 -0
  44. package/dist/entities/plugin/index.d.ts +9 -0
  45. package/dist/entities/plugin/index.d.ts.map +1 -0
  46. package/dist/entities/plugin/index.js +3 -0
  47. package/dist/entities/plugin/index.js.map +1 -0
  48. package/dist/entities/plugin/lib/define-plugin.d.ts +8 -0
  49. package/dist/entities/plugin/lib/define-plugin.d.ts.map +1 -0
  50. package/dist/entities/plugin/lib/define-plugin.js +9 -0
  51. package/dist/entities/plugin/lib/define-plugin.js.map +1 -0
  52. package/dist/entities/plugin/lib/named.d.ts +10 -0
  53. package/dist/entities/plugin/lib/named.d.ts.map +1 -0
  54. package/dist/entities/plugin/lib/named.js +17 -0
  55. package/dist/entities/plugin/lib/named.js.map +1 -0
  56. package/dist/entities/plugin/model/attachment.d.ts +18 -0
  57. package/dist/entities/plugin/model/attachment.d.ts.map +1 -0
  58. package/dist/entities/plugin/model/attachment.js +2 -0
  59. package/dist/entities/plugin/model/attachment.js.map +1 -0
  60. package/dist/entities/plugin/model/http.d.ts +126 -0
  61. package/dist/entities/plugin/model/http.d.ts.map +1 -0
  62. package/dist/entities/plugin/model/http.js +2 -0
  63. package/dist/entities/plugin/model/http.js.map +1 -0
  64. package/dist/entities/plugin/model/page.d.ts +100 -0
  65. package/dist/entities/plugin/model/page.d.ts.map +1 -0
  66. package/dist/entities/plugin/model/page.js +2 -0
  67. package/dist/entities/plugin/model/page.js.map +1 -0
  68. package/dist/entities/plugin/model/plugin.d.ts +83 -0
  69. package/dist/entities/plugin/model/plugin.d.ts.map +1 -0
  70. package/dist/entities/plugin/model/plugin.js +2 -0
  71. package/dist/entities/plugin/model/plugin.js.map +1 -0
  72. package/dist/entities/plugin/model/socket.d.ts +102 -0
  73. package/dist/entities/plugin/model/socket.d.ts.map +1 -0
  74. package/dist/entities/plugin/model/socket.js +2 -0
  75. package/dist/entities/plugin/model/socket.js.map +1 -0
  76. package/dist/entities/plugin/model/stream.d.ts +43 -0
  77. package/dist/entities/plugin/model/stream.d.ts.map +1 -0
  78. package/dist/entities/plugin/model/stream.js +2 -0
  79. package/dist/entities/plugin/model/stream.js.map +1 -0
  80. package/dist/features/connect/index.d.ts +5 -0
  81. package/dist/features/connect/index.d.ts.map +1 -0
  82. package/dist/features/connect/index.js +4 -0
  83. package/dist/features/connect/index.js.map +1 -0
  84. package/dist/features/connect/lib/calls.d.ts +9 -0
  85. package/dist/features/connect/lib/calls.d.ts.map +1 -0
  86. package/dist/features/connect/lib/calls.js +46 -0
  87. package/dist/features/connect/lib/calls.js.map +1 -0
  88. package/dist/features/connect/lib/client.d.ts +33 -0
  89. package/dist/features/connect/lib/client.d.ts.map +1 -0
  90. package/dist/features/connect/lib/client.js +147 -0
  91. package/dist/features/connect/lib/client.js.map +1 -0
  92. package/dist/features/connect/lib/create-connect.d.ts +14 -0
  93. package/dist/features/connect/lib/create-connect.d.ts.map +1 -0
  94. package/dist/features/connect/lib/create-connect.js +124 -0
  95. package/dist/features/connect/lib/create-connect.js.map +1 -0
  96. package/dist/features/connect/lib/faults.d.ts +18 -0
  97. package/dist/features/connect/lib/faults.d.ts.map +1 -0
  98. package/dist/features/connect/lib/faults.js +85 -0
  99. package/dist/features/connect/lib/faults.js.map +1 -0
  100. package/dist/features/connect/lib/protocol.d.ts +42 -0
  101. package/dist/features/connect/lib/protocol.d.ts.map +1 -0
  102. package/dist/features/connect/lib/protocol.js +228 -0
  103. package/dist/features/connect/lib/protocol.js.map +1 -0
  104. package/dist/features/connect/lib/record.d.ts +14 -0
  105. package/dist/features/connect/lib/record.d.ts.map +1 -0
  106. package/dist/features/connect/lib/record.js +36 -0
  107. package/dist/features/connect/lib/record.js.map +1 -0
  108. package/dist/features/connect/lib/recorder.d.ts +77 -0
  109. package/dist/features/connect/lib/recorder.d.ts.map +1 -0
  110. package/dist/features/connect/lib/recorder.js +209 -0
  111. package/dist/features/connect/lib/recorder.js.map +1 -0
  112. package/dist/features/connect/lib/rules.d.ts +51 -0
  113. package/dist/features/connect/lib/rules.d.ts.map +1 -0
  114. package/dist/features/connect/lib/rules.js +222 -0
  115. package/dist/features/connect/lib/rules.js.map +1 -0
  116. package/dist/features/connect/lib/serve.d.ts +10 -0
  117. package/dist/features/connect/lib/serve.d.ts.map +1 -0
  118. package/dist/features/connect/lib/serve.js +78 -0
  119. package/dist/features/connect/lib/serve.js.map +1 -0
  120. package/dist/features/connect/lib/status-of.d.ts +11 -0
  121. package/dist/features/connect/lib/status-of.d.ts.map +1 -0
  122. package/dist/features/connect/lib/status-of.js +22 -0
  123. package/dist/features/connect/lib/status-of.js.map +1 -0
  124. package/dist/features/connect/lib/stubs.d.ts +18 -0
  125. package/dist/features/connect/lib/stubs.d.ts.map +1 -0
  126. package/dist/features/connect/lib/stubs.js +174 -0
  127. package/dist/features/connect/lib/stubs.js.map +1 -0
  128. package/dist/features/connect/lib/universal.d.ts +19 -0
  129. package/dist/features/connect/lib/universal.d.ts.map +1 -0
  130. package/dist/features/connect/lib/universal.js +71 -0
  131. package/dist/features/connect/lib/universal.js.map +1 -0
  132. package/dist/features/connect/model/types.d.ts +247 -0
  133. package/dist/features/connect/model/types.d.ts.map +1 -0
  134. package/dist/features/connect/model/types.js +2 -0
  135. package/dist/features/connect/model/types.js.map +1 -0
  136. package/dist/features/rest/index.d.ts +5 -0
  137. package/dist/features/rest/index.d.ts.map +1 -0
  138. package/dist/features/rest/index.js +3 -0
  139. package/dist/features/rest/index.js.map +1 -0
  140. package/dist/features/rest/lib/calls.d.ts +8 -0
  141. package/dist/features/rest/lib/calls.d.ts.map +1 -0
  142. package/dist/features/rest/lib/calls.js +32 -0
  143. package/dist/features/rest/lib/calls.js.map +1 -0
  144. package/dist/features/rest/lib/create-rest.d.ts +8 -0
  145. package/dist/features/rest/lib/create-rest.d.ts.map +1 -0
  146. package/dist/features/rest/lib/create-rest.js +136 -0
  147. package/dist/features/rest/lib/create-rest.js.map +1 -0
  148. package/dist/features/rest/lib/path.d.ts +14 -0
  149. package/dist/features/rest/lib/path.d.ts.map +1 -0
  150. package/dist/features/rest/lib/path.js +58 -0
  151. package/dist/features/rest/lib/path.js.map +1 -0
  152. package/dist/features/rest/lib/reply.d.ts +25 -0
  153. package/dist/features/rest/lib/reply.d.ts.map +1 -0
  154. package/dist/features/rest/lib/reply.js +40 -0
  155. package/dist/features/rest/lib/reply.js.map +1 -0
  156. package/dist/features/rest/model/types.d.ts +74 -0
  157. package/dist/features/rest/model/types.d.ts.map +1 -0
  158. package/dist/features/rest/model/types.js +2 -0
  159. package/dist/features/rest/model/types.js.map +1 -0
  160. package/dist/features/sse/index.d.ts +4 -0
  161. package/dist/features/sse/index.d.ts.map +1 -0
  162. package/dist/features/sse/index.js +3 -0
  163. package/dist/features/sse/index.js.map +1 -0
  164. package/dist/features/sse/lib/create-sse.d.ts +9 -0
  165. package/dist/features/sse/lib/create-sse.d.ts.map +1 -0
  166. package/dist/features/sse/lib/create-sse.js +120 -0
  167. package/dist/features/sse/lib/create-sse.js.map +1 -0
  168. package/dist/features/sse/lib/encode.d.ts +8 -0
  169. package/dist/features/sse/lib/encode.d.ts.map +1 -0
  170. package/dist/features/sse/lib/encode.js +29 -0
  171. package/dist/features/sse/lib/encode.js.map +1 -0
  172. package/dist/features/sse/model/types.d.ts +62 -0
  173. package/dist/features/sse/model/types.d.ts.map +1 -0
  174. package/dist/features/sse/model/types.js +2 -0
  175. package/dist/features/sse/model/types.js.map +1 -0
  176. package/dist/features/webrtc/index.d.ts +3 -0
  177. package/dist/features/webrtc/index.d.ts.map +1 -0
  178. package/dist/features/webrtc/index.js +2 -0
  179. package/dist/features/webrtc/index.js.map +1 -0
  180. package/dist/features/webrtc/lib/create-webrtc.d.ts +9 -0
  181. package/dist/features/webrtc/lib/create-webrtc.d.ts.map +1 -0
  182. package/dist/features/webrtc/lib/create-webrtc.js +123 -0
  183. package/dist/features/webrtc/lib/create-webrtc.js.map +1 -0
  184. package/dist/features/webrtc/lib/rtc-page-module.d.ts +22 -0
  185. package/dist/features/webrtc/lib/rtc-page-module.d.ts.map +1 -0
  186. package/dist/features/webrtc/lib/rtc-page-module.js +161 -0
  187. package/dist/features/webrtc/lib/rtc-page-module.js.map +1 -0
  188. package/dist/features/webrtc/lib/to-frame.d.ts +9 -0
  189. package/dist/features/webrtc/lib/to-frame.d.ts.map +1 -0
  190. package/dist/features/webrtc/lib/to-frame.js +43 -0
  191. package/dist/features/webrtc/lib/to-frame.js.map +1 -0
  192. package/dist/features/webrtc/model/types.d.ts +70 -0
  193. package/dist/features/webrtc/model/types.d.ts.map +1 -0
  194. package/dist/features/webrtc/model/types.js +2 -0
  195. package/dist/features/webrtc/model/types.js.map +1 -0
  196. package/dist/features/websocket/index.d.ts +3 -0
  197. package/dist/features/websocket/index.d.ts.map +1 -0
  198. package/dist/features/websocket/index.js +2 -0
  199. package/dist/features/websocket/index.js.map +1 -0
  200. package/dist/features/websocket/lib/create-websocket.d.ts +9 -0
  201. package/dist/features/websocket/lib/create-websocket.d.ts.map +1 -0
  202. package/dist/features/websocket/lib/create-websocket.js +34 -0
  203. package/dist/features/websocket/lib/create-websocket.js.map +1 -0
  204. package/dist/features/websocket/lib/mock.d.ts +6 -0
  205. package/dist/features/websocket/lib/mock.d.ts.map +1 -0
  206. package/dist/features/websocket/lib/mock.js +96 -0
  207. package/dist/features/websocket/lib/mock.js.map +1 -0
  208. package/dist/features/websocket/lib/proxy.d.ts +9 -0
  209. package/dist/features/websocket/lib/proxy.d.ts.map +1 -0
  210. package/dist/features/websocket/lib/proxy.js +107 -0
  211. package/dist/features/websocket/lib/proxy.js.map +1 -0
  212. package/dist/features/websocket/lib/wire.d.ts +16 -0
  213. package/dist/features/websocket/lib/wire.d.ts.map +1 -0
  214. package/dist/features/websocket/lib/wire.js +46 -0
  215. package/dist/features/websocket/lib/wire.js.map +1 -0
  216. package/dist/features/websocket/model/types.d.ts +129 -0
  217. package/dist/features/websocket/model/types.d.ts.map +1 -0
  218. package/dist/features/websocket/model/types.js +2 -0
  219. package/dist/features/websocket/model/types.js.map +1 -0
  220. package/dist/index.d.ts +27 -0
  221. package/dist/index.d.ts.map +1 -0
  222. package/dist/index.js +16 -0
  223. package/dist/index.js.map +1 -0
  224. package/dist/playwright.d.ts +4 -0
  225. package/dist/playwright.d.ts.map +1 -0
  226. package/dist/playwright.js +2 -0
  227. package/dist/playwright.js.map +1 -0
  228. package/dist/rest.d.ts +3 -0
  229. package/dist/rest.d.ts.map +1 -0
  230. package/dist/rest.js +3 -0
  231. package/dist/rest.js.map +1 -0
  232. package/dist/shared/api/http-server/index.d.ts +3 -0
  233. package/dist/shared/api/http-server/index.d.ts.map +1 -0
  234. package/dist/shared/api/http-server/index.js +2 -0
  235. package/dist/shared/api/http-server/index.js.map +1 -0
  236. package/dist/shared/api/http-server/listen.d.ts +25 -0
  237. package/dist/shared/api/http-server/listen.d.ts.map +1 -0
  238. package/dist/shared/api/http-server/listen.js +44 -0
  239. package/dist/shared/api/http-server/listen.js.map +1 -0
  240. package/dist/shared/api/playwright/index.d.ts +2 -0
  241. package/dist/shared/api/playwright/index.d.ts.map +1 -0
  242. package/dist/shared/api/playwright/index.js +2 -0
  243. package/dist/shared/api/playwright/index.js.map +1 -0
  244. package/dist/shared/api/playwright/ports.d.ts +117 -0
  245. package/dist/shared/api/playwright/ports.d.ts.map +1 -0
  246. package/dist/shared/api/playwright/ports.js +11 -0
  247. package/dist/shared/api/playwright/ports.js.map +1 -0
  248. package/dist/shared/api/stream-server/index.d.ts +3 -0
  249. package/dist/shared/api/stream-server/index.d.ts.map +1 -0
  250. package/dist/shared/api/stream-server/index.js +2 -0
  251. package/dist/shared/api/stream-server/index.js.map +1 -0
  252. package/dist/shared/api/stream-server/stream-server.d.ts +43 -0
  253. package/dist/shared/api/stream-server/stream-server.d.ts.map +1 -0
  254. package/dist/shared/api/stream-server/stream-server.js +160 -0
  255. package/dist/shared/api/stream-server/stream-server.js.map +1 -0
  256. package/dist/shared/lib/async/arrivals.d.ts +31 -0
  257. package/dist/shared/lib/async/arrivals.d.ts.map +1 -0
  258. package/dist/shared/lib/async/arrivals.js +57 -0
  259. package/dist/shared/lib/async/arrivals.js.map +1 -0
  260. package/dist/shared/lib/async/async-queue.d.ts +23 -0
  261. package/dist/shared/lib/async/async-queue.d.ts.map +1 -0
  262. package/dist/shared/lib/async/async-queue.js +80 -0
  263. package/dist/shared/lib/async/async-queue.js.map +1 -0
  264. package/dist/shared/lib/async/deferred.d.ts +12 -0
  265. package/dist/shared/lib/async/deferred.d.ts.map +1 -0
  266. package/dist/shared/lib/async/deferred.js +34 -0
  267. package/dist/shared/lib/async/deferred.js.map +1 -0
  268. package/dist/shared/lib/async/index.d.ts +8 -0
  269. package/dist/shared/lib/async/index.d.ts.map +1 -0
  270. package/dist/shared/lib/async/index.js +5 -0
  271. package/dist/shared/lib/async/index.js.map +1 -0
  272. package/dist/shared/lib/async/run-all.d.ts +8 -0
  273. package/dist/shared/lib/async/run-all.d.ts.map +1 -0
  274. package/dist/shared/lib/async/run-all.js +22 -0
  275. package/dist/shared/lib/async/run-all.js.map +1 -0
  276. package/dist/shared/lib/bytes/bytes.d.ts +18 -0
  277. package/dist/shared/lib/bytes/bytes.d.ts.map +1 -0
  278. package/dist/shared/lib/bytes/bytes.js +48 -0
  279. package/dist/shared/lib/bytes/bytes.js.map +1 -0
  280. package/dist/shared/lib/bytes/index.d.ts +3 -0
  281. package/dist/shared/lib/bytes/index.d.ts.map +1 -0
  282. package/dist/shared/lib/bytes/index.js +2 -0
  283. package/dist/shared/lib/bytes/index.js.map +1 -0
  284. package/dist/shared/lib/clock/clock.d.ts +29 -0
  285. package/dist/shared/lib/clock/clock.d.ts.map +1 -0
  286. package/dist/shared/lib/clock/clock.js +85 -0
  287. package/dist/shared/lib/clock/clock.js.map +1 -0
  288. package/dist/shared/lib/clock/index.d.ts +3 -0
  289. package/dist/shared/lib/clock/index.d.ts.map +1 -0
  290. package/dist/shared/lib/clock/index.js +2 -0
  291. package/dist/shared/lib/clock/index.js.map +1 -0
  292. package/dist/shared/lib/cookies/index.d.ts +3 -0
  293. package/dist/shared/lib/cookies/index.d.ts.map +1 -0
  294. package/dist/shared/lib/cookies/index.js +2 -0
  295. package/dist/shared/lib/cookies/index.js.map +1 -0
  296. package/dist/shared/lib/cookies/set-cookie.d.ts +22 -0
  297. package/dist/shared/lib/cookies/set-cookie.d.ts.map +1 -0
  298. package/dist/shared/lib/cookies/set-cookie.js +89 -0
  299. package/dist/shared/lib/cookies/set-cookie.js.map +1 -0
  300. package/dist/shared/lib/envelope/envelope.d.ts +50 -0
  301. package/dist/shared/lib/envelope/envelope.d.ts.map +1 -0
  302. package/dist/shared/lib/envelope/envelope.js +111 -0
  303. package/dist/shared/lib/envelope/envelope.js.map +1 -0
  304. package/dist/shared/lib/envelope/index.d.ts +3 -0
  305. package/dist/shared/lib/envelope/index.d.ts.map +1 -0
  306. package/dist/shared/lib/envelope/index.js +2 -0
  307. package/dist/shared/lib/envelope/index.js.map +1 -0
  308. package/dist/shared/lib/errors/index.d.ts +3 -0
  309. package/dist/shared/lib/errors/index.d.ts.map +1 -0
  310. package/dist/shared/lib/errors/index.js +2 -0
  311. package/dist/shared/lib/errors/index.js.map +1 -0
  312. package/dist/shared/lib/errors/wirestage-error.d.ts +28 -0
  313. package/dist/shared/lib/errors/wirestage-error.d.ts.map +1 -0
  314. package/dist/shared/lib/errors/wirestage-error.js +16 -0
  315. package/dist/shared/lib/errors/wirestage-error.js.map +1 -0
  316. package/dist/shared/lib/id/id.d.ts +10 -0
  317. package/dist/shared/lib/id/id.d.ts.map +1 -0
  318. package/dist/shared/lib/id/id.js +26 -0
  319. package/dist/shared/lib/id/id.js.map +1 -0
  320. package/dist/shared/lib/id/index.d.ts +2 -0
  321. package/dist/shared/lib/id/index.d.ts.map +1 -0
  322. package/dist/shared/lib/id/index.js +2 -0
  323. package/dist/shared/lib/id/index.js.map +1 -0
  324. package/dist/shared/lib/logger/index.d.ts +3 -0
  325. package/dist/shared/lib/logger/index.d.ts.map +1 -0
  326. package/dist/shared/lib/logger/index.js +2 -0
  327. package/dist/shared/lib/logger/index.js.map +1 -0
  328. package/dist/shared/lib/logger/logger.d.ts +46 -0
  329. package/dist/shared/lib/logger/logger.d.ts.map +1 -0
  330. package/dist/shared/lib/logger/logger.js +67 -0
  331. package/dist/shared/lib/logger/logger.js.map +1 -0
  332. package/dist/shared/lib/match/index.d.ts +3 -0
  333. package/dist/shared/lib/match/index.d.ts.map +1 -0
  334. package/dist/shared/lib/match/index.js +2 -0
  335. package/dist/shared/lib/match/index.js.map +1 -0
  336. package/dist/shared/lib/match/url-matcher.d.ts +27 -0
  337. package/dist/shared/lib/match/url-matcher.d.ts.map +1 -0
  338. package/dist/shared/lib/match/url-matcher.js +88 -0
  339. package/dist/shared/lib/match/url-matcher.js.map +1 -0
  340. package/dist/sse.d.ts +3 -0
  341. package/dist/sse.d.ts.map +1 -0
  342. package/dist/sse.js +3 -0
  343. package/dist/sse.js.map +1 -0
  344. package/dist/webrtc.d.ts +3 -0
  345. package/dist/webrtc.d.ts.map +1 -0
  346. package/dist/webrtc.js +3 -0
  347. package/dist/webrtc.js.map +1 -0
  348. package/dist/websocket.d.ts +3 -0
  349. package/dist/websocket.d.ts.map +1 -0
  350. package/dist/websocket.js +3 -0
  351. package/dist/websocket.js.map +1 -0
  352. package/dist/widgets/stage/index.d.ts +3 -0
  353. package/dist/widgets/stage/index.d.ts.map +1 -0
  354. package/dist/widgets/stage/index.js +2 -0
  355. package/dist/widgets/stage/index.js.map +1 -0
  356. package/dist/widgets/stage/lib/attached-context.d.ts +10 -0
  357. package/dist/widgets/stage/lib/attached-context.d.ts.map +1 -0
  358. package/dist/widgets/stage/lib/attached-context.js +2 -0
  359. package/dist/widgets/stage/lib/attached-context.js.map +1 -0
  360. package/dist/widgets/stage/lib/create-stage.d.ts +12 -0
  361. package/dist/widgets/stage/lib/create-stage.d.ts.map +1 -0
  362. package/dist/widgets/stage/lib/create-stage.js +248 -0
  363. package/dist/widgets/stage/lib/create-stage.js.map +1 -0
  364. package/dist/widgets/stage/lib/http-router.d.ts +35 -0
  365. package/dist/widgets/stage/lib/http-router.d.ts.map +1 -0
  366. package/dist/widgets/stage/lib/http-router.js +455 -0
  367. package/dist/widgets/stage/lib/http-router.js.map +1 -0
  368. package/dist/widgets/stage/lib/page-host.d.ts +36 -0
  369. package/dist/widgets/stage/lib/page-host.d.ts.map +1 -0
  370. package/dist/widgets/stage/lib/page-host.js +240 -0
  371. package/dist/widgets/stage/lib/page-host.js.map +1 -0
  372. package/dist/widgets/stage/lib/page-runtime.d.ts +93 -0
  373. package/dist/widgets/stage/lib/page-runtime.d.ts.map +1 -0
  374. package/dist/widgets/stage/lib/page-runtime.js +247 -0
  375. package/dist/widgets/stage/lib/page-runtime.js.map +1 -0
  376. package/dist/widgets/stage/lib/reads.d.ts +21 -0
  377. package/dist/widgets/stage/lib/reads.d.ts.map +1 -0
  378. package/dist/widgets/stage/lib/reads.js +97 -0
  379. package/dist/widgets/stage/lib/reads.js.map +1 -0
  380. package/dist/widgets/stage/lib/response-stream.d.ts +9 -0
  381. package/dist/widgets/stage/lib/response-stream.d.ts.map +1 -0
  382. package/dist/widgets/stage/lib/response-stream.js +56 -0
  383. package/dist/widgets/stage/lib/response-stream.js.map +1 -0
  384. package/dist/widgets/stage/lib/socket-router.d.ts +25 -0
  385. package/dist/widgets/stage/lib/socket-router.d.ts.map +1 -0
  386. package/dist/widgets/stage/lib/socket-router.js +204 -0
  387. package/dist/widgets/stage/lib/socket-router.js.map +1 -0
  388. package/dist/widgets/stage/model/stage.d.ts +86 -0
  389. package/dist/widgets/stage/model/stage.d.ts.map +1 -0
  390. package/dist/widgets/stage/model/stage.js +2 -0
  391. package/dist/widgets/stage/model/stage.js.map +1 -0
  392. package/package.json +140 -5
  393. package/src/app/playwright/index.ts +7 -0
  394. package/src/app/playwright/lib/fixture.ts +201 -0
  395. package/src/connect.ts +6 -0
  396. package/src/entities/frame/@x/plugin.ts +8 -0
  397. package/src/entities/frame/index.ts +19 -0
  398. package/src/entities/frame/lib/filter.ts +58 -0
  399. package/src/entities/frame/lib/payload.ts +42 -0
  400. package/src/entities/frame/lib/snapshot.ts +105 -0
  401. package/src/entities/frame/lib/timeline.ts +147 -0
  402. package/src/entities/frame/model/frame.ts +191 -0
  403. package/src/entities/plugin/index.ts +36 -0
  404. package/src/entities/plugin/lib/define-plugin.ts +12 -0
  405. package/src/entities/plugin/lib/named.ts +21 -0
  406. package/src/entities/plugin/model/attachment.ts +18 -0
  407. package/src/entities/plugin/model/http.ts +147 -0
  408. package/src/entities/plugin/model/page.ts +110 -0
  409. package/src/entities/plugin/model/plugin.ts +96 -0
  410. package/src/entities/plugin/model/socket.ts +108 -0
  411. package/src/entities/plugin/model/stream.ts +43 -0
  412. package/src/features/connect/index.ts +23 -0
  413. package/src/features/connect/lib/calls.ts +58 -0
  414. package/src/features/connect/lib/client.ts +203 -0
  415. package/src/features/connect/lib/create-connect.ts +164 -0
  416. package/src/features/connect/lib/faults.ts +132 -0
  417. package/src/features/connect/lib/protocol.ts +321 -0
  418. package/src/features/connect/lib/record.ts +48 -0
  419. package/src/features/connect/lib/recorder.ts +306 -0
  420. package/src/features/connect/lib/rules.ts +385 -0
  421. package/src/features/connect/lib/serve.ts +114 -0
  422. package/src/features/connect/lib/status-of.ts +20 -0
  423. package/src/features/connect/lib/stubs.ts +282 -0
  424. package/src/features/connect/lib/universal.ts +100 -0
  425. package/src/features/connect/model/types.ts +305 -0
  426. package/src/features/rest/index.ts +23 -0
  427. package/src/features/rest/lib/calls.ts +31 -0
  428. package/src/features/rest/lib/create-rest.ts +169 -0
  429. package/src/features/rest/lib/path.ts +70 -0
  430. package/src/features/rest/lib/reply.ts +74 -0
  431. package/src/features/rest/model/types.ts +113 -0
  432. package/src/features/sse/index.ts +10 -0
  433. package/src/features/sse/lib/create-sse.ts +128 -0
  434. package/src/features/sse/lib/encode.ts +28 -0
  435. package/src/features/sse/model/types.ts +66 -0
  436. package/src/features/webrtc/index.ts +6 -0
  437. package/src/features/webrtc/lib/create-webrtc.ts +149 -0
  438. package/src/features/webrtc/lib/rtc-page-module.ts +189 -0
  439. package/src/features/webrtc/lib/to-frame.ts +63 -0
  440. package/src/features/webrtc/model/types.ts +80 -0
  441. package/src/features/websocket/index.ts +15 -0
  442. package/src/features/websocket/lib/create-websocket.ts +41 -0
  443. package/src/features/websocket/lib/mock.ts +114 -0
  444. package/src/features/websocket/lib/proxy.ts +141 -0
  445. package/src/features/websocket/lib/wire.ts +78 -0
  446. package/src/features/websocket/model/types.ts +130 -0
  447. package/src/index.ts +111 -0
  448. package/src/playwright.ts +8 -0
  449. package/src/rest.ts +2 -0
  450. package/src/shared/api/http-server/index.ts +2 -0
  451. package/src/shared/api/http-server/listen.ts +71 -0
  452. package/src/shared/api/playwright/index.ts +17 -0
  453. package/src/shared/api/playwright/ports.ts +145 -0
  454. package/src/shared/api/stream-server/index.ts +7 -0
  455. package/src/shared/api/stream-server/stream-server.ts +246 -0
  456. package/src/shared/lib/async/arrivals.ts +91 -0
  457. package/src/shared/lib/async/async-queue.ts +101 -0
  458. package/src/shared/lib/async/deferred.ts +38 -0
  459. package/src/shared/lib/async/index.ts +11 -0
  460. package/src/shared/lib/async/run-all.ts +19 -0
  461. package/src/shared/lib/bytes/bytes.ts +53 -0
  462. package/src/shared/lib/bytes/index.ts +9 -0
  463. package/src/shared/lib/clock/clock.ts +114 -0
  464. package/src/shared/lib/clock/index.ts +2 -0
  465. package/src/shared/lib/cookies/index.ts +2 -0
  466. package/src/shared/lib/cookies/set-cookie.ts +105 -0
  467. package/src/shared/lib/envelope/envelope.ts +133 -0
  468. package/src/shared/lib/envelope/index.ts +9 -0
  469. package/src/shared/lib/errors/index.ts +5 -0
  470. package/src/shared/lib/errors/wirestage-error.ts +50 -0
  471. package/src/shared/lib/id/id.ts +29 -0
  472. package/src/shared/lib/id/index.ts +1 -0
  473. package/src/shared/lib/logger/index.ts +12 -0
  474. package/src/shared/lib/logger/logger.ts +126 -0
  475. package/src/shared/lib/match/index.ts +6 -0
  476. package/src/shared/lib/match/url-matcher.ts +107 -0
  477. package/src/sse.ts +2 -0
  478. package/src/webrtc.ts +2 -0
  479. package/src/websocket.ts +2 -0
  480. package/src/widgets/stage/index.ts +9 -0
  481. package/src/widgets/stage/lib/attached-context.ts +10 -0
  482. package/src/widgets/stage/lib/create-stage.ts +305 -0
  483. package/src/widgets/stage/lib/http-router.ts +620 -0
  484. package/src/widgets/stage/lib/page-host.ts +375 -0
  485. package/src/widgets/stage/lib/page-runtime.ts +314 -0
  486. package/src/widgets/stage/lib/reads.ts +128 -0
  487. package/src/widgets/stage/lib/response-stream.ts +66 -0
  488. package/src/widgets/stage/lib/socket-router.ts +271 -0
  489. package/src/widgets/stage/model/stage.ts +108 -0
@@ -0,0 +1,71 @@
1
+ import { concatBytes } from "../../../shared/lib/bytes/index.js";
2
+ import { WirestageError } from "../../../shared/lib/errors/index.js";
3
+ /** A Playwright request, as the request Connect's handlers expect. */
4
+ export function toUniversalRequest(view, contextValues, signal = new AbortController().signal) {
5
+ const body = view.body();
6
+ return {
7
+ httpVersion: "1.1",
8
+ url: view.url.href,
9
+ method: view.method,
10
+ header: new Headers(view.headers),
11
+ body: (async function* () {
12
+ if (body.byteLength > 0)
13
+ yield body;
14
+ })(),
15
+ signal,
16
+ contextValues,
17
+ };
18
+ }
19
+ /**
20
+ * A response's headers as a plain record. `set-cookie` keeps every value,
21
+ * one per line, which is how a route and a Node response take several.
22
+ */
23
+ function headersOf(response) {
24
+ const headers = {};
25
+ response.header?.forEach((value, name) => {
26
+ headers[name] = value;
27
+ });
28
+ const cookies = response.header?.getSetCookie() ?? [];
29
+ if (cookies.length > 1)
30
+ headers["set-cookie"] = cookies.join("\n");
31
+ return headers;
32
+ }
33
+ /**
34
+ * Connect and gRPC-web carry their trailers in the headers or the body; only
35
+ * native gRPC needs HTTP trailers, which neither a route nor the stream
36
+ * server sends — and which a browser could not have asked for anyway.
37
+ */
38
+ function refuseTrailers(response) {
39
+ let trailers = 0;
40
+ response.trailer?.forEach(() => {
41
+ trailers += 1;
42
+ });
43
+ if (trailers > 0)
44
+ throw new WirestageError("UNSUPPORTED", "this response needs HTTP trailers (native gRPC), which a browser route cannot send; use serve() for gRPC clients");
45
+ }
46
+ /** Read a handler's whole response, for `route.fulfill`. */
47
+ export async function collectResponse(response) {
48
+ const chunks = [];
49
+ for await (const chunk of response.body ?? [])
50
+ chunks.push(chunk);
51
+ refuseTrailers(response);
52
+ return {
53
+ status: response.status,
54
+ headers: headersOf(response),
55
+ body: concatBytes(chunks),
56
+ };
57
+ }
58
+ /**
59
+ * Write a handler's response to an open stream as the handler produces it:
60
+ * the head with the first chunk, as a real Connect server sends it, and each
61
+ * message as soon as the implementation yields it.
62
+ */
63
+ export async function pipeResponse(response, stream) {
64
+ stream.head(response.status, headersOf(response));
65
+ // A streaming handler always answers with a body, error trailers included.
66
+ for await (const chunk of response.body)
67
+ await stream.write(chunk);
68
+ refuseTrailers(response);
69
+ await stream.end();
70
+ }
71
+ //# sourceMappingURL=universal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"universal.js","sourceRoot":"","sources":["../../../../src/features/connect/lib/universal.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAErE,sEAAsE;AACtE,MAAM,UAAU,kBAAkB,CACjC,IAAqB,EACrB,aAA4B,EAC5B,SAAsB,IAAI,eAAe,EAAE,CAAC,MAAM;IAElD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACzB,OAAO;QACN,WAAW,EAAE,KAAK;QAClB,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI;QAClB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,MAAM,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QACjC,IAAI,EAAE,CAAC,KAAK,SAAS,CAAC;YACrB,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC;gBAAE,MAAM,IAAI,CAAC;QACrC,CAAC,CAAC,EAAE;QACJ,MAAM;QACN,aAAa;KACb,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,SAAS,CAAC,QAAiC;IACnD,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACxC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IACvB,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IACtD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnE,OAAO,OAAO,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc,CAAC,QAAiC;IACxD,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE;QAC9B,QAAQ,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IACH,IAAI,QAAQ,GAAG,CAAC;QACf,MAAM,IAAI,cAAc,CACvB,aAAa,EACb,kHAAkH,CAClH,CAAC;AACJ,CAAC;AAQD,4DAA4D;AAC5D,MAAM,CAAC,KAAK,UAAU,eAAe,CACpC,QAAiC;IAEjC,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,QAAQ,CAAC,IAAI,IAAI,EAAE;QAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClE,cAAc,CAAC,QAAQ,CAAC,CAAC;IACzB,OAAO;QACN,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC;QAC5B,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC;KACzB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CACjC,QAAiC,EACjC,MAAsB;IAEtB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClD,2EAA2E;IAC3E,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,QAAQ,CAAC,IAAiC;QACnE,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3B,cAAc,CAAC,QAAQ,CAAC,CAAC;IACzB,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;AACpB,CAAC"}
@@ -0,0 +1,247 @@
1
+ import type { DescMessage, DescMethod, DescMethodServerStreaming, DescMethodUnary, DescService, JsonReadOptions, JsonWriteOptions, MessageInitShape, MessageShape } from "@bufbuild/protobuf";
2
+ import type { Client, Code, ConnectRouter, HandlerContext, ServiceImpl } from "@connectrpc/connect";
3
+ import type { Frame, FrameSource } from "../../../entities/frame/index.js";
4
+ import type { AbortErrorCode, HttpRequestView, StreamEnd as ResponseEnd } from "../../../entities/plugin/index.js";
5
+ import type { CookieJarPort } from "../../../shared/api/playwright/index.js";
6
+ /** The three wire protocols connect-es speaks. Browsers use the first two. */
7
+ export type RpcProtocol = "connect" | "grpc-web" | "grpc";
8
+ export interface ConnectOptions {
9
+ /**
10
+ * What the app's transport puts in front of `/<package>.<Service>/<Method>`:
11
+ * a path prefix (`/api`) on any origin, or an origin with one
12
+ * (`https://api.example.test/rpc`). Without it a stub matches that suffix
13
+ * under any prefix. It is also where `client()` calls by default.
14
+ */
15
+ readonly baseURL?: string;
16
+ /**
17
+ * Protocols stubs answer. Default: connect and grpc-web — the two a browser
18
+ * can speak. A call in another protocol passes every stub by. Native gRPC
19
+ * is for `serve()`.
20
+ */
21
+ readonly protocols?: readonly RpcProtocol[];
22
+ /**
23
+ * Services whose traffic is recorded and decoded even when nothing stubs
24
+ * it, so `calls()` sees the real backend's answers too.
25
+ */
26
+ readonly record?: readonly DescService[];
27
+ /**
28
+ * `live` (default) answers server streams from a local server, message by
29
+ * message, as the stub produces them. `buffered` collects the whole stream
30
+ * and fulfills it at once — the only choice on an https page without
31
+ * `streamServer.tls`, and only useful for streams that end.
32
+ */
33
+ readonly streaming?: "live" | "buffered";
34
+ /** The protocol `client()` uses by default. Default `connect`. */
35
+ readonly clientProtocol?: RpcProtocol;
36
+ readonly jsonOptions?: Partial<JsonReadOptions & JsonWriteOptions>;
37
+ }
38
+ export interface HoldOptions<I extends DescMessage = DescMessage> {
39
+ /** Take this many calls, then leave the rest to the next rule. */
40
+ readonly times?: number;
41
+ /**
42
+ * Take only the calls this accepts; the rest go on to the next rule, or to
43
+ * the real backend. Gets the decoded request message, and the raw request
44
+ * for its headers. A request that does not decode never matches.
45
+ */
46
+ readonly match?: (request: MessageShape<I>, view: HttpRequestView) => boolean;
47
+ }
48
+ export interface StubOptions<I extends DescMessage = DescMessage> extends HoldOptions<I> {
49
+ /** Wait this long before answering. */
50
+ readonly delayMs?: number;
51
+ }
52
+ export interface StubHandle {
53
+ /** Calls this stub took. */
54
+ readonly hits: number;
55
+ remove(): Promise<void>;
56
+ }
57
+ export type UnaryReply<I extends DescMessage, O extends DescMessage> = MessageInitShape<O> | ((request: MessageShape<I>, context: HandlerContext) => MessageInitShape<O> | Promise<MessageInitShape<O>>);
58
+ export interface UnaryStub<I extends DescMessage> extends StubHandle {
59
+ /** Requests received so far, decoded. */
60
+ readonly requests: readonly MessageShape<I>[];
61
+ /** The next request this stub receives (or already received and nobody took). */
62
+ next(options?: {
63
+ readonly timeout?: number;
64
+ }): Promise<MessageShape<I>>;
65
+ }
66
+ /**
67
+ * How a test-driven stream ended: cleanly, with an error status (`failed`),
68
+ * reset by the test (`cut`), or let go of by the page (`cancelled`).
69
+ */
70
+ export type StreamEnd = ResponseEnd | "failed";
71
+ export interface StreamCall<I extends DescMessage, O extends DescMessage> {
72
+ readonly request: MessageShape<I>;
73
+ readonly requestHeaders: Headers;
74
+ /** The protocol the page called with; undefined for an unidentified call. */
75
+ readonly protocol: RpcProtocol | undefined;
76
+ /**
77
+ * Send a message. Messages go out in order; this resolves once the
78
+ * message is written, and rejects with `CLOSED` when the stream ended
79
+ * before it was.
80
+ */
81
+ send(message: MessageInitShape<O>): Promise<void>;
82
+ /** End with OK. Resolves once the stream is over. */
83
+ end(): Promise<void>;
84
+ /** End with an error status. Resolves once the stream is over. */
85
+ fail(code: Code, message?: string): Promise<void>;
86
+ /**
87
+ * Reset the connection mid-stream: no status, no trailer — what a network
88
+ * drop looks like to the client. Recorded as a `cut` fault, not a status.
89
+ */
90
+ cut(): Promise<void>;
91
+ readonly closed: Promise<StreamEnd>;
92
+ }
93
+ export interface StreamStub<I extends DescMessage, O extends DescMessage> extends StubHandle {
94
+ /** The next call the page opens (or already opened and nobody took). */
95
+ next(options?: {
96
+ readonly timeout?: number;
97
+ }): Promise<StreamCall<I, O>>;
98
+ readonly calls: readonly StreamCall<I, O>[];
99
+ /** Send to every open call. */
100
+ broadcast(message: MessageInitShape<O>): Promise<void>;
101
+ }
102
+ /**
103
+ * A call held at the network boundary until the test decides. Each decision
104
+ * resolves once it is carried out, so `calls()` right after one sees it; the
105
+ * first decision stands and later ones do nothing.
106
+ */
107
+ export interface HeldCall<I extends DescMessage, O extends DescMessage> {
108
+ readonly request: MessageShape<I> | undefined;
109
+ readonly view: HttpRequestView;
110
+ /**
111
+ * Let it go on: to the next rule that matches it, and to the real backend
112
+ * when there is none.
113
+ */
114
+ release(): Promise<void>;
115
+ /** Answer it with this message. */
116
+ reply(message: MessageInitShape<O>): Promise<void>;
117
+ /** Answer it with an error status. */
118
+ fail(code: Code, message?: string): Promise<void>;
119
+ /** Fail it at the network level. */
120
+ abort(error?: AbortErrorCode): Promise<void>;
121
+ }
122
+ export interface HoldStub<I extends DescMessage, O extends DescMessage> extends StubHandle {
123
+ next(options?: {
124
+ readonly timeout?: number;
125
+ }): Promise<HeldCall<I, O>>;
126
+ readonly calls: readonly HeldCall<I, O>[];
127
+ /**
128
+ * Stop holding: every call held so far goes on, and so does every later
129
+ * one. A call already decided stays decided.
130
+ */
131
+ releaseAll(): Promise<void>;
132
+ }
133
+ /** One recorded RPC, reassembled from its frames. */
134
+ export interface RpcCall<I extends DescMessage, O extends DescMessage> {
135
+ readonly correlation: string;
136
+ /**
137
+ * Who made the call: `page`, `test` for a drive client, `network` for a
138
+ * client outside the browser calling a served fake. Undefined when the
139
+ * request never read as an RPC.
140
+ */
141
+ readonly caller: FrameSource | undefined;
142
+ /**
143
+ * Who answered: `stub`, `network` for the real backend, `server` for a
144
+ * served fake. Undefined while nobody has.
145
+ */
146
+ readonly answeredBy: FrameSource | undefined;
147
+ /** The page that made the call (`p1`, ...); undefined for a drive client's. */
148
+ readonly page: string | undefined;
149
+ /** Its browser context (`c1`, ...); undefined for a drive client's. */
150
+ readonly context: string | undefined;
151
+ readonly protocol: RpcProtocol | undefined;
152
+ /** The first request message. */
153
+ readonly request: MessageShape<I> | undefined;
154
+ readonly requests: readonly MessageShape<I>[];
155
+ readonly responses: readonly MessageShape<O>[];
156
+ /** Undefined while the call is open, and when it ended in a fault. Code 0 is OK. */
157
+ readonly status: {
158
+ readonly code: number;
159
+ readonly message: string;
160
+ } | undefined;
161
+ /**
162
+ * Why the call ended without a status: `abort` (a stub failed it), `cut`
163
+ * (the test reset the stream), `cancelled` (the page let go), `network`
164
+ * (the connection to the real backend failed).
165
+ */
166
+ readonly fault: string | undefined;
167
+ readonly frames: readonly Frame[];
168
+ }
169
+ export interface ClientOptions {
170
+ /** Absolute, or a path resolved against the stage's base URL. */
171
+ readonly baseURL?: string;
172
+ readonly protocol?: RpcProtocol;
173
+ /** Protobuf binary (default) or JSON on the wire. */
174
+ readonly binary?: boolean;
175
+ /** Sent with every call that does not set the header itself. */
176
+ readonly headers?: Readonly<Record<string, string>>;
177
+ /**
178
+ * Share a browser context's cookie jar: its cookies go out on the call, so
179
+ * the call is made as the signed-in page, and the cookies a response sets
180
+ * — an error response included — are kept in it. Pass the context.
181
+ * Defaults to the first attached context; `null` uses none.
182
+ */
183
+ readonly session?: CookieJarPort | null;
184
+ /** Accept self-signed certificates (dev servers). */
185
+ readonly ignoreHttpsErrors?: boolean;
186
+ }
187
+ export interface StandaloneClientOptions extends Omit<ClientOptions, "baseURL" | "session"> {
188
+ readonly baseURL: string;
189
+ readonly session?: CookieJarPort;
190
+ }
191
+ export interface ServeOptions {
192
+ /** 0, the default, picks a free port. A fixed port fails loudly when taken. */
193
+ readonly port?: number;
194
+ readonly host?: string;
195
+ /** Protocols served. Default all three. */
196
+ readonly protocols?: readonly RpcProtocol[];
197
+ /**
198
+ * HTTP/2 (h2c). Required by native gRPC clients; an HTTP/1.1-only client
199
+ * (grpc-web, Connect over 1.1) needs it off. Default: on when `protocols`
200
+ * includes grpc.
201
+ */
202
+ readonly http2?: boolean;
203
+ }
204
+ export interface RpcServer {
205
+ readonly url: string;
206
+ readonly port: number;
207
+ close(): Promise<void>;
208
+ }
209
+ export interface ConnectApi {
210
+ /**
211
+ * Stub a whole service, or the methods of it that `impl` defines. A
212
+ * method a browser cannot call (client or bidirectional streaming) is
213
+ * refused: `serve()` is where those are faked.
214
+ */
215
+ service<S extends DescService>(service: S, impl: Partial<ServiceImpl<S>>, options?: StubOptions): Promise<StubHandle>;
216
+ /** Stub one unary method with a message or a function of the request. */
217
+ unary<I extends DescMessage, O extends DescMessage>(method: DescMethodUnary<I, O>, reply: UnaryReply<I, O>, options?: StubOptions<I>): Promise<UnaryStub<I>>;
218
+ /** Stub one server-streaming method and drive it from the test. */
219
+ stream<I extends DescMessage, O extends DescMessage>(method: DescMethodServerStreaming<I, O>, options?: StubOptions<I>): Promise<StreamStub<I, O>>;
220
+ /** Answer every call to `method` with an error status. */
221
+ fail<I extends DescMessage>(method: DescMethod & {
222
+ readonly input: I;
223
+ }, code: Code, message?: string, options?: StubOptions<I>): Promise<StubHandle>;
224
+ /** Fail every call to `method` at the network level. */
225
+ abort<I extends DescMessage>(method: DescMethod & {
226
+ readonly input: I;
227
+ }, options?: StubOptions<I> & {
228
+ readonly error?: AbortErrorCode;
229
+ }): Promise<StubHandle>;
230
+ /** Hold calls until the test releases, answers or aborts each one. */
231
+ hold<I extends DescMessage, O extends DescMessage>(method: DescMethodUnary<I, O> | DescMethodServerStreaming<I, O>, options?: HoldOptions<I>): Promise<HoldStub<I, O>>;
232
+ /** Record and decode calls to this service without answering them. */
233
+ record(service: DescService): Promise<StubHandle>;
234
+ /** Every recorded call to `method`, oldest first. */
235
+ calls<I extends DescMessage, O extends DescMessage>(method: DescMethod & {
236
+ readonly input: I;
237
+ readonly output: O;
238
+ }): Promise<RpcCall<I, O>[]>;
239
+ /** A typed client for the real backend, signed in as the page. */
240
+ client<S extends DescService>(service: S, options?: ClientOptions): Client<S>;
241
+ /**
242
+ * Serve stubs on a port of their own, for clients outside the browser — a
243
+ * native gRPC client, a backend service under test. Calls are recorded.
244
+ */
245
+ serve(routes: (router: ConnectRouter) => void, options?: ServeOptions): Promise<RpcServer>;
246
+ }
247
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/features/connect/model/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/features/connect/model/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ export { rest } from "./lib/create-rest.js";
2
+ export type { ReplyInit } from "./lib/reply.js";
3
+ export { abort, bytes, delay, empty, json, passthrough, text, } from "./lib/reply.js";
4
+ export type { RestApi, RestCall, RestMethod, RestOptions, RestPath, RestReply, RestRequest, RestResolver, RestRoute, RestRouteOptions, } from "./model/types.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/features/rest/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EACN,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,IAAI,EACJ,WAAW,EACX,IAAI,GACJ,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACX,OAAO,EACP,QAAQ,EACR,UAAU,EACV,WAAW,EACX,QAAQ,EACR,SAAS,EACT,WAAW,EACX,YAAY,EACZ,SAAS,EACT,gBAAgB,GAChB,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { rest } from "./lib/create-rest.js";
2
+ export { abort, bytes, delay, empty, json, passthrough, text, } from "./lib/reply.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/features/rest/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE5C,OAAO,EACN,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,IAAI,EACJ,WAAW,EACX,IAAI,GACJ,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { Frame } from "../../../entities/frame/index.js";
2
+ import type { RestCall } from "../model/types.js";
3
+ /**
4
+ * Pair each recorded request with how it ended. One call per exchange,
5
+ * oldest first; a frame with no correlation is an exchange of its own.
6
+ */
7
+ export declare function assembleCalls(frames: readonly Frame[]): RestCall[];
8
+ //# sourceMappingURL=calls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calls.d.ts","sourceRoot":"","sources":["../../../../src/features/rest/lib/calls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,GAAG,QAAQ,EAAE,CAuBlE"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Pair each recorded request with how it ended. One call per exchange,
3
+ * oldest first; a frame with no correlation is an exchange of its own.
4
+ */
5
+ export function assembleCalls(frames) {
6
+ const byCall = new Map();
7
+ for (const frame of frames) {
8
+ const key = frame.correlation ?? `#${frame.seq}`;
9
+ const entry = byCall.get(key) ?? {};
10
+ if (frame.kind === "request")
11
+ entry.request = frame;
12
+ else
13
+ entry.end = frame;
14
+ byCall.set(key, entry);
15
+ }
16
+ const calls = [];
17
+ for (const [correlation, { request, end }] of byCall) {
18
+ if (request === undefined)
19
+ continue;
20
+ const status = end?.meta["status"];
21
+ calls.push({
22
+ correlation,
23
+ method: String(request.meta["method"]),
24
+ url: String(request.meta["url"]),
25
+ request,
26
+ response: end?.kind === "response" ? end : undefined,
27
+ status: typeof status === "number" ? status : undefined,
28
+ });
29
+ }
30
+ return calls;
31
+ }
32
+ //# sourceMappingURL=calls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calls.js","sourceRoot":"","sources":["../../../../src/features/rest/lib/calls.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,MAAwB;IACrD,MAAM,MAAM,GAAG,IAAI,GAAG,EAA4C,CAAC;IACnE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,IAAI,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;YAAE,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;;YAC/C,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC;QACvB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC;IACD,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC;QACtD,IAAI,OAAO,KAAK,SAAS;YAAE,SAAS;QACpC,MAAM,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC;YACV,WAAW;YACX,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChC,OAAO;YACP,QAAQ,EAAE,GAAG,EAAE,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;YACpD,MAAM,EAAE,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;SACvD,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type WirePlugin } from "../../../entities/plugin/index.js";
2
+ import type { RestApi, RestOptions } from "../model/types.js";
3
+ /**
4
+ * REST and other plain HTTP: routes by method and path with `:params`, replies
5
+ * built from small helpers, faults, and recording of the real responses.
6
+ */
7
+ export declare function rest(options?: RestOptions): WirePlugin<"rest", RestApi>;
8
+ //# sourceMappingURL=create-rest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-rest.d.ts","sourceRoot":"","sources":["../../../../src/features/rest/lib/create-rest.ts"],"names":[],"mappings":"AAAA,OAAO,EAIN,KAAK,UAAU,EACf,MAAM,mCAAmC,CAAC;AAE3C,OAAO,KAAK,EACX,OAAO,EAEP,WAAW,EAGX,MAAM,mBAAmB,CAAC;AAI3B;;;GAGG;AACH,wBAAgB,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAmJ3E"}
@@ -0,0 +1,136 @@
1
+ import { definePlugin, } from "../../../entities/plugin/index.js";
2
+ import { createArrivals } from "../../../shared/lib/async/index.js";
3
+ import { assembleCalls } from "./calls.js";
4
+ import { compilePath } from "./path.js";
5
+ /**
6
+ * REST and other plain HTTP: routes by method and path with `:params`, replies
7
+ * built from small helpers, faults, and recording of the real responses.
8
+ */
9
+ export function rest(options = {}) {
10
+ return definePlugin({
11
+ name: "rest",
12
+ scope: "Rest",
13
+ setup(context) {
14
+ const { name } = context;
15
+ /** The record rule being added, once: every context gets it. */
16
+ let recording;
17
+ const toOutcome = async (reply) => {
18
+ switch (reply.kind) {
19
+ case "response":
20
+ return {
21
+ type: "fulfill",
22
+ status: reply.status,
23
+ headers: reply.headers,
24
+ ...(reply.body === undefined ? {} : { body: reply.body }),
25
+ };
26
+ case "passthrough":
27
+ return { type: "fallback" };
28
+ case "abort":
29
+ return { type: "abort", error: reply.error };
30
+ case "delay":
31
+ await context.clock.sleep(reply.ms);
32
+ return toOutcome(reply.reply);
33
+ }
34
+ };
35
+ const on = async (method, path, resolver, routeOptions = {}) => {
36
+ const matcher = compilePath(path, options.baseURL);
37
+ // Own, enumerable fields: a request spreads and prints whole.
38
+ const toRequest = (view) => ({
39
+ get correlation() {
40
+ return view.correlation;
41
+ },
42
+ method: view.method,
43
+ url: view.url,
44
+ headers: view.headers,
45
+ page: view.page,
46
+ context: view.context,
47
+ resourceType: view.resourceType,
48
+ body: view.body,
49
+ text: view.text,
50
+ json: view.json,
51
+ // The rule's URL predicate is this matcher, so it matched.
52
+ params: matcher.match(view.url),
53
+ query: view.url.searchParams,
54
+ });
55
+ const label = `${method} ${String(path)}`;
56
+ const requests = createArrivals({
57
+ clock: context.clock,
58
+ label: `${label} request`,
59
+ });
60
+ const { match } = routeOptions;
61
+ const rule = await context.http.add({
62
+ protocol: name,
63
+ label,
64
+ url: (url) => matcher.match(url) !== undefined,
65
+ ...(method === "*" ? {} : { method }),
66
+ ...(routeOptions.times === undefined
67
+ ? {}
68
+ : { times: routeOptions.times }),
69
+ ...(match === undefined
70
+ ? {}
71
+ : { match: (view) => match(toRequest(view)) }),
72
+ handle: async (view) => {
73
+ const request = toRequest(view);
74
+ requests.push(request);
75
+ return toOutcome(typeof resolver === "function"
76
+ ? await resolver(request)
77
+ : resolver);
78
+ },
79
+ });
80
+ return {
81
+ get hits() {
82
+ return rule.hits;
83
+ },
84
+ get requests() {
85
+ return requests.items;
86
+ },
87
+ next: (waitOptions) => requests.next(waitOptions),
88
+ remove: () => rule.remove(),
89
+ };
90
+ };
91
+ const verb = (method) => (path, resolver, routeOptions) => on(method, path, resolver, routeOptions);
92
+ const api = {
93
+ on,
94
+ get: verb("GET"),
95
+ post: verb("POST"),
96
+ put: verb("PUT"),
97
+ patch: verb("PATCH"),
98
+ delete: verb("DELETE"),
99
+ async calls(filter = {}) {
100
+ await context.sync();
101
+ const matcher = filter.path === undefined
102
+ ? undefined
103
+ : compilePath(filter.path, options.baseURL);
104
+ const wanted = filter.method?.toUpperCase();
105
+ return assembleCalls(context.timeline.frames({ protocol: name })).filter((call) => (wanted === undefined || wanted === call.method) &&
106
+ (matcher === undefined ||
107
+ matcher.match(new URL(call.url)) !== undefined));
108
+ },
109
+ };
110
+ return {
111
+ api,
112
+ async attach() {
113
+ if (options.record === undefined || options.record === false)
114
+ return;
115
+ const base = compilePath(`${options.baseURL ?? ""}/**`, undefined);
116
+ recording ??= context.http
117
+ .add({
118
+ protocol: name,
119
+ label: "record",
120
+ url: options.record === true
121
+ ? (url) => base.match(url) !== undefined
122
+ : options.record,
123
+ handle: () => ({ type: "fallback" }),
124
+ })
125
+ .catch((error) => {
126
+ // The router took the rule back: the next attach adds it again.
127
+ recording = undefined;
128
+ throw error;
129
+ });
130
+ await recording;
131
+ },
132
+ };
133
+ },
134
+ });
135
+ }
136
+ //# sourceMappingURL=create-rest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-rest.js","sourceRoot":"","sources":["../../../../src/features/rest/lib/create-rest.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,YAAY,GAIZ,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAQpE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC;;;GAGG;AACH,MAAM,UAAU,IAAI,CAAC,UAAuB,EAAE;IAC7C,OAAO,YAAY,CAAC;QACnB,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,MAAM;QACb,KAAK,CAAC,OAAO;YACZ,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;YACzB,gEAAgE;YAChE,IAAI,SAAuC,CAAC;YAE5C,MAAM,SAAS,GAAG,KAAK,EAAE,KAAgB,EAAwB,EAAE;gBAClE,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;oBACpB,KAAK,UAAU;wBACd,OAAO;4BACN,IAAI,EAAE,SAAS;4BACf,MAAM,EAAE,KAAK,CAAC,MAAM;4BACpB,OAAO,EAAE,KAAK,CAAC,OAAO;4BACtB,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;yBACzD,CAAC;oBACH,KAAK,aAAa;wBACjB,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;oBAC7B,KAAK,OAAO;wBACX,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;oBAC9C,KAAK,OAAO;wBACX,MAAM,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;wBACpC,OAAO,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAChC,CAAC;YACF,CAAC,CAAC;YAEF,MAAM,EAAE,GAAkB,KAAK,EAC9B,MAAM,EACN,IAAI,EACJ,QAAQ,EACR,YAAY,GAAG,EAAE,EAChB,EAAE;gBACH,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;gBACnD,8DAA8D;gBAC9D,MAAM,SAAS,GAAG,CAAC,IAAqB,EAAe,EAAE,CAAC,CAAC;oBAC1D,IAAI,WAAW;wBACd,OAAO,IAAI,CAAC,WAAW,CAAC;oBACzB,CAAC;oBACD,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,YAAY,EAAE,IAAI,CAAC,YAAY;oBAC/B,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,2DAA2D;oBAC3D,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAA2B;oBACzD,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY;iBAC5B,CAAC,CAAC;gBACH,MAAM,KAAK,GAAG,GAAG,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1C,MAAM,QAAQ,GAAG,cAAc,CAAc;oBAC5C,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,KAAK,EAAE,GAAG,KAAK,UAAU;iBACzB,CAAC,CAAC;gBACH,MAAM,EAAE,KAAK,EAAE,GAAG,YAAY,CAAC;gBAC/B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;oBACnC,QAAQ,EAAE,IAAI;oBACd,KAAK;oBACL,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,SAAS;oBAC9C,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;oBACrC,GAAG,CAAC,YAAY,CAAC,KAAK,KAAK,SAAS;wBACnC,CAAC,CAAC,EAAE;wBACJ,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC;oBACjC,GAAG,CAAC,KAAK,KAAK,SAAS;wBACtB,CAAC,CAAC,EAAE;wBACJ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;oBAC/C,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;wBACtB,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;wBAChC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;wBACvB,OAAO,SAAS,CACf,OAAO,QAAQ,KAAK,UAAU;4BAC7B,CAAC,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC;4BACzB,CAAC,CAAC,QAAQ,CACX,CAAC;oBACH,CAAC;iBACD,CAAC,CAAC;gBACH,OAAO;oBACN,IAAI,IAAI;wBACP,OAAO,IAAI,CAAC,IAAI,CAAC;oBAClB,CAAC;oBACD,IAAI,QAAQ;wBACX,OAAO,QAAQ,CAAC,KAAK,CAAC;oBACvB,CAAC;oBACD,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;oBACjD,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE;iBAC3B,CAAC;YACH,CAAC,CAAC;YAEF,MAAM,IAAI,GACT,CAAC,MAAkB,EAAkB,EAAE,CACvC,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,CAChC,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;YAE3C,MAAM,GAAG,GAAY;gBACpB,EAAE;gBACF,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC;gBAChB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;gBAClB,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC;gBAChB,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC;gBACpB,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC;gBACtB,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE;oBACtB,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;oBACrB,MAAM,OAAO,GACZ,MAAM,CAAC,IAAI,KAAK,SAAS;wBACxB,CAAC,CAAC,SAAS;wBACX,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;oBAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;oBAC5C,OAAO,aAAa,CACnB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAC3C,CAAC,MAAM,CACP,CAAC,IAAI,EAAE,EAAE,CACR,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC;wBAChD,CAAC,OAAO,KAAK,SAAS;4BACrB,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,SAAS,CAAC,CACjD,CAAC;gBACH,CAAC;aACD,CAAC;YAEF,OAAO;gBACN,GAAG;gBACH,KAAK,CAAC,MAAM;oBACX,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK;wBAAE,OAAO;oBACrE,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;oBACnE,SAAS,KAAK,OAAO,CAAC,IAAI;yBACxB,GAAG,CAAC;wBACJ,QAAQ,EAAE,IAAI;wBACd,KAAK,EAAE,QAAQ;wBACf,GAAG,EACF,OAAO,CAAC,MAAM,KAAK,IAAI;4BACtB,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,SAAS;4BACxC,CAAC,CAAC,OAAO,CAAC,MAAM;wBAClB,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;qBACpC,CAAC;yBACD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;wBACzB,gEAAgE;wBAChE,SAAS,GAAG,SAAS,CAAC;wBACtB,MAAM,KAAK,CAAC;oBACb,CAAC,CAAC,CAAC;oBACJ,MAAM,SAAS,CAAC;gBACjB,CAAC;aACD,CAAC;QACH,CAAC;KACD,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { RestPath } from "../model/types.js";
2
+ export interface PathMatcher {
3
+ /** The `:name` params when `url` matches, undefined when it does not. */
4
+ match(url: URL): Record<string, string> | undefined;
5
+ }
6
+ /**
7
+ * `/rooms/:id/files/*` against a URL's path, or — for a pattern that starts
8
+ * with a scheme — against origin plus path. The glob is the one every other
9
+ * pattern of the library takes (`*` one segment, `**` any number, none
10
+ * included, `{a,b}` either), plus `:name` params. The query never takes
11
+ * part: a route for `/search` should answer `/search?q=x`.
12
+ */
13
+ export declare function compilePath(path: RestPath, baseURL: string | undefined): PathMatcher;
14
+ //# sourceMappingURL=path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../../../src/features/rest/lib/path.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,WAAW,WAAW;IAC3B,yEAAyE;IACzE,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;CACpD;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAC1B,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE,MAAM,GAAG,SAAS,GACzB,WAAW,CA+Bb"}