raffel 1.0.6 → 1.0.7

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 (513) hide show
  1. package/README.md +80 -33
  2. package/dist/adapters/grpc.d.ts +2 -2
  3. package/dist/adapters/grpc.d.ts.map +1 -1
  4. package/dist/adapters/grpc.js +37 -7
  5. package/dist/adapters/grpc.js.map +1 -1
  6. package/dist/adapters/http.d.ts +2 -2
  7. package/dist/adapters/http.d.ts.map +1 -1
  8. package/dist/adapters/http.js +56 -2
  9. package/dist/adapters/http.js.map +1 -1
  10. package/dist/adapters/inbound/grpc.d.ts +9 -0
  11. package/dist/adapters/inbound/grpc.d.ts.map +1 -0
  12. package/dist/adapters/inbound/grpc.js +8 -0
  13. package/dist/adapters/inbound/grpc.js.map +1 -0
  14. package/dist/adapters/inbound/http.d.ts +9 -0
  15. package/dist/adapters/inbound/http.d.ts.map +1 -0
  16. package/dist/adapters/inbound/http.js +8 -0
  17. package/dist/adapters/inbound/http.js.map +1 -0
  18. package/dist/adapters/inbound/index.d.ts +22 -0
  19. package/dist/adapters/inbound/index.d.ts.map +1 -0
  20. package/dist/adapters/inbound/index.js +22 -0
  21. package/dist/adapters/inbound/index.js.map +1 -0
  22. package/dist/adapters/inbound/jsonrpc.d.ts +9 -0
  23. package/dist/adapters/inbound/jsonrpc.d.ts.map +1 -0
  24. package/dist/adapters/inbound/jsonrpc.js +8 -0
  25. package/dist/adapters/inbound/jsonrpc.js.map +1 -0
  26. package/dist/adapters/inbound/tcp.d.ts +9 -0
  27. package/dist/adapters/inbound/tcp.d.ts.map +1 -0
  28. package/dist/adapters/inbound/tcp.js +8 -0
  29. package/dist/adapters/inbound/tcp.js.map +1 -0
  30. package/dist/adapters/inbound/udp.d.ts +9 -0
  31. package/dist/adapters/inbound/udp.d.ts.map +1 -0
  32. package/dist/adapters/inbound/udp.js +8 -0
  33. package/dist/adapters/inbound/udp.js.map +1 -0
  34. package/dist/adapters/inbound/utils/connection-filter.d.ts +9 -0
  35. package/dist/adapters/inbound/utils/connection-filter.d.ts.map +1 -0
  36. package/dist/adapters/inbound/utils/connection-filter.js +8 -0
  37. package/dist/adapters/inbound/utils/connection-filter.js.map +1 -0
  38. package/dist/adapters/inbound/websocket.d.ts +9 -0
  39. package/dist/adapters/inbound/websocket.d.ts.map +1 -0
  40. package/dist/adapters/inbound/websocket.js +8 -0
  41. package/dist/adapters/inbound/websocket.js.map +1 -0
  42. package/dist/adapters/index.d.ts +12 -0
  43. package/dist/adapters/index.d.ts.map +1 -1
  44. package/dist/adapters/index.js +13 -0
  45. package/dist/adapters/index.js.map +1 -1
  46. package/dist/adapters/jsonrpc.d.ts.map +1 -1
  47. package/dist/adapters/jsonrpc.js +39 -5
  48. package/dist/adapters/jsonrpc.js.map +1 -1
  49. package/dist/adapters/outbound/cache/file.d.ts +6 -0
  50. package/dist/adapters/outbound/cache/file.d.ts.map +1 -0
  51. package/dist/adapters/outbound/cache/file.js +6 -0
  52. package/dist/adapters/outbound/cache/file.js.map +1 -0
  53. package/dist/adapters/outbound/cache/index.d.ts +9 -0
  54. package/dist/adapters/outbound/cache/index.d.ts.map +1 -0
  55. package/dist/adapters/outbound/cache/index.js +9 -0
  56. package/dist/adapters/outbound/cache/index.js.map +1 -0
  57. package/dist/adapters/outbound/cache/memory.d.ts +6 -0
  58. package/dist/adapters/outbound/cache/memory.d.ts.map +1 -0
  59. package/dist/adapters/outbound/cache/memory.js +6 -0
  60. package/dist/adapters/outbound/cache/memory.js.map +1 -0
  61. package/dist/adapters/outbound/cache/redis.d.ts +6 -0
  62. package/dist/adapters/outbound/cache/redis.d.ts.map +1 -0
  63. package/dist/adapters/outbound/cache/redis.js +6 -0
  64. package/dist/adapters/outbound/cache/redis.js.map +1 -0
  65. package/dist/adapters/outbound/index.d.ts +15 -0
  66. package/dist/adapters/outbound/index.d.ts.map +1 -0
  67. package/dist/adapters/outbound/index.js +17 -0
  68. package/dist/adapters/outbound/index.js.map +1 -0
  69. package/dist/adapters/outbound/logger/index.d.ts +7 -0
  70. package/dist/adapters/outbound/logger/index.d.ts.map +1 -0
  71. package/dist/adapters/outbound/logger/index.js +7 -0
  72. package/dist/adapters/outbound/logger/index.js.map +1 -0
  73. package/dist/adapters/outbound/logger/pino.d.ts +12 -0
  74. package/dist/adapters/outbound/logger/pino.d.ts.map +1 -0
  75. package/dist/adapters/outbound/logger/pino.js +58 -0
  76. package/dist/adapters/outbound/logger/pino.js.map +1 -0
  77. package/dist/adapters/outbound/rate-limit/filesystem.d.ts +6 -0
  78. package/dist/adapters/outbound/rate-limit/filesystem.d.ts.map +1 -0
  79. package/dist/adapters/outbound/rate-limit/filesystem.js +6 -0
  80. package/dist/adapters/outbound/rate-limit/filesystem.js.map +1 -0
  81. package/dist/adapters/outbound/rate-limit/index.d.ts +10 -0
  82. package/dist/adapters/outbound/rate-limit/index.d.ts.map +1 -0
  83. package/dist/adapters/outbound/rate-limit/index.js +10 -0
  84. package/dist/adapters/outbound/rate-limit/index.js.map +1 -0
  85. package/dist/adapters/outbound/rate-limit/memory.d.ts +8 -0
  86. package/dist/adapters/outbound/rate-limit/memory.d.ts.map +1 -0
  87. package/dist/adapters/outbound/rate-limit/memory.js +8 -0
  88. package/dist/adapters/outbound/rate-limit/memory.js.map +1 -0
  89. package/dist/adapters/outbound/rate-limit/redis.d.ts +6 -0
  90. package/dist/adapters/outbound/rate-limit/redis.d.ts.map +1 -0
  91. package/dist/adapters/outbound/rate-limit/redis.js +6 -0
  92. package/dist/adapters/outbound/rate-limit/redis.js.map +1 -0
  93. package/dist/adapters/outbound/rate-limit/s3db.d.ts +6 -0
  94. package/dist/adapters/outbound/rate-limit/s3db.d.ts.map +1 -0
  95. package/dist/adapters/outbound/rate-limit/s3db.js +6 -0
  96. package/dist/adapters/outbound/rate-limit/s3db.js.map +1 -0
  97. package/dist/adapters/outbound/session/index.d.ts +12 -0
  98. package/dist/adapters/outbound/session/index.d.ts.map +1 -0
  99. package/dist/adapters/outbound/session/index.js +9 -0
  100. package/dist/adapters/outbound/session/index.js.map +1 -0
  101. package/dist/adapters/outbound/session/memory.d.ts +9 -0
  102. package/dist/adapters/outbound/session/memory.d.ts.map +1 -0
  103. package/dist/adapters/outbound/session/memory.js +8 -0
  104. package/dist/adapters/outbound/session/memory.js.map +1 -0
  105. package/dist/adapters/outbound/session/redis.d.ts +9 -0
  106. package/dist/adapters/outbound/session/redis.d.ts.map +1 -0
  107. package/dist/adapters/outbound/session/redis.js +8 -0
  108. package/dist/adapters/outbound/session/redis.js.map +1 -0
  109. package/dist/adapters/outbound/session/s3db.d.ts +9 -0
  110. package/dist/adapters/outbound/session/s3db.d.ts.map +1 -0
  111. package/dist/adapters/outbound/session/s3db.js +8 -0
  112. package/dist/adapters/outbound/session/s3db.js.map +1 -0
  113. package/dist/adapters/tcp.d.ts +2 -2
  114. package/dist/adapters/tcp.d.ts.map +1 -1
  115. package/dist/adapters/tcp.js +16 -3
  116. package/dist/adapters/tcp.js.map +1 -1
  117. package/dist/adapters/udp.d.ts +2 -2
  118. package/dist/adapters/udp.d.ts.map +1 -1
  119. package/dist/adapters/udp.js +16 -4
  120. package/dist/adapters/udp.js.map +1 -1
  121. package/dist/adapters/websocket.d.ts +2 -2
  122. package/dist/adapters/websocket.d.ts.map +1 -1
  123. package/dist/adapters/websocket.js +33 -9
  124. package/dist/adapters/websocket.js.map +1 -1
  125. package/dist/application/config-preview.d.ts +147 -0
  126. package/dist/application/config-preview.d.ts.map +1 -0
  127. package/dist/application/config-preview.js +122 -0
  128. package/dist/application/config-preview.js.map +1 -0
  129. package/dist/application/index.d.ts +13 -0
  130. package/dist/application/index.d.ts.map +1 -0
  131. package/dist/application/index.js +13 -0
  132. package/dist/application/index.js.map +1 -0
  133. package/dist/application/registration.d.ts +71 -0
  134. package/dist/application/registration.d.ts.map +1 -0
  135. package/dist/application/registration.js +99 -0
  136. package/dist/application/registration.js.map +1 -0
  137. package/dist/application/runtime-preview.d.ts +67 -0
  138. package/dist/application/runtime-preview.d.ts.map +1 -0
  139. package/dist/application/runtime-preview.js +43 -0
  140. package/dist/application/runtime-preview.js.map +1 -0
  141. package/dist/bootstrap/config-normalization.d.ts +10 -0
  142. package/dist/bootstrap/config-normalization.d.ts.map +1 -0
  143. package/dist/bootstrap/config-normalization.js +14 -0
  144. package/dist/bootstrap/config-normalization.js.map +1 -0
  145. package/dist/bootstrap/create-server.d.ts +15 -0
  146. package/dist/bootstrap/create-server.d.ts.map +1 -0
  147. package/dist/bootstrap/create-server.js +17 -0
  148. package/dist/bootstrap/create-server.js.map +1 -0
  149. package/dist/bootstrap/index.d.ts +11 -0
  150. package/dist/bootstrap/index.d.ts.map +1 -0
  151. package/dist/bootstrap/index.js +13 -0
  152. package/dist/bootstrap/index.js.map +1 -0
  153. package/dist/bootstrap/protocol-wiring.d.ts +13 -0
  154. package/dist/bootstrap/protocol-wiring.d.ts.map +1 -0
  155. package/dist/bootstrap/protocol-wiring.js +11 -0
  156. package/dist/bootstrap/protocol-wiring.js.map +1 -0
  157. package/dist/channels/channel-manager.d.ts +2 -1
  158. package/dist/channels/channel-manager.d.ts.map +1 -1
  159. package/dist/channels/channel-manager.js +52 -19
  160. package/dist/channels/channel-manager.js.map +1 -1
  161. package/dist/core/registry.d.ts +4 -0
  162. package/dist/core/registry.d.ts.map +1 -1
  163. package/dist/core/registry.js +23 -3
  164. package/dist/core/registry.js.map +1 -1
  165. package/dist/core/router.d.ts.map +1 -1
  166. package/dist/core/router.js +61 -10
  167. package/dist/core/router.js.map +1 -1
  168. package/dist/docs/generators/code-samples.d.ts.map +1 -1
  169. package/dist/docs/generators/code-samples.js +7 -75
  170. package/dist/docs/generators/code-samples.js.map +1 -1
  171. package/dist/docs/generators/grpc-generator.js +2 -2
  172. package/dist/docs/generators/grpc-generator.js.map +1 -1
  173. package/dist/docs/generators/http-generator.js +3 -2
  174. package/dist/docs/generators/http-generator.js.map +1 -1
  175. package/dist/docs/generators/index.d.ts +1 -1
  176. package/dist/docs/generators/index.d.ts.map +1 -1
  177. package/dist/docs/generators/index.js +1 -1
  178. package/dist/docs/generators/index.js.map +1 -1
  179. package/dist/docs/generators/jsonrpc-generator.js +2 -2
  180. package/dist/docs/generators/jsonrpc-generator.js.map +1 -1
  181. package/dist/docs/generators/schema-converter.d.ts +3 -3
  182. package/dist/docs/generators/schema-converter.d.ts.map +1 -1
  183. package/dist/docs/generators/schema-converter.js +8 -60
  184. package/dist/docs/generators/schema-converter.js.map +1 -1
  185. package/dist/docs/generators/streams-generator.js +2 -2
  186. package/dist/docs/generators/streams-generator.js.map +1 -1
  187. package/dist/docs/generators/tcp-generator.js +2 -2
  188. package/dist/docs/generators/tcp-generator.js.map +1 -1
  189. package/dist/docs/generators/udp-generator.js +2 -2
  190. package/dist/docs/generators/udp-generator.js.map +1 -1
  191. package/dist/docs/generators/websocket-generator.js +3 -3
  192. package/dist/docs/generators/websocket-generator.js.map +1 -1
  193. package/dist/docs/index.d.ts +1 -1
  194. package/dist/docs/index.d.ts.map +1 -1
  195. package/dist/docs/index.js +1 -1
  196. package/dist/docs/index.js.map +1 -1
  197. package/dist/docs/openapi/generator.d.ts +2 -0
  198. package/dist/docs/openapi/generator.d.ts.map +1 -1
  199. package/dist/docs/openapi/generator.js +16 -51
  200. package/dist/docs/openapi/generator.js.map +1 -1
  201. package/dist/dx/index.d.ts +2 -0
  202. package/dist/dx/index.d.ts.map +1 -1
  203. package/dist/dx/index.js +1 -0
  204. package/dist/dx/index.js.map +1 -1
  205. package/dist/dx/scaffold/index.d.ts +32 -0
  206. package/dist/dx/scaffold/index.d.ts.map +1 -0
  207. package/dist/dx/scaffold/index.js +471 -0
  208. package/dist/dx/scaffold/index.js.map +1 -0
  209. package/dist/graphql/adapter.d.ts.map +1 -1
  210. package/dist/graphql/adapter.js +58 -6
  211. package/dist/graphql/adapter.js.map +1 -1
  212. package/dist/graphql/schema-generator.d.ts +2 -2
  213. package/dist/graphql/schema-generator.d.ts.map +1 -1
  214. package/dist/graphql/schema-generator.js +228 -215
  215. package/dist/graphql/schema-generator.js.map +1 -1
  216. package/dist/http/app.d.ts +9 -4
  217. package/dist/http/app.d.ts.map +1 -1
  218. package/dist/http/app.js +125 -50
  219. package/dist/http/app.js.map +1 -1
  220. package/dist/http/context.d.ts +8 -1
  221. package/dist/http/context.d.ts.map +1 -1
  222. package/dist/http/context.js +2 -1
  223. package/dist/http/context.js.map +1 -1
  224. package/dist/http/cookie.d.ts +2 -2
  225. package/dist/http/cookie.js +1 -1
  226. package/dist/http/cors.d.ts +1 -1
  227. package/dist/http/cors.js +1 -1
  228. package/dist/http/guards.d.ts.map +1 -1
  229. package/dist/http/guards.js +38 -28
  230. package/dist/http/guards.js.map +1 -1
  231. package/dist/http/index.d.ts +1 -1
  232. package/dist/http/index.js +2 -2
  233. package/dist/http/index.js.map +1 -1
  234. package/dist/http/stream-auth.d.ts +1 -1
  235. package/dist/http/stream-auth.d.ts.map +1 -1
  236. package/dist/http/stream-auth.js +6 -5
  237. package/dist/http/stream-auth.js.map +1 -1
  238. package/dist/index.d.ts +23 -7
  239. package/dist/index.d.ts.map +1 -1
  240. package/dist/index.js +22 -3
  241. package/dist/index.js.map +1 -1
  242. package/dist/inspect/contracts.d.ts +47 -0
  243. package/dist/inspect/contracts.d.ts.map +1 -0
  244. package/dist/inspect/contracts.js +237 -0
  245. package/dist/inspect/contracts.js.map +1 -0
  246. package/dist/inspect/format-utils.d.ts +18 -0
  247. package/dist/inspect/format-utils.d.ts.map +1 -0
  248. package/dist/inspect/format-utils.js +55 -0
  249. package/dist/inspect/format-utils.js.map +1 -0
  250. package/dist/inspect/index.d.ts +13 -0
  251. package/dist/inspect/index.d.ts.map +1 -0
  252. package/dist/inspect/index.js +8 -0
  253. package/dist/inspect/index.js.map +1 -0
  254. package/dist/inspect/loader.d.ts +13 -0
  255. package/dist/inspect/loader.d.ts.map +1 -0
  256. package/dist/inspect/loader.js +115 -0
  257. package/dist/inspect/loader.js.map +1 -0
  258. package/dist/inspect/playground-html.d.ts +8 -0
  259. package/dist/inspect/playground-html.d.ts.map +1 -0
  260. package/dist/inspect/playground-html.js +381 -0
  261. package/dist/inspect/playground-html.js.map +1 -0
  262. package/dist/inspect/playground-invokers.d.ts +37 -0
  263. package/dist/inspect/playground-invokers.d.ts.map +1 -0
  264. package/dist/inspect/playground-invokers.js +950 -0
  265. package/dist/inspect/playground-invokers.js.map +1 -0
  266. package/dist/inspect/playground.d.ts +97 -0
  267. package/dist/inspect/playground.d.ts.map +1 -0
  268. package/dist/inspect/playground.js +412 -0
  269. package/dist/inspect/playground.js.map +1 -0
  270. package/dist/inspect/reports.d.ts +52 -0
  271. package/dist/inspect/reports.d.ts.map +1 -0
  272. package/dist/inspect/reports.js +400 -0
  273. package/dist/inspect/reports.js.map +1 -0
  274. package/dist/inspect/runtime-graph.d.ts +52 -0
  275. package/dist/inspect/runtime-graph.d.ts.map +1 -0
  276. package/dist/inspect/runtime-graph.js +739 -0
  277. package/dist/inspect/runtime-graph.js.map +1 -0
  278. package/dist/inspect/schema-samples.d.ts +18 -0
  279. package/dist/inspect/schema-samples.d.ts.map +1 -0
  280. package/dist/inspect/schema-samples.js +137 -0
  281. package/dist/inspect/schema-samples.js.map +1 -0
  282. package/dist/inspect/types.d.ts +146 -0
  283. package/dist/inspect/types.d.ts.map +1 -0
  284. package/dist/inspect/types.js +2 -0
  285. package/dist/inspect/types.js.map +1 -0
  286. package/dist/mcp/cli.d.ts +11 -12
  287. package/dist/mcp/cli.d.ts.map +1 -1
  288. package/dist/mcp/cli.js +303 -65
  289. package/dist/mcp/cli.js.map +1 -1
  290. package/dist/mcp/docs/patterns.d.ts.map +1 -1
  291. package/dist/mcp/docs/patterns.js +82 -29
  292. package/dist/mcp/docs/patterns.js.map +1 -1
  293. package/dist/mcp/docs/quickstart.d.ts +1 -1
  294. package/dist/mcp/docs/quickstart.d.ts.map +1 -1
  295. package/dist/mcp/docs/quickstart.js +65 -25
  296. package/dist/mcp/docs/quickstart.js.map +1 -1
  297. package/dist/mcp/resources/index.d.ts.map +1 -1
  298. package/dist/mcp/resources/index.js +82 -5
  299. package/dist/mcp/resources/index.js.map +1 -1
  300. package/dist/mcp/tools/definitions.d.ts.map +1 -1
  301. package/dist/mcp/tools/definitions.js +36 -0
  302. package/dist/mcp/tools/definitions.js.map +1 -1
  303. package/dist/mcp/tools/handlers.d.ts.map +1 -1
  304. package/dist/mcp/tools/handlers.js +148 -12
  305. package/dist/mcp/tools/handlers.js.map +1 -1
  306. package/dist/middleware/auth.d.ts.map +1 -1
  307. package/dist/middleware/auth.js +3 -2
  308. package/dist/middleware/auth.js.map +1 -1
  309. package/dist/mock-server/cli.d.ts +14 -0
  310. package/dist/mock-server/cli.d.ts.map +1 -0
  311. package/dist/mock-server/cli.js +314 -0
  312. package/dist/mock-server/cli.js.map +1 -0
  313. package/dist/mock-server/fake-data.d.ts +14 -0
  314. package/dist/mock-server/fake-data.d.ts.map +1 -0
  315. package/dist/mock-server/fake-data.js +21 -0
  316. package/dist/mock-server/fake-data.js.map +1 -0
  317. package/dist/mock-server/index.d.ts +69 -0
  318. package/dist/mock-server/index.d.ts.map +1 -0
  319. package/dist/mock-server/index.js +400 -0
  320. package/dist/mock-server/index.js.map +1 -0
  321. package/dist/mock-server/route-extractor.d.ts +40 -0
  322. package/dist/mock-server/route-extractor.d.ts.map +1 -0
  323. package/dist/mock-server/route-extractor.js +211 -0
  324. package/dist/mock-server/route-extractor.js.map +1 -0
  325. package/dist/mock-server/types.d.ts +64 -0
  326. package/dist/mock-server/types.d.ts.map +1 -0
  327. package/dist/mock-server/types.js +5 -0
  328. package/dist/mock-server/types.js.map +1 -0
  329. package/dist/policy/runtime.d.ts +7 -0
  330. package/dist/policy/runtime.d.ts.map +1 -0
  331. package/dist/policy/runtime.js +82 -0
  332. package/dist/policy/runtime.js.map +1 -0
  333. package/dist/ports/index.d.ts +18 -0
  334. package/dist/ports/index.d.ts.map +1 -0
  335. package/dist/ports/index.js +11 -0
  336. package/dist/ports/index.js.map +1 -0
  337. package/dist/ports/outbound/cache-driver.d.ts +9 -0
  338. package/dist/ports/outbound/cache-driver.d.ts.map +1 -0
  339. package/dist/ports/outbound/cache-driver.js +9 -0
  340. package/dist/ports/outbound/cache-driver.js.map +1 -0
  341. package/dist/ports/outbound/cache-store.d.ts +8 -0
  342. package/dist/ports/outbound/cache-store.d.ts.map +1 -0
  343. package/dist/ports/outbound/cache-store.js +8 -0
  344. package/dist/ports/outbound/cache-store.js.map +1 -0
  345. package/dist/ports/outbound/channel-presence.d.ts +30 -0
  346. package/dist/ports/outbound/channel-presence.d.ts.map +1 -0
  347. package/dist/ports/outbound/channel-presence.js +9 -0
  348. package/dist/ports/outbound/channel-presence.js.map +1 -0
  349. package/dist/ports/outbound/event-store.d.ts +9 -0
  350. package/dist/ports/outbound/event-store.d.ts.map +1 -0
  351. package/dist/ports/outbound/event-store.js +9 -0
  352. package/dist/ports/outbound/event-store.js.map +1 -0
  353. package/dist/ports/outbound/logger.d.ts +31 -0
  354. package/dist/ports/outbound/logger.d.ts.map +1 -0
  355. package/dist/ports/outbound/logger.js +8 -0
  356. package/dist/ports/outbound/logger.js.map +1 -0
  357. package/dist/ports/outbound/rate-limit-driver.d.ts +9 -0
  358. package/dist/ports/outbound/rate-limit-driver.d.ts.map +1 -0
  359. package/dist/ports/outbound/rate-limit-driver.js +9 -0
  360. package/dist/ports/outbound/rate-limit-driver.js.map +1 -0
  361. package/dist/ports/outbound/session-store.d.ts +9 -0
  362. package/dist/ports/outbound/session-store.d.ts.map +1 -0
  363. package/dist/ports/outbound/session-store.js +9 -0
  364. package/dist/ports/outbound/session-store.js.map +1 -0
  365. package/dist/ports/outbound/validator.d.ts +9 -0
  366. package/dist/ports/outbound/validator.d.ts.map +1 -0
  367. package/dist/ports/outbound/validator.js +9 -0
  368. package/dist/ports/outbound/validator.js.map +1 -0
  369. package/dist/server/builder/config-preview.d.ts +2 -33
  370. package/dist/server/builder/config-preview.d.ts.map +1 -1
  371. package/dist/server/builder/config-preview.js +1 -94
  372. package/dist/server/builder/config-preview.js.map +1 -1
  373. package/dist/server/builder/lifecycle.d.ts +11 -1
  374. package/dist/server/builder/lifecycle.d.ts.map +1 -1
  375. package/dist/server/builder/lifecycle.js +117 -3
  376. package/dist/server/builder/lifecycle.js.map +1 -1
  377. package/dist/server/builder/single-port-utils.d.ts +11 -2
  378. package/dist/server/builder/single-port-utils.d.ts.map +1 -1
  379. package/dist/server/builder/single-port-utils.js +88 -16
  380. package/dist/server/builder/single-port-utils.js.map +1 -1
  381. package/dist/server/builder.d.ts.map +1 -1
  382. package/dist/server/builder.js +203 -78
  383. package/dist/server/builder.js.map +1 -1
  384. package/dist/server/discovery-utils.d.ts +5 -1
  385. package/dist/server/discovery-utils.d.ts.map +1 -1
  386. package/dist/server/discovery-utils.js +4 -1
  387. package/dist/server/discovery-utils.js.map +1 -1
  388. package/dist/server/front-door.d.ts +3 -1
  389. package/dist/server/front-door.d.ts.map +1 -1
  390. package/dist/server/front-door.js +80 -18
  391. package/dist/server/front-door.js.map +1 -1
  392. package/dist/server/fs-routes/middleware-processor.d.ts.map +1 -1
  393. package/dist/server/fs-routes/middleware-processor.js +9 -8
  394. package/dist/server/fs-routes/middleware-processor.js.map +1 -1
  395. package/dist/server/handler-builders.d.ts +2 -1
  396. package/dist/server/handler-builders.d.ts.map +1 -1
  397. package/dist/server/handler-builders.js +21 -0
  398. package/dist/server/handler-builders.js.map +1 -1
  399. package/dist/server/index.d.ts +4 -2
  400. package/dist/server/index.d.ts.map +1 -1
  401. package/dist/server/index.js +2 -1
  402. package/dist/server/index.js.map +1 -1
  403. package/dist/server/port-binding.d.ts +8 -2
  404. package/dist/server/port-binding.d.ts.map +1 -1
  405. package/dist/server/port-binding.js +11 -1
  406. package/dist/server/port-binding.js.map +1 -1
  407. package/dist/server/protocol-config.d.ts.map +1 -1
  408. package/dist/server/protocol-config.js +1 -0
  409. package/dist/server/protocol-config.js.map +1 -1
  410. package/dist/server/protocol-fusion-diagnostics.d.ts +20 -0
  411. package/dist/server/protocol-fusion-diagnostics.d.ts.map +1 -0
  412. package/dist/server/protocol-fusion-diagnostics.js +51 -0
  413. package/dist/server/protocol-fusion-diagnostics.js.map +1 -0
  414. package/dist/server/rest-middleware.d.ts +3 -3
  415. package/dist/server/rest-middleware.d.ts.map +1 -1
  416. package/dist/server/rest-middleware.js +37 -5
  417. package/dist/server/rest-middleware.js.map +1 -1
  418. package/dist/server/router-module.d.ts +3 -1
  419. package/dist/server/router-module.d.ts.map +1 -1
  420. package/dist/server/router-module.js +14 -0
  421. package/dist/server/router-module.js.map +1 -1
  422. package/dist/server/shared-context.d.ts +3 -3
  423. package/dist/server/shared-context.d.ts.map +1 -1
  424. package/dist/server/shared-context.js +7 -9
  425. package/dist/server/shared-context.js.map +1 -1
  426. package/dist/server/single-port/dispatcher.d.ts.map +1 -1
  427. package/dist/server/single-port/dispatcher.js +20 -13
  428. package/dist/server/single-port/dispatcher.js.map +1 -1
  429. package/dist/server/types.d.ts +104 -7
  430. package/dist/server/types.d.ts.map +1 -1
  431. package/dist/types/context.d.ts +167 -4
  432. package/dist/types/context.d.ts.map +1 -1
  433. package/dist/types/context.js +168 -2
  434. package/dist/types/context.js.map +1 -1
  435. package/dist/types/handlers.d.ts +3 -0
  436. package/dist/types/handlers.d.ts.map +1 -1
  437. package/dist/types/index.d.ts +4 -2
  438. package/dist/types/index.d.ts.map +1 -1
  439. package/dist/types/index.js +2 -1
  440. package/dist/types/index.js.map +1 -1
  441. package/dist/types/policies.d.ts +54 -0
  442. package/dist/types/policies.d.ts.map +1 -0
  443. package/dist/types/policies.js +109 -0
  444. package/dist/types/policies.js.map +1 -0
  445. package/dist/ui/core/registry.d.ts +4 -0
  446. package/dist/ui/core/registry.d.ts.map +1 -1
  447. package/dist/ui/core/router.d.ts.map +1 -1
  448. package/dist/ui/docs/generators/code-samples.d.ts.map +1 -1
  449. package/dist/ui/docs/generators/index.d.ts +1 -1
  450. package/dist/ui/docs/generators/index.d.ts.map +1 -1
  451. package/dist/ui/docs/generators/schema-converter.d.ts +3 -3
  452. package/dist/ui/docs/generators/schema-converter.d.ts.map +1 -1
  453. package/dist/ui/docs/index.d.ts +1 -1
  454. package/dist/ui/docs/index.d.ts.map +1 -1
  455. package/dist/ui/docs/openapi/generator.d.ts +2 -0
  456. package/dist/ui/docs/openapi/generator.d.ts.map +1 -1
  457. package/dist/ui/middleware/interceptors/rate-limit.d.ts +147 -0
  458. package/dist/ui/middleware/interceptors/rate-limit.d.ts.map +1 -0
  459. package/dist/ui/middleware/interceptors/timeout.d.ts +121 -0
  460. package/dist/ui/middleware/interceptors/timeout.d.ts.map +1 -0
  461. package/dist/ui/middleware/types.d.ts +396 -0
  462. package/dist/ui/middleware/types.d.ts.map +1 -0
  463. package/dist/ui/policy/runtime.d.ts +7 -0
  464. package/dist/ui/policy/runtime.d.ts.map +1 -0
  465. package/dist/ui/rate-limit/drivers/filesystem.d.ts +19 -0
  466. package/dist/ui/rate-limit/drivers/filesystem.d.ts.map +1 -0
  467. package/dist/ui/rate-limit/drivers/memory.d.ts +17 -0
  468. package/dist/ui/rate-limit/drivers/memory.d.ts.map +1 -0
  469. package/dist/ui/rate-limit/drivers/redis.d.ts +14 -0
  470. package/dist/ui/rate-limit/drivers/redis.d.ts.map +1 -0
  471. package/dist/ui/rate-limit/drivers/s3db.d.ts +31 -0
  472. package/dist/ui/rate-limit/drivers/s3db.d.ts.map +1 -0
  473. package/dist/ui/rate-limit/factory.d.ts +12 -0
  474. package/dist/ui/rate-limit/factory.d.ts.map +1 -0
  475. package/dist/ui/rate-limit/types.d.ts +81 -0
  476. package/dist/ui/rate-limit/types.d.ts.map +1 -0
  477. package/dist/ui/server/fs-routes/middleware-processor.d.ts.map +1 -1
  478. package/dist/ui/types/context.d.ts +167 -4
  479. package/dist/ui/types/context.d.ts.map +1 -1
  480. package/dist/ui/types/handlers.d.ts +3 -0
  481. package/dist/ui/types/handlers.d.ts.map +1 -1
  482. package/dist/ui/types/index.d.ts +4 -2
  483. package/dist/ui/types/index.d.ts.map +1 -1
  484. package/dist/ui/types/policies.d.ts +54 -0
  485. package/dist/ui/types/policies.d.ts.map +1 -0
  486. package/dist/ui/usd/spec/types.d.ts +3 -0
  487. package/dist/ui/usd/spec/types.d.ts.map +1 -1
  488. package/dist/ui/utils/schema-examples.d.ts +39 -0
  489. package/dist/ui/utils/schema-examples.d.ts.map +1 -0
  490. package/dist/ui/validation/descriptor.d.ts +26 -0
  491. package/dist/ui/validation/descriptor.d.ts.map +1 -0
  492. package/dist/ui/validation/index.d.ts +1 -0
  493. package/dist/ui/validation/index.d.ts.map +1 -1
  494. package/dist/usd/spec/types.d.ts +3 -0
  495. package/dist/usd/spec/types.d.ts.map +1 -1
  496. package/dist/usd/spec/types.js.map +1 -1
  497. package/dist/utils/context-utils.d.ts +3 -2
  498. package/dist/utils/context-utils.d.ts.map +1 -1
  499. package/dist/utils/context-utils.js +4 -0
  500. package/dist/utils/context-utils.js.map +1 -1
  501. package/dist/utils/schema-examples.d.ts +39 -0
  502. package/dist/utils/schema-examples.d.ts.map +1 -0
  503. package/dist/utils/schema-examples.js +240 -0
  504. package/dist/utils/schema-examples.js.map +1 -0
  505. package/dist/validation/descriptor.d.ts +26 -0
  506. package/dist/validation/descriptor.d.ts.map +1 -0
  507. package/dist/validation/descriptor.js +155 -0
  508. package/dist/validation/descriptor.js.map +1 -0
  509. package/dist/validation/index.d.ts +1 -0
  510. package/dist/validation/index.d.ts.map +1 -1
  511. package/dist/validation/index.js +1 -0
  512. package/dist/validation/index.js.map +1 -1
  513. package/package.json +11 -3
