@lovrozagar/honey 0.6.5 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (674) hide show
  1. package/README.md +514 -192
  2. package/bin/honey.js +25 -0
  3. package/dist/accepts.d.ts +7 -1
  4. package/dist/accepts.d.ts.map +1 -1
  5. package/dist/accepts.js +126 -0
  6. package/dist/accepts.js.map +1 -0
  7. package/dist/body-kind.d.ts +26 -0
  8. package/dist/body-kind.d.ts.map +1 -0
  9. package/dist/body-kind.js +70 -0
  10. package/dist/body-kind.js.map +1 -0
  11. package/dist/body-limit.d.ts +5 -1
  12. package/dist/body-limit.d.ts.map +1 -1
  13. package/dist/body-limit.js +126 -0
  14. package/dist/body-limit.js.map +1 -0
  15. package/dist/build/index.d.ts +19 -3
  16. package/dist/build/index.d.ts.map +1 -1
  17. package/dist/build/index.js +173 -0
  18. package/dist/build/index.js.map +1 -0
  19. package/dist/cli-args.d.ts +33 -0
  20. package/dist/cli-args.d.ts.map +1 -0
  21. package/dist/cli-args.js +102 -0
  22. package/dist/cli-args.js.map +1 -0
  23. package/dist/cli-go/auth.go +26 -0
  24. package/dist/cli-go/config.go +192 -0
  25. package/dist/cli-go/errors.go +75 -0
  26. package/dist/cli-go/multipart.go +79 -0
  27. package/dist/cli-go/output.go +163 -0
  28. package/dist/cli-go/root.go +30 -0
  29. package/dist/cli-go/stream.go +88 -0
  30. package/dist/cli-go/version.go +5 -0
  31. package/dist/cli.d.ts +1 -1
  32. package/dist/cli.js +209 -0
  33. package/dist/cli.js.map +1 -0
  34. package/dist/client/defaults.js +48 -0
  35. package/dist/client/defaults.js.map +1 -0
  36. package/dist/client/error.d.ts +35 -0
  37. package/dist/client/error.d.ts.map +1 -1
  38. package/dist/client/error.js +71 -0
  39. package/dist/client/error.js.map +1 -0
  40. package/dist/client/http.d.ts +67 -8
  41. package/dist/client/http.d.ts.map +1 -1
  42. package/dist/client/http.js +571 -0
  43. package/dist/client/http.js.map +1 -0
  44. package/dist/client/index.d.ts +3 -2
  45. package/dist/client/index.d.ts.map +1 -1
  46. package/dist/client/index.js +95 -0
  47. package/dist/client/index.js.map +1 -0
  48. package/dist/client/path.d.ts +26 -0
  49. package/dist/client/path.d.ts.map +1 -0
  50. package/dist/client/path.js +163 -0
  51. package/dist/client/path.js.map +1 -0
  52. package/dist/client/redirect-policy.d.ts +12 -0
  53. package/dist/client/redirect-policy.d.ts.map +1 -0
  54. package/dist/client/redirect-policy.js +20 -0
  55. package/dist/client/redirect-policy.js.map +1 -0
  56. package/dist/client/sdk.d.ts +36 -0
  57. package/dist/client/sdk.d.ts.map +1 -1
  58. package/dist/client/sdk.js +292 -0
  59. package/dist/client/sdk.js.map +1 -0
  60. package/dist/client/sse.d.ts +13 -0
  61. package/dist/client/sse.d.ts.map +1 -1
  62. package/dist/client/sse.js +129 -0
  63. package/dist/client/sse.js.map +1 -0
  64. package/dist/client/types.js +2 -0
  65. package/dist/client/types.js.map +1 -0
  66. package/dist/client/ws.d.ts +9 -2
  67. package/dist/client/ws.d.ts.map +1 -1
  68. package/dist/client/ws.js +112 -0
  69. package/dist/client/ws.js.map +1 -0
  70. package/dist/client-go/errors.go +236 -0
  71. package/dist/client-go/export.go +44 -0
  72. package/dist/client-go/invalidation.go +371 -0
  73. package/dist/client-go/nullable.go +62 -0
  74. package/dist/client-go/realtime.go +354 -0
  75. package/dist/client-go/result.go +20 -0
  76. package/dist/client-go/runtime.go +975 -0
  77. package/dist/client-go/sse.go +159 -0
  78. package/dist/client-go/transport.go +495 -0
  79. package/dist/client-go/ws.go +128 -0
  80. package/dist/client-info.d.ts +36 -0
  81. package/dist/client-info.d.ts.map +1 -0
  82. package/dist/client-info.js +53 -0
  83. package/dist/client-info.js.map +1 -0
  84. package/dist/client-mcp/README.md +10 -0
  85. package/dist/client-mcp/server.ts +221 -0
  86. package/dist/client-mcp/types.ts +19 -0
  87. package/dist/client-python/_errors.py +115 -0
  88. package/dist/client-python/_invalidation.py +494 -0
  89. package/dist/client-python/_realtime.py +179 -0
  90. package/dist/client-python/_runtime.py +860 -0
  91. package/dist/client-python/_sse.py +155 -0
  92. package/dist/client-python/_transport.py +366 -0
  93. package/dist/client-python/_ws.py +159 -0
  94. package/dist/client-python/py.typed +0 -0
  95. package/dist/client-rust/errors.rs +220 -0
  96. package/dist/client-rust/invalidation.rs +412 -0
  97. package/dist/client-rust/invalidation_sync.rs +93 -0
  98. package/dist/client-rust/nullable.rs +17 -0
  99. package/dist/client-rust/realtime.rs +702 -0
  100. package/dist/client-rust/result.rs +22 -0
  101. package/dist/client-rust/runtime.rs +980 -0
  102. package/dist/client-rust/runtime_sync.rs +484 -0
  103. package/dist/client-rust/sse.rs +188 -0
  104. package/dist/client-rust/ws.rs +167 -0
  105. package/dist/codegen-go-cli.d.ts.map +1 -1
  106. package/dist/codegen-go-cli.js +964 -0
  107. package/dist/codegen-go-cli.js.map +1 -0
  108. package/dist/codegen-go.d.ts +15 -3
  109. package/dist/codegen-go.d.ts.map +1 -1
  110. package/dist/codegen-go.js +872 -0
  111. package/dist/codegen-go.js.map +1 -0
  112. package/dist/codegen-hash.js +9 -0
  113. package/dist/codegen-hash.js.map +1 -0
  114. package/dist/codegen-ir.d.ts +69 -2
  115. package/dist/codegen-ir.d.ts.map +1 -1
  116. package/dist/codegen-ir.js +661 -0
  117. package/dist/codegen-ir.js.map +1 -0
  118. package/dist/codegen-lang.d.ts +65 -0
  119. package/dist/codegen-lang.d.ts.map +1 -0
  120. package/dist/codegen-lang.js +526 -0
  121. package/dist/codegen-lang.js.map +1 -0
  122. package/dist/codegen-load.d.ts +31 -0
  123. package/dist/codegen-load.d.ts.map +1 -0
  124. package/dist/codegen-load.js +138 -0
  125. package/dist/codegen-load.js.map +1 -0
  126. package/dist/codegen-loaders.js +55 -0
  127. package/dist/codegen-loaders.js.map +1 -0
  128. package/dist/codegen-mcp.d.ts.map +1 -1
  129. package/dist/codegen-mcp.js +368 -0
  130. package/dist/codegen-mcp.js.map +1 -0
  131. package/dist/codegen-python.d.ts +13 -1
  132. package/dist/codegen-python.d.ts.map +1 -1
  133. package/dist/codegen-python.js +828 -0
  134. package/dist/codegen-python.js.map +1 -0
  135. package/dist/codegen-route-tree-intern.d.ts +15 -5
  136. package/dist/codegen-route-tree-intern.d.ts.map +1 -1
  137. package/dist/codegen-route-tree-intern.js +221 -0
  138. package/dist/codegen-route-tree-intern.js.map +1 -0
  139. package/dist/codegen-rust.d.ts.map +1 -1
  140. package/dist/codegen-rust.js +1293 -0
  141. package/dist/codegen-rust.js.map +1 -0
  142. package/dist/codegen-sanitize.d.ts.map +1 -1
  143. package/dist/codegen-sanitize.js +56 -0
  144. package/dist/codegen-sanitize.js.map +1 -0
  145. package/dist/codegen-schema-naming.d.ts +5 -0
  146. package/dist/codegen-schema-naming.d.ts.map +1 -1
  147. package/dist/codegen-schema-naming.js +150 -0
  148. package/dist/codegen-schema-naming.js.map +1 -0
  149. package/dist/codegen-sdk-model.d.ts +71 -0
  150. package/dist/codegen-sdk-model.d.ts.map +1 -0
  151. package/dist/codegen-sdk-model.js +179 -0
  152. package/dist/codegen-sdk-model.js.map +1 -0
  153. package/dist/codegen.d.ts +41 -23
  154. package/dist/codegen.d.ts.map +1 -1
  155. package/dist/codegen.js +4610 -0
  156. package/dist/codegen.js.map +1 -0
  157. package/dist/context.d.ts +36 -6
  158. package/dist/context.d.ts.map +1 -1
  159. package/dist/context.js +242 -0
  160. package/dist/context.js.map +1 -0
  161. package/dist/cookie-sign.d.ts +16 -2
  162. package/dist/cookie-sign.d.ts.map +1 -1
  163. package/dist/cookie-sign.js +104 -0
  164. package/dist/cookie-sign.js.map +1 -0
  165. package/dist/cookie.d.ts +12 -0
  166. package/dist/cookie.d.ts.map +1 -1
  167. package/dist/cookie.js +138 -0
  168. package/dist/cookie.js.map +1 -0
  169. package/dist/cors.d.ts +1 -0
  170. package/dist/cors.d.ts.map +1 -1
  171. package/dist/cors.js +87 -0
  172. package/dist/cors.js.map +1 -0
  173. package/dist/crypto.d.ts +6 -1
  174. package/dist/crypto.d.ts.map +1 -1
  175. package/dist/crypto.js +38 -0
  176. package/dist/crypto.js.map +1 -0
  177. package/dist/csrf.d.ts +19 -0
  178. package/dist/csrf.d.ts.map +1 -1
  179. package/dist/csrf.js +79 -0
  180. package/dist/csrf.js.map +1 -0
  181. package/dist/curl-logger.d.ts +14 -3
  182. package/dist/curl-logger.d.ts.map +1 -1
  183. package/dist/curl-logger.js +199 -0
  184. package/dist/curl-logger.js.map +1 -0
  185. package/dist/detect-runtime.js +13 -0
  186. package/dist/detect-runtime.js.map +1 -0
  187. package/dist/dict.d.ts +11 -0
  188. package/dist/dict.d.ts.map +1 -0
  189. package/dist/dict.js +13 -0
  190. package/dist/dict.js.map +1 -0
  191. package/dist/error.d.ts.map +1 -1
  192. package/dist/error.js +44 -0
  193. package/dist/error.js.map +1 -0
  194. package/dist/errors.js +39 -0
  195. package/dist/errors.js.map +1 -0
  196. package/dist/etag.d.ts +2 -0
  197. package/dist/etag.d.ts.map +1 -1
  198. package/dist/etag.js +82 -0
  199. package/dist/etag.js.map +1 -0
  200. package/dist/feature-detect.d.ts +25 -0
  201. package/dist/feature-detect.d.ts.map +1 -0
  202. package/dist/feature-detect.js +144 -0
  203. package/dist/feature-detect.js.map +1 -0
  204. package/dist/feature-load.js +36 -0
  205. package/dist/feature-load.js.map +1 -0
  206. package/dist/feature-slots.d.ts +44 -0
  207. package/dist/feature-slots.d.ts.map +1 -0
  208. package/dist/feature-slots.js +48 -0
  209. package/dist/feature-slots.js.map +1 -0
  210. package/dist/fetch-request.d.ts +10 -0
  211. package/dist/fetch-request.d.ts.map +1 -0
  212. package/dist/fetch-request.js +13 -0
  213. package/dist/fetch-request.js.map +1 -0
  214. package/dist/gen-process.d.ts +15 -0
  215. package/dist/gen-process.d.ts.map +1 -0
  216. package/dist/gen-process.js +43 -0
  217. package/dist/gen-process.js.map +1 -0
  218. package/dist/gen-write.d.ts +19 -0
  219. package/dist/gen-write.d.ts.map +1 -0
  220. package/dist/gen-write.js +120 -0
  221. package/dist/gen-write.js.map +1 -0
  222. package/dist/glob.d.ts +21 -0
  223. package/dist/glob.d.ts.map +1 -0
  224. package/dist/glob.js +115 -0
  225. package/dist/glob.js.map +1 -0
  226. package/dist/go-type-emitter.d.ts +18 -4
  227. package/dist/go-type-emitter.d.ts.map +1 -1
  228. package/dist/go-type-emitter.js +594 -0
  229. package/dist/go-type-emitter.js.map +1 -0
  230. package/dist/honey-response.d.ts.map +1 -1
  231. package/dist/honey-response.js +338 -0
  232. package/dist/honey-response.js.map +1 -0
  233. package/dist/i18n-slot.d.ts +8 -0
  234. package/dist/i18n-slot.d.ts.map +1 -1
  235. package/dist/i18n-slot.js +14 -0
  236. package/dist/i18n-slot.js.map +1 -0
  237. package/dist/i18n.d.ts +3 -0
  238. package/dist/i18n.d.ts.map +1 -1
  239. package/dist/i18n.js +250 -0
  240. package/dist/i18n.js.map +1 -0
  241. package/dist/index.d.ts +410 -149
  242. package/dist/index.d.ts.map +1 -1
  243. package/dist/index.js +2324 -0
  244. package/dist/index.js.map +1 -0
  245. package/dist/init.d.ts +3 -5
  246. package/dist/init.d.ts.map +1 -1
  247. package/dist/init.js +140 -0
  248. package/dist/init.js.map +1 -0
  249. package/dist/input.js +4 -0
  250. package/dist/input.js.map +1 -0
  251. package/dist/invalidate-check.d.ts +11 -0
  252. package/dist/invalidate-check.d.ts.map +1 -1
  253. package/dist/invalidate-check.js +163 -0
  254. package/dist/invalidate-check.js.map +1 -0
  255. package/dist/invoke-user.d.ts +35 -0
  256. package/dist/invoke-user.d.ts.map +1 -0
  257. package/dist/invoke-user.js +73 -0
  258. package/dist/invoke-user.js.map +1 -0
  259. package/dist/ip-restrict.d.ts +13 -1
  260. package/dist/ip-restrict.d.ts.map +1 -1
  261. package/dist/ip-restrict.js +60 -0
  262. package/dist/ip-restrict.js.map +1 -0
  263. package/dist/ip.d.ts +39 -0
  264. package/dist/ip.d.ts.map +1 -0
  265. package/dist/ip.js +209 -0
  266. package/dist/ip.js.map +1 -0
  267. package/dist/logger.d.ts.map +1 -1
  268. package/dist/logger.js +113 -0
  269. package/dist/logger.js.map +1 -0
  270. package/dist/media-type.d.ts +30 -0
  271. package/dist/media-type.d.ts.map +1 -0
  272. package/dist/media-type.js +97 -0
  273. package/dist/media-type.js.map +1 -0
  274. package/dist/meta-spec-merge.d.ts +32 -0
  275. package/dist/meta-spec-merge.d.ts.map +1 -0
  276. package/dist/meta-spec-merge.js +68 -0
  277. package/dist/meta-spec-merge.js.map +1 -0
  278. package/dist/meta-spec.d.ts +16 -3
  279. package/dist/meta-spec.d.ts.map +1 -1
  280. package/dist/meta-spec.js +535 -0
  281. package/dist/meta-spec.js.map +1 -0
  282. package/dist/middleware.d.ts +23 -6
  283. package/dist/middleware.d.ts.map +1 -1
  284. package/dist/middleware.js +253 -0
  285. package/dist/middleware.js.map +1 -0
  286. package/dist/node-request.d.ts +57 -12
  287. package/dist/node-request.d.ts.map +1 -1
  288. package/dist/node-request.js +407 -0
  289. package/dist/node-request.js.map +1 -0
  290. package/dist/node.d.ts +20 -3
  291. package/dist/node.d.ts.map +1 -1
  292. package/dist/node.js +396 -0
  293. package/dist/node.js.map +1 -0
  294. package/dist/openapi/collect.d.ts +6 -3
  295. package/dist/openapi/collect.d.ts.map +1 -1
  296. package/dist/openapi/collect.js +30 -0
  297. package/dist/openapi/collect.js.map +1 -0
  298. package/dist/openapi/docs-page.d.ts +42 -0
  299. package/dist/openapi/docs-page.d.ts.map +1 -0
  300. package/dist/openapi/docs-page.js +80 -0
  301. package/dist/openapi/docs-page.js.map +1 -0
  302. package/dist/openapi/document.d.ts +4 -0
  303. package/dist/openapi/document.d.ts.map +1 -1
  304. package/dist/openapi/document.js +785 -0
  305. package/dist/openapi/document.js.map +1 -0
  306. package/dist/openapi/json-schema-slot.d.ts +7 -0
  307. package/dist/openapi/json-schema-slot.d.ts.map +1 -1
  308. package/dist/openapi/json-schema-slot.js +38 -0
  309. package/dist/openapi/json-schema-slot.js.map +1 -0
  310. package/dist/openapi/register.d.ts.map +1 -1
  311. package/dist/openapi/register.js +20 -0
  312. package/dist/openapi/register.js.map +1 -0
  313. package/dist/openapi/scalar.d.ts +3 -1
  314. package/dist/openapi/scalar.d.ts.map +1 -1
  315. package/dist/openapi/scalar.js +21 -0
  316. package/dist/openapi/scalar.js.map +1 -0
  317. package/dist/openapi/serve.d.ts +9 -0
  318. package/dist/openapi/serve.d.ts.map +1 -0
  319. package/dist/openapi/serve.js +36 -0
  320. package/dist/openapi/serve.js.map +1 -0
  321. package/dist/openapi/spec-factory.d.ts +30 -1
  322. package/dist/openapi/spec-factory.d.ts.map +1 -1
  323. package/dist/openapi/spec-factory.js +52 -0
  324. package/dist/openapi/spec-factory.js.map +1 -0
  325. package/dist/openapi/spec.d.ts +14 -5
  326. package/dist/openapi/spec.d.ts.map +1 -1
  327. package/dist/openapi/spec.js +50 -0
  328. package/dist/openapi/spec.js.map +1 -0
  329. package/dist/openapi/swagger.d.ts +3 -1
  330. package/dist/openapi/swagger.d.ts.map +1 -1
  331. package/dist/openapi/swagger.js +22 -0
  332. package/dist/openapi/swagger.js.map +1 -0
  333. package/dist/pattern.d.ts +71 -0
  334. package/dist/pattern.d.ts.map +1 -0
  335. package/dist/pattern.js +239 -0
  336. package/dist/pattern.js.map +1 -0
  337. package/dist/peer.d.ts +17 -0
  338. package/dist/peer.d.ts.map +1 -0
  339. package/dist/peer.js +50 -0
  340. package/dist/peer.js.map +1 -0
  341. package/dist/plugin.d.ts +67 -16
  342. package/dist/plugin.d.ts.map +1 -1
  343. package/dist/plugin.js +649 -0
  344. package/dist/plugin.js.map +1 -0
  345. package/dist/powered-by.d.ts.map +1 -1
  346. package/dist/powered-by.js +11 -0
  347. package/dist/powered-by.js.map +1 -0
  348. package/dist/pretty-json.d.ts.map +1 -1
  349. package/dist/pretty-json.js +47 -0
  350. package/dist/pretty-json.js.map +1 -0
  351. package/dist/producer-stream.d.ts +47 -0
  352. package/dist/producer-stream.d.ts.map +1 -0
  353. package/dist/producer-stream.js +267 -0
  354. package/dist/producer-stream.js.map +1 -0
  355. package/dist/proxy.d.ts +47 -8
  356. package/dist/proxy.d.ts.map +1 -1
  357. package/dist/proxy.js +274 -0
  358. package/dist/proxy.js.map +1 -0
  359. package/dist/python-type-emitter.d.ts +14 -1
  360. package/dist/python-type-emitter.d.ts.map +1 -1
  361. package/dist/python-type-emitter.js +157 -0
  362. package/dist/python-type-emitter.js.map +1 -0
  363. package/dist/realtime/bus.d.ts +17 -1
  364. package/dist/realtime/bus.d.ts.map +1 -1
  365. package/dist/realtime/bus.js +112 -0
  366. package/dist/realtime/bus.js.map +1 -0
  367. package/dist/realtime/register.d.ts +3 -0
  368. package/dist/realtime/register.d.ts.map +1 -0
  369. package/dist/realtime/register.js +10 -0
  370. package/dist/realtime/register.js.map +1 -0
  371. package/dist/realtime/route.d.ts +65 -26
  372. package/dist/realtime/route.d.ts.map +1 -1
  373. package/dist/realtime/route.js +72 -0
  374. package/dist/realtime/route.js.map +1 -0
  375. package/dist/realtime/server.d.ts +43 -0
  376. package/dist/realtime/server.d.ts.map +1 -0
  377. package/dist/realtime/server.js +255 -0
  378. package/dist/realtime/server.js.map +1 -0
  379. package/dist/request-id.d.ts +7 -0
  380. package/dist/request-id.d.ts.map +1 -1
  381. package/dist/request-id.js +16 -0
  382. package/dist/request-id.js.map +1 -0
  383. package/dist/request-limits.d.ts +3 -0
  384. package/dist/request-limits.d.ts.map +1 -0
  385. package/dist/request-limits.js +3 -0
  386. package/dist/request-limits.js.map +1 -0
  387. package/dist/request-path.d.ts +33 -0
  388. package/dist/request-path.d.ts.map +1 -0
  389. package/dist/request-path.js +178 -0
  390. package/dist/request-path.js.map +1 -0
  391. package/dist/request-to-curl.d.ts +7 -1
  392. package/dist/request-to-curl.d.ts.map +1 -1
  393. package/dist/request-to-curl.js +48 -0
  394. package/dist/request-to-curl.js.map +1 -0
  395. package/dist/response.d.ts +25 -2
  396. package/dist/response.d.ts.map +1 -1
  397. package/dist/response.js +313 -0
  398. package/dist/response.js.map +1 -0
  399. package/dist/rust-type-emitter.d.ts +14 -2
  400. package/dist/rust-type-emitter.d.ts.map +1 -1
  401. package/dist/rust-type-emitter.js +463 -0
  402. package/dist/rust-type-emitter.js.map +1 -0
  403. package/dist/secure-headers.d.ts.map +1 -1
  404. package/dist/secure-headers.js +53 -0
  405. package/dist/secure-headers.js.map +1 -0
  406. package/dist/serve-register.d.ts +4 -0
  407. package/dist/serve-register.d.ts.map +1 -1
  408. package/dist/serve-register.js +9 -0
  409. package/dist/serve-register.js.map +1 -0
  410. package/dist/serve-slot.d.ts +3 -0
  411. package/dist/serve-slot.d.ts.map +1 -1
  412. package/dist/serve-slot.js +52 -0
  413. package/dist/serve-slot.js.map +1 -0
  414. package/dist/serve.d.ts +18 -1
  415. package/dist/serve.d.ts.map +1 -1
  416. package/dist/serve.js +157 -0
  417. package/dist/serve.js.map +1 -0
  418. package/dist/server-timing.d.ts.map +1 -1
  419. package/dist/server-timing.js +51 -0
  420. package/dist/server-timing.js.map +1 -0
  421. package/dist/static.d.ts +9 -0
  422. package/dist/static.d.ts.map +1 -1
  423. package/dist/static.js +102 -0
  424. package/dist/static.js.map +1 -0
  425. package/dist/telemetry/otel.d.ts +2 -0
  426. package/dist/telemetry/otel.d.ts.map +1 -1
  427. package/dist/telemetry/otel.js +135 -0
  428. package/dist/telemetry/otel.js.map +1 -0
  429. package/dist/testing.d.ts +12 -0
  430. package/dist/testing.d.ts.map +1 -1
  431. package/dist/testing.js +124 -0
  432. package/dist/testing.js.map +1 -0
  433. package/dist/timeout.d.ts +6 -0
  434. package/dist/timeout.d.ts.map +1 -1
  435. package/dist/timeout.js +36 -0
  436. package/dist/timeout.js.map +1 -0
  437. package/dist/tree.d.ts +133 -36
  438. package/dist/tree.d.ts.map +1 -1
  439. package/dist/tree.js +437 -0
  440. package/dist/tree.js.map +1 -0
  441. package/dist/trust.d.ts +21 -0
  442. package/dist/trust.d.ts.map +1 -0
  443. package/dist/trust.js +100 -0
  444. package/dist/trust.js.map +1 -0
  445. package/dist/ts-type-emitter.d.ts.map +1 -1
  446. package/dist/ts-type-emitter.js +150 -0
  447. package/dist/ts-type-emitter.js.map +1 -0
  448. package/dist/type-emitter.d.ts +16 -2
  449. package/dist/type-emitter.d.ts.map +1 -1
  450. package/dist/type-emitter.js +729 -0
  451. package/dist/type-emitter.js.map +1 -0
  452. package/dist/type-extractor.d.ts +8 -4
  453. package/dist/type-extractor.d.ts.map +1 -1
  454. package/dist/type-extractor.js +776 -0
  455. package/dist/type-extractor.js.map +1 -0
  456. package/dist/types.d.ts +7 -0
  457. package/dist/types.d.ts.map +1 -1
  458. package/dist/types.js +96 -0
  459. package/dist/types.js.map +1 -0
  460. package/dist/validation.d.ts +14 -2
  461. package/dist/validation.d.ts.map +1 -1
  462. package/dist/validation.js +335 -0
  463. package/dist/validation.js.map +1 -0
  464. package/dist/with-headers.d.ts +15 -0
  465. package/dist/with-headers.d.ts.map +1 -0
  466. package/dist/with-headers.js +45 -0
  467. package/dist/with-headers.js.map +1 -0
  468. package/dist/ws/bun.d.ts +11 -5
  469. package/dist/ws/bun.d.ts.map +1 -1
  470. package/dist/ws/bun.js +82 -0
  471. package/dist/ws/bun.js.map +1 -0
  472. package/dist/ws/cloudflare.d.ts +25 -3
  473. package/dist/ws/cloudflare.d.ts.map +1 -1
  474. package/dist/ws/cloudflare.js +117 -0
  475. package/dist/ws/cloudflare.js.map +1 -0
  476. package/dist/ws/deno.d.ts +4 -4
  477. package/dist/ws/deno.d.ts.map +1 -1
  478. package/dist/ws/deno.js +133 -0
  479. package/dist/ws/deno.js.map +1 -0
  480. package/dist/ws/node.d.ts +20 -3
  481. package/dist/ws/node.d.ts.map +1 -1
  482. package/dist/ws/node.js +173 -0
  483. package/dist/ws/node.js.map +1 -0
  484. package/dist/ws/session.d.ts +11 -0
  485. package/dist/ws/session.d.ts.map +1 -0
  486. package/dist/ws/session.js +60 -0
  487. package/dist/ws/session.js.map +1 -0
  488. package/dist/ws/shared.d.ts +65 -0
  489. package/dist/ws/shared.d.ts.map +1 -0
  490. package/dist/ws/shared.js +103 -0
  491. package/dist/ws/shared.js.map +1 -0
  492. package/dist/ws-origin.d.ts +20 -0
  493. package/dist/ws-origin.d.ts.map +1 -0
  494. package/dist/ws-origin.js +41 -0
  495. package/dist/ws-origin.js.map +1 -0
  496. package/dist/yaml.d.ts +15 -1
  497. package/dist/yaml.d.ts.map +1 -1
  498. package/dist/yaml.js +101 -0
  499. package/dist/yaml.js.map +1 -0
  500. package/docs/invalidate-spec.md +13 -1
  501. package/docs/meta-spec.md +36 -12
  502. package/docs/packaging.md +43 -24
  503. package/docs/regression-matrix/README.md +32 -0
  504. package/docs/regression-matrix/review.md +44 -0
  505. package/docs/regression-matrix/ws1-3.md +97 -0
  506. package/docs/regression-matrix/ws4-8.md +107 -0
  507. package/docs/regression-matrix/ws9-12.md +266 -0
  508. package/docs/sdk.md +102 -52
  509. package/package.json +183 -52
  510. package/src/accepts.ts +91 -33
  511. package/src/body-kind.ts +67 -0
  512. package/src/body-limit.ts +102 -87
  513. package/src/build/index.ts +104 -54
  514. package/src/cli-args.ts +123 -0
  515. package/src/cli-go/auth.go +12 -1
  516. package/src/cli-go/config.go +29 -2
  517. package/src/cli-go/errors.go +28 -10
  518. package/src/cli-go/multipart.go +51 -27
  519. package/src/cli-go/output.go +58 -4
  520. package/src/cli-go/root.go +1 -1
  521. package/src/cli-go/version.go +2 -2
  522. package/src/cli.ts +154 -148
  523. package/src/client/error.ts +56 -1
  524. package/src/client/http.ts +479 -256
  525. package/src/client/index.ts +55 -17
  526. package/src/client/path.ts +169 -0
  527. package/src/client/redirect-policy.ts +19 -0
  528. package/src/client/sdk.ts +180 -101
  529. package/src/client/sse.ts +92 -66
  530. package/src/client/ws.ts +67 -31
  531. package/src/client-go/errors.go +41 -12
  532. package/src/client-go/export.go +44 -0
  533. package/src/client-go/invalidation.go +52 -54
  534. package/src/client-go/nullable.go +62 -0
  535. package/src/client-go/realtime.go +147 -110
  536. package/src/client-go/runtime.go +646 -88
  537. package/src/client-go/sse.go +104 -94
  538. package/src/client-go/transport.go +67 -27
  539. package/src/client-go/ws.go +49 -25
  540. package/src/client-info.ts +79 -0
  541. package/src/client-mcp/server.ts +133 -3
  542. package/src/client-python/_invalidation.py +207 -291
  543. package/src/client-python/_realtime.py +63 -40
  544. package/src/client-python/_runtime.py +501 -119
  545. package/src/client-python/_sse.py +130 -74
  546. package/src/client-python/_transport.py +37 -9
  547. package/src/client-python/_ws.py +50 -22
  548. package/src/client-rust/errors.rs +21 -1
  549. package/src/client-rust/invalidation.rs +202 -231
  550. package/src/client-rust/invalidation_sync.rs +16 -229
  551. package/src/client-rust/nullable.rs +17 -0
  552. package/src/client-rust/realtime.rs +217 -217
  553. package/src/client-rust/runtime.rs +602 -177
  554. package/src/client-rust/runtime_sync.rs +169 -145
  555. package/src/client-rust/sse.rs +142 -121
  556. package/src/client-rust/ws.rs +61 -37
  557. package/src/codegen-go-cli.ts +607 -728
  558. package/src/codegen-go.ts +710 -770
  559. package/src/codegen-ir.ts +381 -75
  560. package/src/codegen-lang.ts +517 -0
  561. package/src/codegen-load.ts +150 -0
  562. package/src/codegen-mcp.ts +207 -108
  563. package/src/codegen-python.ts +684 -816
  564. package/src/codegen-route-tree-intern.ts +51 -25
  565. package/src/codegen-rust.ts +946 -1240
  566. package/src/codegen-sanitize.ts +0 -4
  567. package/src/codegen-schema-naming.ts +19 -6
  568. package/src/codegen-sdk-model.ts +228 -0
  569. package/src/codegen.ts +1488 -1140
  570. package/src/context.ts +130 -11
  571. package/src/cookie-sign.ts +85 -16
  572. package/src/cookie.ts +66 -11
  573. package/src/cors.ts +55 -54
  574. package/src/crypto.ts +27 -5
  575. package/src/csrf.ts +57 -25
  576. package/src/curl-logger.ts +155 -114
  577. package/src/dict.ts +12 -0
  578. package/src/error.ts +4 -2
  579. package/src/etag.ts +58 -34
  580. package/src/feature-detect.ts +147 -0
  581. package/src/feature-slots.ts +70 -0
  582. package/src/fetch-request.ts +13 -0
  583. package/src/gen-process.ts +42 -0
  584. package/src/gen-write.ts +127 -0
  585. package/src/glob.ts +109 -0
  586. package/src/go-type-emitter.ts +406 -155
  587. package/src/honey-response.ts +36 -9
  588. package/src/i18n-slot.ts +10 -0
  589. package/src/i18n.ts +98 -23
  590. package/src/index.ts +1893 -1761
  591. package/src/init.ts +40 -28
  592. package/src/invalidate-check.ts +42 -4
  593. package/src/invoke-user.ts +95 -0
  594. package/src/ip-restrict.ts +47 -161
  595. package/src/ip.ts +194 -0
  596. package/src/logger.ts +65 -36
  597. package/src/media-type.ts +104 -0
  598. package/src/meta-spec-merge.ts +80 -0
  599. package/src/meta-spec.ts +0 -0
  600. package/src/middleware.ts +112 -12
  601. package/src/node-request.ts +242 -52
  602. package/src/node.ts +318 -75
  603. package/src/openapi/collect.ts +19 -44
  604. package/src/openapi/docs-page.ts +89 -0
  605. package/src/openapi/document.ts +503 -224
  606. package/src/openapi/json-schema-slot.ts +40 -0
  607. package/src/openapi/register.ts +7 -2
  608. package/src/openapi/scalar.ts +11 -10
  609. package/src/openapi/serve.ts +39 -0
  610. package/src/openapi/spec-factory.ts +50 -1
  611. package/src/openapi/spec.ts +53 -30
  612. package/src/openapi/swagger.ts +12 -11
  613. package/src/pattern.ts +245 -0
  614. package/src/peer.ts +53 -0
  615. package/src/plugin.ts +270 -185
  616. package/src/powered-by.ts +2 -2
  617. package/src/pretty-json.ts +25 -9
  618. package/src/producer-stream.ts +296 -0
  619. package/src/proxy.ts +271 -55
  620. package/src/python-type-emitter.ts +68 -56
  621. package/src/realtime/bus.ts +56 -9
  622. package/src/realtime/register.ts +13 -0
  623. package/src/realtime/route.ts +129 -80
  624. package/src/realtime/server.ts +298 -0
  625. package/src/request-id.ts +13 -3
  626. package/src/request-limits.ts +2 -0
  627. package/src/request-path.ts +165 -0
  628. package/src/request-to-curl.ts +28 -7
  629. package/src/response.ts +143 -103
  630. package/src/rust-type-emitter.ts +265 -170
  631. package/src/secure-headers.ts +8 -4
  632. package/src/serve-register.ts +4 -0
  633. package/src/serve-slot.ts +38 -0
  634. package/src/serve.ts +113 -25
  635. package/src/server-timing.ts +11 -7
  636. package/src/static.ts +85 -32
  637. package/src/telemetry/otel.ts +29 -7
  638. package/src/testing.ts +76 -14
  639. package/src/timeout.ts +15 -7
  640. package/src/tree.ts +405 -333
  641. package/src/trust.ts +117 -0
  642. package/src/ts-type-emitter.ts +18 -12
  643. package/src/type-emitter.ts +227 -89
  644. package/src/type-extractor.ts +562 -424
  645. package/src/types.ts +8 -0
  646. package/src/validation.ts +221 -96
  647. package/src/with-headers.ts +45 -0
  648. package/src/ws/bun.ts +53 -15
  649. package/src/ws/cloudflare.ts +81 -19
  650. package/src/ws/deno.ts +124 -36
  651. package/src/ws/node.ts +173 -79
  652. package/src/ws/session.ts +73 -0
  653. package/src/ws/shared.ts +140 -0
  654. package/src/ws-origin.ts +53 -0
  655. package/src/yaml.ts +45 -22
  656. package/dist/client-mcp/server.d.ts +0 -10
  657. package/dist/client-mcp/server.d.ts.map +0 -1
  658. package/dist/client-mcp/types.d.ts +0 -16
  659. package/dist/client-mcp/types.d.ts.map +0 -1
  660. package/dist/cloudflare/realtime.d.ts +0 -30
  661. package/dist/cloudflare/realtime.d.ts.map +0 -1
  662. package/dist/realtime/buffer.d.ts +0 -18
  663. package/dist/realtime/buffer.d.ts.map +0 -1
  664. package/dist/realtime/longpoll.d.ts +0 -23
  665. package/dist/realtime/longpoll.d.ts.map +0 -1
  666. package/dist/realtime/protocol.d.ts +0 -50
  667. package/dist/realtime/protocol.d.ts.map +0 -1
  668. package/dist/realtime/runtime.d.ts +0 -74
  669. package/dist/realtime/runtime.d.ts.map +0 -1
  670. package/src/cloudflare/realtime.ts +0 -234
  671. package/src/realtime/buffer.ts +0 -101
  672. package/src/realtime/longpoll.ts +0 -148
  673. package/src/realtime/protocol.ts +0 -128
  674. package/src/realtime/runtime.ts +0 -427
