@lovrozagar/honey 0.6.8 → 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 +408 -148
  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 +1887 -1756
  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 +253 -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
@@ -1,148 +0,0 @@
1
- import type { ServerFrame } from "./protocol.ts"
2
-
3
- function isRecord(value: unknown): value is Record<string, unknown> {
4
- return typeof value === "object" && value !== null && !Array.isArray(value)
5
- }
6
-
7
- interface LongPollBus {
8
- subscribe(token: string, cb: (frame: ServerFrame) => void): () => void
9
- deliverMessage(token: string, payload: unknown): boolean
10
- }
11
-
12
- interface LongPollBuffer {
13
- replay(token: string, lastId: number): Array<{ id: number; data: unknown }> | null
14
- }
15
-
16
- export type LongPollHandlerOpts = {
17
- bus: LongPollBus
18
- buffer: LongPollBuffer
19
- defaultWait?: number
20
- maxWait?: number
21
- }
22
-
23
- const DEFAULT_WAIT_S = 25
24
- const MAX_WAIT_S = 30
25
-
26
- const JSON_HEADERS = { "Content-Type": "application/json" }
27
-
28
- function jsonResponse(body: unknown, status = 200): Response {
29
- return new Response(JSON.stringify(body), { headers: JSON_HEADERS, status })
30
- }
31
-
32
- function parseWait(raw: string | null, defaultWait: number, maxWait: number): number {
33
- if (raw === null) return defaultWait
34
-
35
- const parsed = Number(raw)
36
- if (!Number.isFinite(parsed)) return defaultWait
37
- if (parsed < 0) return 0
38
- return Math.min(parsed, maxWait)
39
- }
40
-
41
- export function createLongPollHandler(opts: LongPollHandlerOpts): {
42
- poll(req: Request): Promise<Response>
43
- send(req: Request): Promise<Response>
44
- } {
45
- const defaultWait = opts.defaultWait ?? DEFAULT_WAIT_S
46
- const maxWait = opts.maxWait ?? MAX_WAIT_S
47
-
48
- function poll(req: Request): Promise<Response> {
49
- const url = new URL(req.url)
50
- const token = url.searchParams.get("reconnectToken")
51
-
52
- if (!token) {
53
- return Promise.resolve(jsonResponse({ error: "missing reconnectToken" }, 400))
54
- }
55
-
56
- const lastId = Number(url.searchParams.get("lastId") ?? "0") || 0
57
- const wait = parseWait(url.searchParams.get("wait"), defaultWait, maxWait)
58
-
59
- const entries = opts.buffer.replay(token, lastId)
60
-
61
- if (entries === null) {
62
- return Promise.resolve(jsonResponse([{ reason: "server_restart", t: "bye" }], 404))
63
- }
64
-
65
- if (entries.length > 0) {
66
- const frames: ServerFrame[] = entries.map((e) => ({
67
- data: e.data,
68
- id: e.id,
69
- t: "msg" as const,
70
- }))
71
- return Promise.resolve(jsonResponse(frames))
72
- }
73
-
74
- if (wait === 0) {
75
- return Promise.resolve(jsonResponse([]))
76
- }
77
-
78
- return new Promise<Response>((resolve) => {
79
- let settled = false
80
-
81
- function settle(body: ServerFrame[]): void {
82
- if (settled) return
83
- settled = true
84
- cleanup()
85
- resolve(jsonResponse(body))
86
- }
87
-
88
- const unsubscribe = opts.bus.subscribe(token, (frame) => {
89
- settle([frame])
90
- })
91
-
92
- const timer = setTimeout(() => {
93
- settle([])
94
- }, wait * 1000)
95
-
96
- function cleanup(): void {
97
- unsubscribe()
98
- clearTimeout(timer)
99
- req.signal.removeEventListener("abort", onAbort)
100
- }
101
-
102
- function onAbort(): void {
103
- settle([])
104
- }
105
-
106
- if (req.signal.aborted) {
107
- settle([])
108
- return
109
- }
110
- req.signal.addEventListener("abort", onAbort)
111
- })
112
- }
113
-
114
- async function send(req: Request): Promise<Response> {
115
- let parsed: unknown
116
- try {
117
- const text = await req.text()
118
- if (!text) return jsonResponse({ error: "empty body" }, 400)
119
- parsed = JSON.parse(text)
120
- } catch {
121
- return jsonResponse({ error: "invalid JSON" }, 400)
122
- }
123
-
124
- if (!isRecord(parsed)) {
125
- return jsonResponse({ error: "invalid body" }, 400)
126
- }
127
-
128
- const body = parsed
129
-
130
- const token = body.reconnectToken
131
- if (typeof token !== "string") {
132
- return jsonResponse({ error: "missing reconnectToken" }, 400)
133
- }
134
-
135
- if (!("data" in body)) {
136
- return jsonResponse({ error: "missing data" }, 400)
137
- }
138
-
139
- const delivered = opts.bus.deliverMessage(token, body.data)
140
- if (!delivered) {
141
- return jsonResponse({ error: "unknown token" }, 404)
142
- }
143
-
144
- return jsonResponse({ ok: true })
145
- }
146
-
147
- return { poll, send }
148
- }
@@ -1,128 +0,0 @@
1
- export type ServerFrame =
2
- | { data: unknown; id: number; t: "msg" }
3
- | { t: "pong" }
4
- | { reason: string; t: "bye" }
5
- | { reconnectToken: string; t: "ready" }
6
-
7
- export type ClientFrame =
8
- | { t: "ping" }
9
- | { data: unknown; t: "msg" }
10
- | { lastId: number; reconnectToken: string; t: "resume" }
11
-
12
- export type ProtocolBuffer = {
13
- push(frame: { data: unknown; id: number; t: "msg" }): void
14
- getAfter(lastId: number): Array<{ data: unknown; id: number; t: "msg" }>
15
- }
16
-
17
- export type Protocol = {
18
- handleClientFrame(raw: string): ServerFrame | null
19
- handleConnect(): ServerFrame
20
- handleResume(lastId: number, reconnectToken: string): ServerFrame[]
21
- readonly lastId: number
22
- readonly reconnectToken: string
23
- sendBye(reason: string): ServerFrame
24
- sendMessage(data: unknown): ServerFrame
25
- }
26
-
27
- export function encodeServerFrame(frame: ServerFrame): string {
28
- return JSON.stringify(frame)
29
- }
30
-
31
- function isRecord(value: unknown): value is Record<string, unknown> {
32
- return typeof value === "object" && value !== null && !Array.isArray(value)
33
- }
34
-
35
- export function decodeClientFrame(raw: string): ClientFrame | null {
36
- let parsed: unknown
37
- try {
38
- parsed = JSON.parse(raw)
39
- } catch {
40
- return null
41
- }
42
-
43
- if (!isRecord(parsed)) {
44
- return null
45
- }
46
-
47
- const obj = parsed
48
-
49
- if (obj.t === "ping") {
50
- return { t: "ping" }
51
- }
52
-
53
- if (obj.t === "msg") {
54
- if (!("data" in obj)) return null
55
- return { data: obj.data, t: "msg" }
56
- }
57
-
58
- if (obj.t === "resume") {
59
- if (
60
- typeof obj.lastId !== "number" ||
61
- obj.lastId < 0 ||
62
- !Number.isInteger(obj.lastId) ||
63
- typeof obj.reconnectToken !== "string"
64
- ) {
65
- return null
66
- }
67
- return { lastId: obj.lastId, reconnectToken: obj.reconnectToken, t: "resume" }
68
- }
69
-
70
- return null
71
- }
72
-
73
- export function createProtocol(opts?: { reconnectBuffer?: ProtocolBuffer }): Protocol {
74
- const token = crypto.randomUUID()
75
- const buffer = opts?.reconnectBuffer ?? null
76
- let idCounter = 0
77
-
78
- function handleConnect(): ServerFrame {
79
- return { reconnectToken: token, t: "ready" }
80
- }
81
-
82
- function handleResume(lastId: number, reconnectToken: string): ServerFrame[] {
83
- if (reconnectToken !== token || !buffer) {
84
- return [{ reason: "server_restart", t: "bye" }]
85
- }
86
-
87
- const missed = buffer.getAfter(lastId)
88
- return [...missed, { reconnectToken: token, t: "ready" }]
89
- }
90
-
91
- function handleClientFrame(raw: string): ServerFrame | null {
92
- const frame = decodeClientFrame(raw)
93
- if (!frame) return null
94
-
95
- if (frame.t === "ping") {
96
- return { t: "pong" }
97
- }
98
-
99
- return null
100
- }
101
-
102
- function sendMessage(data: unknown): ServerFrame {
103
- idCounter++
104
- const frame: ServerFrame = { data, id: idCounter, t: "msg" }
105
- if (buffer) {
106
- buffer.push({ data, id: idCounter, t: "msg" })
107
- }
108
- return frame
109
- }
110
-
111
- function sendBye(reason: string): ServerFrame {
112
- return { reason, t: "bye" }
113
- }
114
-
115
- return {
116
- handleClientFrame,
117
- handleConnect,
118
- handleResume,
119
- get lastId() {
120
- return idCounter
121
- },
122
- get reconnectToken() {
123
- return token
124
- },
125
- sendBye,
126
- sendMessage,
127
- }
128
- }
@@ -1,427 +0,0 @@
1
- import type { ServerFrame } from "./protocol.ts"
2
-
3
- /* ------------------------------------------------------------------ */
4
- /* Error hierarchy */
5
- /* ------------------------------------------------------------------ */
6
-
7
- export class RealtimeError extends Error {
8
- readonly reason: string
9
-
10
- constructor(message: string, reason: string) {
11
- super(message)
12
- this.reason = reason
13
- this.name = "RealtimeError"
14
- }
15
- }
16
-
17
- export class RealtimeConnectError extends RealtimeError {
18
- constructor(message: string, reason: string) {
19
- super(message, reason)
20
- this.name = "RealtimeConnectError"
21
- }
22
- }
23
-
24
- export class RealtimeAuthError extends RealtimeError {
25
- constructor(message: string, reason: string) {
26
- super(message, reason)
27
- this.name = "RealtimeAuthError"
28
- }
29
- }
30
-
31
- export class RealtimeKickedError extends RealtimeError {
32
- constructor(message: string, reason: string) {
33
- super(message, reason)
34
- this.name = "RealtimeKickedError"
35
- }
36
- }
37
-
38
- export class RealtimeAbortError extends RealtimeError {
39
- constructor(message: string, reason: string) {
40
- super(message, reason)
41
- this.name = "RealtimeAbortError"
42
- }
43
- }
44
-
45
- /* ------------------------------------------------------------------ */
46
- /* Types */
47
- /* ------------------------------------------------------------------ */
48
-
49
- export type Transport = "ws" | "sse" | "longpoll"
50
- export type ConnectionState = "idle" | "connecting" | "connected" | "draining" | "reconnecting" | "closed"
51
-
52
- export type TransportAdapter = {
53
- connect(url: string, opts: TransportOpts): TransportConnection
54
- }
55
-
56
- export type TransportConnection = {
57
- send(data: string): void
58
- close(): void
59
- onFrame: (frame: ServerFrame) => void
60
- onClose: (reason: string) => void
61
- onError: (err: unknown) => void
62
- }
63
-
64
- export type TransportOpts = {
65
- signal?: AbortSignal
66
- headers?: Record<string, string>
67
- lastId?: number
68
- reconnectToken?: string
69
- }
70
-
71
- /* ------------------------------------------------------------------ */
72
- /* KeepaliveLoop */
73
- /* ------------------------------------------------------------------ */
74
-
75
- export function createKeepaliveLoop(opts: {
76
- transport: Transport
77
- sendPing: () => void
78
- onDead: () => void
79
- interval?: number
80
- timeout?: number
81
- }): { start(): void; stop(): void; onPong(): void; onFrame(): void } {
82
- const interval = opts.interval ?? 25_000
83
- const timeout = opts.timeout ?? 60_000
84
- const transport = opts.transport
85
-
86
- let pingTimer: ReturnType<typeof setInterval> | null = null
87
- let deadTimer: ReturnType<typeof setTimeout> | null = null
88
-
89
- function clearAll(): void {
90
- if (pingTimer !== null) {
91
- clearInterval(pingTimer)
92
- pingTimer = null
93
- }
94
- if (deadTimer !== null) {
95
- clearTimeout(deadTimer)
96
- deadTimer = null
97
- }
98
- }
99
-
100
- function resetDeadTimer(): void {
101
- if (deadTimer !== null) {
102
- clearTimeout(deadTimer)
103
- }
104
- deadTimer = setTimeout(() => {
105
- opts.onDead()
106
- }, timeout)
107
- }
108
-
109
- function start(): void {
110
- /* Idempotent — stop first to avoid stacking timers */
111
- clearAll()
112
-
113
- if (transport === "longpoll") return
114
-
115
- if (transport === "ws") {
116
- pingTimer = setInterval(() => {
117
- opts.sendPing()
118
- }, interval)
119
- resetDeadTimer()
120
- return
121
- }
122
-
123
- if (transport === "sse") {
124
- /* SSE: no pings, just idle timer based on frames from server */
125
- resetDeadTimer()
126
- }
127
- }
128
-
129
- function stop(): void {
130
- clearAll()
131
- }
132
-
133
- function onPong(): void {
134
- /* Only meaningful for WS — reset the dead timer */
135
- if (deadTimer !== null) {
136
- resetDeadTimer()
137
- }
138
- }
139
-
140
- function onFrame(): void {
141
- /* Meaningful for SSE — reset idle timer on any frame */
142
- if (transport === "sse" && deadTimer !== null) {
143
- resetDeadTimer()
144
- }
145
- }
146
-
147
- return { onFrame, onPong, start, stop }
148
- }
149
-
150
- /* ------------------------------------------------------------------ */
151
- /* FallbackChain */
152
- /* ------------------------------------------------------------------ */
153
-
154
- const DEFAULT_FALLBACK_TIMEOUT = 3000
155
-
156
- export function createFallbackChain(opts: { transports: TransportAdapter[]; timeout?: number }): {
157
- connect(url: string, transportOpts: TransportOpts): Promise<{ conn: TransportConnection; transport: Transport }>
158
- readonly provenTransport: Transport | null
159
- } {
160
- const timeout = opts.timeout ?? DEFAULT_FALLBACK_TIMEOUT
161
- let proven: Transport | null = null
162
-
163
- function tryTransport(
164
- adapter: TransportAdapter,
165
- url: string,
166
- transportOpts: TransportOpts,
167
- ): Promise<TransportConnection> {
168
- return new Promise((resolve, reject) => {
169
- const conn = adapter.connect(url, transportOpts)
170
-
171
- const timer = setTimeout(() => {
172
- conn.close()
173
- reject(new Error("timeout"))
174
- }, timeout)
175
-
176
- const originalOnFrame = conn.onFrame
177
- conn.onFrame = (frame: ServerFrame) => {
178
- if (frame.t === "ready") {
179
- clearTimeout(timer)
180
- conn.onFrame = originalOnFrame
181
- resolve(conn)
182
- } else {
183
- originalOnFrame(frame)
184
- }
185
- }
186
-
187
- conn.onError = (err: unknown) => {
188
- clearTimeout(timer)
189
- conn.close()
190
- reject(err)
191
- }
192
-
193
- conn.onClose = (reason: string) => {
194
- clearTimeout(timer)
195
- reject(new Error(reason))
196
- }
197
- })
198
- }
199
-
200
- function connect(
201
- url: string,
202
- transportOpts: TransportOpts,
203
- ): Promise<{ conn: TransportConnection; transport: Transport }> {
204
- const transports = opts.transports
205
-
206
- if (transports.length === 0) {
207
- const p = Promise.reject(new RealtimeConnectError("No transports configured", "no_transports"))
208
- p.catch(() => {})
209
- return p
210
- }
211
-
212
- const p = connectInternal(url, transportOpts, transports)
213
- p.catch(() => {})
214
- return p
215
- }
216
-
217
- async function connectInternal(
218
- url: string,
219
- transportOpts: TransportOpts,
220
- transports: TransportAdapter[],
221
- ): Promise<{ conn: TransportConnection; transport: Transport }> {
222
- /* If we have a proven transport, try it first (it's at a specific index) */
223
- if (proven !== null) {
224
- /* proven refers to index position — try that adapter directly */
225
- const provenIndex = provenIndexStore
226
- if (provenIndex !== null && provenIndex < transports.length) {
227
- try {
228
- const conn = await tryTransport(transports[provenIndex], url, transportOpts)
229
- return { conn, transport: proven }
230
- } catch {
231
- /* Proven transport failed — fall through to full chain */
232
- }
233
- }
234
- }
235
-
236
- for (let i = 0; i < transports.length; i++) {
237
- try {
238
- const conn = await tryTransport(transports[i], url, transportOpts)
239
- /* Record proven transport — we use the index to map to a transport name */
240
- let transportName: Transport = "longpoll"
241
- if (i === 0) transportName = "ws"
242
- else if (i === 1) transportName = "sse"
243
- proven = transportName
244
- provenIndexStore = i
245
- return { conn, transport: transportName }
246
- } catch {
247
- /* Try next */
248
- }
249
- }
250
-
251
- throw new RealtimeConnectError("All transports failed", "all_failed")
252
- }
253
-
254
- let provenIndexStore: number | null = null
255
-
256
- return {
257
- connect,
258
- get provenTransport() {
259
- return proven
260
- },
261
- }
262
- }
263
-
264
- /* ------------------------------------------------------------------ */
265
- /* ResumableConnection */
266
- /* ------------------------------------------------------------------ */
267
-
268
- export type ResumableConnectionOpts = {
269
- url: string
270
- token?: () => string | Promise<string>
271
- onAuthExpired?: () => Promise<string | null>
272
- onReconnecting?: (attempt: number, transport: Transport) => void
273
- onReconnected?: () => void
274
- signal?: AbortSignal
275
- transports?: Transport[]
276
- keepaliveInterval?: number
277
- }
278
-
279
- type QueueEntry = { type: "value"; value: unknown } | { type: "done" } | { type: "error"; error: unknown }
280
-
281
- export function createResumableConnection(opts: ResumableConnectionOpts): {
282
- readonly state: ConnectionState
283
- send(data: unknown): void
284
- close(reason?: string): void
285
- [Symbol.asyncIterator](): AsyncIterableIterator<unknown>
286
- } {
287
- let state: ConnectionState = "idle"
288
- let currentConn: TransportConnection | null = null
289
- let started = false
290
-
291
- /* Check if already aborted */
292
- if (opts.signal?.aborted) {
293
- state = "closed"
294
- }
295
-
296
- /* Queue-based async iterator infrastructure */
297
- const queue: QueueEntry[] = []
298
- let pending: {
299
- resolve: (result: IteratorResult<unknown>) => void
300
- reject: (err: unknown) => void
301
- } | null = null
302
-
303
- function enqueue(entry: QueueEntry): void {
304
- if (pending) {
305
- const { resolve, reject } = pending
306
- pending = null
307
-
308
- if (entry.type === "value") {
309
- resolve({ done: false, value: entry.value })
310
- } else if (entry.type === "done") {
311
- resolve({ done: true, value: undefined })
312
- } else {
313
- reject(entry.error)
314
- }
315
- } else {
316
- queue.push(entry)
317
- }
318
- }
319
-
320
- function terminate(entry: QueueEntry): void {
321
- enqueue(entry)
322
- }
323
-
324
- function handleClose(): void {
325
- if (state === "closed") return
326
- state = "closed"
327
- if (currentConn) {
328
- currentConn.close()
329
- currentConn = null
330
- }
331
- terminate({ type: "done" })
332
- }
333
-
334
- function handleAbort(): void {
335
- if (state === "closed") return
336
- state = "closed"
337
- if (currentConn) {
338
- currentConn.close()
339
- currentConn = null
340
- }
341
- terminate({ error: new RealtimeAbortError("Connection aborted", "aborted"), type: "error" })
342
- }
343
-
344
- /* Listen for abort signal */
345
- if (opts.signal && !opts.signal.aborted) {
346
- opts.signal.addEventListener(
347
- "abort",
348
- () => {
349
- handleAbort()
350
- },
351
- { once: true },
352
- )
353
- }
354
-
355
- function startConnection(): void {
356
- if (started || state === "closed") return
357
- started = true
358
- state = "connecting"
359
-
360
- /* Kick off connection in a microtask */
361
- queueMicrotask(() => {
362
- if (state === "closed") return
363
-
364
- /* In a real implementation, this would use createFallbackChain.
365
- For now, state transitions are driven by external transport frames. */
366
- })
367
- }
368
-
369
- function send(data: unknown): void {
370
- if (state === "closed" || !currentConn) return
371
- currentConn.send(JSON.stringify(data))
372
- }
373
-
374
- function close(_reason?: string): void {
375
- handleClose()
376
- }
377
-
378
- function next(): Promise<IteratorResult<unknown>> {
379
- /* First next() call triggers connection */
380
- if (!started && state !== "closed") {
381
- startConnection()
382
- }
383
-
384
- /* Check queue first */
385
- if (queue.length > 0) {
386
- const entry = queue.shift()
387
- if (!entry || entry.type === "done") {
388
- return Promise.resolve({ done: true, value: undefined })
389
- }
390
- if (entry.type === "value") {
391
- return Promise.resolve({ done: false, value: entry.value })
392
- }
393
- return Promise.reject(entry.error)
394
- }
395
-
396
- /* If already closed, return done */
397
- if (state === "closed") {
398
- return Promise.resolve({ done: true, value: undefined })
399
- }
400
-
401
- /* Wait for next entry — attach a no-op catch to suppress Node's
402
- unhandled-rejection warning while the caller awaits the promise */
403
- const promise = new Promise<IteratorResult<unknown>>((resolve, reject) => {
404
- pending = { reject, resolve }
405
- })
406
- promise.catch(() => {})
407
- return promise
408
- }
409
-
410
- function asyncIterator(): AsyncIterableIterator<unknown> {
411
- return {
412
- next,
413
- [Symbol.asyncIterator]() {
414
- return this
415
- },
416
- }
417
- }
418
-
419
- return {
420
- [Symbol.asyncIterator]: asyncIterator,
421
- close,
422
- send,
423
- get state() {
424
- return state
425
- },
426
- }
427
- }