raffel 0.2.3 → 1.0.0-next.f81d4db

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 (590) hide show
  1. package/dist/adapters/grpc.d.ts.map +1 -1
  2. package/dist/adapters/grpc.js +1 -15
  3. package/dist/adapters/grpc.js.map +1 -1
  4. package/dist/adapters/http.d.ts +6 -0
  5. package/dist/adapters/http.d.ts.map +1 -1
  6. package/dist/adapters/http.js +53 -86
  7. package/dist/adapters/http.js.map +1 -1
  8. package/dist/adapters/index.d.ts +0 -2
  9. package/dist/adapters/index.d.ts.map +1 -1
  10. package/dist/adapters/index.js +0 -2
  11. package/dist/adapters/index.js.map +1 -1
  12. package/dist/adapters/tcp.d.ts +16 -0
  13. package/dist/adapters/tcp.d.ts.map +1 -1
  14. package/dist/adapters/tcp.js +85 -34
  15. package/dist/adapters/tcp.js.map +1 -1
  16. package/dist/adapters/websocket.d.ts.map +1 -1
  17. package/dist/adapters/websocket.js +1 -14
  18. package/dist/adapters/websocket.js.map +1 -1
  19. package/dist/cache/drivers/index.d.ts +0 -1
  20. package/dist/cache/drivers/index.d.ts.map +1 -1
  21. package/dist/cache/drivers/index.js +0 -1
  22. package/dist/cache/drivers/index.js.map +1 -1
  23. package/dist/cache/factory.d.ts +2 -9
  24. package/dist/cache/factory.d.ts.map +1 -1
  25. package/dist/cache/factory.js +1 -19
  26. package/dist/cache/factory.js.map +1 -1
  27. package/dist/cache/index.d.ts +2 -7
  28. package/dist/cache/index.d.ts.map +1 -1
  29. package/dist/cache/index.js +1 -6
  30. package/dist/cache/index.js.map +1 -1
  31. package/dist/cache/types.d.ts +1 -32
  32. package/dist/cache/types.d.ts.map +1 -1
  33. package/dist/core/event-delivery.d.ts.map +1 -1
  34. package/dist/core/event-delivery.js +5 -3
  35. package/dist/core/event-delivery.js.map +1 -1
  36. package/dist/core/index.d.ts +1 -1
  37. package/dist/core/index.d.ts.map +1 -1
  38. package/dist/core/registry.d.ts +3 -3
  39. package/dist/core/registry.d.ts.map +1 -1
  40. package/dist/core/registry.js +30 -8
  41. package/dist/core/registry.js.map +1 -1
  42. package/dist/core/router.d.ts.map +1 -1
  43. package/dist/core/router.js +5 -4
  44. package/dist/core/router.js.map +1 -1
  45. package/dist/docs/generators/code-samples.d.ts +32 -0
  46. package/dist/docs/generators/code-samples.d.ts.map +1 -0
  47. package/dist/docs/generators/code-samples.js +322 -0
  48. package/dist/docs/generators/code-samples.js.map +1 -0
  49. package/dist/docs/generators/errors-types.d.ts +2 -2
  50. package/dist/docs/generators/errors-types.js +2 -2
  51. package/dist/docs/generators/http-generator.d.ts +10 -0
  52. package/dist/docs/generators/http-generator.d.ts.map +1 -1
  53. package/dist/docs/generators/http-generator.js +100 -3
  54. package/dist/docs/generators/http-generator.js.map +1 -1
  55. package/dist/docs/generators/usd-generator.d.ts +31 -1
  56. package/dist/docs/generators/usd-generator.d.ts.map +1 -1
  57. package/dist/docs/generators/usd-generator.js +19 -1
  58. package/dist/docs/generators/usd-generator.js.map +1 -1
  59. package/dist/docs/generators/websocket-generator.d.ts.map +1 -1
  60. package/dist/docs/generators/websocket-generator.js +6 -4
  61. package/dist/docs/generators/websocket-generator.js.map +1 -1
  62. package/dist/docs/ui/html-builder.d.ts.map +1 -1
  63. package/dist/docs/ui/html-builder.js +260 -54
  64. package/dist/docs/ui/html-builder.js.map +1 -1
  65. package/dist/docs/ui/styles.d.ts.map +1 -1
  66. package/dist/docs/ui/styles.js +240 -30
  67. package/dist/docs/ui/styles.js.map +1 -1
  68. package/dist/docs/ui/types.d.ts +15 -1
  69. package/dist/docs/ui/types.d.ts.map +1 -1
  70. package/dist/docs/usd-middleware.d.ts +32 -7
  71. package/dist/docs/usd-middleware.d.ts.map +1 -1
  72. package/dist/docs/usd-middleware.js +5 -1
  73. package/dist/docs/usd-middleware.js.map +1 -1
  74. package/dist/dx/index.d.ts +2 -0
  75. package/dist/dx/index.d.ts.map +1 -1
  76. package/dist/dx/index.js +1 -0
  77. package/dist/dx/index.js.map +1 -1
  78. package/dist/dx/logging/index.d.ts.map +1 -1
  79. package/dist/dx/logging/index.js +5 -3
  80. package/dist/dx/logging/index.js.map +1 -1
  81. package/dist/dx/scenarios.d.ts +26 -0
  82. package/dist/dx/scenarios.d.ts.map +1 -0
  83. package/dist/dx/scenarios.js +109 -0
  84. package/dist/dx/scenarios.js.map +1 -0
  85. package/dist/errors/codes.d.ts +1 -1
  86. package/dist/errors/codes.js +1 -1
  87. package/dist/graphql/adapter.js +1 -1
  88. package/dist/http/index.d.ts +2 -0
  89. package/dist/http/index.d.ts.map +1 -1
  90. package/dist/http/index.js +4 -0
  91. package/dist/http/index.js.map +1 -1
  92. package/dist/http/openapi-ui.d.ts +174 -0
  93. package/dist/http/openapi-ui.d.ts.map +1 -0
  94. package/dist/http/openapi-ui.js +221 -0
  95. package/dist/http/openapi-ui.js.map +1 -0
  96. package/dist/http/serve.d.ts +14 -0
  97. package/dist/http/serve.d.ts.map +1 -1
  98. package/dist/http/serve.js +8 -1
  99. package/dist/http/serve.js.map +1 -1
  100. package/dist/index.d.ts +17 -10
  101. package/dist/index.d.ts.map +1 -1
  102. package/dist/index.js +12 -6
  103. package/dist/index.js.map +1 -1
  104. package/dist/mcp/cli.d.ts +2 -1
  105. package/dist/mcp/cli.d.ts.map +1 -1
  106. package/dist/mcp/cli.js +30 -7
  107. package/dist/mcp/cli.js.map +1 -1
  108. package/dist/mcp/docs/adapters.d.ts.map +1 -1
  109. package/dist/mcp/docs/adapters.js +1 -117
  110. package/dist/mcp/docs/adapters.js.map +1 -1
  111. package/dist/mcp/docs/index.d.ts +0 -1
  112. package/dist/mcp/docs/index.d.ts.map +1 -1
  113. package/dist/mcp/docs/index.js +0 -1
  114. package/dist/mcp/docs/index.js.map +1 -1
  115. package/dist/mcp/docs/interceptors.d.ts.map +1 -1
  116. package/dist/mcp/docs/interceptors.js +272 -1
  117. package/dist/mcp/docs/interceptors.js.map +1 -1
  118. package/dist/mcp/docs/patterns.js +1 -1
  119. package/dist/mcp/prompts/index.d.ts.map +1 -1
  120. package/dist/mcp/prompts/index.js +147 -22
  121. package/dist/mcp/prompts/index.js.map +1 -1
  122. package/dist/mcp/resources/index.d.ts.map +1 -1
  123. package/dist/mcp/resources/index.js +508 -10
  124. package/dist/mcp/resources/index.js.map +1 -1
  125. package/dist/mcp/server.js +1 -1
  126. package/dist/mcp/server.js.map +1 -1
  127. package/dist/mcp/tools/definitions.d.ts +2 -0
  128. package/dist/mcp/tools/definitions.d.ts.map +1 -1
  129. package/dist/mcp/tools/definitions.js +149 -1
  130. package/dist/mcp/tools/definitions.js.map +1 -1
  131. package/dist/mcp/tools/handlers.d.ts.map +1 -1
  132. package/dist/mcp/tools/handlers.js +828 -44
  133. package/dist/mcp/tools/handlers.js.map +1 -1
  134. package/dist/mcp/types.d.ts +1 -1
  135. package/dist/mcp/types.d.ts.map +1 -1
  136. package/dist/metrics/interceptor.d.ts.map +1 -1
  137. package/dist/metrics/interceptor.js +10 -2
  138. package/dist/metrics/interceptor.js.map +1 -1
  139. package/dist/middleware/interceptors/cache.d.ts +1 -1
  140. package/dist/middleware/interceptors/cache.d.ts.map +1 -1
  141. package/dist/middleware/interceptors/cache.js +4 -2
  142. package/dist/middleware/interceptors/cache.js.map +1 -1
  143. package/dist/middleware/interceptors/envelope.d.ts.map +1 -1
  144. package/dist/middleware/interceptors/envelope.js +12 -14
  145. package/dist/middleware/interceptors/envelope.js.map +1 -1
  146. package/dist/middleware/interceptors/logging.d.ts.map +1 -1
  147. package/dist/middleware/interceptors/logging.js +11 -6
  148. package/dist/middleware/interceptors/logging.js.map +1 -1
  149. package/dist/middleware/session/drivers/memory.d.ts +36 -0
  150. package/dist/middleware/session/drivers/memory.d.ts.map +1 -0
  151. package/dist/middleware/session/drivers/memory.js +82 -0
  152. package/dist/middleware/session/drivers/memory.js.map +1 -0
  153. package/dist/middleware/session/drivers/redis.d.ts +58 -0
  154. package/dist/middleware/session/drivers/redis.d.ts.map +1 -0
  155. package/dist/middleware/session/drivers/redis.js +70 -0
  156. package/dist/middleware/session/drivers/redis.js.map +1 -0
  157. package/dist/middleware/session/drivers/s3db.d.ts +65 -0
  158. package/dist/middleware/session/drivers/s3db.d.ts.map +1 -0
  159. package/dist/middleware/session/drivers/s3db.js +98 -0
  160. package/dist/middleware/session/drivers/s3db.js.map +1 -0
  161. package/dist/middleware/session/index.d.ts +47 -0
  162. package/dist/middleware/session/index.d.ts.map +1 -0
  163. package/dist/middleware/session/index.js +46 -0
  164. package/dist/middleware/session/index.js.map +1 -0
  165. package/dist/middleware/session/interceptor.d.ts +42 -0
  166. package/dist/middleware/session/interceptor.d.ts.map +1 -0
  167. package/dist/middleware/session/interceptor.js +264 -0
  168. package/dist/middleware/session/interceptor.js.map +1 -0
  169. package/dist/middleware/session/types.d.ts +116 -0
  170. package/dist/middleware/session/types.d.ts.map +1 -0
  171. package/dist/middleware/session/types.js +9 -0
  172. package/dist/middleware/session/types.js.map +1 -0
  173. package/dist/proxy/connect-tunnel.d.ts +50 -0
  174. package/dist/proxy/connect-tunnel.d.ts.map +1 -0
  175. package/dist/proxy/connect-tunnel.js +163 -0
  176. package/dist/proxy/connect-tunnel.js.map +1 -0
  177. package/dist/proxy/http-forward.d.ts +48 -0
  178. package/dist/proxy/http-forward.d.ts.map +1 -0
  179. package/dist/proxy/http-forward.js +160 -0
  180. package/dist/proxy/http-forward.js.map +1 -0
  181. package/dist/proxy/index.d.ts +19 -0
  182. package/dist/proxy/index.d.ts.map +1 -0
  183. package/dist/proxy/index.js +14 -0
  184. package/dist/proxy/index.js.map +1 -0
  185. package/dist/proxy/socks5.d.ts +22 -0
  186. package/dist/proxy/socks5.d.ts.map +1 -0
  187. package/dist/proxy/socks5.js +307 -0
  188. package/dist/proxy/socks5.js.map +1 -0
  189. package/dist/proxy/transparent.d.ts +40 -0
  190. package/dist/proxy/transparent.d.ts.map +1 -0
  191. package/dist/proxy/transparent.js +144 -0
  192. package/dist/proxy/transparent.js.map +1 -0
  193. package/dist/proxy/types.d.ts +32 -0
  194. package/dist/proxy/types.d.ts.map +1 -0
  195. package/dist/proxy/types.js +5 -0
  196. package/dist/proxy/types.js.map +1 -0
  197. package/dist/proxy/utils/auth.d.ts +31 -0
  198. package/dist/proxy/utils/auth.d.ts.map +1 -0
  199. package/dist/proxy/utils/auth.js +69 -0
  200. package/dist/proxy/utils/auth.js.map +1 -0
  201. package/dist/proxy/utils/hop-headers.d.ts +13 -0
  202. package/dist/proxy/utils/hop-headers.d.ts.map +1 -0
  203. package/dist/proxy/utils/hop-headers.js +38 -0
  204. package/dist/proxy/utils/hop-headers.js.map +1 -0
  205. package/dist/proxy/utils/pipe.d.ts +22 -0
  206. package/dist/proxy/utils/pipe.d.ts.map +1 -0
  207. package/dist/proxy/utils/pipe.js +60 -0
  208. package/dist/proxy/utils/pipe.js.map +1 -0
  209. package/dist/rate-limit/factory.d.ts.map +1 -1
  210. package/dist/rate-limit/factory.js +30 -6
  211. package/dist/rate-limit/factory.js.map +1 -1
  212. package/dist/server/builder/config-preview.d.ts +34 -0
  213. package/dist/server/builder/config-preview.d.ts.map +1 -0
  214. package/dist/server/builder/config-preview.js +95 -0
  215. package/dist/server/builder/config-preview.js.map +1 -0
  216. package/dist/server/builder/lifecycle-utils.d.ts +11 -0
  217. package/dist/server/builder/lifecycle-utils.d.ts.map +1 -0
  218. package/dist/server/builder/lifecycle-utils.js +32 -0
  219. package/dist/server/builder/lifecycle-utils.js.map +1 -0
  220. package/dist/server/builder/lifecycle.d.ts +86 -0
  221. package/dist/server/builder/lifecycle.d.ts.map +1 -0
  222. package/dist/server/builder/lifecycle.js +738 -0
  223. package/dist/server/builder/lifecycle.js.map +1 -0
  224. package/dist/server/builder/single-port-utils.d.ts +27 -0
  225. package/dist/server/builder/single-port-utils.d.ts.map +1 -0
  226. package/dist/server/builder/single-port-utils.js +170 -0
  227. package/dist/server/builder/single-port-utils.js.map +1 -0
  228. package/dist/server/builder.d.ts.map +1 -1
  229. package/dist/server/builder.js +446 -601
  230. package/dist/server/builder.js.map +1 -1
  231. package/dist/server/discovery-bootstrap.d.ts +21 -0
  232. package/dist/server/discovery-bootstrap.d.ts.map +1 -0
  233. package/dist/server/discovery-bootstrap.js +39 -0
  234. package/dist/server/discovery-bootstrap.js.map +1 -0
  235. package/dist/server/errors.d.ts.map +1 -1
  236. package/dist/server/errors.js +1 -33
  237. package/dist/server/errors.js.map +1 -1
  238. package/dist/server/front-door.d.ts +34 -0
  239. package/dist/server/front-door.d.ts.map +1 -0
  240. package/dist/server/front-door.js +238 -0
  241. package/dist/server/front-door.js.map +1 -0
  242. package/dist/server/fs-routes/types.d.ts +6 -0
  243. package/dist/server/fs-routes/types.d.ts.map +1 -1
  244. package/dist/server/handler-builders.d.ts +22 -4
  245. package/dist/server/handler-builders.d.ts.map +1 -1
  246. package/dist/server/handler-builders.js +37 -14
  247. package/dist/server/handler-builders.js.map +1 -1
  248. package/dist/server/index.d.ts +4 -1
  249. package/dist/server/index.d.ts.map +1 -1
  250. package/dist/server/index.js +2 -0
  251. package/dist/server/index.js.map +1 -1
  252. package/dist/server/interceptor-utils.d.ts +8 -0
  253. package/dist/server/interceptor-utils.d.ts.map +1 -0
  254. package/dist/server/interceptor-utils.js +23 -0
  255. package/dist/server/interceptor-utils.js.map +1 -0
  256. package/dist/server/port-binding.d.ts +44 -0
  257. package/dist/server/port-binding.d.ts.map +1 -0
  258. package/dist/server/port-binding.js +94 -0
  259. package/dist/server/port-binding.js.map +1 -0
  260. package/dist/server/protocol-aliases.d.ts +56 -0
  261. package/dist/server/protocol-aliases.d.ts.map +1 -0
  262. package/dist/server/protocol-aliases.js +47 -0
  263. package/dist/server/protocol-aliases.js.map +1 -0
  264. package/dist/server/protocol-config.d.ts +17 -1
  265. package/dist/server/protocol-config.d.ts.map +1 -1
  266. package/dist/server/protocol-config.js +116 -9
  267. package/dist/server/protocol-config.js.map +1 -1
  268. package/dist/server/resource-builder.js +3 -3
  269. package/dist/server/resource-builder.js.map +1 -1
  270. package/dist/server/rest-middleware.d.ts.map +1 -1
  271. package/dist/server/rest-middleware.js +1 -15
  272. package/dist/server/rest-middleware.js.map +1 -1
  273. package/dist/server/router-module.d.ts.map +1 -1
  274. package/dist/server/router-module.js +22 -99
  275. package/dist/server/router-module.js.map +1 -1
  276. package/dist/server/shared-context.d.ts.map +1 -1
  277. package/dist/server/shared-context.js +3 -1
  278. package/dist/server/shared-context.js.map +1 -1
  279. package/dist/server/single-port/dispatcher.d.ts +10 -0
  280. package/dist/server/single-port/dispatcher.d.ts.map +1 -0
  281. package/dist/server/single-port/dispatcher.js +188 -0
  282. package/dist/server/single-port/dispatcher.js.map +1 -0
  283. package/dist/server/single-port/index.d.ts +4 -0
  284. package/dist/server/single-port/index.d.ts.map +1 -0
  285. package/dist/server/single-port/index.js +3 -0
  286. package/dist/server/single-port/index.js.map +1 -0
  287. package/dist/server/single-port/registry.d.ts +19 -0
  288. package/dist/server/single-port/registry.d.ts.map +1 -0
  289. package/dist/server/single-port/registry.js +24 -0
  290. package/dist/server/single-port/registry.js.map +1 -0
  291. package/dist/server/single-port/types.d.ts +46 -0
  292. package/dist/server/single-port/types.d.ts.map +1 -0
  293. package/dist/server/single-port/types.js +2 -0
  294. package/dist/server/single-port/types.js.map +1 -0
  295. package/dist/server/telemetry-bootstrap.d.ts +38 -0
  296. package/dist/server/telemetry-bootstrap.d.ts.map +1 -0
  297. package/dist/server/telemetry-bootstrap.js +115 -0
  298. package/dist/server/telemetry-bootstrap.js.map +1 -0
  299. package/dist/server/types.d.ts +422 -21
  300. package/dist/server/types.d.ts.map +1 -1
  301. package/dist/testing/echo-protection.d.ts +30 -0
  302. package/dist/testing/echo-protection.d.ts.map +1 -0
  303. package/dist/testing/echo-protection.js +158 -0
  304. package/dist/testing/echo-protection.js.map +1 -0
  305. package/dist/testing/index.d.ts +344 -0
  306. package/dist/testing/index.d.ts.map +1 -0
  307. package/dist/testing/index.js +1072 -0
  308. package/dist/testing/index.js.map +1 -0
  309. package/dist/testing/mock-dns-server.d.ts +31 -0
  310. package/dist/testing/mock-dns-server.d.ts.map +1 -0
  311. package/dist/testing/mock-dns-server.js +247 -0
  312. package/dist/testing/mock-dns-server.js.map +1 -0
  313. package/dist/testing/mock-hls-server.d.ts +85 -0
  314. package/dist/testing/mock-hls-server.d.ts.map +1 -0
  315. package/dist/testing/mock-hls-server.js +252 -0
  316. package/dist/testing/mock-hls-server.js.map +1 -0
  317. package/dist/testing/mock-proxy-server.d.ts +78 -0
  318. package/dist/testing/mock-proxy-server.d.ts.map +1 -0
  319. package/dist/testing/mock-proxy-server.js +277 -0
  320. package/dist/testing/mock-proxy-server.js.map +1 -0
  321. package/dist/testing/mock-sse-server.d.ts +56 -0
  322. package/dist/testing/mock-sse-server.d.ts.map +1 -0
  323. package/dist/testing/mock-sse-server.js +206 -0
  324. package/dist/testing/mock-sse-server.js.map +1 -0
  325. package/dist/testing/proxy-certs.d.ts +9 -0
  326. package/dist/testing/proxy-certs.d.ts.map +1 -0
  327. package/dist/testing/proxy-certs.js +2 -0
  328. package/dist/testing/proxy-certs.js.map +1 -0
  329. package/dist/testing/service-suite.d.ts +47 -0
  330. package/dist/testing/service-suite.d.ts.map +1 -0
  331. package/dist/testing/service-suite.js +82 -0
  332. package/dist/testing/service-suite.js.map +1 -0
  333. package/dist/testing/service-types.d.ts +32 -0
  334. package/dist/testing/service-types.d.ts.map +1 -0
  335. package/dist/testing/service-types.js +2 -0
  336. package/dist/testing/service-types.js.map +1 -0
  337. package/dist/ui/core/event-delivery.d.ts.map +1 -1
  338. package/dist/ui/core/index.d.ts +1 -1
  339. package/dist/ui/core/index.d.ts.map +1 -1
  340. package/dist/ui/core/registry.d.ts +3 -3
  341. package/dist/ui/core/registry.d.ts.map +1 -1
  342. package/dist/ui/core/router.d.ts.map +1 -1
  343. package/dist/ui/docs/generators/code-samples.d.ts +32 -0
  344. package/dist/ui/docs/generators/code-samples.d.ts.map +1 -0
  345. package/dist/ui/docs/generators/errors-types.d.ts +2 -2
  346. package/dist/ui/docs/generators/http-generator.d.ts +10 -0
  347. package/dist/ui/docs/generators/http-generator.d.ts.map +1 -1
  348. package/dist/ui/docs/generators/usd-generator.d.ts +31 -1
  349. package/dist/ui/docs/generators/usd-generator.d.ts.map +1 -1
  350. package/dist/ui/docs/generators/websocket-generator.d.ts.map +1 -1
  351. package/dist/ui/docs/ui/html-builder.d.ts.map +1 -1
  352. package/dist/ui/docs/ui/styles.d.ts.map +1 -1
  353. package/dist/ui/docs/ui/types.d.ts +15 -1
  354. package/dist/ui/docs/ui/types.d.ts.map +1 -1
  355. package/dist/ui/docs/usd-middleware.d.ts +32 -7
  356. package/dist/ui/docs/usd-middleware.d.ts.map +1 -1
  357. package/dist/ui/errors/codes.d.ts +1 -1
  358. package/dist/ui/server/fs-routes/types.d.ts +6 -0
  359. package/dist/ui/server/fs-routes/types.d.ts.map +1 -1
  360. package/dist/ui/usd/index.d.ts +1 -1
  361. package/dist/ui/usd/index.d.ts.map +1 -1
  362. package/dist/ui/usd/spec/types.d.ts +91 -0
  363. package/dist/ui/usd/spec/types.d.ts.map +1 -1
  364. package/dist/usd/index.d.ts +1 -1
  365. package/dist/usd/index.d.ts.map +1 -1
  366. package/dist/usd/index.js.map +1 -1
  367. package/dist/usd/spec/types.d.ts +91 -0
  368. package/dist/usd/spec/types.d.ts.map +1 -1
  369. package/dist/usd/spec/types.js.map +1 -1
  370. package/dist/utils/certs.d.ts +30 -0
  371. package/dist/utils/certs.d.ts.map +1 -0
  372. package/dist/utils/certs.js +230 -0
  373. package/dist/utils/certs.js.map +1 -0
  374. package/dist/utils/context-utils.d.ts +11 -0
  375. package/dist/utils/context-utils.d.ts.map +1 -0
  376. package/dist/utils/context-utils.js +24 -0
  377. package/dist/utils/context-utils.js.map +1 -0
  378. package/package.json +11 -2
  379. package/dist/adapters/grpc.int.test.d.ts +0 -5
  380. package/dist/adapters/grpc.int.test.d.ts.map +0 -1
  381. package/dist/adapters/grpc.int.test.js +0 -168
  382. package/dist/adapters/grpc.int.test.js.map +0 -1
  383. package/dist/adapters/http.int.test.d.ts +0 -5
  384. package/dist/adapters/http.int.test.d.ts.map +0 -1
  385. package/dist/adapters/http.int.test.js +0 -396
  386. package/dist/adapters/http.int.test.js.map +0 -1
  387. package/dist/adapters/jsonrpc.int.test.d.ts +0 -5
  388. package/dist/adapters/jsonrpc.int.test.d.ts.map +0 -1
  389. package/dist/adapters/jsonrpc.int.test.js +0 -640
  390. package/dist/adapters/jsonrpc.int.test.js.map +0 -1
  391. package/dist/adapters/s3db/adapter.d.ts +0 -105
  392. package/dist/adapters/s3db/adapter.d.ts.map +0 -1
  393. package/dist/adapters/s3db/adapter.js +0 -536
  394. package/dist/adapters/s3db/adapter.js.map +0 -1
  395. package/dist/adapters/s3db/index.d.ts +0 -20
  396. package/dist/adapters/s3db/index.d.ts.map +0 -1
  397. package/dist/adapters/s3db/index.js +0 -25
  398. package/dist/adapters/s3db/index.js.map +0 -1
  399. package/dist/adapters/s3db/s3db.int.test.d.ts +0 -5
  400. package/dist/adapters/s3db/s3db.int.test.d.ts.map +0 -1
  401. package/dist/adapters/s3db/s3db.int.test.js +0 -472
  402. package/dist/adapters/s3db/s3db.int.test.js.map +0 -1
  403. package/dist/adapters/s3db/types.d.ts +0 -277
  404. package/dist/adapters/s3db/types.d.ts.map +0 -1
  405. package/dist/adapters/s3db/types.js +0 -7
  406. package/dist/adapters/s3db/types.js.map +0 -1
  407. package/dist/adapters/s3db/utils/etag.d.ts +0 -65
  408. package/dist/adapters/s3db/utils/etag.d.ts.map +0 -1
  409. package/dist/adapters/s3db/utils/etag.js +0 -99
  410. package/dist/adapters/s3db/utils/etag.js.map +0 -1
  411. package/dist/adapters/s3db/utils/guards.d.ts +0 -121
  412. package/dist/adapters/s3db/utils/guards.d.ts.map +0 -1
  413. package/dist/adapters/s3db/utils/guards.js +0 -169
  414. package/dist/adapters/s3db/utils/guards.js.map +0 -1
  415. package/dist/adapters/s3db/utils/index.d.ts +0 -9
  416. package/dist/adapters/s3db/utils/index.d.ts.map +0 -1
  417. package/dist/adapters/s3db/utils/index.js +0 -10
  418. package/dist/adapters/s3db/utils/index.js.map +0 -1
  419. package/dist/adapters/s3db/utils/populate.d.ts +0 -89
  420. package/dist/adapters/s3db/utils/populate.d.ts.map +0 -1
  421. package/dist/adapters/s3db/utils/populate.js +0 -165
  422. package/dist/adapters/s3db/utils/populate.js.map +0 -1
  423. package/dist/adapters/tcp.int.test.d.ts +0 -5
  424. package/dist/adapters/tcp.int.test.d.ts.map +0 -1
  425. package/dist/adapters/tcp.int.test.js +0 -379
  426. package/dist/adapters/tcp.int.test.js.map +0 -1
  427. package/dist/adapters/udp.int.test.d.ts +0 -5
  428. package/dist/adapters/udp.int.test.d.ts.map +0 -1
  429. package/dist/adapters/udp.int.test.js +0 -397
  430. package/dist/adapters/udp.int.test.js.map +0 -1
  431. package/dist/adapters/websocket.int.test.d.ts +0 -5
  432. package/dist/adapters/websocket.int.test.d.ts.map +0 -1
  433. package/dist/adapters/websocket.int.test.js +0 -383
  434. package/dist/adapters/websocket.int.test.js.map +0 -1
  435. package/dist/cache/drivers/memory.int.test.d.ts +0 -5
  436. package/dist/cache/drivers/memory.int.test.d.ts.map +0 -1
  437. package/dist/cache/drivers/memory.int.test.js +0 -241
  438. package/dist/cache/drivers/memory.int.test.js.map +0 -1
  439. package/dist/cache/drivers/s3db.d.ts +0 -78
  440. package/dist/cache/drivers/s3db.d.ts.map +0 -1
  441. package/dist/cache/drivers/s3db.js +0 -216
  442. package/dist/cache/drivers/s3db.js.map +0 -1
  443. package/dist/channels/channel-manager.int.test.d.ts +0 -5
  444. package/dist/channels/channel-manager.int.test.d.ts.map +0 -1
  445. package/dist/channels/channel-manager.int.test.js +0 -378
  446. package/dist/channels/channel-manager.int.test.js.map +0 -1
  447. package/dist/core/ctx-call.int.test.d.ts +0 -7
  448. package/dist/core/ctx-call.int.test.d.ts.map +0 -1
  449. package/dist/core/ctx-call.int.test.js +0 -263
  450. package/dist/core/ctx-call.int.test.js.map +0 -1
  451. package/dist/core/registry.unit.test.d.ts +0 -2
  452. package/dist/core/registry.unit.test.d.ts.map +0 -1
  453. package/dist/core/registry.unit.test.js +0 -133
  454. package/dist/core/registry.unit.test.js.map +0 -1
  455. package/dist/core/router.int.test.d.ts +0 -2
  456. package/dist/core/router.int.test.d.ts.map +0 -1
  457. package/dist/core/router.int.test.js +0 -368
  458. package/dist/core/router.int.test.js.map +0 -1
  459. package/dist/docs/generators/generators.int.test.d.ts +0 -2
  460. package/dist/docs/generators/generators.int.test.d.ts.map +0 -1
  461. package/dist/docs/generators/generators.int.test.js +0 -105
  462. package/dist/docs/generators/generators.int.test.js.map +0 -1
  463. package/dist/docs/openapi/generator.int.test.d.ts +0 -5
  464. package/dist/docs/openapi/generator.int.test.d.ts.map +0 -1
  465. package/dist/docs/openapi/generator.int.test.js +0 -260
  466. package/dist/docs/openapi/generator.int.test.js.map +0 -1
  467. package/dist/dx/health/health.int.test.d.ts +0 -5
  468. package/dist/dx/health/health.int.test.d.ts.map +0 -1
  469. package/dist/dx/health/health.int.test.js +0 -249
  470. package/dist/dx/health/health.int.test.js.map +0 -1
  471. package/dist/dx/logging/http-logging.int.test.d.ts +0 -5
  472. package/dist/dx/logging/http-logging.int.test.d.ts.map +0 -1
  473. package/dist/dx/logging/http-logging.int.test.js +0 -319
  474. package/dist/dx/logging/http-logging.int.test.js.map +0 -1
  475. package/dist/errors/factories.unit.test.d.ts +0 -7
  476. package/dist/errors/factories.unit.test.d.ts.map +0 -1
  477. package/dist/errors/factories.unit.test.js +0 -358
  478. package/dist/errors/factories.unit.test.js.map +0 -1
  479. package/dist/graphql/graphql.int.test.d.ts +0 -10
  480. package/dist/graphql/graphql.int.test.d.ts.map +0 -1
  481. package/dist/graphql/graphql.int.test.js +0 -698
  482. package/dist/graphql/graphql.int.test.js.map +0 -1
  483. package/dist/graphql/schema-generator.int.test.d.ts +0 -5
  484. package/dist/graphql/schema-generator.int.test.d.ts.map +0 -1
  485. package/dist/graphql/schema-generator.int.test.js +0 -51
  486. package/dist/graphql/schema-generator.int.test.js.map +0 -1
  487. package/dist/http/http.int.test.d.ts +0 -7
  488. package/dist/http/http.int.test.d.ts.map +0 -1
  489. package/dist/http/http.int.test.js +0 -605
  490. package/dist/http/http.int.test.js.map +0 -1
  491. package/dist/http/session-redis.int.test.d.ts +0 -8
  492. package/dist/http/session-redis.int.test.d.ts.map +0 -1
  493. package/dist/http/session-redis.int.test.js +0 -492
  494. package/dist/http/session-redis.int.test.js.map +0 -1
  495. package/dist/metrics/metrics.int.test.d.ts +0 -5
  496. package/dist/metrics/metrics.int.test.d.ts.map +0 -1
  497. package/dist/metrics/metrics.int.test.js +0 -288
  498. package/dist/metrics/metrics.int.test.js.map +0 -1
  499. package/dist/middleware/auth/oauth2.int.test.d.ts +0 -2
  500. package/dist/middleware/auth/oauth2.int.test.d.ts.map +0 -1
  501. package/dist/middleware/auth/oauth2.int.test.js +0 -714
  502. package/dist/middleware/auth/oauth2.int.test.js.map +0 -1
  503. package/dist/middleware/auth.int.test.d.ts +0 -5
  504. package/dist/middleware/auth.int.test.d.ts.map +0 -1
  505. package/dist/middleware/auth.int.test.js +0 -366
  506. package/dist/middleware/auth.int.test.js.map +0 -1
  507. package/dist/middleware/compose.int.test.d.ts +0 -7
  508. package/dist/middleware/compose.int.test.d.ts.map +0 -1
  509. package/dist/middleware/compose.int.test.js +0 -238
  510. package/dist/middleware/compose.int.test.js.map +0 -1
  511. package/dist/middleware/interceptors/bulkhead.int.test.d.ts +0 -5
  512. package/dist/middleware/interceptors/bulkhead.int.test.d.ts.map +0 -1
  513. package/dist/middleware/interceptors/bulkhead.int.test.js +0 -263
  514. package/dist/middleware/interceptors/bulkhead.int.test.js.map +0 -1
  515. package/dist/middleware/interceptors/cache.int.test.d.ts +0 -5
  516. package/dist/middleware/interceptors/cache.int.test.d.ts.map +0 -1
  517. package/dist/middleware/interceptors/cache.int.test.js +0 -470
  518. package/dist/middleware/interceptors/cache.int.test.js.map +0 -1
  519. package/dist/middleware/interceptors/circuit-breaker.int.test.d.ts +0 -5
  520. package/dist/middleware/interceptors/circuit-breaker.int.test.d.ts.map +0 -1
  521. package/dist/middleware/interceptors/circuit-breaker.int.test.js +0 -253
  522. package/dist/middleware/interceptors/circuit-breaker.int.test.js.map +0 -1
  523. package/dist/middleware/interceptors/envelope.int.test.d.ts +0 -5
  524. package/dist/middleware/interceptors/envelope.int.test.d.ts.map +0 -1
  525. package/dist/middleware/interceptors/envelope.int.test.js +0 -409
  526. package/dist/middleware/interceptors/envelope.int.test.js.map +0 -1
  527. package/dist/middleware/interceptors/fallback.int.test.d.ts +0 -5
  528. package/dist/middleware/interceptors/fallback.int.test.d.ts.map +0 -1
  529. package/dist/middleware/interceptors/fallback.int.test.js +0 -211
  530. package/dist/middleware/interceptors/fallback.int.test.js.map +0 -1
  531. package/dist/middleware/interceptors/logging.int.test.d.ts +0 -5
  532. package/dist/middleware/interceptors/logging.int.test.d.ts.map +0 -1
  533. package/dist/middleware/interceptors/logging.int.test.js +0 -144
  534. package/dist/middleware/interceptors/logging.int.test.js.map +0 -1
  535. package/dist/middleware/interceptors/rate-limit.int.test.d.ts +0 -5
  536. package/dist/middleware/interceptors/rate-limit.int.test.d.ts.map +0 -1
  537. package/dist/middleware/interceptors/rate-limit.int.test.js +0 -221
  538. package/dist/middleware/interceptors/rate-limit.int.test.js.map +0 -1
  539. package/dist/middleware/interceptors/request-id.int.test.d.ts +0 -5
  540. package/dist/middleware/interceptors/request-id.int.test.d.ts.map +0 -1
  541. package/dist/middleware/interceptors/request-id.int.test.js +0 -136
  542. package/dist/middleware/interceptors/request-id.int.test.js.map +0 -1
  543. package/dist/middleware/interceptors/retry.int.test.d.ts +0 -5
  544. package/dist/middleware/interceptors/retry.int.test.d.ts.map +0 -1
  545. package/dist/middleware/interceptors/retry.int.test.js +0 -534
  546. package/dist/middleware/interceptors/retry.int.test.js.map +0 -1
  547. package/dist/middleware/interceptors/timeout.int.test.d.ts +0 -5
  548. package/dist/middleware/interceptors/timeout.int.test.d.ts.map +0 -1
  549. package/dist/middleware/interceptors/timeout.int.test.js +0 -228
  550. package/dist/middleware/interceptors/timeout.int.test.js.map +0 -1
  551. package/dist/rate-limit/drivers/drivers.int.test.d.ts +0 -7
  552. package/dist/rate-limit/drivers/drivers.int.test.d.ts.map +0 -1
  553. package/dist/rate-limit/drivers/drivers.int.test.js +0 -466
  554. package/dist/rate-limit/drivers/drivers.int.test.js.map +0 -1
  555. package/dist/server/builder.int.test.d.ts +0 -7
  556. package/dist/server/builder.int.test.d.ts.map +0 -1
  557. package/dist/server/builder.int.test.js +0 -455
  558. package/dist/server/builder.int.test.js.map +0 -1
  559. package/dist/server/fs-routes/loader.int.test.d.ts +0 -5
  560. package/dist/server/fs-routes/loader.int.test.d.ts.map +0 -1
  561. package/dist/server/fs-routes/loader.int.test.js +0 -48
  562. package/dist/server/fs-routes/loader.int.test.js.map +0 -1
  563. package/dist/server/hooks.int.test.d.ts +0 -7
  564. package/dist/server/hooks.int.test.d.ts.map +0 -1
  565. package/dist/server/hooks.int.test.js +0 -564
  566. package/dist/server/hooks.int.test.js.map +0 -1
  567. package/dist/server/route-discovery.int.test.d.ts +0 -5
  568. package/dist/server/route-discovery.int.test.d.ts.map +0 -1
  569. package/dist/server/route-discovery.int.test.js +0 -49
  570. package/dist/server/route-discovery.int.test.js.map +0 -1
  571. package/dist/stream/raffel-stream.int.test.d.ts +0 -2
  572. package/dist/stream/raffel-stream.int.test.d.ts.map +0 -1
  573. package/dist/stream/raffel-stream.int.test.js +0 -265
  574. package/dist/stream/raffel-stream.int.test.js.map +0 -1
  575. package/dist/tracing/tracing.int.test.d.ts +0 -5
  576. package/dist/tracing/tracing.int.test.d.ts.map +0 -1
  577. package/dist/tracing/tracing.int.test.js +0 -412
  578. package/dist/tracing/tracing.int.test.js.map +0 -1
  579. package/dist/usd/usd.int.test.d.ts +0 -10
  580. package/dist/usd/usd.int.test.d.ts.map +0 -1
  581. package/dist/usd/usd.int.test.js +0 -719
  582. package/dist/usd/usd.int.test.js.map +0 -1
  583. package/dist/validation/multi-validator.int.test.d.ts +0 -7
  584. package/dist/validation/multi-validator.int.test.d.ts.map +0 -1
  585. package/dist/validation/multi-validator.int.test.js +0 -808
  586. package/dist/validation/multi-validator.int.test.js.map +0 -1
  587. package/dist/validation/schema.int.test.d.ts +0 -5
  588. package/dist/validation/schema.int.test.d.ts.map +0 -1
  589. package/dist/validation/schema.int.test.js +0 -340
  590. package/dist/validation/schema.int.test.js.map +0 -1