@@ -0,0 +1,10 @@
1
+ /**
2
+ * `import "@lovrozagar/honey/realtime"` makes `app.realtime()` available. The core never
3
+ * imports the realtime server, so an app without realtime routes does not bundle it.
4
+ */
5
+ import { registerFeature } from "../feature-slots.js";
6
+ import { createBus } from "./bus.js";
7
+ import { resolveRealtimeConfig } from "./route.js";
8
+ import { createRealtimePublisher, createRealtimeSession } from "./server.js";
9
+ registerFeature("realtime", { createBus, createRealtimePublisher, createRealtimeSession, resolveRealtimeConfig });
10
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/realtime/register.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAE5E,eAAe,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,CAAC,CAAA"}
@@ -1,42 +1,81 @@
1
+ import { type WSOriginPolicy } from "../ws-origin.ts";
2
+ /**
3
+ * One realtime connection as the route handler sees it. Only the WebSocket transport ships.
4
+ * Every frame, in both directions, is one JSON text (see the README's realtime wire format).
5
+ */
1
6
  export type ConnContext = {
2
7
  readonly id: string;
8
+ /** What the route's `identify(ctx)` returned, else `null`. */
3
9
  readonly userId: string | null;
4
- readonly transport: "ws" | "sse" | "longpoll";
10
+ readonly transport: "ws";
11
+ /** `true` once the connection closed (or `close()` was called). `join` and `send` are then no-ops. */
12
+ readonly closed: boolean;
5
13
  readonly state: Record<string, unknown>;
14
+ /** Subscribe to `topic` in this route's namespace. Throws past `limits.maxTopics`. */
6
15
  join(topic: string): void;
7
16
  leave(topic: string): void;
17
+ /** Send one JSON frame to this connection. Throws when `payload` is not JSON-serializable. */
8
18
  send(payload: unknown): void;
19
+ /** Send one JSON frame to every connection on `topic` in this route's namespace (this one included). */
9
20
  publish(topic: string, payload: unknown): void;
21
+ /** Close with code 1000. A reason longer than 123 UTF-8 bytes is truncated. */
10
22
  close(reason?: string): void;
11
- on(event: "message", handler: (payload: unknown) => void): void;
12
- on(event: "close", handler: (reason: string) => void): void;
13
- readonly _handlers: {
14
- message: ((payload: unknown) => void) | null;
15
- close: ((reason: string) => void) | null;
16
- };
23
+ on(event: "message", handler: (payload: unknown) => void | Promise<void>): void;
24
+ on(event: "close", handler: (reason: string) => void | Promise<void>): void;
17
25
  };