@@ -0,0 +1,950 @@
1
+ /**
2
+ * Inspect — Playground protocol invokers and session management
3
+ *
4
+ * Handles HTTP, JSON-RPC, GraphQL, gRPC invocations and
5
+ * WebSocket/SSE session lifecycle for the playground server.
6
+ */
7
+ import { randomUUID } from 'node:crypto';
8
+ import { createConnection } from 'node:net';
9
+ import { createSocket } from 'node:dgram';
10
+ import * as grpc from '@grpc/grpc-js';
11
+ import * as protoLoader from '@grpc/proto-loader';
12
+ import { WebSocket } from 'ws';
13
+ const TCP_LENGTH_HEADER_SIZE = 4;
14
+ export function normalizeConnectHost(host) {
15
+ if (!host || host === '0.0.0.0' || host === '::') {
16
+ return '127.0.0.1';
17
+ }
18
+ return host;
19
+ }
20
+ export function toStringRecord(input) {
21
+ if (!input) {
22
+ return {};
23
+ }
24
+ const result = {};
25
+ for (const [key, value] of Object.entries(input)) {
26
+ if (value === undefined || value === null)
27
+ continue;
28
+ result[key] = String(value);
29
+ }
30
+ return result;
31
+ }
32
+ function sanitizeQueryRecord(input) {
33
+ const params = new URLSearchParams();
34
+ for (const [key, value] of Object.entries(input)) {
35
+ if (value === undefined || value === null || value === '')
36
+ continue;
37
+ if (Array.isArray(value)) {
38
+ for (const item of value) {
39
+ params.append(key, String(item));
40
+ }
41
+ continue;
42
+ }
43
+ params.set(key, String(value));
44
+ }
45
+ const rendered = params.toString();
46
+ return rendered ? `?${rendered}` : '';
47
+ }
48
+ function interpolatePath(pathname, params) {
49
+ let rendered = pathname;
50
+ for (const [key, value] of Object.entries(params)) {
51
+ rendered = rendered.replaceAll(`:${key}`, encodeURIComponent(String(value)));
52
+ rendered = rendered.replaceAll(`:${key}?`, encodeURIComponent(String(value)));
53
+ }
54
+ return rendered.replace(/\/:\w+\?/g, '');
55
+ }
56
+ function buildTargetUrl(entry, payload, options = {}) {
57
+ const protocol = options.protocol ?? (entry.protocol === 'websocket' ? 'ws' : 'http');
58
+ const host = normalizeConnectHost(entry.target.host);
59
+ const port = entry.target.port;
60
+ const pathname = interpolatePath(options.path ?? entry.target.path ?? '/', payload.params ?? {});
61
+ const query = sanitizeQueryRecord(toStringRecord(payload.query));
62
+ return `${protocol}://${host}:${port}${pathname}${query}`;
63
+ }
64
+ function buildHttpUrl(entry, payload) {
65
+ return buildTargetUrl(entry, payload);
66
+ }
67
+ function buildWebSocketCandidates(entry, payload) {
68
+ const candidates = [buildTargetUrl(entry, payload, { protocol: 'ws' })];
69
+ const path = entry.target.path;
70
+ if (path) {
71
+ const segments = path.split('/').filter(Boolean);
72
+ if (segments.length > 1) {
73
+ const fallbackPath = `/${segments[segments.length - 1]}`;
74
+ const fallbackUrl = buildTargetUrl(entry, payload, { protocol: 'ws', path: fallbackPath });
75
+ if (!candidates.includes(fallbackUrl)) {
76
+ candidates.push(fallbackUrl);
77
+ }
78
+ }
79
+ }
80
+ return candidates;
81
+ }
82
+ export function parseJsonBody(req) {
83
+ return new Promise((resolve, reject) => {
84
+ const chunks = [];
85
+ req.on('data', (chunk) => chunks.push(chunk));
86
+ req.on('end', () => {
87
+ try {
88
+ const text = Buffer.concat(chunks).toString('utf8');
89
+ resolve((text ? JSON.parse(text) : {}));
90
+ }
91
+ catch (error) {
92
+ reject(error);
93
+ }
94
+ });
95
+ req.on('error', reject);
96
+ });
97
+ }
98
+ async function parseFetchResponse(response) {
99
+ const contentType = response.headers.get('content-type') ?? '';
100
+ if (contentType.includes('application/json')) {
101
+ return response.json();
102
+ }
103
+ return response.text();
104
+ }
105
+ function encodeDatagramPayload(payload) {
106
+ if (payload === undefined || payload === null) {
107
+ return Buffer.alloc(0);
108
+ }
109
+ if (typeof payload === 'string') {
110
+ return Buffer.from(payload, 'utf8');
111
+ }
112
+ return Buffer.from(JSON.stringify(payload), 'utf8');
113
+ }
114
+ function decodeDatagramPayload(payload) {
115
+ const raw = payload.toString('utf8');
116
+ if (!raw) {
117
+ return '';
118
+ }
119
+ return parseMaybeJson(raw);
120
+ }
121
+ function encodeTcpRawPayload(payload) {
122
+ if (payload === undefined || payload === null) {
123
+ return Buffer.alloc(0);
124
+ }
125
+ if (typeof payload === 'string') {
126
+ return Buffer.from(payload, 'utf8');
127
+ }
128
+ return Buffer.from(JSON.stringify(payload), 'utf8');
129
+ }
130
+ function frameTcpMessage(message) {
131
+ const data = Buffer.from(JSON.stringify(message), 'utf8');
132
+ const frame = Buffer.allocUnsafe(TCP_LENGTH_HEADER_SIZE + data.length);
133
+ frame.writeUInt32BE(data.length, 0);
134
+ data.copy(frame, TCP_LENGTH_HEADER_SIZE);
135
+ return frame;
136
+ }
137
+ function connectTcpSocket(entry) {
138
+ const port = entry.target.port;
139
+ if (port === undefined) {
140
+ throw new Error(`Missing TCP target port for playground entry "${entry.key}"`);
141
+ }
142
+ return new Promise((resolve, reject) => {
143
+ const socket = createConnection({
144
+ host: normalizeConnectHost(entry.target.host),
145
+ port,
146
+ }, () => resolve(socket));
147
+ socket.once('error', reject);
148
+ });
149
+ }
150
+ function waitForTcpEnvelope(socket, timeoutMs = 5000) {
151
+ return new Promise((resolve, reject) => {
152
+ let buffer = Buffer.alloc(0);
153
+ const timeout = setTimeout(() => {
154
+ cleanup();
155
+ reject(new Error(`Timed out waiting for TCP response after ${timeoutMs}ms`));
156
+ }, timeoutMs);
157
+ const cleanup = () => {
158
+ clearTimeout(timeout);
159
+ socket.off('data', onData);
160
+ socket.off('error', onError);
161
+ socket.off('close', onClose);
162
+ };
163
+ const onError = (error) => {
164
+ cleanup();
165
+ reject(error);
166
+ };
167
+ const onClose = () => {
168
+ cleanup();
169
+ reject(new Error('TCP socket closed before a response was received'));
170
+ };
171
+ const onData = (chunk) => {
172
+ buffer = Buffer.concat([buffer, Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)]);
173
+ while (buffer.length >= TCP_LENGTH_HEADER_SIZE) {
174
+ const messageLength = buffer.readUInt32BE(0);
175
+ const totalLength = TCP_LENGTH_HEADER_SIZE + messageLength;
176
+ if (buffer.length < totalLength) {
177
+ return;
178
+ }
179
+ const messageData = buffer.subarray(TCP_LENGTH_HEADER_SIZE, totalLength);
180
+ buffer = buffer.subarray(totalLength);
181
+ try {
182
+ cleanup();
183
+ resolve(JSON.parse(messageData.toString('utf8')));
184
+ }
185
+ catch (error) {
186
+ cleanup();
187
+ reject(error);
188
+ }
189
+ return;
190
+ }
191
+ };
192
+ socket.on('data', onData);
193
+ socket.once('error', onError);
194
+ socket.once('close', onClose);
195
+ });
196
+ }
197
+ function attachTcpEnvelopeStream(socket, handlers) {
198
+ let buffer = Buffer.alloc(0);
199
+ socket.on('data', (chunk) => {
200
+ buffer = Buffer.concat([buffer, Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)]);
201
+ while (buffer.length >= TCP_LENGTH_HEADER_SIZE) {
202
+ const messageLength = buffer.readUInt32BE(0);
203
+ const totalLength = TCP_LENGTH_HEADER_SIZE + messageLength;
204
+ if (buffer.length < totalLength) {
205
+ return;
206
+ }
207
+ const messageData = buffer.subarray(TCP_LENGTH_HEADER_SIZE, totalLength);
208
+ buffer = buffer.subarray(totalLength);
209
+ try {
210
+ handlers.onEnvelope(JSON.parse(messageData.toString('utf8')));
211
+ }
212
+ catch (error) {
213
+ handlers.onError(error);
214
+ }
215
+ }
216
+ });
217
+ socket.on('error', handlers.onError);
218
+ if (handlers.onClose) {
219
+ socket.on('close', handlers.onClose);
220
+ }
221
+ }
222
+ function attachRawTcpMessageStream(socket, framing, handlers) {
223
+ if (!framing || framing.type === 'none') {
224
+ socket.on('data', (chunk) => {
225
+ handlers.onMessage(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
226
+ });
227
+ }
228
+ else if (framing.type === 'delimiter' && framing.delimiter) {
229
+ let buffer = Buffer.alloc(0);
230
+ const delimiter = Buffer.from(framing.delimiter, 'utf8');
231
+ socket.on('data', (chunk) => {
232
+ buffer = Buffer.concat([buffer, Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)]);
233
+ let index = -1;
234
+ while ((index = buffer.indexOf(delimiter)) !== -1) {
235
+ const message = buffer.subarray(0, index);
236
+ buffer = buffer.subarray(index + delimiter.length);
237
+ handlers.onMessage(message);
238
+ }
239
+ });
240
+ }
241
+ else if (framing.type === 'length-prefixed') {
242
+ const lengthBytes = framing.lengthBytes ?? 4;
243
+ const lengthEncoding = framing.lengthEncoding ?? 'BE';
244
+ let buffer = Buffer.alloc(0);
245
+ socket.on('data', (chunk) => {
246
+ buffer = Buffer.concat([buffer, Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)]);
247
+ while (buffer.length >= lengthBytes) {
248
+ const length = lengthBytes === 1
249
+ ? buffer.readUInt8(0)
250
+ : lengthBytes === 2
251
+ ? (lengthEncoding === 'BE' ? buffer.readUInt16BE(0) : buffer.readUInt16LE(0))
252
+ : (lengthEncoding === 'BE' ? buffer.readUInt32BE(0) : buffer.readUInt32LE(0));
253
+ const totalLength = lengthBytes + length;
254
+ if (buffer.length < totalLength) {
255
+ return;
256
+ }
257
+ const message = buffer.subarray(lengthBytes, totalLength);
258
+ buffer = buffer.subarray(totalLength);
259
+ handlers.onMessage(message);
260
+ }
261
+ });
262
+ }
263
+ socket.on('error', handlers.onError);
264
+ if (handlers.onClose) {
265
+ socket.on('close', handlers.onClose);
266
+ }
267
+ }
268
+ function frameRawTcpMessage(payload, framing) {
269
+ if (!framing || framing.type === 'none') {
270
+ return payload;
271
+ }
272
+ if (framing.type === 'delimiter' && framing.delimiter) {
273
+ return Buffer.concat([payload, Buffer.from(framing.delimiter, 'utf8')]);
274
+ }
275
+ const lengthBytes = framing.lengthBytes ?? 4;
276
+ const lengthEncoding = framing.lengthEncoding ?? 'BE';
277
+ const header = Buffer.alloc(lengthBytes);
278
+ if (lengthBytes === 1) {
279
+ header.writeUInt8(payload.length, 0);
280
+ }
281
+ else if (lengthBytes === 2) {
282
+ if (lengthEncoding === 'BE') {
283
+ header.writeUInt16BE(payload.length, 0);
284
+ }
285
+ else {
286
+ header.writeUInt16LE(payload.length, 0);
287
+ }
288
+ }
289
+ else if (lengthEncoding === 'BE') {
290
+ header.writeUInt32BE(payload.length, 0);
291
+ }
292
+ else {
293
+ header.writeUInt32LE(payload.length, 0);
294
+ }
295
+ return Buffer.concat([header, payload]);
296
+ }
297
+ export async function invokeHttp(entry, payload) {
298
+ if (entry.mode === 'stream') {
299
+ throw new Error('Use a session for HTTP stream bindings');
300
+ }
301
+ const url = buildHttpUrl(entry, payload);
302
+ const headers = {
303
+ ...toStringRecord(payload.headers),
304
+ ...toStringRecord(payload.metadata),
305
+ };
306
+ const method = entry.label.split(' ')[0] || 'POST';
307
+ const requestInit = {
308
+ method,
309
+ headers,
310
+ };
311
+ if (method !== 'GET' && payload.body !== undefined) {
312
+ requestInit.body = JSON.stringify(payload.body);
313
+ if (!headers['content-type']) {
314
+ headers['content-type'] = 'application/json';
315
+ }
316
+ }
317
+ const response = await fetch(url, requestInit);
318
+ return {
319
+ ok: response.ok,
320
+ status: response.status,
321
+ headers: Object.fromEntries(response.headers.entries()),
322
+ body: await parseFetchResponse(response),
323
+ };
324
+ }
325
+ export async function invokeJsonRpc(entry, payload) {
326
+ const url = buildHttpUrl(entry, payload);
327
+ const response = await fetch(url, {
328
+ method: 'POST',
329
+ headers: {
330
+ 'content-type': 'application/json',
331
+ ...toStringRecord(payload.headers),
332
+ ...toStringRecord(payload.metadata),
333
+ },
334
+ body: JSON.stringify({
335
+ jsonrpc: '2.0',
336
+ method: entry.label,
337
+ params: payload.body ?? {},
338
+ id: 'playground-call',
339
+ }),
340
+ });
341
+ return {
342
+ ok: response.ok,
343
+ status: response.status,
344
+ headers: Object.fromEntries(response.headers.entries()),
345
+ body: await parseFetchResponse(response),
346
+ };
347
+ }
348
+ export async function invokeGraphQL(entry, payload) {
349
+ const url = buildHttpUrl(entry, payload);
350
+ const response = await fetch(url, {
351
+ method: 'POST',
352
+ headers: {
353
+ 'content-type': 'application/json',
354
+ ...toStringRecord(payload.headers),
355
+ ...toStringRecord(payload.metadata),
356
+ },
357
+ body: JSON.stringify({
358
+ query: payload.document,
359
+ }),
360
+ });
361
+ return {
362
+ ok: response.ok,
363
+ status: response.status,
364
+ headers: Object.fromEntries(response.headers.entries()),
365
+ body: await parseFetchResponse(response),
366
+ };
367
+ }
368
+ function resolveGrpcClient(root, fullName) {
369
+ const parts = fullName.split('.').filter(Boolean);
370
+ let current = root;
371
+ for (const part of parts) {
372
+ if (!current || typeof current !== 'object' || !(part in current)) {
373
+ throw new Error(`gRPC service "${fullName}" not found in loaded proto definition`);
374
+ }
375
+ current = current[part];
376
+ }
377
+ return current;
378
+ }
379
+ function createGrpcClient(entry, graph) {
380
+ const transport = graph.transports.find((candidate) => candidate.id === entry.transportId);
381
+ if (!transport?.grpc) {
382
+ throw new Error('Missing gRPC transport metadata for playground invocation');
383
+ }
384
+ const definition = protoLoader.loadSync(transport.grpc.protoPath, {
385
+ keepCase: true,
386
+ longs: String,
387
+ enums: String,
388
+ defaults: true,
389
+ oneofs: true,
390
+ });
391
+ const proto = grpc.loadPackageDefinition(definition);
392
+ const Client = resolveGrpcClient(proto, entry.target.service ?? '');
393
+ return new Client(`${normalizeConnectHost(entry.target.host)}:${entry.target.port}`, grpc.credentials.createInsecure());
394
+ }
395
+ function buildGrpcMetadata(payload) {
396
+ const metadata = new grpc.Metadata();
397
+ for (const [key, value] of Object.entries(toStringRecord(payload.metadata))) {
398
+ metadata.set(key, value);
399
+ }
400
+ return metadata;
401
+ }
402
+ export async function invokeGrpc(entry, payload, graph) {
403
+ if (entry.mode !== 'unary') {
404
+ throw new Error(`Use a session for gRPC ${entry.mode} methods`);
405
+ }
406
+ const client = createGrpcClient(entry, graph);
407
+ const metadata = buildGrpcMetadata(payload);
408
+ try {
409
+ const response = await new Promise((resolve, reject) => {
410
+ client[entry.target.method ?? ''](payload.body ?? {}, metadata, (error, result) => {
411
+ if (error) {
412
+ reject(error);
413
+ return;
414
+ }
415
+ resolve(result);
416
+ });
417
+ });
418
+ return {
419
+ ok: true,
420
+ body: response,
421
+ };
422
+ }
423
+ finally {
424
+ client.close();
425
+ }
426
+ }
427
+ export async function invokeTcp(entry, payload) {
428
+ if (entry.mode === 'stream') {
429
+ throw new Error('Use a session for TCP stream bindings');
430
+ }
431
+ const socket = await connectTcpSocket(entry);
432
+ const requestId = randomUUID();
433
+ const metadata = {
434
+ ...toStringRecord(payload.headers),
435
+ ...toStringRecord(payload.metadata),
436
+ };
437
+ const message = {
438
+ id: requestId,
439
+ procedure: entry.target.procedure ?? entry.label,
440
+ type: entry.mode === 'event' ? 'event' : 'request',
441
+ payload: payload.body ?? {},
442
+ metadata,
443
+ };
444
+ try {
445
+ const responsePromise = waitForTcpEnvelope(socket);
446
+ socket.write(frameTcpMessage(message));
447
+ const response = await responsePromise;
448
+ return {
449
+ ok: response.type !== 'error',
450
+ body: response.payload,
451
+ envelope: response,
452
+ };
453
+ }
454
+ finally {
455
+ socket.destroy();
456
+ }
457
+ }
458
+ export async function invokeUdp(entry, payload) {
459
+ const port = entry.target.port;
460
+ if (port === undefined) {
461
+ throw new Error(`Missing UDP target port for playground entry "${entry.key}"`);
462
+ }
463
+ const socketType = entry.target.socketType ?? 'udp4';
464
+ const socket = createSocket(socketType);
465
+ const body = encodeDatagramPayload(payload.body);
466
+ try {
467
+ await new Promise((resolve, reject) => {
468
+ socket.once('error', reject);
469
+ socket.bind(() => resolve());
470
+ });
471
+ const response = await new Promise((resolve, reject) => {
472
+ const timeout = setTimeout(() => {
473
+ cleanup();
474
+ resolve({
475
+ ok: true,
476
+ body: null,
477
+ note: 'No UDP response received before timeout; the handler may be fire-and-forget.',
478
+ });
479
+ }, 1500);
480
+ const cleanup = () => {
481
+ clearTimeout(timeout);
482
+ socket.off('message', onMessage);
483
+ socket.off('error', onError);
484
+ };
485
+ const onError = (error) => {
486
+ cleanup();
487
+ reject(error);
488
+ };
489
+ const onMessage = (message) => {
490
+ cleanup();
491
+ resolve({
492
+ ok: true,
493
+ body: decodeDatagramPayload(message),
494
+ });
495
+ };
496
+ socket.once('error', onError);
497
+ socket.once('message', onMessage);
498
+ socket.send(body, port, normalizeConnectHost(entry.target.host), (error) => {
499
+ if (error) {
500
+ cleanup();
501
+ reject(error);
502
+ }
503
+ });
504
+ });
505
+ return response;
506
+ }
507
+ finally {
508
+ socket.close();
509
+ }
510
+ }
511
+ export function toSessionView(session) {
512
+ return {
513
+ id: session.id,
514
+ entry: session.entry.key,
515
+ state: session.state,
516
+ protocol: session.protocol,
517
+ mode: session.mode,
518
+ target: session.target,
519
+ sent: [...session.sent],
520
+ received: [...session.received],
521
+ errors: [...session.errors],
522
+ };
523
+ }
524
+ function parseMaybeJson(raw) {
525
+ try {
526
+ return JSON.parse(raw);
527
+ }
528
+ catch {
529
+ return raw;
530
+ }
531
+ }
532
+ export async function createGrpcSession(entry, payload, graph) {
533
+ const client = createGrpcClient(entry, graph);
534
+ const metadata = buildGrpcMetadata(payload);
535
+ const sent = [];
536
+ const received = [];
537
+ const errors = [];
538
+ const target = `${normalizeConnectHost(entry.target.host)}:${entry.target.port}/${entry.target.service}.${entry.target.method}`;
539
+ const methodName = entry.target.method ?? '';
540
+ let closing = false;
541
+ let resolveSettled = null;
542
+ let rejectSettled = null;
543
+ const settled = new Promise((resolve, reject) => {
544
+ resolveSettled = resolve;
545
+ rejectSettled = reject;
546
+ });
547
+ const session = {
548
+ id: randomUUID(),
549
+ entry,
550
+ state: 'connecting',
551
+ protocol: entry.protocol,
552
+ mode: entry.mode,
553
+ target,
554
+ sent,
555
+ received,
556
+ errors,
557
+ async close() {
558
+ closing = true;
559
+ if (entry.mode === 'server-streaming') {
560
+ readableCall?.cancel();
561
+ client.close();
562
+ session.state = 'closed';
563
+ resolveSettled?.();
564
+ return;
565
+ }
566
+ if (entry.mode === 'client-streaming') {
567
+ writableCall?.end();
568
+ }
569
+ else if (entry.mode === 'bidirectional') {
570
+ duplexCall?.end();
571
+ }
572
+ try {
573
+ await settled;
574
+ }
575
+ finally {
576
+ client.close();
577
+ }
578
+ },
579
+ };
580
+ let readableCall = null;
581
+ let writableCall = null;
582
+ let duplexCall = null;
583
+ const pushReceived = (message) => {
584
+ received.push({ at: new Date().toISOString(), payload: message });
585
+ };
586
+ const handleError = (error) => {
587
+ const isCancellation = error.code === grpc.status.CANCELLED;
588
+ if (closing && isCancellation) {
589
+ session.state = 'closed';
590
+ resolveSettled?.();
591
+ return;
592
+ }
593
+ session.state = 'error';
594
+ errors.push(error.message);
595
+ rejectSettled?.(error);
596
+ };
597
+ if (entry.mode === 'server-streaming') {
598
+ readableCall = client[methodName](payload.body ?? {}, metadata);
599
+ readableCall.on('data', (chunk) => {
600
+ pushReceived({ type: 'data', payload: chunk });
601
+ });
602
+ readableCall.on('end', () => {
603
+ session.state = 'closed';
604
+ resolveSettled?.();
605
+ client.close();
606
+ });
607
+ readableCall.on('error', handleError);
608
+ session.state = 'open';
609
+ return session;
610
+ }
611
+ if (entry.mode === 'client-streaming') {
612
+ writableCall = client[methodName](metadata, (error, result) => {
613
+ if (error) {
614
+ handleError(error);
615
+ return;
616
+ }
617
+ pushReceived({ type: 'response', payload: result });
618
+ session.state = 'closed';
619
+ resolveSettled?.();
620
+ });
621
+ session.send = (message) => {
622
+ writableCall?.write(message);
623
+ sent.push({ at: new Date().toISOString(), payload: message });
624
+ };
625
+ writableCall.on('error', handleError);
626
+ session.state = 'open';
627
+ return session;
628
+ }
629
+ if (entry.mode !== 'bidirectional') {
630
+ client.close();
631
+ throw new Error(`Sessions are not supported for gRPC ${entry.mode}`);
632
+ }
633
+ duplexCall = client[methodName](metadata);
634
+ duplexCall.on('data', (chunk) => {
635
+ pushReceived({ type: 'data', payload: chunk });
636
+ });
637
+ duplexCall.on('end', () => {
638
+ session.state = 'closed';
639
+ resolveSettled?.();
640
+ client.close();
641
+ });
642
+ duplexCall.on('error', handleError);
643
+ session.send = (message) => {
644
+ duplexCall?.write(message);
645
+ sent.push({ at: new Date().toISOString(), payload: message });
646
+ };
647
+ session.state = 'open';
648
+ return session;
649
+ }
650
+ export async function createTcpStreamSession(entry, payload) {
651
+ if (entry.mode !== 'stream') {
652
+ throw new Error(`TCP sessions are only supported for stream bindings; received ${entry.mode}`);
653
+ }
654
+ const socket = await connectTcpSocket(entry);
655
+ const requestId = randomUUID();
656
+ const target = `${normalizeConnectHost(entry.target.host)}:${entry.target.port}/${entry.target.procedure ?? entry.label}`;
657
+ const sent = [];
658
+ const received = [];
659
+ const errors = [];
660
+ let closing = false;
661
+ const session = {
662
+ id: randomUUID(),
663
+ entry,
664
+ state: 'connecting',
665
+ protocol: entry.protocol,
666
+ mode: entry.mode,
667
+ target,
668
+ sent,
669
+ received,
670
+ errors,
671
+ async close() {
672
+ closing = true;
673
+ if (!socket.destroyed) {
674
+ socket.write(frameTcpMessage({
675
+ id: requestId,
676
+ type: 'cancel',
677
+ }));
678
+ socket.end();
679
+ }
680
+ session.state = 'closed';
681
+ },
682
+ };
683
+ attachTcpEnvelopeStream(socket, {
684
+ onEnvelope(envelope) {
685
+ received.push({ at: new Date().toISOString(), payload: envelope });
686
+ if (envelope.type === 'stream:end') {
687
+ session.state = 'closed';
688
+ }
689
+ else if (envelope.type === 'stream:error' || envelope.type === 'error') {
690
+ session.state = closing ? 'closed' : 'error';
691
+ }
692
+ else if (session.state === 'connecting') {
693
+ session.state = 'open';
694
+ }
695
+ },
696
+ onError(error) {
697
+ if (closing) {
698
+ session.state = 'closed';
699
+ return;
700
+ }
701
+ session.state = 'error';
702
+ errors.push(error.message);
703
+ },
704
+ onClose() {
705
+ if (session.state !== 'error') {
706
+ session.state = 'closed';
707
+ }
708
+ },
709
+ });
710
+ socket.write(frameTcpMessage({
711
+ id: requestId,
712
+ procedure: entry.target.procedure ?? entry.label,
713
+ type: 'stream:start',
714
+ payload: payload.body ?? {},
715
+ metadata: {
716
+ ...toStringRecord(payload.headers),
717
+ ...toStringRecord(payload.metadata),
718
+ },
719
+ }));
720
+ session.state = 'open';
721
+ return session;
722
+ }
723
+ export async function createRawTcpSession(entry) {
724
+ const socket = await connectTcpSocket(entry);
725
+ const sent = [];
726
+ const received = [];
727
+ const errors = [];
728
+ const target = `${normalizeConnectHost(entry.target.host)}:${entry.target.port}/${entry.target.procedure ?? entry.label}`;
729
+ const framing = entry.target.framing;
730
+ const session = {
731
+ id: randomUUID(),
732
+ entry,
733
+ state: 'connecting',
734
+ protocol: entry.protocol,
735
+ mode: entry.mode,
736
+ target,
737
+ sent,
738
+ received,
739
+ errors,
740
+ send(message) {
741
+ const payload = encodeTcpRawPayload(message);
742
+ socket.write(frameRawTcpMessage(payload, framing));
743
+ sent.push({ at: new Date().toISOString(), payload: parseMaybeJson(payload.toString('utf8')) });
744
+ },
745
+ async close() {
746
+ socket.end();
747
+ session.state = 'closed';
748
+ },
749
+ };
750
+ attachRawTcpMessageStream(socket, framing, {
751
+ onMessage(message) {
752
+ received.push({
753
+ at: new Date().toISOString(),
754
+ payload: parseMaybeJson(message.toString('utf8')),
755
+ });
756
+ if (session.state === 'connecting') {
757
+ session.state = 'open';
758
+ }
759
+ },
760
+ onError(error) {
761
+ session.state = 'error';
762
+ errors.push(error.message);
763
+ },
764
+ onClose() {
765
+ if (session.state !== 'error') {
766
+ session.state = 'closed';
767
+ }
768
+ },
769
+ });
770
+ session.state = 'open';
771
+ return session;
772
+ }
773
+ export async function createWebSocketSession(entry, payload) {
774
+ const sent = [];
775
+ const received = [];
776
+ const errors = [];
777
+ const headers = {
778
+ ...toStringRecord(payload.headers),
779
+ ...toStringRecord(payload.metadata),
780
+ };
781
+ const candidates = buildWebSocketCandidates(entry, payload);
782
+ let socket = null;
783
+ let target = candidates[0];
784
+ const session = {
785
+ id: randomUUID(),
786
+ entry,
787
+ state: 'connecting',
788
+ protocol: entry.protocol,
789
+ mode: entry.mode,
790
+ target,
791
+ sent,
792
+ received,
793
+ errors,
794
+ send(message) {
795
+ const normalized = typeof message === 'string' ? message : JSON.stringify(message);
796
+ socket?.send(normalized);
797
+ sent.push({ at: new Date().toISOString(), payload: parseMaybeJson(normalized) });
798
+ },
799
+ async close() {
800
+ socket?.close();
801
+ },
802
+ };
803
+ async function connect(candidate) {
804
+ return await new Promise((resolve, reject) => {
805
+ const current = new WebSocket(candidate, { headers });
806
+ const timeout = setTimeout(() => {
807
+ current.close();
808
+ reject(new Error(`Timed out opening WebSocket session to ${candidate}`));
809
+ }, 2000);
810
+ current.once('open', () => {
811
+ clearTimeout(timeout);
812
+ resolve(current);
813
+ });
814
+ current.once('error', (error) => {
815
+ clearTimeout(timeout);
816
+ reject(error);
817
+ });
818
+ });
819
+ }
820
+ let lastError = null;
821
+ for (const candidate of candidates) {
822
+ try {
823
+ socket = await connect(candidate);
824
+ target = candidate;
825
+ session.target = candidate;
826
+ break;
827
+ }
828
+ catch (error) {
829
+ lastError = error;
830
+ errors.push(lastError.message);
831
+ }
832
+ }
833
+ if (!socket) {
834
+ session.state = 'error';
835
+ throw lastError ?? new Error('Failed to open WebSocket session');
836
+ }
837
+ socket.on('message', (message) => {
838
+ const raw = typeof message === 'string' ? message : message.toString('utf8');
839
+ received.push({ at: new Date().toISOString(), payload: parseMaybeJson(raw) });
840
+ });
841
+ socket.on('close', () => {
842
+ session.state = 'closed';
843
+ });
844
+ socket.on('error', (error) => {
845
+ session.state = 'error';
846
+ errors.push(error.message);
847
+ });
848
+ session.state = 'open';
849
+ return session;
850
+ }
851
+ function parseSseBlock(block) {
852
+ const event = {};
853
+ for (const line of block.split('\n')) {
854
+ const separator = line.indexOf(':');
855
+ if (separator === -1)
856
+ continue;
857
+ const key = line.slice(0, separator).trim();
858
+ const value = line.slice(separator + 1).trim();
859
+ if (key === 'event') {
860
+ event.event = value;
861
+ }
862
+ else if (key === 'data') {
863
+ event.data = value;
864
+ }
865
+ }
866
+ if (event.data) {
867
+ return {
868
+ ...event,
869
+ parsed: parseMaybeJson(event.data),
870
+ };
871
+ }
872
+ return event;
873
+ }
874
+ export async function createHttpStreamSession(entry, payload) {
875
+ const target = buildHttpUrl(entry, payload);
876
+ const controller = new AbortController();
877
+ const sent = [];
878
+ const received = [];
879
+ const errors = [];
880
+ const session = {
881
+ id: randomUUID(),
882
+ entry,
883
+ state: 'connecting',
884
+ protocol: entry.protocol,
885
+ mode: entry.mode,
886
+ target,
887
+ sent,
888
+ received,
889
+ errors,
890
+ async close() {
891
+ controller.abort('playground-session-closed');
892
+ session.state = 'closed';
893
+ },
894
+ };
895
+ void (async () => {
896
+ try {
897
+ const response = await fetch(target, {
898
+ method: 'GET',
899
+ headers: {
900
+ accept: 'text/event-stream',
901
+ ...toStringRecord(payload.headers),
902
+ ...toStringRecord(payload.metadata),
903
+ },
904
+ signal: controller.signal,
905
+ });
906
+ if (!response.ok) {
907
+ session.state = 'error';
908
+ errors.push(`HTTP ${response.status}`);
909
+ received.push({
910
+ at: new Date().toISOString(),
911
+ payload: await parseFetchResponse(response),
912
+ });
913
+ return;
914
+ }
915
+ session.state = 'open';
916
+ const reader = response.body?.getReader();
917
+ if (!reader) {
918
+ session.state = 'closed';
919
+ return;
920
+ }
921
+ const decoder = new TextDecoder();
922
+ let buffer = '';
923
+ while (true) {
924
+ const { done, value } = await reader.read();
925
+ if (done)
926
+ break;
927
+ buffer += decoder.decode(value, { stream: true });
928
+ const blocks = buffer.split('\n\n');
929
+ buffer = blocks.pop() ?? '';
930
+ for (const block of blocks) {
931
+ if (!block.trim())
932
+ continue;
933
+ received.push({
934
+ at: new Date().toISOString(),
935
+ payload: parseSseBlock(block),
936
+ });
937
+ }
938
+ }
939
+ session.state = 'closed';
940
+ }
941
+ catch (error) {
942
+ if (!controller.signal.aborted) {
943
+ session.state = 'error';
944
+ errors.push(error instanceof Error ? error.message : String(error));
945
+ }
946
+ }
947
+ })();
948
+ return session;
949
+ }
950
+ //# sourceMappingURL=playground-invokers.js.map