@@ -5,25 +5,22 @@
5
5
  */
6
6
  import { createRegistry } from '../core/registry.js';
7
7
  import { createRouter } from '../core/router.js';
8
- import { createHttpAdapter } from '../adapters/http.js';
9
- import { createWebSocketAdapter } from '../adapters/websocket.js';
10
- import { createTcpAdapter } from '../adapters/tcp.js';
11
- import { createJsonRpcAdapter, createJsonRpcMiddleware } from '../adapters/jsonrpc.js';
12
- import { createGrpcAdapter } from '../adapters/grpc.js';
13
- import { createGraphQLAdapter, createGraphQLMiddleware } from '../graphql/index.js';
14
8
  import { getRouterModuleDefinition } from './router-module.js';
15
- import { createSchemaRegistry, createValidationInterceptor } from '../validation/index.js';
16
- import { createMetricRegistry, createMetricsInterceptor, startProcessMetricsCollection, } from '../metrics/index.js';
17
- import { createTracer, createTracingInterceptor } from '../tracing/index.js';
18
- import { createUSDHandlers } from '../docs/index.js';
19
- import { createDiscoveryWatcher, createRouteInterceptors, isDevelopment, generateResourceRoutes, } from './fs-routes/index.js';
9
+ import { createSchemaRegistry } from '../validation/index.js';
10
+ import { createEnvelopeInterceptor, createStandardEnvelopeInterceptor } from '../middleware/interceptors/envelope.js';
11
+ import { createRouteInterceptors, isDevelopment, generateResourceRoutes, } from './fs-routes/index.js';
20
12
  import { createLogger } from '../utils/logger.js';
