@zshannon/streamstore 0.22.3

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 (444) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +93 -0
  3. package/dist/cjs/accessTokens.d.ts +51 -0
  4. package/dist/cjs/accessTokens.d.ts.map +1 -0
  5. package/dist/cjs/accessTokens.js +127 -0
  6. package/dist/cjs/accessTokens.js.map +1 -0
  7. package/dist/cjs/auth/biscuit.d.ts +42 -0
  8. package/dist/cjs/auth/biscuit.d.ts.map +1 -0
  9. package/dist/cjs/auth/biscuit.js +72 -0
  10. package/dist/cjs/auth/biscuit.js.map +1 -0
  11. package/dist/cjs/auth/index.d.ts +5 -0
  12. package/dist/cjs/auth/index.d.ts.map +1 -0
  13. package/dist/cjs/auth/index.js +14 -0
  14. package/dist/cjs/auth/index.js.map +1 -0
  15. package/dist/cjs/auth/pki-auth.d.ts +60 -0
  16. package/dist/cjs/auth/pki-auth.d.ts.map +1 -0
  17. package/dist/cjs/auth/pki-auth.js +102 -0
  18. package/dist/cjs/auth/pki-auth.js.map +1 -0
  19. package/dist/cjs/auth/sign.d.ts +39 -0
  20. package/dist/cjs/auth/sign.d.ts.map +1 -0
  21. package/dist/cjs/auth/sign.js +128 -0
  22. package/dist/cjs/auth/sign.js.map +1 -0
  23. package/dist/cjs/auth/signing-key.d.ts +42 -0
  24. package/dist/cjs/auth/signing-key.d.ts.map +1 -0
  25. package/dist/cjs/auth/signing-key.js +66 -0
  26. package/dist/cjs/auth/signing-key.js.map +1 -0
  27. package/dist/cjs/basin.d.ts +33 -0
  28. package/dist/cjs/basin.d.ts.map +1 -0
  29. package/dist/cjs/basin.js +54 -0
  30. package/dist/cjs/basin.js.map +1 -0
  31. package/dist/cjs/basins.d.ts +62 -0
  32. package/dist/cjs/basins.d.ts.map +1 -0
  33. package/dist/cjs/basins.js +201 -0
  34. package/dist/cjs/basins.js.map +1 -0
  35. package/dist/cjs/batch-transform.d.ts +60 -0
  36. package/dist/cjs/batch-transform.d.ts.map +1 -0
  37. package/dist/cjs/batch-transform.js +171 -0
  38. package/dist/cjs/batch-transform.js.map +1 -0
  39. package/dist/cjs/common.d.ts +156 -0
  40. package/dist/cjs/common.d.ts.map +1 -0
  41. package/dist/cjs/common.js +54 -0
  42. package/dist/cjs/common.js.map +1 -0
  43. package/dist/cjs/endpoints.d.ts +63 -0
  44. package/dist/cjs/endpoints.d.ts.map +1 -0
  45. package/dist/cjs/endpoints.js +120 -0
  46. package/dist/cjs/endpoints.js.map +1 -0
  47. package/dist/cjs/error.d.ts +119 -0
  48. package/dist/cjs/error.d.ts.map +1 -0
  49. package/dist/cjs/error.js +373 -0
  50. package/dist/cjs/error.js.map +1 -0
  51. package/dist/cjs/generated/client/client.gen.d.ts +3 -0
  52. package/dist/cjs/generated/client/client.gen.d.ts.map +1 -0
  53. package/dist/cjs/generated/client/client.gen.js +209 -0
  54. package/dist/cjs/generated/client/client.gen.js.map +1 -0
  55. package/dist/cjs/generated/client/index.d.ts +9 -0
  56. package/dist/cjs/generated/client/index.d.ts.map +1 -0
  57. package/dist/cjs/generated/client/index.js +18 -0
  58. package/dist/cjs/generated/client/index.js.map +1 -0
  59. package/dist/cjs/generated/client/types.gen.d.ts +125 -0
  60. package/dist/cjs/generated/client/types.gen.d.ts.map +1 -0
  61. package/dist/cjs/generated/client/types.gen.js +4 -0
  62. package/dist/cjs/generated/client/types.gen.js.map +1 -0
  63. package/dist/cjs/generated/client/utils.gen.d.ts +34 -0
  64. package/dist/cjs/generated/client/utils.gen.d.ts.map +1 -0
  65. package/dist/cjs/generated/client/utils.gen.js +243 -0
  66. package/dist/cjs/generated/client/utils.gen.js.map +1 -0
  67. package/dist/cjs/generated/client.gen.d.ts +13 -0
  68. package/dist/cjs/generated/client.gen.d.ts.map +1 -0
  69. package/dist/cjs/generated/client.gen.js +9 -0
  70. package/dist/cjs/generated/client.gen.js.map +1 -0
  71. package/dist/cjs/generated/core/auth.gen.d.ts +19 -0
  72. package/dist/cjs/generated/core/auth.gen.d.ts.map +1 -0
  73. package/dist/cjs/generated/core/auth.gen.js +19 -0
  74. package/dist/cjs/generated/core/auth.gen.js.map +1 -0
  75. package/dist/cjs/generated/core/bodySerializer.gen.d.ts +26 -0
  76. package/dist/cjs/generated/core/bodySerializer.gen.d.ts.map +1 -0
  77. package/dist/cjs/generated/core/bodySerializer.gen.js +61 -0
  78. package/dist/cjs/generated/core/bodySerializer.gen.js.map +1 -0
  79. package/dist/cjs/generated/core/params.gen.d.ts +44 -0
  80. package/dist/cjs/generated/core/params.gen.d.ts.map +1 -0
  81. package/dist/cjs/generated/core/params.gen.js +105 -0
  82. package/dist/cjs/generated/core/params.gen.js.map +1 -0
  83. package/dist/cjs/generated/core/pathSerializer.gen.d.ts +34 -0
  84. package/dist/cjs/generated/core/pathSerializer.gen.d.ts.map +1 -0
  85. package/dist/cjs/generated/core/pathSerializer.gen.js +124 -0
  86. package/dist/cjs/generated/core/pathSerializer.gen.js.map +1 -0
  87. package/dist/cjs/generated/core/queryKeySerializer.gen.d.ts +19 -0
  88. package/dist/cjs/generated/core/queryKeySerializer.gen.d.ts.map +1 -0
  89. package/dist/cjs/generated/core/queryKeySerializer.gen.js +106 -0
  90. package/dist/cjs/generated/core/queryKeySerializer.gen.js.map +1 -0
  91. package/dist/cjs/generated/core/serverSentEvents.gen.d.ts +72 -0
  92. package/dist/cjs/generated/core/serverSentEvents.gen.d.ts.map +1 -0
  93. package/dist/cjs/generated/core/serverSentEvents.gen.js +140 -0
  94. package/dist/cjs/generated/core/serverSentEvents.gen.js.map +1 -0
  95. package/dist/cjs/generated/core/types.gen.d.ts +79 -0
  96. package/dist/cjs/generated/core/types.gen.d.ts.map +1 -0
  97. package/dist/cjs/generated/core/types.gen.js +4 -0
  98. package/dist/cjs/generated/core/types.gen.js.map +1 -0
  99. package/dist/cjs/generated/core/utils.gen.d.ts +20 -0
  100. package/dist/cjs/generated/core/utils.gen.d.ts.map +1 -0
  101. package/dist/cjs/generated/core/utils.gen.js +94 -0
  102. package/dist/cjs/generated/core/utils.gen.js.map +1 -0
  103. package/dist/cjs/generated/index.d.ts +3 -0
  104. package/dist/cjs/generated/index.d.ts.map +1 -0
  105. package/dist/cjs/generated/index.js +19 -0
  106. package/dist/cjs/generated/index.js.map +1 -0
  107. package/dist/cjs/generated/proto/s2.d.ts +250 -0
  108. package/dist/cjs/generated/proto/s2.d.ts.map +1 -0
  109. package/dist/cjs/generated/proto/s2.js +426 -0
  110. package/dist/cjs/generated/proto/s2.js.map +1 -0
  111. package/dist/cjs/generated/sdk.gen.d.ts +100 -0
  112. package/dist/cjs/generated/sdk.gen.d.ts.map +1 -0
  113. package/dist/cjs/generated/sdk.gen.js +374 -0
  114. package/dist/cjs/generated/sdk.gen.js.map +1 -0
  115. package/dist/cjs/generated/types.gen.d.ts +1064 -0
  116. package/dist/cjs/generated/types.gen.d.ts.map +1 -0
  117. package/dist/cjs/generated/types.gen.js +4 -0
  118. package/dist/cjs/generated/types.gen.js.map +1 -0
  119. package/dist/cjs/index.d.ts +42 -0
  120. package/dist/cjs/index.d.ts.map +1 -0
  121. package/dist/cjs/index.js +81 -0
  122. package/dist/cjs/index.js.map +1 -0
  123. package/dist/cjs/internal/case-transform.d.ts +59 -0
  124. package/dist/cjs/internal/case-transform.d.ts.map +1 -0
  125. package/dist/cjs/internal/case-transform.js +80 -0
  126. package/dist/cjs/internal/case-transform.js.map +1 -0
  127. package/dist/cjs/internal/mappers.d.ts +51 -0
  128. package/dist/cjs/internal/mappers.d.ts.map +1 -0
  129. package/dist/cjs/internal/mappers.js +225 -0
  130. package/dist/cjs/internal/mappers.js.map +1 -0
  131. package/dist/cjs/internal/sdk-types.d.ts +127 -0
  132. package/dist/cjs/internal/sdk-types.d.ts.map +1 -0
  133. package/dist/cjs/internal/sdk-types.js +9 -0
  134. package/dist/cjs/internal/sdk-types.js.map +1 -0
  135. package/dist/cjs/lib/base64.d.ts +12 -0
  136. package/dist/cjs/lib/base64.d.ts.map +1 -0
  137. package/dist/cjs/lib/base64.js +172 -0
  138. package/dist/cjs/lib/base64.js.map +1 -0
  139. package/dist/cjs/lib/event-stream.d.ts +26 -0
  140. package/dist/cjs/lib/event-stream.d.ts.map +1 -0
  141. package/dist/cjs/lib/event-stream.js +154 -0
  142. package/dist/cjs/lib/event-stream.js.map +1 -0
  143. package/dist/cjs/lib/paginate.d.ts +61 -0
  144. package/dist/cjs/lib/paginate.d.ts.map +1 -0
  145. package/dist/cjs/lib/paginate.js +51 -0
  146. package/dist/cjs/lib/paginate.js.map +1 -0
  147. package/dist/cjs/lib/redacted.d.ts +17 -0
  148. package/dist/cjs/lib/redacted.d.ts.map +1 -0
  149. package/dist/cjs/lib/redacted.js +34 -0
  150. package/dist/cjs/lib/redacted.js.map +1 -0
  151. package/dist/cjs/lib/result.d.ts +57 -0
  152. package/dist/cjs/lib/result.d.ts.map +1 -0
  153. package/dist/cjs/lib/result.js +43 -0
  154. package/dist/cjs/lib/result.js.map +1 -0
  155. package/dist/cjs/lib/retry.d.ts +167 -0
  156. package/dist/cjs/lib/retry.d.ts.map +1 -0
  157. package/dist/cjs/lib/retry.js +1011 -0
  158. package/dist/cjs/lib/retry.js.map +1 -0
  159. package/dist/cjs/lib/stream/factory.d.ts +14 -0
  160. package/dist/cjs/lib/stream/factory.d.ts.map +1 -0
  161. package/dist/cjs/lib/stream/factory.js +35 -0
  162. package/dist/cjs/lib/stream/factory.js.map +1 -0
  163. package/dist/cjs/lib/stream/runtime.d.ts +27 -0
  164. package/dist/cjs/lib/stream/runtime.d.ts.map +1 -0
  165. package/dist/cjs/lib/stream/runtime.js +70 -0
  166. package/dist/cjs/lib/stream/runtime.js.map +1 -0
  167. package/dist/cjs/lib/stream/transport/fetch/index.d.ts +64 -0
  168. package/dist/cjs/lib/stream/transport/fetch/index.d.ts.map +1 -0
  169. package/dist/cjs/lib/stream/transport/fetch/index.js +462 -0
  170. package/dist/cjs/lib/stream/transport/fetch/index.js.map +1 -0
  171. package/dist/cjs/lib/stream/transport/fetch/shared.d.ts +11 -0
  172. package/dist/cjs/lib/stream/transport/fetch/shared.d.ts.map +1 -0
  173. package/dist/cjs/lib/stream/transport/fetch/shared.js +118 -0
  174. package/dist/cjs/lib/stream/transport/fetch/shared.js.map +1 -0
  175. package/dist/cjs/lib/stream/transport/proto.d.ts +9 -0
  176. package/dist/cjs/lib/stream/transport/proto.d.ts.map +1 -0
  177. package/dist/cjs/lib/stream/transport/proto.js +118 -0
  178. package/dist/cjs/lib/stream/transport/proto.js.map +1 -0
  179. package/dist/cjs/lib/stream/transport/s2s/framing.d.ts +47 -0
  180. package/dist/cjs/lib/stream/transport/s2s/framing.d.ts.map +1 -0
  181. package/dist/cjs/lib/stream/transport/s2s/framing.js +123 -0
  182. package/dist/cjs/lib/stream/transport/s2s/framing.js.map +1 -0
  183. package/dist/cjs/lib/stream/transport/s2s/index.d.ts +24 -0
  184. package/dist/cjs/lib/stream/transport/s2s/index.d.ts.map +1 -0
  185. package/dist/cjs/lib/stream/transport/s2s/index.js +823 -0
  186. package/dist/cjs/lib/stream/transport/s2s/index.js.map +1 -0
  187. package/dist/cjs/lib/stream/types.d.ts +199 -0
  188. package/dist/cjs/lib/stream/types.d.ts.map +1 -0
  189. package/dist/cjs/lib/stream/types.js +21 -0
  190. package/dist/cjs/lib/stream/types.js.map +1 -0
  191. package/dist/cjs/metrics.d.ts +46 -0
  192. package/dist/cjs/metrics.d.ts.map +1 -0
  193. package/dist/cjs/metrics.js +127 -0
  194. package/dist/cjs/metrics.js.map +1 -0
  195. package/dist/cjs/package.json +3 -0
  196. package/dist/cjs/producer.d.ts +82 -0
  197. package/dist/cjs/producer.d.ts.map +1 -0
  198. package/dist/cjs/producer.js +305 -0
  199. package/dist/cjs/producer.js.map +1 -0
  200. package/dist/cjs/s2.d.ts +41 -0
  201. package/dist/cjs/s2.d.ts.map +1 -0
  202. package/dist/cjs/s2.js +119 -0
  203. package/dist/cjs/s2.js.map +1 -0
  204. package/dist/cjs/stream.d.ts +78 -0
  205. package/dist/cjs/stream.d.ts.map +1 -0
  206. package/dist/cjs/stream.js +176 -0
  207. package/dist/cjs/stream.js.map +1 -0
  208. package/dist/cjs/streams.d.ts +61 -0
  209. package/dist/cjs/streams.d.ts.map +1 -0
  210. package/dist/cjs/streams.js +201 -0
  211. package/dist/cjs/streams.js.map +1 -0
  212. package/dist/cjs/types.d.ts +633 -0
  213. package/dist/cjs/types.d.ts.map +1 -0
  214. package/dist/cjs/types.js +129 -0
  215. package/dist/cjs/types.js.map +1 -0
  216. package/dist/cjs/utils.d.ts +25 -0
  217. package/dist/cjs/utils.d.ts.map +1 -0
  218. package/dist/cjs/utils.js +108 -0
  219. package/dist/cjs/utils.js.map +1 -0
  220. package/dist/cjs/version.d.ts +8 -0
  221. package/dist/cjs/version.d.ts.map +1 -0
  222. package/dist/cjs/version.js +11 -0
  223. package/dist/cjs/version.js.map +1 -0
  224. package/dist/esm/accessTokens.d.ts +51 -0
  225. package/dist/esm/accessTokens.d.ts.map +1 -0
  226. package/dist/esm/accessTokens.js +123 -0
  227. package/dist/esm/accessTokens.js.map +1 -0
  228. package/dist/esm/auth/biscuit.d.ts +42 -0
  229. package/dist/esm/auth/biscuit.d.ts.map +1 -0
  230. package/dist/esm/auth/biscuit.js +68 -0
  231. package/dist/esm/auth/biscuit.js.map +1 -0
  232. package/dist/esm/auth/index.d.ts +5 -0
  233. package/dist/esm/auth/index.d.ts.map +1 -0
  234. package/dist/esm/auth/index.js +5 -0
  235. package/dist/esm/auth/index.js.map +1 -0
  236. package/dist/esm/auth/pki-auth.d.ts +60 -0
  237. package/dist/esm/auth/pki-auth.d.ts.map +1 -0
  238. package/dist/esm/auth/pki-auth.js +99 -0
  239. package/dist/esm/auth/pki-auth.js.map +1 -0
  240. package/dist/esm/auth/sign.d.ts +39 -0
  241. package/dist/esm/auth/sign.d.ts.map +1 -0
  242. package/dist/esm/auth/sign.js +125 -0
  243. package/dist/esm/auth/sign.js.map +1 -0
  244. package/dist/esm/auth/signing-key.d.ts +42 -0
  245. package/dist/esm/auth/signing-key.d.ts.map +1 -0
  246. package/dist/esm/auth/signing-key.js +62 -0
  247. package/dist/esm/auth/signing-key.js.map +1 -0
  248. package/dist/esm/basin.d.ts +33 -0
  249. package/dist/esm/basin.d.ts.map +1 -0
  250. package/dist/esm/basin.js +50 -0
  251. package/dist/esm/basin.js.map +1 -0
  252. package/dist/esm/basins.d.ts +62 -0
  253. package/dist/esm/basins.d.ts.map +1 -0
  254. package/dist/esm/basins.js +197 -0
  255. package/dist/esm/basins.js.map +1 -0
  256. package/dist/esm/batch-transform.d.ts +60 -0
  257. package/dist/esm/batch-transform.d.ts.map +1 -0
  258. package/dist/esm/batch-transform.js +167 -0
  259. package/dist/esm/batch-transform.js.map +1 -0
  260. package/dist/esm/common.d.ts +156 -0
  261. package/dist/esm/common.d.ts.map +1 -0
  262. package/dist/esm/common.js +49 -0
  263. package/dist/esm/common.js.map +1 -0
  264. package/dist/esm/endpoints.d.ts +63 -0
  265. package/dist/esm/endpoints.d.ts.map +1 -0
  266. package/dist/esm/endpoints.js +115 -0
  267. package/dist/esm/endpoints.js.map +1 -0
  268. package/dist/esm/error.d.ts +119 -0
  269. package/dist/esm/error.d.ts.map +1 -0
  270. package/dist/esm/error.js +358 -0
  271. package/dist/esm/error.js.map +1 -0
  272. package/dist/esm/generated/client/client.gen.d.ts +3 -0
  273. package/dist/esm/generated/client/client.gen.d.ts.map +1 -0
  274. package/dist/esm/generated/client/client.gen.js +205 -0
  275. package/dist/esm/generated/client/client.gen.js.map +1 -0
  276. package/dist/esm/generated/client/index.d.ts +9 -0
  277. package/dist/esm/generated/client/index.d.ts.map +1 -0
  278. package/dist/esm/generated/client/index.js +7 -0
  279. package/dist/esm/generated/client/index.js.map +1 -0
  280. package/dist/esm/generated/client/types.gen.d.ts +125 -0
  281. package/dist/esm/generated/client/types.gen.d.ts.map +1 -0
  282. package/dist/esm/generated/client/types.gen.js +3 -0
  283. package/dist/esm/generated/client/types.gen.js.map +1 -0
  284. package/dist/esm/generated/client/utils.gen.d.ts +34 -0
  285. package/dist/esm/generated/client/utils.gen.d.ts.map +1 -0
  286. package/dist/esm/generated/client/utils.gen.js +232 -0
  287. package/dist/esm/generated/client/utils.gen.js.map +1 -0
  288. package/dist/esm/generated/client.gen.d.ts +13 -0
  289. package/dist/esm/generated/client.gen.d.ts.map +1 -0
  290. package/dist/esm/generated/client.gen.js +6 -0
  291. package/dist/esm/generated/client.gen.js.map +1 -0
  292. package/dist/esm/generated/core/auth.gen.d.ts +19 -0
  293. package/dist/esm/generated/core/auth.gen.d.ts.map +1 -0
  294. package/dist/esm/generated/core/auth.gen.js +15 -0
  295. package/dist/esm/generated/core/auth.gen.js.map +1 -0
  296. package/dist/esm/generated/core/bodySerializer.gen.d.ts +26 -0
  297. package/dist/esm/generated/core/bodySerializer.gen.d.ts.map +1 -0
  298. package/dist/esm/generated/core/bodySerializer.gen.js +58 -0
  299. package/dist/esm/generated/core/bodySerializer.gen.js.map +1 -0
  300. package/dist/esm/generated/core/params.gen.d.ts +44 -0
  301. package/dist/esm/generated/core/params.gen.d.ts.map +1 -0
  302. package/dist/esm/generated/core/params.gen.js +101 -0
  303. package/dist/esm/generated/core/params.gen.js.map +1 -0
  304. package/dist/esm/generated/core/pathSerializer.gen.d.ts +34 -0
  305. package/dist/esm/generated/core/pathSerializer.gen.d.ts.map +1 -0
  306. package/dist/esm/generated/core/pathSerializer.gen.js +115 -0
  307. package/dist/esm/generated/core/pathSerializer.gen.js.map +1 -0
  308. package/dist/esm/generated/core/queryKeySerializer.gen.d.ts +19 -0
  309. package/dist/esm/generated/core/queryKeySerializer.gen.d.ts.map +1 -0
  310. package/dist/esm/generated/core/queryKeySerializer.gen.js +100 -0
  311. package/dist/esm/generated/core/queryKeySerializer.gen.js.map +1 -0
  312. package/dist/esm/generated/core/serverSentEvents.gen.d.ts +72 -0
  313. package/dist/esm/generated/core/serverSentEvents.gen.d.ts.map +1 -0
  314. package/dist/esm/generated/core/serverSentEvents.gen.js +136 -0
  315. package/dist/esm/generated/core/serverSentEvents.gen.js.map +1 -0
  316. package/dist/esm/generated/core/types.gen.d.ts +79 -0
  317. package/dist/esm/generated/core/types.gen.d.ts.map +1 -0
  318. package/dist/esm/generated/core/types.gen.js +3 -0
  319. package/dist/esm/generated/core/types.gen.js.map +1 -0
  320. package/dist/esm/generated/core/utils.gen.d.ts +20 -0
  321. package/dist/esm/generated/core/utils.gen.d.ts.map +1 -0
  322. package/dist/esm/generated/core/utils.gen.js +88 -0
  323. package/dist/esm/generated/core/utils.gen.js.map +1 -0
  324. package/dist/esm/generated/index.d.ts +3 -0
  325. package/dist/esm/generated/index.d.ts.map +1 -0
  326. package/dist/esm/generated/index.js +3 -0
  327. package/dist/esm/generated/index.js.map +1 -0
  328. package/dist/esm/generated/proto/s2.d.ts +250 -0
  329. package/dist/esm/generated/proto/s2.d.ts.map +1 -0
  330. package/dist/esm/generated/proto/s2.js +423 -0
  331. package/dist/esm/generated/proto/s2.js.map +1 -0
  332. package/dist/esm/generated/sdk.gen.d.ts +100 -0
  333. package/dist/esm/generated/sdk.gen.d.ts.map +1 -0
  334. package/dist/esm/generated/sdk.gen.js +350 -0
  335. package/dist/esm/generated/sdk.gen.js.map +1 -0
  336. package/dist/esm/generated/types.gen.d.ts +1064 -0
  337. package/dist/esm/generated/types.gen.d.ts.map +1 -0
  338. package/dist/esm/generated/types.gen.js +3 -0
  339. package/dist/esm/generated/types.gen.js.map +1 -0
  340. package/dist/esm/index.d.ts +42 -0
  341. package/dist/esm/index.d.ts.map +1 -0
  342. package/dist/esm/index.js +47 -0
  343. package/dist/esm/index.js.map +1 -0
  344. package/dist/esm/internal/case-transform.d.ts +59 -0
  345. package/dist/esm/internal/case-transform.d.ts.map +1 -0
  346. package/dist/esm/internal/case-transform.js +76 -0
  347. package/dist/esm/internal/case-transform.js.map +1 -0
  348. package/dist/esm/internal/mappers.d.ts +51 -0
  349. package/dist/esm/internal/mappers.d.ts.map +1 -0
  350. package/dist/esm/internal/mappers.js +218 -0
  351. package/dist/esm/internal/mappers.js.map +1 -0
  352. package/dist/esm/internal/sdk-types.d.ts +127 -0
  353. package/dist/esm/internal/sdk-types.d.ts.map +1 -0
  354. package/dist/esm/internal/sdk-types.js +8 -0
  355. package/dist/esm/internal/sdk-types.js.map +1 -0
  356. package/dist/esm/lib/base64.d.ts +12 -0
  357. package/dist/esm/lib/base64.d.ts.map +1 -0
  358. package/dist/esm/lib/base64.js +165 -0
  359. package/dist/esm/lib/base64.js.map +1 -0
  360. package/dist/esm/lib/event-stream.d.ts +26 -0
  361. package/dist/esm/lib/event-stream.d.ts.map +1 -0
  362. package/dist/esm/lib/event-stream.js +150 -0
  363. package/dist/esm/lib/event-stream.js.map +1 -0
  364. package/dist/esm/lib/paginate.d.ts +61 -0
  365. package/dist/esm/lib/paginate.d.ts.map +1 -0
  366. package/dist/esm/lib/paginate.js +48 -0
  367. package/dist/esm/lib/paginate.js.map +1 -0
  368. package/dist/esm/lib/redacted.d.ts +17 -0
  369. package/dist/esm/lib/redacted.d.ts.map +1 -0
  370. package/dist/esm/lib/redacted.js +28 -0
  371. package/dist/esm/lib/redacted.js.map +1 -0
  372. package/dist/esm/lib/result.d.ts +57 -0
  373. package/dist/esm/lib/result.d.ts.map +1 -0
  374. package/dist/esm/lib/result.js +37 -0
  375. package/dist/esm/lib/result.js.map +1 -0
  376. package/dist/esm/lib/retry.d.ts +167 -0
  377. package/dist/esm/lib/retry.d.ts.map +1 -0
  378. package/dist/esm/lib/retry.js +1003 -0
  379. package/dist/esm/lib/retry.js.map +1 -0
  380. package/dist/esm/lib/stream/factory.d.ts +14 -0
  381. package/dist/esm/lib/stream/factory.d.ts.map +1 -0
  382. package/dist/esm/lib/stream/factory.js +32 -0
  383. package/dist/esm/lib/stream/factory.js.map +1 -0
  384. package/dist/esm/lib/stream/runtime.d.ts +27 -0
  385. package/dist/esm/lib/stream/runtime.d.ts.map +1 -0
  386. package/dist/esm/lib/stream/runtime.js +71 -0
  387. package/dist/esm/lib/stream/runtime.js.map +1 -0
  388. package/dist/esm/lib/stream/transport/fetch/index.d.ts +64 -0
  389. package/dist/esm/lib/stream/transport/fetch/index.d.ts.map +1 -0
  390. package/dist/esm/lib/stream/transport/fetch/index.js +456 -0
  391. package/dist/esm/lib/stream/transport/fetch/index.js.map +1 -0
  392. package/dist/esm/lib/stream/transport/fetch/shared.d.ts +11 -0
  393. package/dist/esm/lib/stream/transport/fetch/shared.d.ts.map +1 -0
  394. package/dist/esm/lib/stream/transport/fetch/shared.js +114 -0
  395. package/dist/esm/lib/stream/transport/fetch/shared.js.map +1 -0
  396. package/dist/esm/lib/stream/transport/proto.d.ts +9 -0
  397. package/dist/esm/lib/stream/transport/proto.d.ts.map +1 -0
  398. package/dist/esm/lib/stream/transport/proto.js +110 -0
  399. package/dist/esm/lib/stream/transport/proto.js.map +1 -0
  400. package/dist/esm/lib/stream/transport/s2s/framing.d.ts +47 -0
  401. package/dist/esm/lib/stream/transport/s2s/framing.d.ts.map +1 -0
  402. package/dist/esm/lib/stream/transport/s2s/framing.js +118 -0
  403. package/dist/esm/lib/stream/transport/s2s/framing.js.map +1 -0
  404. package/dist/esm/lib/stream/transport/s2s/index.d.ts +24 -0
  405. package/dist/esm/lib/stream/transport/s2s/index.d.ts.map +1 -0
  406. package/dist/esm/lib/stream/transport/s2s/index.js +819 -0
  407. package/dist/esm/lib/stream/transport/s2s/index.js.map +1 -0
  408. package/dist/esm/lib/stream/types.d.ts +199 -0
  409. package/dist/esm/lib/stream/types.d.ts.map +1 -0
  410. package/dist/esm/lib/stream/types.js +18 -0
  411. package/dist/esm/lib/stream/types.js.map +1 -0
  412. package/dist/esm/metrics.d.ts +46 -0
  413. package/dist/esm/metrics.d.ts.map +1 -0
  414. package/dist/esm/metrics.js +122 -0
  415. package/dist/esm/metrics.js.map +1 -0
  416. package/dist/esm/producer.d.ts +82 -0
  417. package/dist/esm/producer.d.ts.map +1 -0
  418. package/dist/esm/producer.js +300 -0
  419. package/dist/esm/producer.js.map +1 -0
  420. package/dist/esm/s2.d.ts +41 -0
  421. package/dist/esm/s2.d.ts.map +1 -0
  422. package/dist/esm/s2.js +115 -0
  423. package/dist/esm/s2.js.map +1 -0
  424. package/dist/esm/stream.d.ts +78 -0
  425. package/dist/esm/stream.d.ts.map +1 -0
  426. package/dist/esm/stream.js +172 -0
  427. package/dist/esm/stream.js.map +1 -0
  428. package/dist/esm/streams.d.ts +61 -0
  429. package/dist/esm/streams.d.ts.map +1 -0
  430. package/dist/esm/streams.js +197 -0
  431. package/dist/esm/streams.js.map +1 -0
  432. package/dist/esm/types.d.ts +633 -0
  433. package/dist/esm/types.d.ts.map +1 -0
  434. package/dist/esm/types.js +126 -0
  435. package/dist/esm/types.js.map +1 -0
  436. package/dist/esm/utils.d.ts +25 -0
  437. package/dist/esm/utils.d.ts.map +1 -0
  438. package/dist/esm/utils.js +103 -0
  439. package/dist/esm/utils.js.map +1 -0
  440. package/dist/esm/version.d.ts +8 -0
  441. package/dist/esm/version.d.ts.map +1 -0
  442. package/dist/esm/version.js +8 -0
  443. package/dist/esm/version.js.map +1 -0
  444. package/package.json +47 -0