18
- export type RealtimeRouteOpts = {
26
+ export type RealtimeLimits = {
27
+ /** Topics one connection may join. Default 128. */
28
+ maxTopics?: number;
29
+ /** Largest inbound text frame in UTF-8 bytes; larger frames close the connection with 1009. Default 1 MiB. */
30
+ maxFrameBytes?: number;
31
+ /**
32
+ * Inbound frames waiting for a handler (a slow async `message` handler, or none attached yet).
33
+ * Past this the connection closes with 1008. Default 64.
34
+ */
35
+ maxPendingFrames?: number;
36
+ /**
37
+ * Outbound bytes the runtime may hold for a client that is not reading, where the runtime reports
38
+ * it (`bufferedAmount`). Past this `slowConsumer` applies. Default 4 MiB.
39
+ */
40
+ maxBufferedBytes?: number;
41
+ /** `"close"` (default) closes a slow consumer with 1013; `"drop"` drops frames until it catches up. */
42
+ slowConsumer?: "close" | "drop";
43
+ };
44
+ /** `C` is the request context of the handle `realtime()` is called on. */
45
+ export type RealtimeRouteOpts<C = unknown> = {
19
46
  use?: Array<(ctx: unknown, next: () => Promise<Response>) => Promise<Response>>;
20
- reconnectBuffer?: number;
21
- handler: (c: unknown, conn: ConnContext) => void | Promise<void>;
47
+ /**
48
+ * Topic namespace. Connections only see topics of their own namespace. Defaults to the route's
49
+ * full path pattern, so two realtime routes never share topics unless they name the same namespace.
50
+ */
51
+ namespace?: string;
52
+ /** Runs after the route's middleware, before the upgrade. Its result becomes `conn.userId`; a throw rejects the upgrade. */
53
+ identify?: (ctx: C) => string | null | undefined | Promise<string | null | undefined>;
54
+ /** Receives every error thrown by `handler` and the `message`/`close` handlers. Defaults to the app logger. */
55
+ onError?: (error: unknown, conn: ConnContext) => void | Promise<void>;
56
+ limits?: RealtimeLimits;
57
+ /**
58
+ * Browser origins allowed to connect: `"*"`, a list (`https://app.example.com`), or a
59
+ * predicate. Same-origin always passes. Unset, a cross-origin upgrade that carries `Cookie`
60
+ * or `Authorization` gets 403.
61
+ */
62
+ allowedOrigins?: WSOriginPolicy;
63
+ handler: (c: C, conn: ConnContext) => void | Promise<void>;
22
64
  };
23
- export type RealtimeRouteHandler = {
65
+ /** A realtime route after validation, with every default applied. */
66
+ export type RealtimeConfig = {
67
+ allowedOrigins: WSOriginPolicy | null;
24
68
  handler: RealtimeRouteOpts["handler"];
25
- middlewares: RealtimeRouteOpts["use"];
26
- reconnectBuffer: number;
69
+ identify: NonNullable<RealtimeRouteOpts["identify"]> | null;
70
+ limits: Required<RealtimeLimits>;
71
+ namespace: string;
72
+ /** false when `namespace` is the default (the route's path), which follows the route when mounted */
73
+ namespaceExplicit: boolean;
74
+ onError: NonNullable<RealtimeRouteOpts["onError"]> | null;
27
75
  path: string;
28
76
  };
29
- export declare function createConnContext(opts: {
30
- id: string;
31
- userId: string | null;
32
- transport: "ws" | "sse" | "longpoll";
33
- bus: {
34
- subscribe(connId: string, topic: string): void;
35
- unsubscribe(connId: string, topic: string): void;
36
- unsubscribeAll(connId: string): void;
37
- publish(topic: string, data: unknown): void;
38
- };
39
- sendFn: (payload: unknown) => void;
40
- closeFn: (reason?: string) => void;
41
- }): ConnContext;
77
+ /** Validate `app.realtime()` options. Options the shipped bus does not implement are rejected, not ignored. */
78
+ export declare function resolveRealtimeConfig<C>(path: string, routeOpts: RealtimeRouteOpts<C>): RealtimeConfig;
79
+ /** Cut `reason` to at most `max` UTF-8 bytes without splitting a code point. */
80
+ export declare function truncateUtf8(reason: string, max: number): string;
42
81
  //# sourceMappingURL=route.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../src/realtime/route.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,QAAQ,CAAC,SAAS,EAAE,IAAI,GAAG,KAAK,GAAG,UAAU,CAAA;IAC7C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACvC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;IAC5B,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;IAC9C,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAA;IAC/D,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAA;IAC3D,QAAQ,CAAC,SAAS,EAAE;QAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAA;KAAE,CAAA;CAC9G,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC/B,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC/E,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAChE,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IAClC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAA;IACrC,WAAW,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAA;IACrC,eAAe,EAAE,MAAM,CAAA;IACvB,IAAI,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACvC,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,SAAS,EAAE,IAAI,GAAG,KAAK,GAAG,UAAU,CAAA;IACpC,GAAG,EAAE;QACJ,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;QAC9C,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;QAChD,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;QACpC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;KAC3C,CAAA;IACD,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IAClC,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CAClC,GAAG,WAAW,CA+Dd"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../src/realtime/route.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import { validateOriginPolicy } from "../ws-origin.js";
2
+ const DEFAULT_LIMITS = {
3
+ maxBufferedBytes: 4 * 1024 * 1024,
4
+ maxFrameBytes: 1024 * 1024,
5
+ maxPendingFrames: 64,
6
+ maxTopics: 128,
7
+ slowConsumer: "close",
8
+ };
9
+ function positiveInt(name, value, fallback) {
10
+ if (value === undefined)
11
+ return fallback;
12
+ if (typeof value !== "number" || !Number.isSafeInteger(value) || value < 1) {
13
+ throw new TypeError(`realtime limits.${name} must be a positive integer, got ${String(value)}`);
14
+ }
15
+ return value;
16
+ }
17
+ /** Validate `app.realtime()` options. Options the shipped bus does not implement are rejected, not ignored. */
18
+ export function resolveRealtimeConfig(path, routeOpts) {
19
+ const opts = routeOpts;
20
+ if (typeof opts?.handler !== "function") {
21
+ throw new TypeError(`app.realtime("${path}"): handler must be a function`);
22
+ }
23
+ const legacy = opts;
24
+ if (legacy.reconnectBuffer !== undefined) {
25
+ throw new TypeError(`app.realtime("${path}"): reconnectBuffer is not supported. Realtime ships the WebSocket transport without resume; remove the option.`);
26
+ }
27
+ if (legacy.transports !== undefined) {
28
+ throw new TypeError(`app.realtime("${path}"): only the WebSocket transport ships; remove transports.`);
29
+ }
30
+ if (opts.namespace !== undefined && (typeof opts.namespace !== "string" || opts.namespace === "")) {
31
+ throw new TypeError(`app.realtime("${path}"): namespace must be a non-empty string`);
32
+ }
33
+ const l = opts.limits ?? {};
34
+ if (l.slowConsumer !== undefined && l.slowConsumer !== "close" && l.slowConsumer !== "drop") {
35
+ throw new TypeError(`realtime limits.slowConsumer must be "close" or "drop"`);
36
+ }
37
+ return {
38
+ allowedOrigins: opts.allowedOrigins === undefined ? null : validateOriginPolicy(opts.allowedOrigins),
39
+ handler: opts.handler,
40
+ identify: opts.identify ?? null,
41
+ limits: {
42
+ maxBufferedBytes: positiveInt("maxBufferedBytes", l.maxBufferedBytes, DEFAULT_LIMITS.maxBufferedBytes),
43
+ maxFrameBytes: positiveInt("maxFrameBytes", l.maxFrameBytes, DEFAULT_LIMITS.maxFrameBytes),
44
+ maxPendingFrames: positiveInt("maxPendingFrames", l.maxPendingFrames, DEFAULT_LIMITS.maxPendingFrames),
45
+ maxTopics: positiveInt("maxTopics", l.maxTopics, DEFAULT_LIMITS.maxTopics),
46
+ slowConsumer: l.slowConsumer ?? DEFAULT_LIMITS.slowConsumer,
47
+ },
48
+ namespace: opts.namespace ?? path,
49
+ namespaceExplicit: opts.namespace !== undefined,
50
+ onError: opts.onError ?? null,
51
+ path,
52
+ };
53
+ }
54
+ const encoder = new TextEncoder();
55
+ /** Cut `reason` to at most `max` UTF-8 bytes without splitting a code point. */
56
+ export function truncateUtf8(reason, max) {
57
+ if (reason.length * 3 <= max)
58
+ return reason;
59
+ if (encoder.encode(reason).byteLength <= max)
60
+ return reason;
61
+ let bytes = 0;
62
+ let out = "";
63
+ for (const ch of reason) {
64
+ const n = encoder.encode(ch).byteLength;
65
+ if (bytes + n > max)
66
+ break;
67
+ bytes += n;
68
+ out += ch;
69
+ }
70
+ return out;
71
+ }
72
+ //# sourceMappingURL=route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../src/realtime/route.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { WSContext, WSHandler } from "../ws/cloudflare.ts";
2
+ import type { RealtimeBus } from "./bus.ts";
3
+ import type { RealtimeConfig } from "./route.ts";
4
+ type Logger = {
5
+ error?: (obj: Record<string, unknown>, msg?: string) => void;
6
+ warn?: (obj: Record<string, unknown>, msg?: string) => void;
7
+ };
8
+ /** `ctx.realtime` — publish into a realtime namespace from any request. */
9
+ export type RealtimePublisher = {
10
+ /**
11
+ * Publish to `topic` in the app's only realtime namespace. Throws when the app has several
12
+ * namespaces; use `namespace(name).publish()` then.
13
+ */
14
+ publish(topic: string, data: unknown): void;
15
+ /** The publisher for one namespace (a route's `namespace` option, or its full path pattern). */
16
+ namespace(name: string): {
17
+ publish(topic: string, data: unknown): void;
18
+ };
19
+ };
20
+ /** The bus key of `topic` in namespace `ns`. Namespaces never see each other's topics. */
21
+ export declare function topicKey(ns: string, topic: string): string;
22
+ export declare function createRealtimePublisher(bus: RealtimeBus, namespaces: () => Iterable<string>): RealtimePublisher;
23
+ export type RealtimeSession = {
24
+ /** The handler to pass to the runtime's WebSocket adapter. */
25
+ handler: WSHandler<unknown>;
26
+ /** Attach the socket and start the connection (idempotent). Adapters that return an open socket from `upgrade()` call this right away; others get it from `onOpen`. */
27
+ attach(ws: WSContext<unknown>): void;
28
+ };
29
+ /**
30
+ * One realtime connection: binds the socket to the bus and runs the route's callbacks on one ordered
31
+ * queue — `handler`, then each inbound frame, then `close` — each awaited. Every callback is
32
+ * contained: a throw or rejection goes to the route's `onError` (or the app logger) and never escapes
33
+ * into the runtime, so it can neither crash the process nor poison the queue.
34
+ */
35
+ export declare function createRealtimeSession(opts: {
36
+ bus: RealtimeBus;
37
+ config: RealtimeConfig;
38
+ ctx: unknown;
39
+ log: Logger | undefined;
40
+ userId: string | null;
41
+ }): RealtimeSession;
42
+ export {};
43
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/realtime/server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAE/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAY3C,OAAO,KAAK,EAAe,cAAc,EAAE,MAAM,YAAY,CAAA;AAE7D,KAAK,MAAM,GAAG;IACb,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5D,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CAC3D,CAAA;AAED,2EAA2E;AAC3E,MAAM,MAAM,iBAAiB,GAAG;IAC/B;;;OAGG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;IAC3C,gGAAgG;IAChG,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;KAAE,CAAA;CACxE,CAAA;AAID,0FAA0F;AAC1F,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC,MAAM,CAAC,GAAG,iBAAiB,CAsB/G;AAED,MAAM,MAAM,eAAe,GAAG;IAC7B,8DAA8D;IAC9D,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,CAAA;IAC3B,uKAAuK;IACvK,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;CACpC,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC3C,GAAG,EAAE,WAAW,CAAA;IAChB,MAAM,EAAE,cAAc,CAAA;IACtB,GAAG,EAAE,OAAO,CAAA;IACZ,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB,GAAG,eAAe,CAsNlB"}
@@ -0,0 +1,255 @@
1
+ import { invokeUser } from "../invoke-user.js";
2
+ import { encodeRealtimeFrame } from "./bus.js";
3
+ import { bufferedAmountOf, CLOSE_INTERNAL, CLOSE_NORMAL, CLOSE_POLICY, CLOSE_TOO_BIG, CLOSE_TRY_AGAIN, exceedsPayload, MAX_CLOSE_REASON, } from "../ws/shared.js";
4
+ import { truncateUtf8 } from "./route.js";
5
+ const SEP = "\u0000";
6
+ /** The bus key of `topic` in namespace `ns`. Namespaces never see each other's topics. */
7
+ export function topicKey(ns, topic) {
8
+ return ns + SEP + topic;
9
+ }
10
+ export function createRealtimePublisher(bus, namespaces) {
11
+ const forNs = (ns) => ({
12
+ publish(topic, data) {
13
+ bus.publish(topicKey(ns, String(topic)), data);
14
+ },
15
+ });
16
+ return {
17
+ namespace(name) {
18
+ return forNs(String(name));
19
+ },
20
+ publish(topic, data) {
21
+ const all = new Set(namespaces());
22
+ if (all.size !== 1) {
23
+ throw new Error(all.size === 0
24
+ ? "ctx.realtime.publish: the app has no realtime routes"
25
+ : `ctx.realtime.publish: the app has ${all.size} realtime namespaces (${[...all].join(", ")}); use ctx.realtime.namespace(name).publish(topic, data)`);
26
+ }
27
+ forNs(all.values().next().value).publish(topic, data);
28
+ },
29
+ };
30
+ }
31
+ /**
32
+ * One realtime connection: binds the socket to the bus and runs the route's callbacks on one ordered
33
+ * queue — `handler`, then each inbound frame, then `close` — each awaited. Every callback is
34
+ * contained: a throw or rejection goes to the route's `onError` (or the app logger) and never escapes
35
+ * into the runtime, so it can neither crash the process nor poison the queue.
36
+ */
37
+ export function createRealtimeSession(opts) {
38
+ const { bus, config, ctx, log, userId } = opts;
39
+ const { limits, namespace } = config;
40
+ const connId = crypto.randomUUID();
41
+ const state = {};
42
+ let socket = null;
43
+ let closed = false;
44
+ let tornDown = false;
45
+ let closeRan = false;
46
+ let onMessageFn = null;
47
+ let onCloseFn = null;
48
+ /* ordered queue: open → messages → close. Every inbound frame waits in `inbox` in arrival
49
+ * order, including frames that beat the open or the `message` handler; a drain task delivers
50
+ * them, so a frame never overtakes one that arrived before it. */
51
+ let queue = Promise.resolve();
52
+ const inbox = [];
53
+ /* the same containment as WebSocket callbacks: onError gets the error, an onError that
54
+ * throws is logged and never invoked again for its own error, nothing reaches the runtime */
55
+ const invoke = (phase, fn) => invokeUser(fn, {
56
+ fields: { connId, namespace, route: config.path },
57
+ log,
58
+ onError: config.onError ? (err) => config.onError?.(err, conn) : null,
59
+ phase,
60
+ });
61
+ const enqueue = (task) => {
62
+ queue = queue.then(task).then(() => undefined, () => undefined);
63
+ };
64
+ /** Drop the connection from the bus. Runs exactly once, before any user close handler. */
65
+ const teardown = () => {
66
+ if (tornDown)
67
+ return;
68
+ tornDown = true;
69
+ closed = true;
70
+ bus.unsubscribeAll(connId);
71
+ bus.removeHandler(connId);
72
+ };
73
+ const closeSocket = (code, reason) => {
74
+ const ws = socket;
75
+ teardown();
76
+ if (ws === null)
77
+ return;
78
+ try {
79
+ ws.close(code, truncateUtf8(reason, MAX_CLOSE_REASON));
80
+ }
81
+ catch (e) {
82
+ log?.warn?.({ connId, err: e }, "realtime close failed");
83
+ }
84
+ };
85
+ const sendFrame = (frame) => {
86
+ const ws = socket;
87
+ if (closed || ws === null)
88
+ return;
89
+ if (bufferedAmountOf(ws.raw) > limits.maxBufferedBytes) {
90
+ if (limits.slowConsumer === "drop")
91
+ return;
92
+ closeSocket(CLOSE_TRY_AGAIN, "slow consumer");
93
+ return;
94
+ }
95
+ try {
96
+ ws.send(frame);
97
+ }
98
+ catch (e) {
99
+ /* the socket went away between the readyState check and the write */
100
+ log?.warn?.({ connId, err: e }, "realtime send failed");
101
+ }
102
+ };
103
+ /* frames that arrived before the close still run; the close handler is queued after them.
104
+ * Without a handler the frames stay in the inbox until one is attached, or are dropped on close. */
105
+ const drain = async () => {
106
+ while (inbox.length > 0) {
107
+ const fn = onMessageFn;
108
+ if (fn === null) {
109
+ if (closed)
110
+ inbox.length = 0;
111
+ return;
112
+ }
113
+ const payload = inbox.shift();
114
+ await invoke("message", () => fn(payload));
115
+ }
116
+ };
117
+ const accept = (payload) => {
118
+ if (inbox.length >= limits.maxPendingFrames) {
119
+ closeSocket(CLOSE_POLICY, "too many pending frames");
120
+ return;
121
+ }
122
+ inbox.push(payload);
123
+ enqueue(drain);
124
+ };
125
+ const conn = Object.create(null);
126
+ Object.defineProperties(conn, {
127
+ close: {
128
+ enumerable: true,
129
+ value(reason) {
130
+ if (closed)
131
+ return;
132
+ closeSocket(CLOSE_NORMAL, reason === undefined ? "" : String(reason));
133
+ },
134
+ },
135
+ closed: { enumerable: true, get: () => closed },
136
+ id: { enumerable: true, value: connId },
137
+ join: {
138
+ enumerable: true,
139
+ value(topic) {
140
+ if (closed)
141
+ return;
142
+ const key = topicKey(namespace, String(topic));
143
+ if (bus.topicCount(connId) >= limits.maxTopics && !bus.isSubscribed(connId, key)) {
144
+ throw new RangeError(`realtime: a connection may join at most ${limits.maxTopics} topics`);
145
+ }
146
+ bus.subscribe(connId, key);
147
+ },
148
+ },
149
+ leave: {
150
+ enumerable: true,
151
+ value(topic) {
152
+ if (closed)
153
+ return;
154
+ bus.unsubscribe(connId, topicKey(namespace, String(topic)));
155
+ },
156
+ },
157
+ on: {
158
+ enumerable: true,
159
+ value(event, fn) {
160
+ if (typeof fn !== "function")
161
+ throw new TypeError("conn.on: handler must be a function");
162
+ if (event === "message") {
163
+ onMessageFn = fn;
164
+ /* frames that waited for a handler run next, in arrival order */
165
+ if (inbox.length > 0)
166
+ enqueue(drain);
167
+ }
168
+ else if (event === "close") {
169
+ onCloseFn = fn;
170
+ }
171
+ else {
172
+ throw new TypeError(`conn.on: unknown event "${String(event)}"`);
173
+ }
174
+ },
175
+ },
176
+ /* publishing after close is allowed: a close handler announcing a departure is the common case */
177
+ publish: {
178
+ enumerable: true,
179
+ value(topic, payload) {
180
+ bus.publish(topicKey(namespace, String(topic)), payload);
181
+ },
182
+ },
183
+ send: {
184
+ enumerable: true,
185
+ value(payload) {
186
+ const frame = encodeRealtimeFrame(payload);
187
+ sendFrame(frame);
188
+ },
189
+ },
190
+ state: { enumerable: true, get: () => state },
191
+ transport: { enumerable: true, value: "ws" },
192
+ userId: { enumerable: true, value: userId },
193
+ });
194
+ const attach = (ws) => {
195
+ if (socket !== null || tornDown)
196
+ return;
197
+ socket = ws;
198
+ bus.onMessage(connId, sendFrame);
199
+ enqueue(async () => {
200
+ const ok = await invoke("handler", () => config.handler(ctx, conn));
201
+ if (!ok)
202
+ closeSocket(CLOSE_INTERNAL, "internal error");
203
+ });
204
+ };
205
+ const onSocketClose = (reason) => {
206
+ teardown();
207
+ if (closeRan)
208
+ return;
209
+ closeRan = true;
210
+ enqueue(() => {
211
+ const fn = onCloseFn;
212
+ return fn === null ? Promise.resolve() : invoke("close", () => fn(reason));
213
+ });
214
+ };
215
+ const handler = {
216
+ onClose: (_ctx, _ws, _code, reason) => {
217
+ onSocketClose(reason || "normal");
218
+ },
219
+ onError: (_ctx, _ws, error) => {
220
+ log?.warn?.({ connId, err: error }, "realtime socket error");
221
+ },
222
+ onMessage: (_ctx, _ws, data) => {
223
+ if (closed)
224
+ return;
225
+ /* the wire format is JSON text; binary frames are not part of it */
226
+ if (typeof data !== "string")
227
+ return;
228
+ if (exceedsPayload(data, limits.maxFrameBytes)) {
229
+ closeSocket(CLOSE_TOO_BIG, "frame too large");
230
+ return;
231
+ }
232
+ let payload;
233
+ try {
234
+ payload = JSON.parse(data);
235
+ }
236
+ catch {
237
+ /* not JSON: not a frame of this protocol */
238
+ return;
239
+ }
240
+ if (socket === null) {
241
+ /* a frame before open (runtime quirk): it waits in the inbox, ahead of later frames */
242
+ if (inbox.length >= limits.maxPendingFrames)
243
+ return;
244
+ inbox.push(payload);
245
+ return;
246
+ }
247
+ accept(payload);
248
+ },
249
+ onOpen: (_ctx, ws) => {
250
+ attach(ws);
251
+ },
252
+ };
253
+ return { attach, handler };
254
+ }
255
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/realtime/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAE9C,OAAO,EACN,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,eAAe,EACf,cAAc,EACd,gBAAgB,GAChB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAmBzC,MAAM,GAAG,GAAG,QAAQ,CAAA;AAEpB,0FAA0F;AAC1F,MAAM,UAAU,QAAQ,CAAC,EAAU,EAAE,KAAa;IACjD,OAAO,EAAE,GAAG,GAAG,GAAG,KAAK,CAAA;AACxB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAgB,EAAE,UAAkC;IAC3F,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,CAAC;QAC9B,OAAO,CAAC,KAAa,EAAE,IAAa;YACnC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QAC/C,CAAC;KACD,CAAC,CAAA;IACF,OAAO;QACN,SAAS,CAAC,IAAY;YACrB,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;QAC3B,CAAC;QACD,OAAO,CAAC,KAAa,EAAE,IAAa;YACnC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAA;YACjC,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CACd,GAAG,CAAC,IAAI,KAAK,CAAC;oBACb,CAAC,CAAC,sDAAsD;oBACxD,CAAC,CAAC,qCAAqC,GAAG,CAAC,IAAI,yBAAyB,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,0DAA0D,CACtJ,CAAA;YACF,CAAC;YACD,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAe,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QAChE,CAAC;KACD,CAAA;AACF,CAAC;AASD;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAMrC;IACA,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAC9C,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAA;IACpC,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE,CAAA;IAClC,MAAM,KAAK,GAA4B,EAAE,CAAA;IAEzC,IAAI,MAAM,GAA8B,IAAI,CAAA;IAC5C,IAAI,MAAM,GAAG,KAAK,CAAA;IAClB,IAAI,QAAQ,GAAG,KAAK,CAAA;IACpB,IAAI,QAAQ,GAAG,KAAK,CAAA;IACpB,IAAI,WAAW,GAAwD,IAAI,CAAA;IAC3E,IAAI,SAAS,GAAsD,IAAI,CAAA;IAEvE;;sEAEkE;IAClE,IAAI,KAAK,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAA;IAC5C,MAAM,KAAK,GAAc,EAAE,CAAA;IAE3B;iGAC6F;IAC7F,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,EAA8B,EAAoB,EAAE,CAClF,UAAU,CAAC,EAAE,EAAE;QACd,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE;QACjD,GAAG;QACH,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;QACrE,KAAK;KACL,CAAC,CAAA;IAEH,MAAM,OAAO,GAAG,CAAC,IAA4B,EAAE,EAAE;QAChD,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAC5B,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CACf,CAAA;IACF,CAAC,CAAA;IAED,0FAA0F;IAC1F,MAAM,QAAQ,GAAG,GAAG,EAAE;QACrB,IAAI,QAAQ;YAAE,OAAM;QACpB,QAAQ,GAAG,IAAI,CAAA;QACf,MAAM,GAAG,IAAI,CAAA;QACb,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;QAC1B,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;IAC1B,CAAC,CAAA;IAED,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,MAAc,EAAE,EAAE;QACpD,MAAM,EAAE,GAAG,MAAM,CAAA;QACjB,QAAQ,EAAE,CAAA;QACV,IAAI,EAAE,KAAK,IAAI;YAAE,OAAM;QACvB,IAAI,CAAC;YACJ,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAA;QACvD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,uBAAuB,CAAC,CAAA;QACzD,CAAC;IACF,CAAC,CAAA;IAED,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,EAAE;QACnC,MAAM,EAAE,GAAG,MAAM,CAAA;QACjB,IAAI,MAAM,IAAI,EAAE,KAAK,IAAI;YAAE,OAAM;QACjC,IAAI,gBAAgB,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,gBAAgB,EAAE,CAAC;YACxD,IAAI,MAAM,CAAC,YAAY,KAAK,MAAM;gBAAE,OAAM;YAC1C,WAAW,CAAC,eAAe,EAAE,eAAe,CAAC,CAAA;YAC7C,OAAM;QACP,CAAC;QACD,IAAI,CAAC;YACJ,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACf,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,qEAAqE;YACrE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,sBAAsB,CAAC,CAAA;QACxD,CAAC;IACF,CAAC,CAAA;IAED;wGACoG;IACpG,MAAM,KAAK,GAAG,KAAK,IAAmB,EAAE;QACvC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,EAAE,GAAG,WAAW,CAAA;YACtB,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;gBACjB,IAAI,MAAM;oBAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAA;gBAC5B,OAAM;YACP,CAAC;YACD,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAA;YAC7B,MAAM,MAAM,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;QAC3C,CAAC;IACF,CAAC,CAAA;IAED,MAAM,MAAM,GAAG,CAAC,OAAgB,EAAE,EAAE;QACnC,IAAI,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAC7C,WAAW,CAAC,YAAY,EAAE,yBAAyB,CAAC,CAAA;YACpD,OAAM;QACP,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACnB,OAAO,CAAC,KAAK,CAAC,CAAA;IACf,CAAC,CAAA;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAgB,CAAA;IAC/C,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE;QAC7B,KAAK,EAAE;YACN,UAAU,EAAE,IAAI;YAChB,KAAK,CAAC,MAAe;gBACpB,IAAI,MAAM;oBAAE,OAAM;gBAClB,WAAW,CAAC,YAAY,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;YACtE,CAAC;SACD;QACD,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE;QAC/C,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;QACvC,IAAI,EAAE;YACL,UAAU,EAAE,IAAI;YAChB,KAAK,CAAC,KAAa;gBAClB,IAAI,MAAM;oBAAE,OAAM;gBAClB,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;gBAC9C,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,SAAS,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;oBAClF,MAAM,IAAI,UAAU,CAAC,2CAA2C,MAAM,CAAC,SAAS,SAAS,CAAC,CAAA;gBAC3F,CAAC;gBACD,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;YAC3B,CAAC;SACD;QACD,KAAK,EAAE;YACN,UAAU,EAAE,IAAI;YAChB,KAAK,CAAC,KAAa;gBAClB,IAAI,MAAM;oBAAE,OAAM;gBAClB,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YAC5D,CAAC;SACD;QACD,EAAE,EAAE;YACH,UAAU,EAAE,IAAI;YAChB,KAAK,CAAC,KAA0B,EAAE,EAAwC;gBACzE,IAAI,OAAO,EAAE,KAAK,UAAU;oBAAE,MAAM,IAAI,SAAS,CAAC,qCAAqC,CAAC,CAAA;gBACxF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACzB,WAAW,GAAG,EAAgD,CAAA;oBAC9D,iEAAiE;oBACjE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;wBAAE,OAAO,CAAC,KAAK,CAAC,CAAA;gBACrC,CAAC;qBAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;oBAC9B,SAAS,GAAG,EAA8C,CAAA;gBAC3D,CAAC;qBAAM,CAAC;oBACP,MAAM,IAAI,SAAS,CAAC,2BAA2B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;gBACjE,CAAC;YACF,CAAC;SACD;QACD,kGAAkG;QAClG,OAAO,EAAE;YACR,UAAU,EAAE,IAAI;YAChB,KAAK,CAAC,KAAa,EAAE,OAAgB;gBACpC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;YACzD,CAAC;SACD;QACD,IAAI,EAAE;YACL,UAAU,EAAE,IAAI;YAChB,KAAK,CAAC,OAAgB;gBACrB,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;gBAC1C,SAAS,CAAC,KAAK,CAAC,CAAA;YACjB,CAAC;SACD;QACD,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE;QAC7C,SAAS,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;QAC5C,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;KAC3C,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,CAAC,EAAsB,EAAE,EAAE;QACzC,IAAI,MAAM,KAAK,IAAI,IAAI,QAAQ;YAAE,OAAM;QACvC,MAAM,GAAG,EAAE,CAAA;QACX,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;QAChC,OAAO,CAAC,KAAK,IAAI,EAAE;YAClB,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAA;YACnE,IAAI,CAAC,EAAE;gBAAE,WAAW,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAA;QACvD,CAAC,CAAC,CAAA;IACH,CAAC,CAAA;IAED,MAAM,aAAa,GAAG,CAAC,MAAc,EAAE,EAAE;QACxC,QAAQ,EAAE,CAAA;QACV,IAAI,QAAQ;YAAE,OAAM;QACpB,QAAQ,GAAG,IAAI,CAAA;QACf,OAAO,CAAC,GAAG,EAAE;YACZ,MAAM,EAAE,GAAG,SAAS,CAAA;YACpB,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;QAC3E,CAAC,CAAC,CAAA;IACH,CAAC,CAAA;IAED,MAAM,OAAO,GAAuB;QACnC,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACrC,aAAa,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAA;QAClC,CAAC;QACD,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;YAC7B,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,uBAAuB,CAAC,CAAA;QAC7D,CAAC;QACD,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YAC9B,IAAI,MAAM;gBAAE,OAAM;YAClB,oEAAoE;YACpE,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,OAAM;YACpC,IAAI,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;gBAChD,WAAW,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAA;gBAC7C,OAAM;YACP,CAAC;YACD,IAAI,OAAgB,CAAA;YACpB,IAAI,CAAC;gBACJ,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAC3B,CAAC;YAAC,MAAM,CAAC;gBACR,4CAA4C;gBAC5C,OAAM;YACP,CAAC;YACD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACrB,uFAAuF;gBACvF,IAAI,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,gBAAgB;oBAAE,OAAM;gBACnD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBACnB,OAAM;YACP,CAAC;YACD,MAAM,CAAC,OAAO,CAAC,CAAA;QAChB,CAAC;QACD,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE;YACpB,MAAM,CAAC,EAAE,CAAC,CAAA;QACX,CAAC;KACD,CAAA;IAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;AAC3B,CAAC"}
@@ -2,6 +2,13 @@ import type { MiddlewareFn } from "./middleware.ts";
2
2
  type RequestIdOptions = {
3
3
  generator?: () => string;
4
4
  header?: string;
5
+ /**
6
+ * Decides whether an inbound id is reused. Default: 1–128 characters of
7
+ * `A-Z a-z 0-9 . _ : + / = -` (UUIDs, ULIDs, base64, W3C trace ids).
8
+ * Anything else is replaced with a generated id, so a client cannot put
9
+ * arbitrary text into logs or response headers.
10
+ */
11
+ validate?: (id: string) => boolean;
5
12
  };
6
13
  export declare function requestId(options?: RequestIdOptions): MiddlewareFn<{
7
14
  req: Request;
@@ -1 +1 @@
1
- {"version":3,"file":"request-id.d.ts","sourceRoot":"","sources":["../src/request-id.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAEnD,KAAK,gBAAgB,GAAG;IACvB,SAAS,CAAC,EAAE,MAAM,MAAM,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,wBAAgB,SAAS,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,YAAY,CAAC;IAAE,GAAG,EAAE,OAAO,CAAA;CAAE,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAa3G"}
1
+ {"version":3,"file":"request-id.d.ts","sourceRoot":"","sources":["../src/request-id.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAGnD,KAAK,gBAAgB,GAAG;IACvB,SAAS,CAAC,EAAE,MAAM,MAAM,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAA;CAClC,CAAA;AAID,wBAAgB,SAAS,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,YAAY,CAAC;IAAE,GAAG,EAAE,OAAO,CAAA;CAAE,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAa3G"}
@@ -0,0 +1,16 @@
1
+ import { namedMiddleware } from "./middleware.js";
2
+ import { withHeaders } from "./with-headers.js";
3
+ const SAFE_ID_RE = /^[\w.:+/=-]{1,128}$/;
4
+ export function requestId(options) {
5
+ const headerName = options?.header ?? "x-request-id";
6
+ const generate = options?.generator ?? (() => crypto.randomUUID());
7
+ const validate = options?.validate ?? ((id) => SAFE_ID_RE.test(id));
8
+ const mw = async (ctx, next) => {
9
+ const existing = ctx.req.headers.get(headerName);
10
+ const id = existing !== null && validate(existing) ? existing : generate();
11
+ const response = await next({ requestId: id });
12
+ return withHeaders(response, (headers) => headers.set(headerName, id));
13
+ };
14
+ return namedMiddleware("requestId", mw);
15
+ }
16
+ //# sourceMappingURL=request-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-id.js","sourceRoot":"","sources":["../src/request-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAc/C,MAAM,UAAU,GAAG,qBAAqB,CAAA;AAExC,MAAM,UAAU,SAAS,CAAC,OAA0B;IACnD,MAAM,UAAU,GAAG,OAAO,EAAE,MAAM,IAAI,cAAc,CAAA;IACpD,MAAM,QAAQ,GAAG,OAAO,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAA;IAClE,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;IAE3E,MAAM,EAAE,GAA0D,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACrF,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QAChD,MAAM,EAAE,GAAG,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC1E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAA;QAC9C,OAAO,WAAW,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAA;IACvE,CAAC,CAAA;IAED,OAAO,eAAe,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;AACxC,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Bun's default request body cap; honey's Node adapter applies the same one. */
2
+ export declare const DEFAULT_MAX_REQUEST_BODY: number;
3
+ //# sourceMappingURL=request-limits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-limits.d.ts","sourceRoot":"","sources":["../src/request-limits.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,eAAO,MAAM,wBAAwB,QAAoB,CAAA"}
@@ -0,0 +1,3 @@
1
+ /** Bun's default request body cap; honey's Node adapter applies the same one. */
2
+ export const DEFAULT_MAX_REQUEST_BODY = 128 * 1024 * 1024;
3
+ //# sourceMappingURL=request-limits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-limits.js","sourceRoot":"","sources":["../src/request-limits.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAA"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * The request path the router, scopes, `ctx.path`, `proxy()` and `staticFiles()` all see.
3
+ *
4
+ * Policy, applied the same way on every runtime:
5
+ * - empty segments collapse: `//admin///users` is `/admin/users`
6
+ * - dot segments resolve: `.` is dropped and `..` removes the segment before it, never past
7
+ * the root; `%2e` counts as a dot, as it does for WHATWG URL parsing
8
+ * - a trailing slash is kept (the router and `trailingSlash()` decide what it means)
9
+ * - a backslash is a `/`, and characters a URL path cannot hold raw (space, controls, `"`, `<`,
10
+ * `>`, `` ` ``, `{`, `}`, non-ASCII) are percent-encoded as UTF-8 — what WHATWG URL parsing
11
+ * does, so a runtime that hands the app the raw target (Deno) and one that parses it first
12
+ * (Bun, Node) route the same bytes the same way
13
+ * - an encoded `/` or `\` (`%2F`, `%5C`) is rejected unless `encodedSlashes` is `"allow"`: a
14
+ * segment that decodes to a path separator means one thing to this router and another to
15
+ * whatever the path is forwarded to (a proxy upstream, a file system). Allowed, it stays
16
+ * encoded in the path and decodes into a param value.
17
+ * - everything else stays percent-encoded; params are decoded when they are extracted
18
+ *
19
+ * Returns `null` for a rejected path; the app answers 400.
20
+ */
21
+ export declare function normalizePath(raw: string, encodedSlashes?: "allow" | "reject"): string | null;
22
+ /**
23
+ * One path segment as a normalized request path holds it: characters a URL path cannot hold
24
+ * raw become UTF-8 percent escapes, everything else (existing escapes included) is kept.
25
+ * Route patterns encode their static segments with this too, so `app.get("/é")` matches the
26
+ * `/%C3%A9` every runtime hands the app.
27
+ */
28
+ export declare function encodeSegment(seg: string): string;
29
+ /** The path of a request URL without `new URL()`: everything from the first `/` after the authority, up to `?` or `#`. */
30
+ export declare function pathOfUrl(rawUrl: string): string;
31
+ /** `?query` of a request URL (with the `?`), or `""`. Never includes a fragment. */
32
+ export declare function searchOfUrl(rawUrl: string): string;
33
+ //# sourceMappingURL=request-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-path.d.ts","sourceRoot":"","sources":["../src/request-path.ts"],"names":[],"mappings":"AAaA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,GAAE,OAAO,GAAG,QAAmB,GAAG,MAAM,GAAG,IAAI,CAgDvG;AAqBD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAwBjD;AAWD,0HAA0H;AAC1H,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAShD;AAED,oFAAoF;AACpF,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQlD"}