21
13
  import { createProcedureBuilder, createStreamBuilder, createEventBuilder, createGroupBuilder, joinHandlerName, } from './handler-builders.js';
22
14
  import { createResourceBuilder } from './resource-builder.js';
23
15
  import { registerDiscoveredHandlers, resolveHooksForProcedure } from './discovery-utils.js';
24
- import { buildChannelOptions, joinBasePath } from './channel-utils.js';
25
- import { createRestMiddleware, createHttpOverrideMiddleware, logRestMiddlewareRegistered, createDocsRouteMiddleware, } from './rest-middleware.js';
26
- import { buildProtocolConfig } from './protocol-config.js';
16
+ import { buildProtocolConfig, resolveSinglePortConfig } from './protocol-config.js';
17
+ import { normalizeInterceptors as normalizeInterceptorsShared } from './interceptor-utils.js';
18
+ import { buildServerConfigPreview, emitConfigWarnings, logSinglePortConfig, } from './builder/config-preview.js';
19
+ import { createFrontDoorBootstrap, normalizeFrontDoorProtocol } from './front-door.js';
20
+ import { createDiscoveryBootstrap } from './discovery-bootstrap.js';
21
+ import { createServerLifecycle } from './builder/lifecycle.js';
22
+ import { configureMetrics, configureTracing, createTelemetryState, } from './telemetry-bootstrap.js';
23
+ import { isSinglePortTcpRouteEnabled as detectSinglePortTcpRouteEnabled, isSinglePortUdpRouteEnabled as detectSinglePortUdpRouteEnabled, } from './builder/single-port-utils.js';
27
24
  const logger = createLogger('server');