@@ -0,0 +1,819 @@
1
+ /**
2
+ * S2S HTTP/2 transport for Node.js
3
+ * Uses the s2s binary protocol over HTTP/2 for efficient streaming
4
+ *
5
+ * This file should only be imported in Node.js environments
6
+ */
7
+ import createDebug from "debug";
8
+ import { makeAppendPreconditionError, makeServerError, RangeNotSatisfiableError, S2Error, s2Error, } from "../../../../error.js";
9
+ import * as Proto from "../../../../generated/proto/s2.js";
10
+ import { err, errClose, ok, okClose } from "../../../result.js";
11
+ import { RetryAppendSession as AppendSessionImpl, RetryReadSession as ReadSessionImpl, } from "../../../retry.js";
12
+ import { DEFAULT_USER_AGENT } from "../../runtime.js";
13
+ import { encodeProtoAppendInput } from "../proto.js";
14
+ import { frameMessage, S2SFrameParser } from "./framing.js";
15
+ /**
16
+ * Gets the auth token from an auth provider.
17
+ */
18
+ async function getAuthToken(authProvider) {
19
+ if (authProvider.type === "pki") {
20
+ return authProvider.context.getToken();
21
+ }
22
+ return authProvider.token;
23
+ }
24
+ /**
25
+ * Signs headers if using PKI auth.
26
+ */
27
+ async function signHeadersIfPki(authProvider, headers, method, url, body) {
28
+ if (authProvider.type === "pki") {
29
+ await authProvider.context.signHeaders({ method, url, headers, body });
30
+ }
31
+ }
32
+ const debug = createDebug("s2:s2s");
33
+ let http2ModulePromise;
34
+ async function loadHttp2() {
35
+ // Hint bundlers to skip bundling node:http2 while keeping the specifier static for type inference.
36
+ if (!http2ModulePromise) {
37
+ http2ModulePromise = import(
38
+ /* webpackIgnore: true */
39
+ /* @vite-ignore */
40
+ "node:http2");
41
+ }
42
+ return http2ModulePromise;
43
+ }
44
+ export class S2STransport {
45
+ transportConfig;
46
+ connection;
47
+ connectionPromise;
48
+ closingPromise;
49
+ constructor(config) {
50
+ this.transportConfig = config;
51
+ }
52
+ async makeAppendSession(stream, sessionOptions, requestOptions) {
53
+ return AppendSessionImpl.create((myOptions) => {
54
+ return S2SAppendSession.create(this.transportConfig.baseUrl, this.transportConfig.authProvider, stream, () => this.getConnection(), this.transportConfig.basinName, myOptions, requestOptions);
55
+ }, sessionOptions, this.transportConfig.retry, stream);
56
+ }
57
+ async makeReadSession(stream, args, options) {
58
+ return ReadSessionImpl.create((myArgs) => {
59
+ return S2SReadSession.create(this.transportConfig.baseUrl, this.transportConfig.authProvider, stream, myArgs, options, () => this.getConnection(), this.transportConfig.basinName);
60
+ }, args, this.transportConfig.retry);
61
+ }
62
+ /**
63
+ * Get or create HTTP/2 connection (one per transport)
64
+ */
65
+ async getConnection() {
66
+ if (this.connection &&
67
+ !this.connection.closed &&
68
+ !this.connection.destroyed) {
69
+ return this.connection;
70
+ }
71
+ // If connection is in progress, wait for it
72
+ if (this.connectionPromise) {
73
+ return this.connectionPromise;
74
+ }
75
+ // Create new connection
76
+ this.connectionPromise = this.createConnection();
77
+ try {
78
+ this.connection = await this.connectionPromise;
79
+ return this.connection;
80
+ }
81
+ finally {
82
+ this.connectionPromise = undefined;
83
+ }
84
+ }
85
+ async createConnection() {
86
+ const http2 = await loadHttp2();
87
+ const url = new URL(this.transportConfig.baseUrl);
88
+ const client = http2.connect(url.origin, {
89
+ // Use HTTPS settings
90
+ ...(url.protocol === "https:"
91
+ ? {
92
+ // TLS options can go here if needed
93
+ }
94
+ : {}),
95
+ settings: {
96
+ initialWindowSize: 10 * 1024 * 1024, // 10 MB
97
+ },
98
+ });
99
+ const connectPromise = new Promise((resolve, reject) => {
100
+ client.once("connect", () => {
101
+ // Guard against session being destroyed before connect fires
102
+ if (client.destroyed)
103
+ return;
104
+ client.setLocalWindowSize(10 * 1024 * 1024);
105
+ resolve(client);
106
+ });
107
+ client.once("error", (err) => {
108
+ reject(err);
109
+ });
110
+ // Handle connection close
111
+ client.once("close", () => {
112
+ if (this.connection === client) {
113
+ this.connection = undefined;
114
+ }
115
+ });
116
+ });
117
+ // Apply connection timeout if configured
118
+ const connectionTimeout = this.transportConfig.connectionTimeoutMillis ?? 3000;
119
+ let timeoutId;
120
+ const timeoutPromise = new Promise((_, reject) => {
121
+ timeoutId = setTimeout(() => {
122
+ // Destroy the client on timeout
123
+ if (!client.closed && !client.destroyed) {
124
+ client.destroy();
125
+ }
126
+ reject(new S2Error({
127
+ message: `Connection timeout after ${connectionTimeout}ms`,
128
+ status: 408,
129
+ code: "CONNECTION_TIMEOUT",
130
+ origin: "sdk",
131
+ }));
132
+ }, connectionTimeout);
133
+ });
134
+ try {
135
+ return await Promise.race([connectPromise, timeoutPromise]);
136
+ }
137
+ finally {
138
+ if (timeoutId) {
139
+ clearTimeout(timeoutId);
140
+ }
141
+ }
142
+ }
143
+ async close() {
144
+ if (this.closingPromise) {
145
+ return this.closingPromise;
146
+ }
147
+ this.closingPromise = (async () => {
148
+ const connection = this.connection ??
149
+ (await this.connectionPromise?.catch(() => undefined));
150
+ if (connection && !connection.closed && !connection.destroyed) {
151
+ await new Promise((resolve) => {
152
+ connection.close(() => resolve());
153
+ });
154
+ }
155
+ this.connection = undefined;
156
+ })();
157
+ try {
158
+ await this.closingPromise;
159
+ }
160
+ finally {
161
+ this.closingPromise = undefined;
162
+ }
163
+ }
164
+ }
165
+ class S2SReadSession extends ReadableStream {
166
+ streamName;
167
+ args;
168
+ authProvider;
169
+ url;
170
+ options;
171
+ getConnection;
172
+ basinName;
173
+ http2Stream;
174
+ _lastReadPosition;
175
+ _nextReadPosition;
176
+ _lastObservedTail;
177
+ parser = new S2SFrameParser();
178
+ static async create(baseUrl, authProvider, streamName, args, options, getConnection, basinName) {
179
+ const url = new URL(baseUrl);
180
+ return new S2SReadSession(streamName, args, authProvider, url, options, getConnection, basinName);
181
+ }
182
+ constructor(streamName, args, authProvider, url, options, getConnection, basinName) {
183
+ // Initialize parser and textDecoder before super() call
184
+ const parser = new S2SFrameParser();
185
+ const textDecoder = new TextDecoder();
186
+ let http2Stream;
187
+ let lastReadPosition;
188
+ // Track timeout for detecting when server stops sending data
189
+ const TAIL_TIMEOUT_MS = 20000; // 20 seconds
190
+ let timeoutTimer;
191
+ super({
192
+ start: async (controller) => {
193
+ let controllerClosed = false;
194
+ let responseCode;
195
+ const safeClose = () => {
196
+ if (!controllerClosed) {
197
+ controllerClosed = true;
198
+ if (timeoutTimer) {
199
+ clearTimeout(timeoutTimer);
200
+ timeoutTimer = undefined;
201
+ }
202
+ try {
203
+ controller.close();
204
+ }
205
+ catch {
206
+ // Controller may already be closed, ignore
207
+ }
208
+ }
209
+ };
210
+ const safeError = (err) => {
211
+ if (!controllerClosed) {
212
+ controllerClosed = true;
213
+ if (timeoutTimer) {
214
+ clearTimeout(timeoutTimer);
215
+ timeoutTimer = undefined;
216
+ }
217
+ // Convert error to S2Error and enqueue as error result
218
+ controller.enqueue({ ok: false, error: s2Error(err) });
219
+ controller.close();
220
+ }
221
+ };
222
+ // Helper to start/reset the timeout timer
223
+ // Resets on every tail received, fires only if no tail for 20s
224
+ const resetTimeoutTimer = () => {
225
+ if (timeoutTimer) {
226
+ clearTimeout(timeoutTimer);
227
+ }
228
+ timeoutTimer = setTimeout(() => {
229
+ const timeoutError = new S2Error({
230
+ message: `No tail received for ${TAIL_TIMEOUT_MS / 1000}s`,
231
+ status: 408, // Request Timeout
232
+ code: "TIMEOUT",
233
+ });
234
+ debug("tail timeout detected");
235
+ safeError(timeoutError);
236
+ }, TAIL_TIMEOUT_MS);
237
+ };
238
+ try {
239
+ // Start the timeout timer - will fire in 20s if no tail received
240
+ resetTimeoutTimer();
241
+ const connection = await getConnection();
242
+ // Build query string
243
+ const queryParams = new URLSearchParams();
244
+ const { as, ...readParams } = args ?? {};
245
+ if (readParams.seq_num !== undefined)
246
+ queryParams.set("seq_num", readParams.seq_num.toString());
247
+ if (readParams.timestamp !== undefined)
248
+ queryParams.set("timestamp", readParams.timestamp.toString());
249
+ if (readParams.tail_offset !== undefined)
250
+ queryParams.set("tail_offset", readParams.tail_offset.toString());
251
+ if (readParams.count !== undefined)
252
+ queryParams.set("count", readParams.count.toString());
253
+ if (readParams.bytes !== undefined)
254
+ queryParams.set("bytes", readParams.bytes.toString());
255
+ if (readParams.wait !== undefined)
256
+ queryParams.set("wait", readParams.wait.toString());
257
+ if (typeof readParams.until === "number") {
258
+ queryParams.set("until", readParams.until.toString());
259
+ }
260
+ const queryString = queryParams.toString();
261
+ const path = `${url.pathname}/streams/${encodeURIComponent(streamName)}/records${queryString ? `?${queryString}` : ""}`;
262
+ const fullUrl = `${url.protocol}//${url.host}${path}`;
263
+ // Get auth token
264
+ const token = await getAuthToken(authProvider);
265
+ // Build headers
266
+ // Note: We include both :authority (HTTP/2 pseudo-header) and host (for proxy compatibility)
267
+ const headers = {
268
+ ":method": "GET",
269
+ ":path": path,
270
+ ":scheme": url.protocol.slice(0, -1),
271
+ ":authority": url.host,
272
+ host: url.host, // Some proxies (like Fly.io) may need this for proper forwarding
273
+ "user-agent": DEFAULT_USER_AGENT,
274
+ authorization: `Bearer ${token}`,
275
+ accept: "application/protobuf",
276
+ "content-type": "s2s/proto",
277
+ ...(basinName ? { "s2-basin": basinName } : {}),
278
+ };
279
+ // Sign headers if using PKI auth
280
+ await signHeadersIfPki(authProvider, headers, "GET", fullUrl);
281
+ const stream = connection.request(headers);
282
+ http2Stream = stream;
283
+ options?.signal?.addEventListener("abort", () => {
284
+ if (!stream.closed) {
285
+ stream.close();
286
+ }
287
+ });
288
+ stream.on("response", (headers) => {
289
+ // Cache the status.
290
+ // This informs whether we should attempt to parse s2s frames in the "data" handler.
291
+ responseCode = headers[":status"] ?? 500;
292
+ });
293
+ connection.on("goaway", (errorCode, lastStreamID, opaqueData) => {
294
+ debug("received GOAWAY from server");
295
+ });
296
+ stream.on("error", (err) => {
297
+ safeError(err);
298
+ });
299
+ stream.on("data", (chunk) => {
300
+ try {
301
+ const status = responseCode ?? 500;
302
+ if (status >= 400) {
303
+ const errorText = textDecoder.decode(chunk);
304
+ debug("error response: status=%d body=%s", status, errorText);
305
+ if (status === 416) {
306
+ try {
307
+ const errorJson = JSON.parse(errorText);
308
+ safeError(new RangeNotSatisfiableError({
309
+ status,
310
+ code: errorJson.code,
311
+ tail: errorJson.tail,
312
+ }));
313
+ }
314
+ catch {
315
+ safeError(new RangeNotSatisfiableError({ status }));
316
+ }
317
+ return;
318
+ }
319
+ try {
320
+ const errorJson = JSON.parse(errorText);
321
+ safeError(new S2Error({
322
+ message: errorJson.message ?? "Unknown error",
323
+ code: errorJson.code,
324
+ status,
325
+ origin: "server",
326
+ }));
327
+ }
328
+ catch {
329
+ safeError(new S2Error({
330
+ message: errorText || "Unknown error",
331
+ status,
332
+ origin: "server",
333
+ }));
334
+ }
335
+ return;
336
+ }
337
+ // Buffer already extends Uint8Array in Node.js, no need to convert
338
+ parser.push(chunk);
339
+ let frame = parser.parseFrame();
340
+ while (frame) {
341
+ if (frame.terminal) {
342
+ if (frame.statusCode && frame.statusCode >= 400) {
343
+ const errorText = textDecoder.decode(frame.body);
344
+ try {
345
+ const errorJson = JSON.parse(errorText);
346
+ const status = frame.statusCode ?? 500;
347
+ // Map known read errors
348
+ if (status === 416) {
349
+ safeError(new RangeNotSatisfiableError({
350
+ status,
351
+ code: errorJson.code,
352
+ tail: errorJson.tail,
353
+ }));
354
+ }
355
+ else {
356
+ safeError(makeServerError({ status, statusText: undefined }, errorJson));
357
+ }
358
+ }
359
+ catch {
360
+ safeError(makeServerError({
361
+ status: frame.statusCode ?? 500,
362
+ statusText: undefined,
363
+ }, errorText));
364
+ }
365
+ }
366
+ else {
367
+ safeClose();
368
+ }
369
+ stream.close();
370
+ }
371
+ else {
372
+ // Parse ReadBatch
373
+ try {
374
+ const protoBatch = Proto.ReadBatch.fromBinary(frame.body);
375
+ resetTimeoutTimer();
376
+ // Update tail from batch
377
+ if (protoBatch.tail) {
378
+ const tail = convertStreamPosition(protoBatch.tail);
379
+ lastReadPosition = tail;
380
+ this._lastReadPosition = tail;
381
+ this._lastObservedTail = tail;
382
+ debug("received tail");
383
+ }
384
+ // Enqueue each record and track next position
385
+ for (const record of protoBatch.records) {
386
+ const converted = this.convertRecord(record, as ?? "string", textDecoder);
387
+ controller.enqueue({ ok: true, value: converted });
388
+ // Update next read position to after this record
389
+ if (record.seqNum !== undefined) {
390
+ this._nextReadPosition = {
391
+ seq_num: Number(record.seqNum) + 1,
392
+ timestamp: Number(record.timestamp ?? 0n),
393
+ };
394
+ }
395
+ }
396
+ }
397
+ catch (err) {
398
+ safeError(new S2Error({
399
+ message: `Failed to parse ReadBatch: ${err}`,
400
+ status: 500,
401
+ origin: "sdk",
402
+ }));
403
+ }
404
+ }
405
+ frame = parser.parseFrame();
406
+ }
407
+ }
408
+ catch (error) {
409
+ safeError(error instanceof S2Error
410
+ ? error
411
+ : new S2Error({
412
+ message: `Failed to process read data: ${error}`,
413
+ status: 500,
414
+ origin: "sdk",
415
+ }));
416
+ }
417
+ });
418
+ stream.on("end", () => {
419
+ if (stream.rstCode != 0) {
420
+ debug("stream reset code=%d", stream.rstCode);
421
+ safeError(new S2Error({
422
+ message: `Stream ended with error: ${stream.rstCode}`,
423
+ status: 500,
424
+ code: "stream reset",
425
+ origin: "sdk",
426
+ }));
427
+ }
428
+ });
429
+ stream.on("close", () => {
430
+ if (parser.hasData()) {
431
+ safeError(new S2Error({
432
+ message: "Stream closed with unparsed data remaining",
433
+ status: 500,
434
+ code: "STREAM_CLOSED_PREMATURELY",
435
+ origin: "sdk",
436
+ }));
437
+ }
438
+ else {
439
+ safeClose();
440
+ }
441
+ });
442
+ }
443
+ catch (err) {
444
+ safeError(err);
445
+ }
446
+ },
447
+ cancel: async () => {
448
+ if (http2Stream && !http2Stream.closed) {
449
+ http2Stream.close();
450
+ }
451
+ },
452
+ });
453
+ this.streamName = streamName;
454
+ this.args = args;
455
+ this.authProvider = authProvider;
456
+ this.url = url;
457
+ this.options = options;
458
+ this.getConnection = getConnection;
459
+ this.basinName = basinName;
460
+ // Assign parser to instance property after super() completes
461
+ this.parser = parser;
462
+ this.http2Stream = http2Stream;
463
+ }
464
+ /**
465
+ * Convert a protobuf SequencedRecord to the requested format
466
+ */
467
+ convertRecord(record, format, textDecoder) {
468
+ if (format === "bytes") {
469
+ return {
470
+ seq_num: Number(record.seqNum),
471
+ timestamp: Number(record.timestamp),
472
+ headers: record.headers?.map((h) => [h.name ?? new Uint8Array(), h.value ?? new Uint8Array()]),
473
+ body: record.body,
474
+ };
475
+ }
476
+ else {
477
+ // Convert to string format with object headers
478
+ const headerEntries = record.headers?.map((h) => [
479
+ h.name ? textDecoder.decode(h.name) : "",
480
+ h.value ? textDecoder.decode(h.value) : "",
481
+ ]);
482
+ return {
483
+ seq_num: Number(record.seqNum),
484
+ timestamp: Number(record.timestamp),
485
+ headers: headerEntries ? Object.fromEntries(headerEntries) : undefined,
486
+ body: record.body ? textDecoder.decode(record.body) : undefined,
487
+ };
488
+ }
489
+ }
490
+ async [Symbol.asyncDispose]() {
491
+ await this.cancel("disposed");
492
+ }
493
+ // Polyfill for older browsers / Node.js environments
494
+ [Symbol.asyncIterator]() {
495
+ const proto = ReadableStream.prototype;
496
+ const fn = proto[Symbol.asyncIterator];
497
+ if (typeof fn === "function")
498
+ return fn.call(this);
499
+ const reader = this.getReader();
500
+ return {
501
+ next: async () => {
502
+ const r = await reader.read();
503
+ if (r.done) {
504
+ reader.releaseLock();
505
+ return { done: true, value: undefined };
506
+ }
507
+ return { done: false, value: r.value };
508
+ },
509
+ throw: async (e) => {
510
+ await reader.cancel(e);
511
+ reader.releaseLock();
512
+ return { done: true, value: undefined };
513
+ },
514
+ return: async () => {
515
+ await reader.cancel("done");
516
+ reader.releaseLock();
517
+ return { done: true, value: undefined };
518
+ },
519
+ [Symbol.asyncIterator]() {
520
+ return this;
521
+ },
522
+ };
523
+ }
524
+ nextReadPosition() {
525
+ return this._nextReadPosition;
526
+ }
527
+ lastObservedTail() {
528
+ return this._lastObservedTail;
529
+ }
530
+ }
531
+ /**
532
+ * AcksStream for S2S append session
533
+ */
534
+ // Removed S2SAcksStream - transport sessions no longer expose streams
535
+ /**
536
+ * S2S-based transport session for appending records via HTTP/2.
537
+ * Pipelined: multiple requests can be in-flight simultaneously.
538
+ * No backpressure, no retry logic, no streams - just submit/close with value-encoded errors.
539
+ */
540
+ class S2SAppendSession {
541
+ baseUrl;
542
+ authProvider;
543
+ streamName;
544
+ getConnection;
545
+ basinName;
546
+ options;
547
+ http2Stream;
548
+ parser = new S2SFrameParser();
549
+ closed = false;
550
+ pendingAcks = [];
551
+ initPromise;
552
+ static async create(baseUrl, authProvider, streamName, getConnection, basinName, sessionOptions, requestOptions) {
553
+ return new S2SAppendSession(baseUrl, authProvider, streamName, getConnection, basinName, sessionOptions, requestOptions);
554
+ }
555
+ constructor(baseUrl, authProvider, streamName, getConnection, basinName, sessionOptions, options) {
556
+ this.baseUrl = baseUrl;
557
+ this.authProvider = authProvider;
558
+ this.streamName = streamName;
559
+ this.getConnection = getConnection;
560
+ this.basinName = basinName;
561
+ this.options = options;
562
+ // No stream setup
563
+ // Initialization happens lazily on first submit
564
+ }
565
+ async initializeStream() {
566
+ const url = new URL(this.baseUrl);
567
+ const connection = await this.getConnection();
568
+ const path = `${url.pathname}/streams/${encodeURIComponent(this.streamName)}/records`;
569
+ const fullUrl = `${url.protocol}//${url.host}${path}`;
570
+ // Get auth token
571
+ const token = await getAuthToken(this.authProvider);
572
+ // Build headers
573
+ // Note: We include both :authority (HTTP/2 pseudo-header) and host (for proxy compatibility)
574
+ const headers = {
575
+ ":method": "POST",
576
+ ":path": path,
577
+ ":scheme": url.protocol.slice(0, -1),
578
+ ":authority": url.host,
579
+ host: url.host, // Some proxies (like Fly.io) may need this for proper forwarding
580
+ "user-agent": DEFAULT_USER_AGENT,
581
+ authorization: `Bearer ${token}`,
582
+ "content-type": "s2s/proto",
583
+ accept: "application/protobuf",
584
+ ...(this.basinName ? { "s2-basin": this.basinName } : {}),
585
+ };
586
+ // Sign headers if using PKI auth
587
+ await signHeadersIfPki(this.authProvider, headers, "POST", fullUrl);
588
+ const stream = connection.request(headers);
589
+ this.http2Stream = stream;
590
+ this.options?.signal?.addEventListener("abort", () => {
591
+ if (!stream.closed) {
592
+ stream.close();
593
+ }
594
+ });
595
+ const textDecoder = new TextDecoder();
596
+ let responseCode;
597
+ const safeError = (error) => {
598
+ // Resolve all pending acks with error result
599
+ for (const pending of this.pendingAcks) {
600
+ pending.resolve(err(s2Error(error)));
601
+ }
602
+ this.pendingAcks = [];
603
+ };
604
+ // Capture HTTP response status
605
+ stream.on("response", (headers) => {
606
+ responseCode = headers[":status"] ?? 500;
607
+ });
608
+ // Handle incoming data (acks or error response)
609
+ stream.on("data", (chunk) => {
610
+ try {
611
+ // Check for HTTP-level errors first (before s2s frame parsing)
612
+ if ((responseCode ?? 200) >= 400) {
613
+ const errorText = textDecoder.decode(chunk);
614
+ try {
615
+ const errorJson = JSON.parse(errorText);
616
+ safeError(new S2Error({
617
+ message: errorJson.message ?? "Unknown error",
618
+ code: errorJson.code,
619
+ status: responseCode,
620
+ origin: "server",
621
+ }));
622
+ }
623
+ catch {
624
+ safeError(new S2Error({
625
+ message: errorText || "Unknown error",
626
+ status: responseCode,
627
+ origin: "server",
628
+ }));
629
+ }
630
+ return;
631
+ }
632
+ this.parser.push(chunk);
633
+ let frame = this.parser.parseFrame();
634
+ while (frame) {
635
+ if (frame.terminal) {
636
+ if (frame.statusCode && frame.statusCode >= 400) {
637
+ const errorText = textDecoder.decode(frame.body);
638
+ const status = frame.statusCode ?? 500;
639
+ try {
640
+ const errorJson = JSON.parse(errorText);
641
+ const err = status === 412
642
+ ? makeAppendPreconditionError(status, errorJson)
643
+ : makeServerError({ status, statusText: undefined }, errorJson);
644
+ queueMicrotask(() => safeError(err));
645
+ }
646
+ catch {
647
+ const err = makeServerError({ status, statusText: undefined }, errorText);
648
+ queueMicrotask(() => safeError(err));
649
+ }
650
+ }
651
+ stream.close();
652
+ }
653
+ else {
654
+ // Parse AppendAck
655
+ try {
656
+ const protoAck = Proto.AppendAck.fromBinary(frame.body);
657
+ const ack = convertAppendAck(protoAck);
658
+ // Resolve the pending ack promise (FIFO)
659
+ const pending = this.pendingAcks.shift();
660
+ if (pending) {
661
+ pending.resolve(ok(ack));
662
+ }
663
+ }
664
+ catch (parseErr) {
665
+ queueMicrotask(() => safeError(new S2Error({
666
+ message: `Failed to parse AppendAck: ${parseErr}`,
667
+ status: 500,
668
+ })));
669
+ }
670
+ }
671
+ frame = this.parser.parseFrame();
672
+ }
673
+ }
674
+ catch (error) {
675
+ queueMicrotask(() => safeError(error));
676
+ }
677
+ });
678
+ stream.on("error", (streamErr) => {
679
+ queueMicrotask(() => safeError(streamErr));
680
+ });
681
+ stream.on("close", () => {
682
+ // Stream closed - resolve any remaining pending acks with error
683
+ // This can happen if the server closes the stream without sending all acks
684
+ if (this.pendingAcks.length > 0) {
685
+ queueMicrotask(() => safeError(new S2Error({
686
+ message: "Stream closed with pending acks",
687
+ status: 502,
688
+ code: "BAD_GATEWAY",
689
+ })));
690
+ }
691
+ });
692
+ }
693
+ /**
694
+ * Send a batch and wait for ack. Returns AppendResult (never throws).
695
+ * Pipelined: multiple sends can be in-flight; acks resolve FIFO.
696
+ */
697
+ sendBatch(input) {
698
+ if (!this.http2Stream || this.http2Stream.closed) {
699
+ return Promise.resolve(err(new S2Error({ message: "HTTP/2 stream is not open", status: 502 })));
700
+ }
701
+ // Convert to protobuf AppendInput
702
+ const bodyBytes = encodeProtoAppendInput(input);
703
+ // Frame the message
704
+ const frame = frameMessage({
705
+ terminal: false,
706
+ body: bodyBytes,
707
+ });
708
+ // Track pending ack - this promise resolves when the ack is received (FIFO)
709
+ return new Promise((resolve) => {
710
+ this.pendingAcks.push({
711
+ resolve,
712
+ batchSize: input.meteredBytes,
713
+ });
714
+ // Send the frame (pipelined - non-blocking)
715
+ this.http2Stream.write(frame, (writeErr) => {
716
+ if (writeErr) {
717
+ // Remove from pending acks on write error
718
+ const idx = this.pendingAcks.findIndex((p) => p.resolve === resolve);
719
+ if (idx !== -1) {
720
+ this.pendingAcks.splice(idx, 1);
721
+ }
722
+ // Resolve with error result
723
+ resolve(err(s2Error(writeErr)));
724
+ }
725
+ // Write completed successfully - promise resolves later when ack is received
726
+ });
727
+ });
728
+ }
729
+ /**
730
+ * Close the append session.
731
+ * Waits for all pending appends to complete before resolving.
732
+ * Never throws - returns CloseResult.
733
+ */
734
+ async close() {
735
+ try {
736
+ this.closed = true;
737
+ // Wait for all pending acks to complete
738
+ while (this.pendingAcks.length > 0) {
739
+ await new Promise((resolve) => setTimeout(resolve, 10));
740
+ }
741
+ // Close the HTTP/2 stream (client doesn't send terminal frame for clean close)
742
+ if (this.http2Stream && !this.http2Stream.closed) {
743
+ this.http2Stream.end();
744
+ }
745
+ return okClose();
746
+ }
747
+ catch (error) {
748
+ return errClose(s2Error(error));
749
+ }
750
+ }
751
+ /**
752
+ * Submit an append request to the session.
753
+ * Returns AppendResult (never throws).
754
+ * Pipelined: multiple submits can be in-flight; acks resolve FIFO.
755
+ */
756
+ async submit(input) {
757
+ // Validate closed state
758
+ if (this.closed) {
759
+ return err(new S2Error({ message: "AppendSession is closed", status: 400 }));
760
+ }
761
+ // Lazy initialize HTTP/2 stream on first submit
762
+ if (!this.initPromise) {
763
+ this.initPromise = this.initializeStream();
764
+ }
765
+ try {
766
+ await this.initPromise;
767
+ }
768
+ catch (initErr) {
769
+ return err(s2Error(initErr));
770
+ }
771
+ const recordsArray = Array.from(input.records);
772
+ // Validate batch size limits (non-retryable 400-level error)
773
+ // Note: This should already be validated by AppendInput.create(), but we check defensively
774
+ if (recordsArray.length > 1000) {
775
+ return err(new S2Error({
776
+ message: `Batch of ${recordsArray.length} exceeds maximum batch size of 1000 records`,
777
+ status: 400,
778
+ code: "INVALID_ARGUMENT",
779
+ }));
780
+ }
781
+ if (input.meteredBytes > 1024 * 1024) {
782
+ return err(new S2Error({
783
+ message: `Batch size ${input.meteredBytes} bytes exceeds maximum of 1 MiB (1048576 bytes)`,
784
+ status: 400,
785
+ code: "INVALID_ARGUMENT",
786
+ }));
787
+ }
788
+ return this.sendBatch(input);
789
+ }
790
+ }
791
+ /**
792
+ * Convert protobuf StreamPosition to API StreamPosition (internal use)
793
+ */
794
+ function convertStreamPosition(proto) {
795
+ return {
796
+ seq_num: Number(proto.seqNum),
797
+ timestamp: Number(proto.timestamp),
798
+ };
799
+ }
800
+ /**
801
+ * Convert API StreamPosition to SDK StreamPosition (public interface)
802
+ */
803
+ function toSDKStreamPosition(pos) {
804
+ return {
805
+ seqNum: pos.seq_num,
806
+ timestamp: new Date(pos.timestamp),
807
+ };
808
+ }
809
+ function convertAppendAck(proto) {
810
+ if (!proto.start || !proto.end || !proto.tail) {
811
+ throw new Error("Invariant violation: AppendAck is missing required fields");
812
+ }
813
+ return {
814
+ start: toSDKStreamPosition(convertStreamPosition(proto.start)),
815
+ end: toSDKStreamPosition(convertStreamPosition(proto.end)),
816
+ tail: toSDKStreamPosition(convertStreamPosition(proto.tail)),
817
+ };
818
+ }
819
+ //# sourceMappingURL=index.js.map