28
25
  /**
29
26
  * Check if a value is an async iterable
@@ -35,46 +32,150 @@ function isAsyncIterable(value) {
35
32
  * Create a unified Raffel server
36
33
  */
37
34
  export function createServer(options) {
38
- const { port, host = '0.0.0.0', basePath = '/', cors = true, eventDelivery, websocket, jsonrpc, tcp, graphql, middleware, http: httpOptions, discovery, hotReload = isDevelopment(), providers: initialProviders, protocolExtensions: initialProtocolExtensions, } = options;
35
+ const { port, host = '0.0.0.0', basePath = '/', cors = true, eventDelivery, websocket, jsonrpc, tcp, grpc, graphql, middleware, http: httpOptions, frontDoor, singlePort, envelope, discovery, hotReload = isDevelopment(), providers: initialProviders, protocolExtensions: initialProtocolExtensions, protocolAliasMode: serverProtocolAliasMode = 'standard', } = options;
39
36
  // Core components
40
37
  const registry = createRegistry();
41
38
  const router = createRouter(registry, { eventDelivery });
42
39
  const schemaRegistry = createSchemaRegistry();
43
- // Discovery watcher for file-system handlers
44
- let discoveryWatcher = null;
45
- // Create discovery watcher if configured
46
- if (discovery) {
47
- discoveryWatcher = createDiscoveryWatcher({
48
- discovery: discovery === true
49
- ? { http: true, channels: true, rpc: true, streams: true, rest: true, resources: true, tcp: true, udp: true }
50
- : discovery,
51
- hotReload,
52
- onLoad: (stats) => {
53
- logger.info({
54
- http: stats.http,
55
- rpc: stats.rpc,
56
- streams: stats.streams,
57
- channels: stats.channels,
58
- rest: stats.rest,
59
- resources: stats.resources,
60
- tcp: stats.tcp,
61
- udp: stats.udp,
62
- duration: stats.duration,
63
- }, `Discovered ${stats.total} handlers`);
64
- },
65
- onReload: async (result) => {
66
- applyDiscoveryResult(result);
67
- logger.info({ total: result.stats.total }, 'Handlers hot-reloaded');
68
- },
69
- onError: (err) => {
70
- logger.error({ err }, 'Discovery loading error');
71
- },
72
- });
73
- }
40
+ const telemetryState = createTelemetryState();
41
+ const discoveryBootstrap = createDiscoveryBootstrap({
42
+ discovery,
43
+ hotReload,
44
+ onLoad: (stats) => {
45
+ logger.info({
46
+ http: stats.http,
47
+ rpc: stats.rpc,
48
+ streams: stats.streams,
49
+ channels: stats.channels,
50
+ rest: stats.rest,
51
+ resources: stats.resources,
52
+ tcp: stats.tcp,
53
+ udp: stats.udp,
54
+ duration: stats.duration,
55
+ }, `Discovered ${stats.total} handlers`);
56
+ },
57
+ onReload: async (result) => {
58
+ applyDiscoveryResult(result);
59
+ logger.info({ total: result.stats.total }, 'Handlers hot-reloaded');
60
+ },
61
+ onError: (err) => {
62
+ logger.error({ err }, 'Discovery loading error');
63
+ },
64
+ });
74
65
  // Protocol configuration (from options)
75
- const protocols = buildProtocolConfig({ websocket, jsonrpc, tcp, graphql });
66
+ const frontDoorEnabled = frontDoor?.enabled === true;
67
+ const frontDoorHost = frontDoor?.host ?? host;
68
+ const frontDoorPort = frontDoor?.port ?? port;
69
+ let singlePortConfigInput = singlePort;
70
+ let singlePortConfig = resolveSinglePortConfig(singlePortConfigInput);
71
+ const frontDoorAliasMode = frontDoor?.protocolAliasMode ?? serverProtocolAliasMode;
72
+ const effectiveHost = frontDoorEnabled ? frontDoorHost : host;
73
+ const effectivePort = frontDoorEnabled ? frontDoorPort : port;
74
+ const frontDoorProtocols = frontDoor?.protocols && frontDoor.protocols.length > 0
75
+ ? Array.from(new Set(frontDoor.protocols.map((protocol) => normalizeFrontDoorProtocol(protocol, frontDoorAliasMode)).filter(Boolean)))
76
+ : null;
77
+ const getSinglePortAliasMode = () => {
78
+ return singlePortConfigInput?.protocolAliasMode ?? serverProtocolAliasMode;
79
+ };
80
+ const getSinglePortSource = () => {
81
+ return singlePortConfig.enabled ? 'singlePort' : 'native';
82
+ };
83
+ const updateSinglePortConfig = (next) => {
84
+ if (next === undefined)
85
+ return;
86
+ if (typeof next === 'boolean') {
87
+ singlePortConfigInput = {
88
+ ...(singlePortConfigInput ?? {}),
89
+ enabled: next,
90
+ protocolFusion: next ? (singlePortConfigInput?.protocolFusion ?? true) : false,
91
+ };
92
+ }
93
+ else {
94
+ singlePortConfigInput = { ...(singlePortConfigInput ?? {}), ...next };
95
+ }
96
+ singlePortConfig = resolveSinglePortConfig(singlePortConfigInput);
97
+ };
98
+ const shouldUseFrontDoor = (name) => {
99
+ if (!frontDoorEnabled)
100
+ return false;
101
+ if (!frontDoorProtocols) {
102
+ return ['websocket', 'jsonrpc', 'graphql'].includes(name);
103
+ }
104
+ return frontDoorProtocols.includes(name);
105
+ };
106
+ const strategyFor = (name, fallback) => {
107
+ const strategy = frontDoor?.strategy?.[name];
108
+ return strategy ?? fallback;
109
+ };
110
+ const protocols = buildProtocolConfig({
111
+ websocket,
112
+ jsonrpc,
113
+ tcp,
114
+ graphql,
115
+ grpc,
116
+ frontDoor,
117
+ singlePort,
118
+ protocolAliasMode: frontDoorAliasMode,
119
+ });
120
+ const frontDoorBootstrap = createFrontDoorBootstrap({
121
+ frontDoorEnabled,
122
+ frontDoorProtocols,
123
+ protocols,
124
+ basePath,
125
+ effectiveHost,
126
+ effectivePort,
127
+ });
76
128
  // Global interceptors (from options + added via .use())
77
129
  const globalInterceptors = middleware ? [...middleware] : [];
130
+ const envelopeInterceptor = createEnvelopeInterceptorFromOptions(envelope);
131
+ if (envelopeInterceptor) {
132
+ globalInterceptors.push(envelopeInterceptor);
133
+ }
134
+ function createEnvelopeInterceptorFromOptions(config) {
135
+ if (config === undefined || config === false) {
136
+ return undefined;
137
+ }
138
+ if (config === true) {
139
+ return createStandardEnvelopeInterceptor();
140
+ }
141
+ return createEnvelopeInterceptor(config);
142
+ }
143
+ function normalizeInterceptors(interceptors, schema) {
144
+ return normalizeInterceptorsShared(interceptors, {
145
+ envelopeInterceptor,
146
+ schema,
147
+ });
148
+ }
149
+ const serverConfigPreviewContext = {
150
+ effectiveHost,
151
+ effectivePort,
152
+ frontDoorEnabled,
153
+ frontDoorHost,
154
+ frontDoorPort,
155
+ frontDoorProtocols,
156
+ protocolAliasMode: frontDoorAliasMode,
157
+ getSinglePortConfig: () => ({
158
+ enabled: singlePortConfig.enabled,
159
+ protocolFusion: singlePortConfig.protocolFusion,
160
+ sniffTimeoutMs: singlePortConfig.sniffTimeoutMs,
161
+ sniffMaxBytes: singlePortConfig.sniffMaxBytes,
162
+ maxConcurrentDetections: singlePortConfig.maxConcurrentDetections,
163
+ protocols: singlePortConfig.protocols,
164
+ alpn: singlePortConfig.alpn,
165
+ }),
166
+ getSinglePortAliasMode,
167
+ getSinglePortSource,
168
+ protocols,
169
+ };
170
+ function emitConfiguredWarnings() {
171
+ emitConfigWarnings(serverConfigPreviewContext, logger);
172
+ }
173
+ function getPreviewConfig() {
174
+ return buildServerConfigPreview(serverConfigPreviewContext);
175
+ }
176
+ function logSinglePortConfiguration() {
177
+ logSinglePortConfig(serverConfigPreviewContext, logger);
178
+ }
78
179
  // Namespace-level interceptors (for shared middleware per protocol)
79
180
  // These are persistent across getter calls, enabling shared middleware chains
80
181
  const httpInterceptors = [];
@@ -88,32 +189,29 @@ export function createServer(options) {
88
189
  let wsUnsubscribeHandler = null;
89
190
  // Global hooks configuration (added via .hooks())
90
191
  let globalHooks = {};
91
- // Create hooks resolver that uses current globalHooks state
92
- const createHooksResolver = () => (name) => resolveHooksForProcedure(name, globalHooks);
93
- // Active adapters
94
- let httpServer = null;
95
- let wsAdapter = null;
96
- let jsonRpcAdapter = null;
97
- let tcpAdapter = null;
98
- let grpcAdapter = null;
99
- let graphqlAdapter = null;
100
- let graphqlMiddleware = null;
101
- let graphqlSubscriptionServer = null;
192
+ // Hooks resolver that closes over globalHooks (mutable by .hooks())
193
+ const hooksResolver = (name) => resolveHooksForProcedure(name, globalHooks);
194
+ // Runtime state shared with lifecycle module
195
+ const serverState = {
196
+ running: { value: false },
197
+ addresses: { value: null },
198
+ providerMiddlewareInstalled: { value: false },
199
+ portBinding: { value: null },
200
+ singlePortTcpConnectionHandler: { value: null },
201
+ httpServer: { value: null },
202
+ wsAdapter: { value: null },
203
+ jsonRpcAdapter: { value: null },
204
+ tcpAdapter: { value: null },
205
+ grpcAdapter: { value: null },
206
+ graphqlAdapter: { value: null },
207
+ graphqlMiddleware: { value: null },
208
+ graphqlSubscriptionServer: { value: null },
209
+ usdDocsHandlers: { value: null },
210
+ };
102
211
  const protocolExtensionConfigs = [];
103
212
  const protocolAdapters = new Map();
104
- // Metrics
105
- let metricsConfig = null;
106
- let metricsRegistry = null;
107
- let processMetricsCleanup = null;
108
- // Tracing
109
- let tracingConfig = null;
110
- let tracerInstance = null;
111
213
  // USD Documentation
112
214
  let usdDocsConfig = null;
113
- let usdDocsHandlers = null;
114
- // State
115
- let running = false;
116
- let addresses = null;
117
215
  // Provider definitions (added via .provide() or options.providers)
118
216
  const providerDefinitions = new Map();
119
217
  const resolvedProviders = {};
@@ -210,6 +308,52 @@ export function createServer(options) {
210
308
  registerUdpHandler(handler);
211
309
  }
212
310
  }
311
+ const createFrontDoorDecisionMiddleware = () => frontDoorBootstrap.createDecisionMiddleware({
312
+ info: logger.info.bind(logger),
313
+ debug: logger.debug.bind(logger),
314
+ warn: logger.warn.bind(logger),
315
+ });
316
+ const isSinglePortTcpRouteEnabled = () => detectSinglePortTcpRouteEnabled(singlePortConfig.enabled, protocols.tcp?.enabled ?? false, protocols.tcp?.options.port, protocols.tcp?.options.host, effectiveHost, effectivePort);
317
+ const isSinglePortUdpRouteEnabled = (handler) => detectSinglePortUdpRouteEnabled(singlePortConfig.enabled, handler.config.port, handler.config.host, effectiveHost, effectivePort);
318
+ const serverLifecycle = createServerLifecycle({
319
+ logger,
320
+ state: serverState,
321
+ discoveryBootstrap,
322
+ telemetryState,
323
+ protocolExtensionConfigs,
324
+ protocolAdapters,
325
+ providerDefinitions,
326
+ resolvedProviders,
327
+ frontDoorEnabled,
328
+ frontDoorProtocols,
329
+ protocols,
330
+ registry,
331
+ schemaRegistry,
332
+ router,
333
+ globalInterceptors,
334
+ channelRegistry,
335
+ restResourceRegistry,
336
+ tcpHandlers,
337
+ udpHandlers,
338
+ tcpServers,
339
+ udpServers,
340
+ singlePortConfig,
341
+ isSinglePortTcpRouteEnabled,
342
+ isSinglePortUdpRouteEnabled,
343
+ getSinglePortSource,
344
+ getSinglePortAliasMode,
345
+ createFrontDoorDecisionMiddleware,
346
+ applyDiscoveryResult,
347
+ logSinglePortConfig: logSinglePortConfiguration,
348
+ host,
349
+ effectiveHost,
350
+ effectivePort,
351
+ basePath,
352
+ cors,
353
+ httpOptions,
354
+ wsMessageHandler,
355
+ usdDocsConfig,
356
+ });
213
357
  /**
214
358
  * Register an HTTP route (Hono-style).
215
359
  * Creates a procedure with the method and path as name (e.g., `get:/users/:id`).
@@ -228,7 +372,7 @@ export function createServer(options) {
228
372
  // Generate procedure name from method and path (e.g., "get:/users/:id")
229
373
  const name = `${method.toLowerCase()}:${path}`;
230
374
  // Build interceptors: global → namespace → route-specific
231
- const interceptors = [...globalInterceptors, ...httpInterceptors, ...(options.use ?? [])];
375
+ const interceptors = normalizeInterceptors([...globalInterceptors, ...httpInterceptors, ...(options.use ?? [])]);
232
376
  // Register schema if provided
233
377
  if (options.input || options.output) {
234
378
  const schema = {};
@@ -237,7 +381,9 @@ export function createServer(options) {
237
381
  if (options.output)
238
382
  schema.output = options.output;
239
383
  schemaRegistry.register(name, schema);
240
- interceptors.unshift(createValidationInterceptor(schema));
384
+ const normalizedWithSchema = normalizeInterceptors([...interceptors], schema);
385
+ interceptors.length = 0;
386
+ interceptors.push(...normalizedWithSchema);
241
387
  }
242
388
  // Register as a procedure with HTTP metadata
243
389
  registry.procedure(name, handler, {
@@ -254,107 +400,244 @@ export function createServer(options) {
254
400
  const server = {
255
401
  // === Protocol Configuration ===
256
402
  enableWebSocket(path = '/') {
403
+ const useFrontDoor = shouldUseFrontDoor('websocket');
257
404
  protocols.websocket = {
258
405
  enabled: true,
259
406
  options: { path },
260
407
  shared: true,
408
+ frontDoor: useFrontDoor,
409
+ strategy: useFrontDoor ? strategyFor('websocket', 'shared') : strategyFor('websocket', 'native'),
261
410
  };
262
411
  return server;
263
412
  },
264
413
  websocket(opts) {
414
+ const useFrontDoor = shouldUseFrontDoor('websocket');
415
+ const requestedShared = opts.port === undefined;
416
+ const shared = useFrontDoor || requestedShared;
265
417
  protocols.websocket = {
266
418
  enabled: true,
267
419
  options: opts,
268
- shared: opts.port === undefined,
420
+ shared,
421
+ frontDoor: useFrontDoor,
422
+ strategy: useFrontDoor ? strategyFor('websocket', 'shared') : strategyFor('websocket', 'native'),
269
423
  };
270
424
  return server;
271
425
  },
272
426
  enableJsonRpc(path = '/rpc') {
427
+ const useFrontDoor = shouldUseFrontDoor('jsonrpc');
273
428
  protocols.jsonrpc = {
274
429
  enabled: true,
275
430
  options: { path },
276
431
  shared: true,
432
+ frontDoor: useFrontDoor,
433
+ strategy: useFrontDoor ? strategyFor('jsonrpc', 'shared') : strategyFor('jsonrpc', 'native'),
277
434
  };
278
435
  return server;
279
436
  },
280
437
  jsonrpc(opts) {
438
+ const useFrontDoor = shouldUseFrontDoor('jsonrpc');
439
+ const requestedShared = opts.port === undefined;
440
+ const shared = useFrontDoor || requestedShared;
281
441
  protocols.jsonrpc = {
282
442
  enabled: true,
283
443
  options: opts,
284
- shared: opts.port === undefined,
444
+ shared,
445
+ frontDoor: useFrontDoor,
446
+ strategy: useFrontDoor ? strategyFor('jsonrpc', 'shared') : strategyFor('jsonrpc', 'native'),
285
447
  };
286
448
  return server;
287
449
  },
288
450
  tcp(opts) {
451
+ const useFrontDoor = shouldUseFrontDoor('tcp');
289
452
  protocols.tcp = {
290
453
  enabled: true,
291
454
  options: opts,
455
+ frontDoor: useFrontDoor,
456
+ strategy: useFrontDoor ? strategyFor('tcp', 'offload') : strategyFor('tcp', 'native'),
292
457
  };
293
458
  return server;
294
459
  },
295
460
  grpc(opts) {
461
+ const useFrontDoor = shouldUseFrontDoor('grpc');
296
462
  protocols.grpc = {
297
463
  enabled: true,
298
464
  options: opts,
465
+ frontDoor: useFrontDoor,
466
+ strategy: useFrontDoor ? strategyFor('grpc', 'offload') : strategyFor('grpc', 'native'),
299
467
  };
300
468
  return server;
301
469
  },
302
470
  protocols(config) {
471
+ server.withProtocols({
472
+ websocket: config.websocket,
473
+ jsonrpc: config.jsonrpc,
474
+ streams: config.streams,
475
+ graphql: config.graphql,
476
+ tcp: config.tcp,
477
+ grpc: config.grpc,
478
+ });
479
+ return server;
480
+ },
481
+ withProtocols(config) {
482
+ const hasOwnFields = (value) => {
483
+ for (const key in value) {
484
+ if (Object.prototype.hasOwnProperty.call(value, key)) {
485
+ return true;
486
+ }
487
+ }
488
+ return false;
489
+ };
490
+ // Helper to check if a slot has enabled: false
491
+ function isDisabled(value) {
492
+ if (value === false)
493
+ return true;
494
+ if (typeof value === 'object' && value !== null && 'enabled' in value) {
495
+ return value.enabled === false;
496
+ }
497
+ return false;
498
+ }
303
499
  // WebSocket
304
- if (config.websocket !== undefined && config.websocket !== false) {
305
- if (config.websocket === true) {
500
+ if (config.websocket !== undefined && !isDisabled(config.websocket)) {
501
+ const ws = config.websocket;
502
+ if (ws === true) {
306
503
  server.enableWebSocket('/ws');
307
504
  }
308
- else if (typeof config.websocket === 'string') {
309
- server.enableWebSocket(config.websocket);
505
+ else if (typeof ws === 'string') {
506
+ server.enableWebSocket(ws);
507
+ }
508
+ else if (typeof ws === 'object' && 'enabled' in ws) {
509
+ const { enabled: _enabled, ...rest } = ws;
510
+ if (hasOwnFields(rest)) {
511
+ server.websocket(rest);
512
+ }
513
+ else {
514
+ server.enableWebSocket('/ws');
515
+ }
310
516
  }
311
517
  else {
312
- server.websocket(config.websocket);
518
+ server.websocket(ws);
313
519
  }
314
520
  }
315
521
  // JSON-RPC
316
- if (config.jsonrpc !== undefined && config.jsonrpc !== false) {
317
- if (config.jsonrpc === true) {
522
+ if (config.jsonrpc !== undefined && !isDisabled(config.jsonrpc)) {
523
+ const jrpc = config.jsonrpc;
524
+ if (jrpc === true) {
318
525
  server.enableJsonRpc('/rpc');
319
526
  }
320
- else if (typeof config.jsonrpc === 'string') {
321
- server.enableJsonRpc(config.jsonrpc);
527
+ else if (typeof jrpc === 'string') {
528
+ server.enableJsonRpc(jrpc);
529
+ }
530
+ else if (typeof jrpc === 'object' && 'enabled' in jrpc) {
531
+ const { enabled: _enabled, ...rest } = jrpc;
532
+ server.enableJsonRpc(rest.path ?? '/rpc');
322
533
  }
323
534
  else {
324
- server.jsonrpc(config.jsonrpc);
535
+ server.jsonrpc(jrpc);
325
536
  }
326
537
  }
327
- // Streams (SSE)
538
+ // Streams
328
539
  if (config.streams !== undefined && config.streams !== false) {
329
- // Streams are enabled automatically when stream handlers are registered
330
- // This is a marker for documentation and configuration
331
540
  logger.debug({ streams: config.streams }, 'Streams protocol enabled');
332
541
  }
333
542
  // GraphQL
334
- if (config.graphql !== undefined && config.graphql !== false) {
335
- if (config.graphql === true) {
543
+ if (config.graphql !== undefined && !isDisabled(config.graphql)) {
544
+ const gql = config.graphql;
545
+ if (gql === true) {
336
546
  server.enableGraphQL('/graphql');
337
547
  }
338
- else if (typeof config.graphql === 'string') {
339
- server.enableGraphQL(config.graphql);
548
+ else if (typeof gql === 'string') {
549
+ server.enableGraphQL(gql);
550
+ }
551
+ else if (typeof gql === 'object' && 'enabled' in gql) {
552
+ const { enabled: _enabled, ...rest } = gql;
553
+ if (hasOwnFields(rest)) {
554
+ server.configureGraphQL(rest);
555
+ }
556
+ else {
557
+ server.enableGraphQL('/graphql');
558
+ }
559
+ }
560
+ else {
561
+ server.configureGraphQL(gql);
562
+ }
563
+ }
564
+ // TCP
565
+ if (config.tcp !== undefined && !isDisabled(config.tcp)) {
566
+ const tcpCfg = config.tcp;
567
+ if (typeof tcpCfg === 'object' && 'enabled' in tcpCfg) {
568
+ const { enabled: _enabled, ...rest } = tcpCfg;
569
+ if (rest.port !== undefined) {
570
+ server.tcp(rest);
571
+ }
340
572
  }
341
573
  else {
342
- server.configureGraphQL(config.graphql);
574
+ server.tcp(tcpCfg);
343
575
  }
344
576
  }
345
- // TCP (requires full options)
346
- if (config.tcp) {
347
- server.tcp(config.tcp);
577
+ // UDP (test-scope marker only — no production adapter)
578
+ if (config.udp !== undefined && !isDisabled(config.udp)) {
579
+ logger.debug('UDP protocol noted (test-scope only; no production adapter registered)');
348
580
  }
349
- // gRPC (requires full options)
350
- if (config.grpc) {
351
- server.grpc(config.grpc);
581
+ // gRPC
582
+ if (config.grpc !== undefined && !isDisabled(config.grpc)) {
583
+ const grpcCfg = config.grpc;
584
+ if (typeof grpcCfg === 'object' && 'enabled' in grpcCfg) {
585
+ const { enabled: _enabled, ...rest } = grpcCfg;
586
+ if (rest.port !== undefined && rest.protoPath !== undefined) {
587
+ server.grpc(rest);
588
+ }
589
+ }
590
+ else {
591
+ server.grpc(grpcCfg);
592
+ }
352
593
  }
353
- logger.info({ protocols: Object.keys(config).filter((k) => config[k]) }, 'Protocols configured');
594
+ emitConfiguredWarnings();
595
+ return server;
596
+ },
597
+ withProfile(profile, overrides) {
598
+ if (profile === 'local') {
599
+ updateSinglePortConfig({ protocolAliasMode: 'extended' });
600
+ }
601
+ else if (profile === 'staging') {
602
+ updateSinglePortConfig({ protocolAliasMode: 'standard' });
603
+ }
604
+ else if (profile === 'production') {
605
+ updateSinglePortConfig({ protocolAliasMode: 'standard' });
606
+ if (hotReload) {
607
+ logger.warn('hotReload is enabled but profile is "production". Pass hotReload: false to createServer() for production.');
608
+ }
609
+ if (serverProtocolAliasMode === 'extended') {
610
+ logger.warn('protocolAliasMode "extended" was passed to createServer() but profile is "production". Use "standard" in production.');
611
+ }
612
+ }
613
+ if (overrides?.protocols) {
614
+ server.withProtocols(overrides.protocols);
615
+ }
616
+ return server;
617
+ },
618
+ withPreset(preset, options = {}) {
619
+ const websocketPath = options.websocketPath ?? '/ws';
620
+ const jsonrpcPath = options.jsonrpcPath ?? '/rpc';
621
+ const graphqlPath = options.graphqlPath ?? '/graphql';
622
+ if (preset === 'realtime') {
623
+ server.enableWebSocket(websocketPath);
624
+ }
625
+ else if (preset === 'rpc') {
626
+ server.enableJsonRpc(jsonrpcPath);
627
+ }
628
+ else if (preset === 'api' || preset === 'dev' || preset === 'full') {
629
+ server.enableWebSocket(websocketPath);
630
+ server.enableJsonRpc(jsonrpcPath);
631
+ server.enableGraphQL(graphqlPath);
632
+ }
633
+ return server;
634
+ },
635
+ enableSinglePort(config = true) {
636
+ updateSinglePortConfig(config);
354
637
  return server;
355
638
  },
356
639
  registerProtocol(name, factory, options) {
357
- if (running) {
640
+ if (serverState.running.value) {
358
641
  throw new Error('Cannot register protocol adapter after the server has started');
359
642
  }
360
643
  registerProtocolExtension({
@@ -365,51 +648,37 @@ export function createServer(options) {
365
648
  return server;
366
649
  },
367
650
  enableGraphQL(path = '/graphql') {
651
+ const useFrontDoor = shouldUseFrontDoor('graphql');
368
652
  protocols.graphql = {
369
653
  enabled: true,
370
654
  options: { path },
371
655
  shared: true,
656
+ frontDoor: useFrontDoor,
657
+ strategy: useFrontDoor ? strategyFor('graphql', 'shared') : strategyFor('graphql', 'native'),
372
658
  };
373
659
  return server;
374
660
  },
375
661
  configureGraphQL(opts) {
662
+ const useFrontDoor = shouldUseFrontDoor('graphql');
663
+ const requestedShared = opts.port === undefined;
664
+ const shared = useFrontDoor || requestedShared;
376
665
  protocols.graphql = {
377
666
  enabled: true,
378
667
  options: opts,
379
- shared: opts.port === undefined,
668
+ shared,
669
+ frontDoor: useFrontDoor,
670
+ strategy: useFrontDoor ? strategyFor('graphql', 'shared') : strategyFor('graphql', 'native'),
380
671
  };
381
672
  return server;
382
673
  },
383
674
  // === Metrics ===
384
675
  enableMetrics(config = {}) {
385
- metricsConfig = {
386
- enabled: config.enabled ?? true,
387
- endpoint: config.endpoint ?? '/metrics',
388
- defaultLabels: config.defaultLabels,
389
- collectRequestMetrics: config.collectRequestMetrics ?? true,
390
- collectProcessMetrics: config.collectProcessMetrics ?? false,
391
- };
392
- // Create registry immediately so it's available for custom metrics
393
- metricsRegistry = createMetricRegistry();
394
- if (metricsConfig.defaultLabels) {
395
- metricsRegistry.setDefaultLabels(metricsConfig.defaultLabels);
396
- }
676
+ configureMetrics(telemetryState, config);
397
677
  return server;
398
678
  },
399
679
  // === Tracing ===
400
680
  enableTracing(config = {}) {
401
- tracingConfig = {
402
- enabled: config.enabled ?? true,
403
- serviceName: config.serviceName ?? 'raffel',
404
- sampleRate: config.sampleRate ?? 1.0,
405
- rateLimit: config.rateLimit ?? 0,
406
- exporters: config.exporters ?? [],
407
- batchSize: config.batchSize ?? 100,
408
- batchTimeout: config.batchTimeout ?? 5000,
409
- defaultAttributes: config.defaultAttributes ?? {},
410
- };
411
- // Create tracer immediately so it's available
412
- tracerInstance = createTracer(tracingConfig);
681
+ configureTracing(telemetryState, config);
413
682
  return server;
414
683
  },
415
684
  // === USD Documentation ===
@@ -422,8 +691,11 @@ export function createServer(options) {
422
691
  securitySchemes: config.securitySchemes,
423
692
  defaultSecurity: config.defaultSecurity,
424
693
  tags: config.tags,
694
+ contentTypes: config.contentTypes,
695
+ tagGroups: config.tagGroups,
425
696
  externalDocs: config.externalDocs,
426
697
  ui: config.ui,
698
+ documentation: config.documentation,
427
699
  includeErrorSchemas: config.includeErrorSchemas,
428
700
  includeStreamEventSchemas: config.includeStreamEventSchemas,
429
701
  jsonrpc: config.jsonrpc,
@@ -472,7 +744,7 @@ export function createServer(options) {
472
744
  return;
473
745
  }
474
746
  // Fluent builder with hooks resolver
475
- return createProcedureBuilder(registry, schemaRegistry, nameOrHandler, [...globalInterceptors], createHooksResolver());
747
+ return createProcedureBuilder(registry, schemaRegistry, nameOrHandler, [...globalInterceptors], hooksResolver, envelopeInterceptor);
476
748
  },
477
749
  stream(name) {
478
750
  return createStreamBuilder(registry, schemaRegistry, name, [...globalInterceptors]);
@@ -534,7 +806,7 @@ export function createServer(options) {
534
806
  }
535
807
  }
536
808
  // Build interceptors
537
- const interceptors = [...globalInterceptors, ...(def.use ?? [])];
809
+ let interceptors = normalizeInterceptors([...globalInterceptors, ...(def.use ?? [])]);
538
810
  // Register schema
539
811
  if (def.input || def.output) {
540
812
  const schema = {};
@@ -543,7 +815,7 @@ export function createServer(options) {
543
815
  if (def.output)
544
816
  schema.output = def.output;
545
817
  schemaRegistry.register(name, schema);
546
- interceptors.unshift(createValidationInterceptor(schema));
818
+ interceptors = normalizeInterceptors(interceptors, schema);
547
819
  }
548
820
  registry.procedure(name, def.handler, {
549
821
  summary: def.summary,
@@ -565,7 +837,7 @@ export function createServer(options) {
565
837
  // Helper to register an operation
566
838
  const registerOp = (opName, handler, method, path, inputSchema) => {
567
839
  const procedureName = `${name}.${opName}`;
568
- const interceptors = [...baseInterceptors];
840
+ let interceptors = [...baseInterceptors];
569
841
  if (inputSchema || def.schema) {
570
842
  const schema = {};
571
843
  if (inputSchema)
@@ -574,9 +846,12 @@ export function createServer(options) {
574
846
  schema.output = def.schema;
575
847
  schemaRegistry.register(procedureName, schema);
576
848
  if (inputSchema) {
577
- interceptors.unshift(createValidationInterceptor({ input: inputSchema }));
849
+ interceptors = normalizeInterceptors(interceptors, { input: inputSchema });
578
850
  }
579
851
  }
852
+ else {
853
+ interceptors = normalizeInterceptors(interceptors);
854
+ }
580
855
  registry.procedure(procedureName, handler, {
581
856
  tags,
582
857
  httpPath: path,
@@ -655,22 +930,15 @@ export function createServer(options) {
655
930
  },
656
931
  // === Grouping ===
657
932
  group(prefix) {
658
- return createGroupBuilder(registry, schemaRegistry, prefix, [...globalInterceptors], createHooksResolver());
933
+ return createGroupBuilder(registry, schemaRegistry, prefix, [...globalInterceptors], hooksResolver, envelopeInterceptor);
659
934
  },
660
935
  mount(prefix, module, options = {}) {
661
936
  const definition = getRouterModuleDefinition(module);
662
937
  const mountInterceptors = options.interceptors ?? [];
663
938
  for (const route of definition.routes) {
664
939
  const fullName = joinHandlerName(prefix, route.name);
665
- const interceptors = [
666
- ...(route.kind === 'procedure' && route.schema
667
- ? [createValidationInterceptor(route.schema)]
668
- : []),
669
- ...globalInterceptors,
670
- ...mountInterceptors,
671
- ...route.moduleInterceptors,
672
- ...route.interceptors,
673
- ];
940
+ const routeSchema = route.kind === 'procedure' ? route.schema : undefined;
941
+ const interceptors = normalizeInterceptors([...globalInterceptors, ...mountInterceptors, ...route.moduleInterceptors, ...route.interceptors], routeSchema);
674
942
  if (route.schema) {
675
943
  schemaRegistry.register(fullName, route.schema);
676
944
  }
@@ -723,7 +991,7 @@ export function createServer(options) {
723
991
  const grpc = 'meta' in input ? input.meta?.grpc : input.grpc;
724
992
  const routeInterceptors = 'middlewares' in input ? createRouteInterceptors(input) : [];
725
993
  const inputInterceptors = 'interceptors' in input ? input.interceptors ?? [] : [];
726
- const interceptors = [...globalInterceptors, ...routeInterceptors, ...inputInterceptors];
994
+ let interceptors = normalizeInterceptors([...globalInterceptors, ...routeInterceptors, ...inputInterceptors]);
727
995
  // Register schema if defined
728
996
  if (inputSchema || outputSchema) {
729
997
  const schema = {};
@@ -732,7 +1000,7 @@ export function createServer(options) {
732
1000
  if (outputSchema)
733
1001
  schema.output = outputSchema;
734
1002
  schemaRegistry.register(name, schema);
735
- interceptors.unshift(createValidationInterceptor(schema));
1003
+ interceptors = normalizeInterceptors(interceptors, schema);
736
1004
  }
737
1005
  registry.procedure(name, handler, {
738
1006
  summary,
@@ -833,443 +1101,10 @@ export function createServer(options) {
833
1101
  },
834
1102
  // === Lifecycle ===
835
1103
  async start() {
836
- if (running) {
837
- throw new Error('Server is already running');
838
- }
839
- // Initialize providers
840
- if (providerDefinitions.size > 0) {
841
- logger.debug({ count: providerDefinitions.size }, 'Initializing providers');
842
- for (const [name, definition] of providerDefinitions) {
843
- try {
844
- const instance = await definition.factory();
845
- resolvedProviders[name] = instance;
846
- logger.debug({ name }, 'Provider initialized');
847
- }
848
- catch (err) {
849
- logger.error({ err, name }, 'Failed to initialize provider');
850
- throw err;
851
- }
852
- }
853
- // Add interceptor to inject providers into context
854
- globalInterceptors.unshift(async (_env, ctx, next) => {
855
- // Inject all providers into context
856
- const ctxAny = ctx;
857
- for (const [name, instance] of Object.entries(resolvedProviders)) {
858
- ctxAny[name] = instance;
859
- }
860
- return next();
861
- });
862
- }
863
- // Initialize metrics if enabled
864
- if (metricsConfig?.enabled && metricsRegistry) {
865
- logger.debug({ endpoint: metricsConfig.endpoint }, 'Initializing metrics');
866
- // Add request metrics interceptor
867
- if (metricsConfig.collectRequestMetrics) {
868
- globalInterceptors.unshift(createMetricsInterceptor(metricsRegistry));
869
- }
870
- // Start process metrics collection
871
- if (metricsConfig.collectProcessMetrics) {
872
- processMetricsCleanup = startProcessMetricsCollection(metricsRegistry);
873
- }
874
- // Register /metrics endpoint as a procedure
875
- const metricsEndpointName = `__metrics__`;
876
- registry.procedure(metricsEndpointName, async () => {
877
- return metricsRegistry.export('prometheus');
878
- });
879
- logger.info({ endpoint: metricsConfig.endpoint }, 'Metrics enabled');
880
- }
881
- // Initialize tracing if enabled
882
- if (tracingConfig?.enabled && tracerInstance) {
883
- logger.debug({
884
- serviceName: tracingConfig.serviceName,
885
- sampleRate: tracingConfig.sampleRate,
886
- }, 'Initializing tracing');
887
- // Add tracing interceptor (should be first to capture full request duration)
888
- globalInterceptors.unshift(createTracingInterceptor(tracerInstance));
889
- logger.info({
890
- serviceName: tracingConfig.serviceName,
891
- sampleRate: tracingConfig.sampleRate,
892
- exporters: tracingConfig.exporters?.length ?? 0,
893
- }, 'Tracing enabled');
894
- }
895
- // Load file-system handlers first (before starting adapters)
896
- if (discoveryWatcher) {
897
- const result = await discoveryWatcher.start();
898
- applyDiscoveryResult(result);
899
- }
900
- addresses = {
901
- http: { host, port },
902
- };
903
- // Build HTTP middleware list
904
- const httpMiddleware = [];
905
- if (httpOptions?.middleware?.length) {
906
- httpMiddleware.push(...httpOptions.middleware);
907
- }
908
- // Add USD Documentation handlers if enabled
909
- if (usdDocsConfig) {
910
- usdDocsHandlers = createUSDHandlers({
911
- registry,
912
- schemaRegistry,
913
- channels: channelRegistry,
914
- restResources: restResourceRegistry,
915
- tcpHandlers,
916
- udpHandlers,
917
- protocolConfig: protocols,
918
- }, {
919
- basePath: usdDocsConfig.basePath ?? '/docs',
920
- info: usdDocsConfig.info,
921
- servers: usdDocsConfig.servers,
922
- protocols: usdDocsConfig.protocols,
923
- securitySchemes: usdDocsConfig.securitySchemes,
924
- defaultSecurity: usdDocsConfig.defaultSecurity,
925
- tags: usdDocsConfig.tags,
926
- externalDocs: usdDocsConfig.externalDocs,
927
- ui: usdDocsConfig.ui,
928
- includeErrorSchemas: usdDocsConfig.includeErrorSchemas,
929
- includeStreamEventSchemas: usdDocsConfig.includeStreamEventSchemas,
930
- jsonrpc: usdDocsConfig.jsonrpc,
931
- grpc: usdDocsConfig.grpc,
932
- });
933
- // Create Hono middleware for USD routes
934
- const usdBasePath = usdDocsConfig.basePath ?? '/docs';
935
- httpMiddleware.push(createDocsRouteMiddleware([
936
- { method: 'GET', path: usdBasePath, handler: usdDocsHandlers.serveUI },
937
- { method: 'GET', path: `${usdBasePath}/usd.json`, handler: usdDocsHandlers.serveUSD },
938
- { method: 'GET', path: `${usdBasePath}/usd.yaml`, handler: usdDocsHandlers.serveUSDYaml },
939
- { method: 'GET', path: `${usdBasePath}/openapi.json`, handler: usdDocsHandlers.serveOpenAPI },
940
- ]));
941
- logger.info({ basePath: usdBasePath }, 'USD Documentation middleware registered');
942
- }
943
- httpMiddleware.push(createHttpOverrideMiddleware({
944
- router,
945
- registry,
946
- basePath,
947
- maxBodySize: httpOptions?.maxBodySize ?? 1024 * 1024,
948
- contextFactory: httpOptions?.contextFactory,
949
- codecs: httpOptions?.codecs,
950
- }));
951
- // Add REST middleware for proper HTTP verb routing
952
- if (restResourceRegistry.length > 0) {
953
- httpMiddleware.push(createRestMiddleware({
954
- restResources: restResourceRegistry,
955
- router,
956
- basePath,
957
- maxBodySize: httpOptions?.maxBodySize ?? 1024 * 1024,
958
- contextFactory: httpOptions?.contextFactory,
959
- codecs: httpOptions?.codecs,
960
- }));
961
- logRestMiddlewareRegistered(restResourceRegistry.length);
962
- }
963
- // Add JSON-RPC middleware when sharing the HTTP port
964
- if (protocols.jsonrpc?.enabled && protocols.jsonrpc.shared) {
965
- const rpcOpts = protocols.jsonrpc.options;
966
- const rpcPath = rpcOpts.path || '/rpc';
967
- const sharedRpcPath = joinBasePath(basePath, rpcPath);
968
- httpMiddleware.push(createJsonRpcMiddleware(router, {
969
- path: sharedRpcPath,
970
- timeout: rpcOpts.timeout,
971
- maxBodySize: rpcOpts.maxBodySize,
972
- cors: false,
973
- codecs: rpcOpts.codecs,
974
- }));
975
- }
976
- // Add GraphQL middleware when sharing the HTTP port
977
- if (protocols.graphql?.enabled && protocols.graphql.shared) {
978
- const gqlOpts = protocols.graphql.options;
979
- const gqlPath = gqlOpts.path || '/graphql';
980
- const sharedGqlPath = joinBasePath(basePath, gqlPath);
981
- const isDev = isDevelopment();
982
- graphqlMiddleware = createGraphQLMiddleware({
983
- router,
984
- registry,
985
- schemaRegistry,
986
- config: {
987
- ...gqlOpts,
988
- path: sharedGqlPath,
989
- playground: gqlOpts.playground ?? isDev,
990
- introspection: gqlOpts.introspection ?? isDev,
991
- timeout: gqlOpts.timeout ?? 30000,
992
- maxBodySize: gqlOpts.maxBodySize ?? 1024 * 1024,
993
- },
994
- });
995
- httpMiddleware.push(graphqlMiddleware.middleware);
996
- graphqlAdapter = {
997
- async start() {
998
- if (!httpServer?.server)
999
- return;
1000
- graphqlSubscriptionServer = graphqlMiddleware?.createSubscriptionServer(httpServer.server) ?? null;
1001
- },
1002
- async stop() {
1003
- if (graphqlSubscriptionServer) {
1004
- graphqlSubscriptionServer.close();
1005
- graphqlSubscriptionServer = null;
1006
- }
1007
- },
1008
- get schema() {
1009
- return graphqlMiddleware.schema;
1010
- },
1011
- get schemaInfo() {
1012
- return graphqlMiddleware.schemaInfo;
1013
- },
1014
- get address() {
1015
- return { host, port, path: sharedGqlPath };
1016
- },
1017
- };
1018
- }
1019
- // Start HTTP adapter (always)
1020
- httpServer = createHttpAdapter(router, {
1021
- port,
1022
- host,
1023
- basePath,
1024
- maxBodySize: httpOptions?.maxBodySize,
1025
- contextFactory: httpOptions?.contextFactory,
1026
- codecs: httpOptions?.codecs,
1027
- cors: cors === true
1028
- ? {
1029
- origin: '*',
1030
- methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],
1031
- headers: ['Content-Type', 'Authorization', 'Accept', 'X-Request-Id', 'Traceparent', 'Tracestate'],
1032
- }
1033
- : cors,
1034
- middleware: httpMiddleware.length > 0 ? httpMiddleware : undefined,
1035
- });
1036
- await httpServer.start();
1037
- // Start WebSocket adapter
1038
- if (protocols.websocket?.enabled) {
1039
- const wsOpts = protocols.websocket.options;
1040
- const channels = buildChannelOptions(channelRegistry, wsOpts.channels, wsMessageHandler ?? undefined);
1041
- if (protocols.websocket.shared) {
1042
- // Share HTTP port - attach to HTTP server
1043
- wsAdapter = createWebSocketAdapter(router, {
1044
- host,
1045
- port,
1046
- server: httpServer.server ?? undefined,
1047
- path: wsOpts.path || '/',
1048
- maxPayloadSize: wsOpts.maxPayloadSize,
1049
- heartbeatInterval: wsOpts.heartbeatInterval,
1050
- channels,
1051
- contextFactory: wsOpts.contextFactory,
1052
- });
1053
- addresses.websocket = { host, port, path: wsOpts.path || '/', shared: true };
1054
- }
1055
- else {
1056
- wsAdapter = createWebSocketAdapter(router, {
1057
- port: wsOpts.port,
1058
- host,
1059
- path: wsOpts.path || '/',
1060
- maxPayloadSize: wsOpts.maxPayloadSize,
1061
- heartbeatInterval: wsOpts.heartbeatInterval,
1062
- channels,
1063
- contextFactory: wsOpts.contextFactory,
1064
- });
1065
- addresses.websocket = { host, port: wsOpts.port, path: wsOpts.path || '/', shared: false };
1066
- }
1067
- await wsAdapter.start();
1068
- }
1069
- // Start JSON-RPC adapter
1070
- if (protocols.jsonrpc?.enabled) {
1071
- const rpcOpts = protocols.jsonrpc.options;
1072
- if (protocols.jsonrpc.shared) {
1073
- const rpcPath = rpcOpts.path || '/rpc';
1074
- addresses.jsonrpc = { host, port, path: joinBasePath(basePath, rpcPath), shared: true };
1075
- }
1076
- else {
1077
- jsonRpcAdapter = createJsonRpcAdapter(router, {
1078
- port: rpcOpts.port,
1079
- host,
1080
- path: rpcOpts.path || '/rpc',
1081
- timeout: rpcOpts.timeout,
1082
- maxBodySize: rpcOpts.maxBodySize,
1083
- });
1084
- addresses.jsonrpc = { host, port: rpcOpts.port, path: rpcOpts.path || '/rpc', shared: false };
1085
- await jsonRpcAdapter.start();
1086
- }
1087
- }
1088
- // Start TCP adapter
1089
- if (protocols.tcp?.enabled) {
1090
- const tcpOpts = protocols.tcp.options;
1091
- tcpAdapter = createTcpAdapter(router, {
1092
- port: tcpOpts.port,
1093
- host: tcpOpts.host || host,
1094
- maxMessageSize: tcpOpts.maxMessageSize,
1095
- keepAliveInterval: tcpOpts.keepAliveInterval,
1096
- });
1097
- await tcpAdapter.start();
1098
- addresses.tcp = { host: tcpOpts.host || host, port: tcpOpts.port };
1099
- }
1100
- // Start gRPC adapter
1101
- if (protocols.grpc?.enabled) {
1102
- const grpcOpts = protocols.grpc.options;
1103
- grpcAdapter = createGrpcAdapter(router, {
1104
- host: grpcOpts.host || host,
1105
- port: grpcOpts.port,
1106
- protoPath: grpcOpts.protoPath,
1107
- packageName: grpcOpts.packageName,
1108
- serviceNames: grpcOpts.serviceNames,
1109
- loaderOptions: grpcOpts.loaderOptions,
1110
- tls: grpcOpts.tls,
1111
- maxReceiveMessageLength: grpcOpts.maxReceiveMessageLength,
1112
- maxSendMessageLength: grpcOpts.maxSendMessageLength,
1113
- });
1114
- await grpcAdapter.start();
1115
- if (grpcAdapter.address) {
1116
- addresses.grpc = grpcAdapter.address;
1117
- }
1118
- else {
1119
- addresses.grpc = { host: grpcOpts.host || host, port: grpcOpts.port };
1120
- }
1121
- }
1122
- // Start GraphQL adapter
1123
- if (protocols.graphql?.enabled) {
1124
- const gqlOpts = protocols.graphql.options;
1125
- const gqlPath = gqlOpts.path || '/graphql';
1126
- if (protocols.graphql.shared) {
1127
- if (graphqlAdapter) {
1128
- await graphqlAdapter.start();
1129
- }
1130
- addresses.graphql = { host, port, path: joinBasePath(basePath, gqlPath), shared: true };
1131
- }
1132
- else {
1133
- const isDev = isDevelopment();
1134
- graphqlAdapter = createGraphQLAdapter({
1135
- router,
1136
- registry,
1137
- schemaRegistry,
1138
- host,
1139
- port: gqlOpts.port,
1140
- config: {
1141
- ...gqlOpts,
1142
- path: gqlPath,
1143
- playground: gqlOpts.playground ?? isDev,
1144
- introspection: gqlOpts.introspection ?? isDev,
1145
- timeout: gqlOpts.timeout ?? 30000,
1146
- maxBodySize: gqlOpts.maxBodySize ?? 1024 * 1024,
1147
- },
1148
- });
1149
- await graphqlAdapter.start();
1150
- addresses.graphql = { host, port: gqlOpts.port, path: gqlPath, shared: false };
1151
- }
1152
- }
1153
- if (protocolExtensionConfigs.length > 0) {
1154
- const protocolContext = {
1155
- router,
1156
- registry,
1157
- schemaRegistry,
1158
- httpServer,
1159
- basePath,
1160
- host,
1161
- port,
1162
- providers: resolvedProviders,
1163
- };
1164
- for (const extension of protocolExtensionConfigs) {
1165
- const adapter = await extension.factory(protocolContext, extension.options);
1166
- protocolAdapters.set(extension.name, adapter);
1167
- await adapter.start();
1168
- if (adapter.address) {
1169
- if (!addresses.protocols) {
1170
- addresses.protocols = {};
1171
- }
1172
- addresses.protocols[extension.name] = adapter.address;
1173
- }
1174
- logger.info({ name: extension.name }, 'Protocol adapter started');
1175
- }
1176
- }
1177
- // Start custom TCP handlers (added via .addTcpHandler())
1178
- for (const handler of tcpHandlers) {
1179
- const { createTcpServer } = await import('./fs-routes/tcp/index.js');
1180
- const tcpServer = createTcpServer(handler);
1181
- await tcpServer.start();
1182
- tcpServers.push(tcpServer);
1183
- logger.info({ name: handler.name, port: handler.config.port }, 'TCP handler started');
1184
- }
1185
- // Start custom UDP handlers (added via .addUdpHandler())
1186
- for (const handler of udpHandlers) {
1187
- const { createUdpServer } = await import('./fs-routes/udp/index.js');
1188
- const udpServer = createUdpServer(handler);
1189
- await udpServer.start();
1190
- udpServers.push(udpServer);
1191
- if (!addresses.udp) {
1192
- addresses.udp = { host: udpServer.host, port: udpServer.port };
1193
- }
1194
- logger.info({ name: handler.name, port: handler.config.port }, 'UDP handler started');
1195
- }
1196
- running = true;
1104
+ await serverLifecycle.start();
1197
1105
  },
1198
1106
  async stop() {
1199
- if (!running)
1200
- return;
1201
- const stops = [];
1202
- if (protocolAdapters.size > 0) {
1203
- for (const [name, adapter] of protocolAdapters) {
1204
- logger.info({ name }, 'Protocol adapter stopping');
1205
- stops.push(adapter.stop());
1206
- }
1207
- protocolAdapters.clear();
1208
- }
1209
- if (tcpAdapter) {
1210
- stops.push(tcpAdapter.stop());
1211
- tcpAdapter = null;
1212
- }
1213
- if (jsonRpcAdapter) {
1214
- stops.push(jsonRpcAdapter.stop());
1215
- jsonRpcAdapter = null;
1216
- }
1217
- if (wsAdapter) {
1218
- stops.push(wsAdapter.stop());
1219
- wsAdapter = null;
1220
- }
1221
- if (httpServer) {
1222
- stops.push(httpServer.stop());
1223
- httpServer = null;
1224
- }
1225
- if (grpcAdapter) {
1226
- stops.push(grpcAdapter.stop());
1227
- grpcAdapter = null;
1228
- }
1229
- if (graphqlAdapter) {
1230
- stops.push(graphqlAdapter.stop());
1231
- graphqlAdapter = null;
1232
- }
1233
- await Promise.all(stops);
1234
- // Stop custom TCP servers
1235
- for (const tcpServer of tcpServers) {
1236
- await tcpServer.stop();
1237
- }
1238
- tcpServers.length = 0;
1239
- // Stop custom UDP servers
1240
- for (const udpServer of udpServers) {
1241
- await udpServer.stop();
1242
- }
1243
- udpServers.length = 0;
1244
- // Stop discovery watcher
1245
- if (discoveryWatcher) {
1246
- discoveryWatcher.stop();
1247
- }
1248
- // Stop process metrics collection
1249
- if (processMetricsCleanup) {
1250
- processMetricsCleanup();
1251
- processMetricsCleanup = null;
1252
- }
1253
- // Shutdown tracer (flush pending spans)
1254
- if (tracerInstance) {
1255
- await tracerInstance.shutdown();
1256
- tracerInstance = null;
1257
- }
1258
- // Shutdown providers
1259
- for (const [name, definition] of providerDefinitions) {
1260
- if (definition.onShutdown && resolvedProviders[name]) {
1261
- try {
1262
- await definition.onShutdown(resolvedProviders[name]);
1263
- logger.debug({ name }, 'Provider shut down');
1264
- }
1265
- catch (err) {
1266
- logger.error({ err, name }, 'Error shutting down provider');
1267
- }
1268
- }
1269
- }
1270
- router.stop();
1271
- running = false;
1272
- addresses = null;
1107
+ await serverLifecycle.stop();
1273
1108
  },
1274
1109
  async restart() {
1275
1110
  await server.stop();
@@ -1336,6 +1171,10 @@ export function createServer(options) {
1336
1171
  onJoin: wrappedOnJoin,
1337
1172
  onLeave: wrappedOnLeave,
1338
1173
  },
1174
+ // Include documentation metadata
1175
+ type: options?.type ?? 'public',
1176
+ description: options?.description,
1177
+ tags: options?.tags,
1339
1178
  };
1340
1179
  channelRegistry.set(channelName, channelDef);
1341
1180
  logger.debug({ name: channelName, type: options?.type ?? 'public', auth: authRequirement }, 'Added WebSocket channel');
@@ -1362,18 +1201,21 @@ export function createServer(options) {
1362
1201
  },
1363
1202
  get streams() {
1364
1203
  // Uses persistent streamInterceptors from outer scope for shared middleware chain
1204
+ const isStreamOptions = (optionsOrHandler) => typeof optionsOrHandler === 'object'
1205
+ && optionsOrHandler !== null
1206
+ && !isAsyncIterable(optionsOrHandler);
1365
1207
  const streamsNamespace = {
1366
1208
  source(name, optionsOrHandler, maybeHandler) {
1367
- const isOptionsObject = typeof optionsOrHandler === 'object' && optionsOrHandler !== null && !isAsyncIterable(optionsOrHandler);
1209
+ const isOptionsObject = isStreamOptions(optionsOrHandler);
1368
1210
  const options = isOptionsObject ? optionsOrHandler : {};
1369
1211
  const handler = isOptionsObject ? maybeHandler : optionsOrHandler;
1370
1212
  // Register as a stream handler using the registry
1371
1213
  const streamName = `stream:${name}`;
1372
- const interceptors = [...globalInterceptors, ...streamInterceptors];
1214
+ let interceptors = normalizeInterceptors([...globalInterceptors, ...streamInterceptors]);
1373
1215
  if (options.input) {
1374
1216
  const schema = { input: options.input };
1375
1217
  schemaRegistry.register(streamName, schema);
1376
- interceptors.unshift(createValidationInterceptor(schema));
1218
+ interceptors = normalizeInterceptors(interceptors, schema);
1377
1219
  }
1378
1220
  registry.stream(streamName, handler, {
1379
1221
  description: options.description,
@@ -1384,15 +1226,15 @@ export function createServer(options) {
1384
1226
  return streamsNamespace;
1385
1227
  },
1386
1228
  sink(name, optionsOrHandler, maybeHandler) {
1387
- const isOptionsObject = typeof optionsOrHandler === 'object' && optionsOrHandler !== null;
1229
+ const isOptionsObject = isStreamOptions(optionsOrHandler);
1388
1230
  const options = isOptionsObject ? optionsOrHandler : {};
1389
1231
  const handler = isOptionsObject ? maybeHandler : optionsOrHandler;
1390
1232
  const streamName = `stream:${name}`;
1391
- const interceptors = [...globalInterceptors, ...streamInterceptors];
1233
+ let interceptors = normalizeInterceptors([...globalInterceptors, ...streamInterceptors]);
1392
1234
  if (options.input) {
1393
1235
  const schema = { input: options.input };
1394
1236
  schemaRegistry.register(streamName, schema);
1395
- interceptors.unshift(createValidationInterceptor(schema));
1237
+ interceptors = normalizeInterceptors(interceptors, schema);
1396
1238
  }
1397
1239
  registry.stream(streamName, handler, {
1398
1240
  description: options.description,
@@ -1403,15 +1245,15 @@ export function createServer(options) {
1403
1245
  return streamsNamespace;
1404
1246
  },
1405
1247
  duplex(name, optionsOrHandler, maybeHandler) {
1406
- const isOptionsObject = typeof optionsOrHandler === 'object' && optionsOrHandler !== null;
1248
+ const isOptionsObject = isStreamOptions(optionsOrHandler);
1407
1249
  const options = isOptionsObject ? optionsOrHandler : {};
1408
1250
  const handler = isOptionsObject ? maybeHandler : optionsOrHandler;
1409
1251
  const streamName = `stream:${name}`;
1410
- const interceptors = [...globalInterceptors, ...streamInterceptors];
1252
+ let interceptors = normalizeInterceptors([...globalInterceptors, ...streamInterceptors]);
1411
1253
  if (options.input) {
1412
1254
  const schema = { input: options.input };
1413
1255
  schemaRegistry.register(streamName, schema);
1414
- interceptors.unshift(createValidationInterceptor(schema));
1256
+ interceptors = normalizeInterceptors(interceptors, schema);
1415
1257
  }
1416
1258
  registry.stream(streamName, handler, {
1417
1259
  description: options.description,
@@ -1434,11 +1276,11 @@ export function createServer(options) {
1434
1276
  const isOptionsObject = typeof optionsOrHandler === 'object' && optionsOrHandler !== null && typeof maybeHandler === 'function';
1435
1277
  const options = isOptionsObject ? optionsOrHandler : {};
1436
1278
  const handler = isOptionsObject ? maybeHandler : optionsOrHandler;
1437
- const interceptors = [...globalInterceptors, ...rpcInterceptors];
1279
+ let interceptors = normalizeInterceptors([...globalInterceptors, ...rpcInterceptors]);
1438
1280
  if (options.input) {
1439
1281
  const schema = { input: options.input, output: options.output };
1440
1282
  schemaRegistry.register(name, schema);
1441
- interceptors.unshift(createValidationInterceptor(schema));
1283
+ interceptors = normalizeInterceptors(interceptors, schema);
1442
1284
  }
1443
1285
  registry.procedure(name, handler, {
1444
1286
  description: options.description,
@@ -1601,7 +1443,7 @@ export function createServer(options) {
1601
1443
  const options = isOptionsObject ? optionsOrHandler : {};
1602
1444
  const handler = isOptionsObject ? maybeHandler : optionsOrHandler;
1603
1445
  const procedureName = packageName ? `${packageName}.${serviceName}.${name}` : `${serviceName}.${name}`;
1604
- const interceptors = [...globalInterceptors, ...grpcInterceptors];
1446
+ let interceptors = normalizeInterceptors([...globalInterceptors, ...grpcInterceptors]);
1605
1447
  if (options.input || options.output) {
1606
1448
  const schema = {};
1607
1449
  if (options.input)
@@ -1609,7 +1451,7 @@ export function createServer(options) {
1609
1451
  if (options.output)
1610
1452
  schema.output = options.output;
1611
1453
  schemaRegistry.register(procedureName, schema);
1612
- interceptors.unshift(createValidationInterceptor(schema));
1454
+ interceptors = normalizeInterceptors(interceptors, schema);
1613
1455
  }
1614
1456
  registry.procedure(procedureName, handler, {
1615
1457
  description: options.description,
@@ -1706,32 +1548,35 @@ export function createServer(options) {
1706
1548
  return router;
1707
1549
  },
1708
1550
  get isRunning() {
1709
- return running;
1551
+ return serverState.running.value;
1710
1552
  },
1711
1553
  get addresses() {
1712
- return addresses;
1554
+ return serverState.addresses.value;
1713
1555
  },
1714
1556
  get channels() {
1715
- return wsAdapter?.channels ?? null;
1557
+ return serverState.wsAdapter.value?.channels ?? null;
1716
1558
  },
1717
- get discoveryWatcher() { return discoveryWatcher; },
1559
+ get discoveryWatcher() { return discoveryBootstrap.watcher; },
1718
1560
  get providers() { return resolvedProviders; },
1719
- get graphql() { return graphqlAdapter; },
1720
- get metrics() { return metricsRegistry; },
1721
- get tracer() { return tracerInstance; },
1722
- get usd() { return usdDocsHandlers; },
1561
+ get graphql() { return serverState.graphqlAdapter.value; },
1562
+ get metrics() { return telemetryState.metricsRegistry; },
1563
+ get tracer() { return telemetryState.tracerInstance; },
1564
+ previewConfig() {
1565
+ return getPreviewConfig();
1566
+ },
1567
+ get usd() { return serverState.usdDocsHandlers.value; },
1723
1568
  // === USD Document Access ===
1724
1569
  getUSDDocument() {
1725
- if (!usdDocsHandlers) {
1570
+ if (!serverState.usdDocsHandlers.value) {
1726
1571
  return null;
1727
1572
  }
1728
- return usdDocsHandlers.getUSDDocument();
1573
+ return serverState.usdDocsHandlers.value.getUSDDocument();
1729
1574
  },
1730
1575
  getOpenAPIDocument() {
1731
- if (!usdDocsHandlers) {
1576
+ if (!serverState.usdDocsHandlers.value) {
1732
1577
  return null;
1733
1578
  }
1734
- return usdDocsHandlers.getOpenAPIDocument();
1579
+ return serverState.usdDocsHandlers.value.getOpenAPIDocument();
1735
1580
  },
1736
1581
  };
1737
1582
  return server;