@dotdo/postgres 0.1.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 (1129) hide show
  1. package/README.md +868 -0
  2. package/dist/cdc/change-stream.d.ts +44 -0
  3. package/dist/cdc/change-stream.d.ts.map +1 -0
  4. package/dist/cdc/change-stream.js +95 -0
  5. package/dist/cdc/change-stream.js.map +1 -0
  6. package/dist/cdc/filter.d.ts +58 -0
  7. package/dist/cdc/filter.d.ts.map +1 -0
  8. package/dist/cdc/filter.js +520 -0
  9. package/dist/cdc/filter.js.map +1 -0
  10. package/dist/cdc/index.d.ts +47 -0
  11. package/dist/cdc/index.d.ts.map +1 -0
  12. package/dist/cdc/index.js +50 -0
  13. package/dist/cdc/index.js.map +1 -0
  14. package/dist/cdc/resume-token.d.ts +60 -0
  15. package/dist/cdc/resume-token.d.ts.map +1 -0
  16. package/dist/cdc/resume-token.js +228 -0
  17. package/dist/cdc/resume-token.js.map +1 -0
  18. package/dist/cdc/transport/index.d.ts +7 -0
  19. package/dist/cdc/transport/index.d.ts.map +1 -0
  20. package/dist/cdc/transport/index.js +7 -0
  21. package/dist/cdc/transport/index.js.map +1 -0
  22. package/dist/cdc/transport/sse.d.ts +120 -0
  23. package/dist/cdc/transport/sse.d.ts.map +1 -0
  24. package/dist/cdc/transport/sse.js +590 -0
  25. package/dist/cdc/transport/sse.js.map +1 -0
  26. package/dist/cdc/transport/websocket.d.ts +130 -0
  27. package/dist/cdc/transport/websocket.d.ts.map +1 -0
  28. package/dist/cdc/transport/websocket.js +688 -0
  29. package/dist/cdc/transport/websocket.js.map +1 -0
  30. package/dist/cdc/types.d.ts +306 -0
  31. package/dist/cdc/types.d.ts.map +1 -0
  32. package/dist/cdc/types.js +8 -0
  33. package/dist/cdc/types.js.map +1 -0
  34. package/dist/config/index.d.ts +25 -0
  35. package/dist/config/index.d.ts.map +1 -0
  36. package/dist/config/index.js +25 -0
  37. package/dist/config/index.js.map +1 -0
  38. package/dist/config/memory.d.ts +139 -0
  39. package/dist/config/memory.d.ts.map +1 -0
  40. package/dist/config/memory.js +157 -0
  41. package/dist/config/memory.js.map +1 -0
  42. package/dist/config/storage.d.ts +157 -0
  43. package/dist/config/storage.d.ts.map +1 -0
  44. package/dist/config/storage.js +178 -0
  45. package/dist/config/storage.js.map +1 -0
  46. package/dist/config/streaming.d.ts +117 -0
  47. package/dist/config/streaming.d.ts.map +1 -0
  48. package/dist/config/streaming.js +132 -0
  49. package/dist/config/streaming.js.map +1 -0
  50. package/dist/config/timeouts.d.ts +168 -0
  51. package/dist/config/timeouts.d.ts.map +1 -0
  52. package/dist/config/timeouts.js +192 -0
  53. package/dist/config/timeouts.js.map +1 -0
  54. package/dist/extensions/config.d.ts +89 -0
  55. package/dist/extensions/config.d.ts.map +1 -0
  56. package/dist/extensions/config.js +216 -0
  57. package/dist/extensions/config.js.map +1 -0
  58. package/dist/extensions/geo.d.ts +452 -0
  59. package/dist/extensions/geo.d.ts.map +1 -0
  60. package/dist/extensions/geo.js +583 -0
  61. package/dist/extensions/geo.js.map +1 -0
  62. package/dist/extensions/index.d.ts +167 -0
  63. package/dist/extensions/index.d.ts.map +1 -0
  64. package/dist/extensions/index.js +99 -0
  65. package/dist/extensions/index.js.map +1 -0
  66. package/dist/extensions/loader.d.ts +226 -0
  67. package/dist/extensions/loader.d.ts.map +1 -0
  68. package/dist/extensions/loader.js +456 -0
  69. package/dist/extensions/loader.js.map +1 -0
  70. package/dist/extensions/pgmq-lite.d.ts +330 -0
  71. package/dist/extensions/pgmq-lite.d.ts.map +1 -0
  72. package/dist/extensions/pgmq-lite.js +648 -0
  73. package/dist/extensions/pgmq-lite.js.map +1 -0
  74. package/dist/extensions/plugins.d.ts +260 -0
  75. package/dist/extensions/plugins.d.ts.map +1 -0
  76. package/dist/extensions/plugins.js +535 -0
  77. package/dist/extensions/plugins.js.map +1 -0
  78. package/dist/extensions/registry.d.ts +93 -0
  79. package/dist/extensions/registry.d.ts.map +1 -0
  80. package/dist/extensions/registry.js +182 -0
  81. package/dist/extensions/registry.js.map +1 -0
  82. package/dist/extensions/vector.d.ts +106 -0
  83. package/dist/extensions/vector.d.ts.map +1 -0
  84. package/dist/extensions/vector.js +129 -0
  85. package/dist/extensions/vector.js.map +1 -0
  86. package/dist/iceberg/analytics.d.ts +279 -0
  87. package/dist/iceberg/analytics.d.ts.map +1 -0
  88. package/dist/iceberg/analytics.js +448 -0
  89. package/dist/iceberg/analytics.js.map +1 -0
  90. package/dist/iceberg/catalog-api.d.ts +39 -0
  91. package/dist/iceberg/catalog-api.d.ts.map +1 -0
  92. package/dist/iceberg/catalog-api.js +388 -0
  93. package/dist/iceberg/catalog-api.js.map +1 -0
  94. package/dist/iceberg/catalog.d.ts +401 -0
  95. package/dist/iceberg/catalog.d.ts.map +1 -0
  96. package/dist/iceberg/catalog.js +677 -0
  97. package/dist/iceberg/catalog.js.map +1 -0
  98. package/dist/iceberg/duckdb-wasm.d.ts +447 -0
  99. package/dist/iceberg/duckdb-wasm.d.ts.map +1 -0
  100. package/dist/iceberg/duckdb-wasm.js +600 -0
  101. package/dist/iceberg/duckdb-wasm.js.map +1 -0
  102. package/dist/iceberg/index.d.ts +92 -0
  103. package/dist/iceberg/index.d.ts.map +1 -0
  104. package/dist/iceberg/index.js +119 -0
  105. package/dist/iceberg/index.js.map +1 -0
  106. package/dist/iceberg/metadata.d.ts +214 -0
  107. package/dist/iceberg/metadata.d.ts.map +1 -0
  108. package/dist/iceberg/metadata.js +535 -0
  109. package/dist/iceberg/metadata.js.map +1 -0
  110. package/dist/iceberg/optimizer.d.ts +296 -0
  111. package/dist/iceberg/optimizer.d.ts.map +1 -0
  112. package/dist/iceberg/optimizer.js +889 -0
  113. package/dist/iceberg/optimizer.js.map +1 -0
  114. package/dist/iceberg/parquet.d.ts +447 -0
  115. package/dist/iceberg/parquet.d.ts.map +1 -0
  116. package/dist/iceberg/parquet.js +1225 -0
  117. package/dist/iceberg/parquet.js.map +1 -0
  118. package/dist/iceberg/r2-organization.d.ts +422 -0
  119. package/dist/iceberg/r2-organization.d.ts.map +1 -0
  120. package/dist/iceberg/r2-organization.js +672 -0
  121. package/dist/iceberg/r2-organization.js.map +1 -0
  122. package/dist/iceberg/scheduler-do-example.d.ts +158 -0
  123. package/dist/iceberg/scheduler-do-example.d.ts.map +1 -0
  124. package/dist/iceberg/scheduler-do-example.js +261 -0
  125. package/dist/iceberg/scheduler-do-example.js.map +1 -0
  126. package/dist/iceberg/scheduler.d.ts +434 -0
  127. package/dist/iceberg/scheduler.d.ts.map +1 -0
  128. package/dist/iceberg/scheduler.js +818 -0
  129. package/dist/iceberg/scheduler.js.map +1 -0
  130. package/dist/iceberg/schema.d.ts +149 -0
  131. package/dist/iceberg/schema.d.ts.map +1 -0
  132. package/dist/iceberg/schema.js +525 -0
  133. package/dist/iceberg/schema.js.map +1 -0
  134. package/dist/iceberg/snapshot-manager.d.ts +406 -0
  135. package/dist/iceberg/snapshot-manager.d.ts.map +1 -0
  136. package/dist/iceberg/snapshot-manager.js +934 -0
  137. package/dist/iceberg/snapshot-manager.js.map +1 -0
  138. package/dist/iceberg/sql-router.d.ts +194 -0
  139. package/dist/iceberg/sql-router.d.ts.map +1 -0
  140. package/dist/iceberg/sql-router.js +180 -0
  141. package/dist/iceberg/sql-router.js.map +1 -0
  142. package/dist/iceberg/test-fixtures.d.ts +151 -0
  143. package/dist/iceberg/test-fixtures.d.ts.map +1 -0
  144. package/dist/iceberg/test-fixtures.js +446 -0
  145. package/dist/iceberg/test-fixtures.js.map +1 -0
  146. package/dist/iceberg/time-travel-api.d.ts +102 -0
  147. package/dist/iceberg/time-travel-api.d.ts.map +1 -0
  148. package/dist/iceberg/time-travel-api.js +437 -0
  149. package/dist/iceberg/time-travel-api.js.map +1 -0
  150. package/dist/iceberg/time-travel.d.ts +293 -0
  151. package/dist/iceberg/time-travel.d.ts.map +1 -0
  152. package/dist/iceberg/time-travel.js +689 -0
  153. package/dist/iceberg/time-travel.js.map +1 -0
  154. package/dist/iceberg/transformer.d.ts +356 -0
  155. package/dist/iceberg/transformer.d.ts.map +1 -0
  156. package/dist/iceberg/transformer.js +770 -0
  157. package/dist/iceberg/transformer.js.map +1 -0
  158. package/dist/iceberg/types.d.ts +318 -0
  159. package/dist/iceberg/types.d.ts.map +1 -0
  160. package/dist/iceberg/types.js +9 -0
  161. package/dist/iceberg/types.js.map +1 -0
  162. package/dist/iceberg/writer.d.ts +144 -0
  163. package/dist/iceberg/writer.d.ts.map +1 -0
  164. package/dist/iceberg/writer.js +452 -0
  165. package/dist/iceberg/writer.js.map +1 -0
  166. package/dist/index.d.ts +50 -0
  167. package/dist/index.d.ts.map +1 -0
  168. package/dist/index.js +69 -0
  169. package/dist/index.js.map +1 -0
  170. package/dist/lineage/index.d.ts +11 -0
  171. package/dist/lineage/index.d.ts.map +1 -0
  172. package/dist/lineage/index.js +11 -0
  173. package/dist/lineage/index.js.map +1 -0
  174. package/dist/lineage/integration.d.ts +134 -0
  175. package/dist/lineage/integration.d.ts.map +1 -0
  176. package/dist/lineage/integration.js +258 -0
  177. package/dist/lineage/integration.js.map +1 -0
  178. package/dist/lineage/tracker.d.ts +189 -0
  179. package/dist/lineage/tracker.d.ts.map +1 -0
  180. package/dist/lineage/tracker.js +1352 -0
  181. package/dist/lineage/tracker.js.map +1 -0
  182. package/dist/lineage/types.d.ts +318 -0
  183. package/dist/lineage/types.d.ts.map +1 -0
  184. package/dist/lineage/types.js +9 -0
  185. package/dist/lineage/types.js.map +1 -0
  186. package/dist/middleware/index.d.ts +11 -0
  187. package/dist/middleware/index.d.ts.map +1 -0
  188. package/dist/middleware/index.js +16 -0
  189. package/dist/middleware/index.js.map +1 -0
  190. package/dist/middleware/rate-limit.d.ts +397 -0
  191. package/dist/middleware/rate-limit.d.ts.map +1 -0
  192. package/dist/middleware/rate-limit.js +507 -0
  193. package/dist/middleware/rate-limit.js.map +1 -0
  194. package/dist/migration-tooling/external-migration.d.ts +601 -0
  195. package/dist/migration-tooling/external-migration.d.ts.map +1 -0
  196. package/dist/migration-tooling/external-migration.js +1612 -0
  197. package/dist/migration-tooling/external-migration.js.map +1 -0
  198. package/dist/migration-tooling/index.d.ts +19 -0
  199. package/dist/migration-tooling/index.d.ts.map +1 -0
  200. package/dist/migration-tooling/index.js +19 -0
  201. package/dist/migration-tooling/index.js.map +1 -0
  202. package/dist/migrations/auto-migrator.d.ts +289 -0
  203. package/dist/migrations/auto-migrator.d.ts.map +1 -0
  204. package/dist/migrations/auto-migrator.js +396 -0
  205. package/dist/migrations/auto-migrator.js.map +1 -0
  206. package/dist/migrations/bulk-orchestrator.d.ts +403 -0
  207. package/dist/migrations/bulk-orchestrator.d.ts.map +1 -0
  208. package/dist/migrations/bulk-orchestrator.js +646 -0
  209. package/dist/migrations/bulk-orchestrator.js.map +1 -0
  210. package/dist/migrations/compatibility.d.ts +216 -0
  211. package/dist/migrations/compatibility.d.ts.map +1 -0
  212. package/dist/migrations/compatibility.js +651 -0
  213. package/dist/migrations/compatibility.js.map +1 -0
  214. package/dist/migrations/do-migrations.d.ts +101 -0
  215. package/dist/migrations/do-migrations.d.ts.map +1 -0
  216. package/dist/migrations/do-migrations.js +1060 -0
  217. package/dist/migrations/do-migrations.js.map +1 -0
  218. package/dist/migrations/do-migrations.types.d.ts +550 -0
  219. package/dist/migrations/do-migrations.types.d.ts.map +1 -0
  220. package/dist/migrations/do-migrations.types.js +15 -0
  221. package/dist/migrations/do-migrations.types.js.map +1 -0
  222. package/dist/migrations/drizzle-compat.d.ts +163 -0
  223. package/dist/migrations/drizzle-compat.d.ts.map +1 -0
  224. package/dist/migrations/drizzle-compat.js +273 -0
  225. package/dist/migrations/drizzle-compat.js.map +1 -0
  226. package/dist/migrations/index.d.ts +109 -0
  227. package/dist/migrations/index.d.ts.map +1 -0
  228. package/dist/migrations/index.js +127 -0
  229. package/dist/migrations/index.js.map +1 -0
  230. package/dist/migrations/migration-api.d.ts +161 -0
  231. package/dist/migrations/migration-api.d.ts.map +1 -0
  232. package/dist/migrations/migration-api.js +499 -0
  233. package/dist/migrations/migration-api.js.map +1 -0
  234. package/dist/migrations/progress-tracker-do.d.ts +195 -0
  235. package/dist/migrations/progress-tracker-do.d.ts.map +1 -0
  236. package/dist/migrations/progress-tracker-do.js +339 -0
  237. package/dist/migrations/progress-tracker-do.js.map +1 -0
  238. package/dist/migrations/progress-tracker-kv.d.ts +103 -0
  239. package/dist/migrations/progress-tracker-kv.d.ts.map +1 -0
  240. package/dist/migrations/progress-tracker-kv.js +231 -0
  241. package/dist/migrations/progress-tracker-kv.js.map +1 -0
  242. package/dist/migrations/progress-tracker.d.ts +320 -0
  243. package/dist/migrations/progress-tracker.d.ts.map +1 -0
  244. package/dist/migrations/progress-tracker.js +443 -0
  245. package/dist/migrations/progress-tracker.js.map +1 -0
  246. package/dist/migrations/registry.d.ts +231 -0
  247. package/dist/migrations/registry.d.ts.map +1 -0
  248. package/dist/migrations/registry.js +376 -0
  249. package/dist/migrations/registry.js.map +1 -0
  250. package/dist/migrations/runner.d.ts +197 -0
  251. package/dist/migrations/runner.d.ts.map +1 -0
  252. package/dist/migrations/runner.js +1167 -0
  253. package/dist/migrations/runner.js.map +1 -0
  254. package/dist/migrations/schema-generator.d.ts +111 -0
  255. package/dist/migrations/schema-generator.d.ts.map +1 -0
  256. package/dist/migrations/schema-generator.js +335 -0
  257. package/dist/migrations/schema-generator.js.map +1 -0
  258. package/dist/migrations/testing.d.ts +321 -0
  259. package/dist/migrations/testing.d.ts.map +1 -0
  260. package/dist/migrations/testing.js +645 -0
  261. package/dist/migrations/testing.js.map +1 -0
  262. package/dist/migrations/types.d.ts +503 -0
  263. package/dist/migrations/types.d.ts.map +1 -0
  264. package/dist/migrations/types.js +11 -0
  265. package/dist/migrations/types.js.map +1 -0
  266. package/dist/migrations/validator.d.ts +215 -0
  267. package/dist/migrations/validator.d.ts.map +1 -0
  268. package/dist/migrations/validator.js +494 -0
  269. package/dist/migrations/validator.js.map +1 -0
  270. package/dist/observability/alerting.d.ts +116 -0
  271. package/dist/observability/alerting.d.ts.map +1 -0
  272. package/dist/observability/alerting.js +353 -0
  273. package/dist/observability/alerting.js.map +1 -0
  274. package/dist/observability/analytics-engine.d.ts +357 -0
  275. package/dist/observability/analytics-engine.d.ts.map +1 -0
  276. package/dist/observability/analytics-engine.js +430 -0
  277. package/dist/observability/analytics-engine.js.map +1 -0
  278. package/dist/observability/cost-metrics.d.ts +269 -0
  279. package/dist/observability/cost-metrics.d.ts.map +1 -0
  280. package/dist/observability/cost-metrics.js +560 -0
  281. package/dist/observability/cost-metrics.js.map +1 -0
  282. package/dist/observability/cross-do-tracing.d.ts +305 -0
  283. package/dist/observability/cross-do-tracing.d.ts.map +1 -0
  284. package/dist/observability/cross-do-tracing.js +431 -0
  285. package/dist/observability/cross-do-tracing.js.map +1 -0
  286. package/dist/observability/error-rate-collector.d.ts +163 -0
  287. package/dist/observability/error-rate-collector.d.ts.map +1 -0
  288. package/dist/observability/error-rate-collector.js +306 -0
  289. package/dist/observability/error-rate-collector.js.map +1 -0
  290. package/dist/observability/exporters.d.ts +231 -0
  291. package/dist/observability/exporters.d.ts.map +1 -0
  292. package/dist/observability/exporters.js +479 -0
  293. package/dist/observability/exporters.js.map +1 -0
  294. package/dist/observability/health-check.d.ts +106 -0
  295. package/dist/observability/health-check.d.ts.map +1 -0
  296. package/dist/observability/health-check.js +243 -0
  297. package/dist/observability/health-check.js.map +1 -0
  298. package/dist/observability/index.d.ts +297 -0
  299. package/dist/observability/index.d.ts.map +1 -0
  300. package/dist/observability/index.js +455 -0
  301. package/dist/observability/index.js.map +1 -0
  302. package/dist/observability/instrumentation.d.ts +222 -0
  303. package/dist/observability/instrumentation.d.ts.map +1 -0
  304. package/dist/observability/instrumentation.js +532 -0
  305. package/dist/observability/instrumentation.js.map +1 -0
  306. package/dist/observability/memory-metrics.d.ts +227 -0
  307. package/dist/observability/memory-metrics.d.ts.map +1 -0
  308. package/dist/observability/memory-metrics.js +688 -0
  309. package/dist/observability/memory-metrics.js.map +1 -0
  310. package/dist/observability/metrics-endpoint.d.ts +91 -0
  311. package/dist/observability/metrics-endpoint.d.ts.map +1 -0
  312. package/dist/observability/metrics-endpoint.js +246 -0
  313. package/dist/observability/metrics-endpoint.js.map +1 -0
  314. package/dist/observability/metrics.d.ts +88 -0
  315. package/dist/observability/metrics.d.ts.map +1 -0
  316. package/dist/observability/metrics.js +253 -0
  317. package/dist/observability/metrics.js.map +1 -0
  318. package/dist/observability/observability-features.d.ts +488 -0
  319. package/dist/observability/observability-features.d.ts.map +1 -0
  320. package/dist/observability/observability-features.js +773 -0
  321. package/dist/observability/observability-features.js.map +1 -0
  322. package/dist/observability/prometheus.d.ts +39 -0
  323. package/dist/observability/prometheus.d.ts.map +1 -0
  324. package/dist/observability/prometheus.js +120 -0
  325. package/dist/observability/prometheus.js.map +1 -0
  326. package/dist/observability/propagation.d.ts +126 -0
  327. package/dist/observability/propagation.d.ts.map +1 -0
  328. package/dist/observability/propagation.js +234 -0
  329. package/dist/observability/propagation.js.map +1 -0
  330. package/dist/observability/query-latency.d.ts +243 -0
  331. package/dist/observability/query-latency.d.ts.map +1 -0
  332. package/dist/observability/query-latency.js +292 -0
  333. package/dist/observability/query-latency.js.map +1 -0
  334. package/dist/observability/query-performance.d.ts +169 -0
  335. package/dist/observability/query-performance.d.ts.map +1 -0
  336. package/dist/observability/query-performance.js +290 -0
  337. package/dist/observability/query-performance.js.map +1 -0
  338. package/dist/observability/storage-tier-metrics.d.ts +174 -0
  339. package/dist/observability/storage-tier-metrics.d.ts.map +1 -0
  340. package/dist/observability/storage-tier-metrics.js +306 -0
  341. package/dist/observability/storage-tier-metrics.js.map +1 -0
  342. package/dist/observability/tier-cost-optimizer.d.ts +155 -0
  343. package/dist/observability/tier-cost-optimizer.d.ts.map +1 -0
  344. package/dist/observability/tier-cost-optimizer.js +536 -0
  345. package/dist/observability/tier-cost-optimizer.js.map +1 -0
  346. package/dist/observability/tracer.d.ts +149 -0
  347. package/dist/observability/tracer.d.ts.map +1 -0
  348. package/dist/observability/tracer.js +435 -0
  349. package/dist/observability/tracer.js.map +1 -0
  350. package/dist/observability/types.d.ts +402 -0
  351. package/dist/observability/types.d.ts.map +1 -0
  352. package/dist/observability/types.js +103 -0
  353. package/dist/observability/types.js.map +1 -0
  354. package/dist/pglite/workers-pglite.d.ts +138 -0
  355. package/dist/pglite/workers-pglite.d.ts.map +1 -0
  356. package/dist/pglite/workers-pglite.js +143 -0
  357. package/dist/pglite/workers-pglite.js.map +1 -0
  358. package/dist/pglite-assets/pglite.data +0 -0
  359. package/dist/pglite-assets/pglite.wasm +0 -0
  360. package/dist/playground/index.d.ts +52 -0
  361. package/dist/playground/index.d.ts.map +1 -0
  362. package/dist/playground/index.js +55 -0
  363. package/dist/playground/index.js.map +1 -0
  364. package/dist/playground/keyboard-shortcuts.d.ts +116 -0
  365. package/dist/playground/keyboard-shortcuts.d.ts.map +1 -0
  366. package/dist/playground/keyboard-shortcuts.js +588 -0
  367. package/dist/playground/keyboard-shortcuts.js.map +1 -0
  368. package/dist/playground/playground.d.ts +82 -0
  369. package/dist/playground/playground.d.ts.map +1 -0
  370. package/dist/playground/playground.js +271 -0
  371. package/dist/playground/playground.js.map +1 -0
  372. package/dist/playground/query-executor.d.ts +115 -0
  373. package/dist/playground/query-executor.d.ts.map +1 -0
  374. package/dist/playground/query-executor.js +558 -0
  375. package/dist/playground/query-executor.js.map +1 -0
  376. package/dist/playground/query-history.d.ts +92 -0
  377. package/dist/playground/query-history.d.ts.map +1 -0
  378. package/dist/playground/query-history.js +259 -0
  379. package/dist/playground/query-history.js.map +1 -0
  380. package/dist/playground/result-formatter.d.ts +59 -0
  381. package/dist/playground/result-formatter.d.ts.map +1 -0
  382. package/dist/playground/result-formatter.js +341 -0
  383. package/dist/playground/result-formatter.js.map +1 -0
  384. package/dist/playground/sample-datasets.d.ts +77 -0
  385. package/dist/playground/sample-datasets.d.ts.map +1 -0
  386. package/dist/playground/sample-datasets.js +641 -0
  387. package/dist/playground/sample-datasets.js.map +1 -0
  388. package/dist/playground/sample-queries.d.ts +73 -0
  389. package/dist/playground/sample-queries.d.ts.map +1 -0
  390. package/dist/playground/sample-queries.js +1095 -0
  391. package/dist/playground/sample-queries.js.map +1 -0
  392. package/dist/playground/schema-explorer.d.ts +55 -0
  393. package/dist/playground/schema-explorer.d.ts.map +1 -0
  394. package/dist/playground/schema-explorer.js +473 -0
  395. package/dist/playground/schema-explorer.js.map +1 -0
  396. package/dist/playground/types.d.ts +430 -0
  397. package/dist/playground/types.d.ts.map +1 -0
  398. package/dist/playground/types.js +10 -0
  399. package/dist/playground/types.js.map +1 -0
  400. package/dist/readonly/cache-reader.d.ts +145 -0
  401. package/dist/readonly/cache-reader.d.ts.map +1 -0
  402. package/dist/readonly/cache-reader.js +198 -0
  403. package/dist/readonly/cache-reader.js.map +1 -0
  404. package/dist/readonly/config.d.ts +74 -0
  405. package/dist/readonly/config.d.ts.map +1 -0
  406. package/dist/readonly/config.js +67 -0
  407. package/dist/readonly/config.js.map +1 -0
  408. package/dist/readonly/index.d.ts +22 -0
  409. package/dist/readonly/index.d.ts.map +1 -0
  410. package/dist/readonly/index.js +17 -0
  411. package/dist/readonly/index.js.map +1 -0
  412. package/dist/readonly/pglite-wrapper.d.ts +82 -0
  413. package/dist/readonly/pglite-wrapper.d.ts.map +1 -0
  414. package/dist/readonly/pglite-wrapper.js +123 -0
  415. package/dist/readonly/pglite-wrapper.js.map +1 -0
  416. package/dist/readonly/worker.d.ts +142 -0
  417. package/dist/readonly/worker.d.ts.map +1 -0
  418. package/dist/readonly/worker.js +187 -0
  419. package/dist/readonly/worker.js.map +1 -0
  420. package/dist/readonly/write-blocker.d.ts +47 -0
  421. package/dist/readonly/write-blocker.d.ts.map +1 -0
  422. package/dist/readonly/write-blocker.js +136 -0
  423. package/dist/readonly/write-blocker.js.map +1 -0
  424. package/dist/recovery/disaster-recovery.d.ts +326 -0
  425. package/dist/recovery/disaster-recovery.d.ts.map +1 -0
  426. package/dist/recovery/disaster-recovery.js +799 -0
  427. package/dist/recovery/disaster-recovery.js.map +1 -0
  428. package/dist/recovery/index.d.ts +12 -0
  429. package/dist/recovery/index.d.ts.map +1 -0
  430. package/dist/recovery/index.js +12 -0
  431. package/dist/recovery/index.js.map +1 -0
  432. package/dist/recovery/parquet-parser.d.ts +321 -0
  433. package/dist/recovery/parquet-parser.d.ts.map +1 -0
  434. package/dist/recovery/parquet-parser.js +797 -0
  435. package/dist/recovery/parquet-parser.js.map +1 -0
  436. package/dist/retention/index.d.ts +50 -0
  437. package/dist/retention/index.d.ts.map +1 -0
  438. package/dist/retention/index.js +50 -0
  439. package/dist/retention/index.js.map +1 -0
  440. package/dist/retention/policy.d.ts +344 -0
  441. package/dist/retention/policy.d.ts.map +1 -0
  442. package/dist/retention/policy.js +472 -0
  443. package/dist/retention/policy.js.map +1 -0
  444. package/dist/retention/purger.d.ts +187 -0
  445. package/dist/retention/purger.d.ts.map +1 -0
  446. package/dist/retention/purger.js +411 -0
  447. package/dist/retention/purger.js.map +1 -0
  448. package/dist/rls/auth-integration.d.ts +280 -0
  449. package/dist/rls/auth-integration.d.ts.map +1 -0
  450. package/dist/rls/auth-integration.js +399 -0
  451. package/dist/rls/auth-integration.js.map +1 -0
  452. package/dist/rls/generator.d.ts +249 -0
  453. package/dist/rls/generator.d.ts.map +1 -0
  454. package/dist/rls/generator.js +495 -0
  455. package/dist/rls/generator.js.map +1 -0
  456. package/dist/rls/index.d.ts +26 -0
  457. package/dist/rls/index.d.ts.map +1 -0
  458. package/dist/rls/index.js +58 -0
  459. package/dist/rls/index.js.map +1 -0
  460. package/dist/rls/policy.d.ts +116 -0
  461. package/dist/rls/policy.d.ts.map +1 -0
  462. package/dist/rls/policy.js +77 -0
  463. package/dist/rls/policy.js.map +1 -0
  464. package/dist/rls/validator.d.ts +155 -0
  465. package/dist/rls/validator.d.ts.map +1 -0
  466. package/dist/rls/validator.js +792 -0
  467. package/dist/rls/validator.js.map +1 -0
  468. package/dist/routing/adaptive-router.d.ts +317 -0
  469. package/dist/routing/adaptive-router.d.ts.map +1 -0
  470. package/dist/routing/adaptive-router.js +554 -0
  471. package/dist/routing/adaptive-router.js.map +1 -0
  472. package/dist/routing/circuit-breaker.d.ts +339 -0
  473. package/dist/routing/circuit-breaker.d.ts.map +1 -0
  474. package/dist/routing/circuit-breaker.js +620 -0
  475. package/dist/routing/circuit-breaker.js.map +1 -0
  476. package/dist/routing/cost-metrics.d.ts +133 -0
  477. package/dist/routing/cost-metrics.d.ts.map +1 -0
  478. package/dist/routing/cost-metrics.js +259 -0
  479. package/dist/routing/cost-metrics.js.map +1 -0
  480. package/dist/routing/do-connection-pool.d.ts +243 -0
  481. package/dist/routing/do-connection-pool.d.ts.map +1 -0
  482. package/dist/routing/do-connection-pool.js +572 -0
  483. package/dist/routing/do-connection-pool.js.map +1 -0
  484. package/dist/routing/index.d.ts +59 -0
  485. package/dist/routing/index.d.ts.map +1 -0
  486. package/dist/routing/index.js +59 -0
  487. package/dist/routing/index.js.map +1 -0
  488. package/dist/routing/query-complexity-estimator.d.ts +73 -0
  489. package/dist/routing/query-complexity-estimator.d.ts.map +1 -0
  490. package/dist/routing/query-complexity-estimator.js +327 -0
  491. package/dist/routing/query-complexity-estimator.js.map +1 -0
  492. package/dist/routing/request-coalescing.d.ts +178 -0
  493. package/dist/routing/request-coalescing.d.ts.map +1 -0
  494. package/dist/routing/request-coalescing.js +325 -0
  495. package/dist/routing/request-coalescing.js.map +1 -0
  496. package/dist/routing/runtime-router.d.ts +107 -0
  497. package/dist/routing/runtime-router.d.ts.map +1 -0
  498. package/dist/routing/runtime-router.js +246 -0
  499. package/dist/routing/runtime-router.js.map +1 -0
  500. package/dist/routing/tenant-router.d.ts +848 -0
  501. package/dist/routing/tenant-router.d.ts.map +1 -0
  502. package/dist/routing/tenant-router.js +1056 -0
  503. package/dist/routing/tenant-router.js.map +1 -0
  504. package/dist/routing/websocket-pool.d.ts +119 -0
  505. package/dist/routing/websocket-pool.d.ts.map +1 -0
  506. package/dist/routing/websocket-pool.js +436 -0
  507. package/dist/routing/websocket-pool.js.map +1 -0
  508. package/dist/storage/cache-layer.d.ts +159 -0
  509. package/dist/storage/cache-layer.d.ts.map +1 -0
  510. package/dist/storage/cache-layer.js +245 -0
  511. package/dist/storage/cache-layer.js.map +1 -0
  512. package/dist/storage/cost-aware-tiering.d.ts +258 -0
  513. package/dist/storage/cost-aware-tiering.d.ts.map +1 -0
  514. package/dist/storage/cost-aware-tiering.js +526 -0
  515. package/dist/storage/cost-aware-tiering.js.map +1 -0
  516. package/dist/storage/index.d.ts +87 -0
  517. package/dist/storage/index.d.ts.map +1 -0
  518. package/dist/storage/index.js +78 -0
  519. package/dist/storage/index.js.map +1 -0
  520. package/dist/storage/interfaces.d.ts +856 -0
  521. package/dist/storage/interfaces.d.ts.map +1 -0
  522. package/dist/storage/interfaces.js +69 -0
  523. package/dist/storage/interfaces.js.map +1 -0
  524. package/dist/storage/r2-layer.d.ts +226 -0
  525. package/dist/storage/r2-layer.d.ts.map +1 -0
  526. package/dist/storage/r2-layer.js +307 -0
  527. package/dist/storage/r2-layer.js.map +1 -0
  528. package/dist/storage/r2-overflow.d.ts +344 -0
  529. package/dist/storage/r2-overflow.d.ts.map +1 -0
  530. package/dist/storage/r2-overflow.js +730 -0
  531. package/dist/storage/r2-overflow.js.map +1 -0
  532. package/dist/storage/r2-page-vfs.d.ts +374 -0
  533. package/dist/storage/r2-page-vfs.d.ts.map +1 -0
  534. package/dist/storage/r2-page-vfs.js +754 -0
  535. package/dist/storage/r2-page-vfs.js.map +1 -0
  536. package/dist/storage/swr-cache.d.ts +181 -0
  537. package/dist/storage/swr-cache.d.ts.map +1 -0
  538. package/dist/storage/swr-cache.js +295 -0
  539. package/dist/storage/swr-cache.js.map +1 -0
  540. package/dist/storage/tiered-orchestrator.d.ts +951 -0
  541. package/dist/storage/tiered-orchestrator.d.ts.map +1 -0
  542. package/dist/storage/tiered-orchestrator.js +1731 -0
  543. package/dist/storage/tiered-orchestrator.js.map +1 -0
  544. package/dist/storage/tiered-vfs-swr.d.ts +279 -0
  545. package/dist/storage/tiered-vfs-swr.d.ts.map +1 -0
  546. package/dist/storage/tiered-vfs-swr.js +584 -0
  547. package/dist/storage/tiered-vfs-swr.js.map +1 -0
  548. package/dist/storage/tiered-vfs.d.ts +405 -0
  549. package/dist/storage/tiered-vfs.d.ts.map +1 -0
  550. package/dist/storage/tiered-vfs.js +833 -0
  551. package/dist/storage/tiered-vfs.js.map +1 -0
  552. package/dist/streaming/backpressure-controller.d.ts +173 -0
  553. package/dist/streaming/backpressure-controller.d.ts.map +1 -0
  554. package/dist/streaming/backpressure-controller.js +344 -0
  555. package/dist/streaming/backpressure-controller.js.map +1 -0
  556. package/dist/streaming/buffer-pool.d.ts +241 -0
  557. package/dist/streaming/buffer-pool.d.ts.map +1 -0
  558. package/dist/streaming/buffer-pool.js +381 -0
  559. package/dist/streaming/buffer-pool.js.map +1 -0
  560. package/dist/streaming/cdc-iceberg-connector.d.ts +272 -0
  561. package/dist/streaming/cdc-iceberg-connector.d.ts.map +1 -0
  562. package/dist/streaming/cdc-iceberg-connector.js +408 -0
  563. package/dist/streaming/cdc-iceberg-connector.js.map +1 -0
  564. package/dist/streaming/index.d.ts +111 -0
  565. package/dist/streaming/index.d.ts.map +1 -0
  566. package/dist/streaming/index.js +128 -0
  567. package/dist/streaming/index.js.map +1 -0
  568. package/dist/streaming/live-cdc-stream.d.ts +400 -0
  569. package/dist/streaming/live-cdc-stream.d.ts.map +1 -0
  570. package/dist/streaming/live-cdc-stream.js +703 -0
  571. package/dist/streaming/live-cdc-stream.js.map +1 -0
  572. package/dist/streaming/memory-bounded-stream.d.ts +207 -0
  573. package/dist/streaming/memory-bounded-stream.d.ts.map +1 -0
  574. package/dist/streaming/memory-bounded-stream.js +340 -0
  575. package/dist/streaming/memory-bounded-stream.js.map +1 -0
  576. package/dist/streaming/query-streamer.d.ts +379 -0
  577. package/dist/streaming/query-streamer.d.ts.map +1 -0
  578. package/dist/streaming/query-streamer.js +495 -0
  579. package/dist/streaming/query-streamer.js.map +1 -0
  580. package/dist/streaming/response-streaming.d.ts +203 -0
  581. package/dist/streaming/response-streaming.d.ts.map +1 -0
  582. package/dist/streaming/response-streaming.js +449 -0
  583. package/dist/streaming/response-streaming.js.map +1 -0
  584. package/dist/types/branded.d.ts +859 -0
  585. package/dist/types/branded.d.ts.map +1 -0
  586. package/dist/types/branded.js +891 -0
  587. package/dist/types/branded.js.map +1 -0
  588. package/dist/types/utilities.d.ts +757 -0
  589. package/dist/types/utilities.d.ts.map +1 -0
  590. package/dist/types/utilities.js +447 -0
  591. package/dist/types/utilities.js.map +1 -0
  592. package/dist/wal/replay-engine.d.ts +344 -0
  593. package/dist/wal/replay-engine.d.ts.map +1 -0
  594. package/dist/wal/replay-engine.js +975 -0
  595. package/dist/wal/replay-engine.js.map +1 -0
  596. package/dist/worker/__mocks__/capnweb.d.ts +13 -0
  597. package/dist/worker/__mocks__/capnweb.d.ts.map +1 -0
  598. package/dist/worker/__mocks__/capnweb.js +15 -0
  599. package/dist/worker/__mocks__/capnweb.js.map +1 -0
  600. package/dist/worker/__mocks__/cloudflare-workers.d.ts +31 -0
  601. package/dist/worker/__mocks__/cloudflare-workers.d.ts.map +1 -0
  602. package/dist/worker/__mocks__/cloudflare-workers.js +33 -0
  603. package/dist/worker/__mocks__/cloudflare-workers.js.map +1 -0
  604. package/dist/worker/__mocks__/pglite.data.d.ts +3 -0
  605. package/dist/worker/__mocks__/pglite.data.d.ts.map +1 -0
  606. package/dist/worker/__mocks__/pglite.data.js +20 -0
  607. package/dist/worker/__mocks__/pglite.data.js.map +1 -0
  608. package/dist/worker/__mocks__/pglite.wasm.d.ts +3 -0
  609. package/dist/worker/__mocks__/pglite.wasm.d.ts.map +1 -0
  610. package/dist/worker/__mocks__/pglite.wasm.js +30 -0
  611. package/dist/worker/__mocks__/pglite.wasm.js.map +1 -0
  612. package/dist/worker/auth-rate-limiter.d.ts +270 -0
  613. package/dist/worker/auth-rate-limiter.d.ts.map +1 -0
  614. package/dist/worker/auth-rate-limiter.js +332 -0
  615. package/dist/worker/auth-rate-limiter.js.map +1 -0
  616. package/dist/worker/auth.d.ts +345 -0
  617. package/dist/worker/auth.d.ts.map +1 -0
  618. package/dist/worker/auth.js +837 -0
  619. package/dist/worker/auth.js.map +1 -0
  620. package/dist/worker/cdc-backpressure.d.ts +338 -0
  621. package/dist/worker/cdc-backpressure.d.ts.map +1 -0
  622. package/dist/worker/cdc-backpressure.js +619 -0
  623. package/dist/worker/cdc-backpressure.js.map +1 -0
  624. package/dist/worker/cdc-sse.d.ts +277 -0
  625. package/dist/worker/cdc-sse.d.ts.map +1 -0
  626. package/dist/worker/cdc-sse.js +528 -0
  627. package/dist/worker/cdc-sse.js.map +1 -0
  628. package/dist/worker/cdc-websocket.d.ts +252 -0
  629. package/dist/worker/cdc-websocket.d.ts.map +1 -0
  630. package/dist/worker/cdc-websocket.js +940 -0
  631. package/dist/worker/cdc-websocket.js.map +1 -0
  632. package/dist/worker/cdc.d.ts +95 -0
  633. package/dist/worker/cdc.d.ts.map +1 -0
  634. package/dist/worker/cdc.js +211 -0
  635. package/dist/worker/cdc.js.map +1 -0
  636. package/dist/worker/concerns/auth-concern.d.ts +50 -0
  637. package/dist/worker/concerns/auth-concern.d.ts.map +1 -0
  638. package/dist/worker/concerns/auth-concern.js +131 -0
  639. package/dist/worker/concerns/auth-concern.js.map +1 -0
  640. package/dist/worker/concerns/cdc-concern.d.ts +99 -0
  641. package/dist/worker/concerns/cdc-concern.d.ts.map +1 -0
  642. package/dist/worker/concerns/cdc-concern.js +137 -0
  643. package/dist/worker/concerns/cdc-concern.js.map +1 -0
  644. package/dist/worker/concerns/index.d.ts +22 -0
  645. package/dist/worker/concerns/index.d.ts.map +1 -0
  646. package/dist/worker/concerns/index.js +13 -0
  647. package/dist/worker/concerns/index.js.map +1 -0
  648. package/dist/worker/concerns/query-execution-concern.d.ts +104 -0
  649. package/dist/worker/concerns/query-execution-concern.d.ts.map +1 -0
  650. package/dist/worker/concerns/query-execution-concern.js +95 -0
  651. package/dist/worker/concerns/query-execution-concern.js.map +1 -0
  652. package/dist/worker/concerns/storage-orchestration-concern.d.ts +78 -0
  653. package/dist/worker/concerns/storage-orchestration-concern.d.ts.map +1 -0
  654. package/dist/worker/concerns/storage-orchestration-concern.js +240 -0
  655. package/dist/worker/concerns/storage-orchestration-concern.js.map +1 -0
  656. package/dist/worker/do-auth-manager.d.ts +108 -0
  657. package/dist/worker/do-auth-manager.d.ts.map +1 -0
  658. package/dist/worker/do-auth-manager.js +212 -0
  659. package/dist/worker/do-auth-manager.js.map +1 -0
  660. package/dist/worker/do-pglite-manager.d.ts +137 -0
  661. package/dist/worker/do-pglite-manager.d.ts.map +1 -0
  662. package/dist/worker/do-pglite-manager.js +228 -0
  663. package/dist/worker/do-pglite-manager.js.map +1 -0
  664. package/dist/worker/do.d.ts +556 -0
  665. package/dist/worker/do.d.ts.map +1 -0
  666. package/dist/worker/do.js +1441 -0
  667. package/dist/worker/do.js.map +1 -0
  668. package/dist/worker/entry.d.ts +23 -0
  669. package/dist/worker/entry.d.ts.map +1 -0
  670. package/dist/worker/entry.js +362 -0
  671. package/dist/worker/entry.js.map +1 -0
  672. package/dist/worker/errors.d.ts +106 -0
  673. package/dist/worker/errors.d.ts.map +1 -0
  674. package/dist/worker/errors.js +178 -0
  675. package/dist/worker/errors.js.map +1 -0
  676. package/dist/worker/health-check-manager.d.ts +141 -0
  677. package/dist/worker/health-check-manager.d.ts.map +1 -0
  678. package/dist/worker/health-check-manager.js +145 -0
  679. package/dist/worker/health-check-manager.js.map +1 -0
  680. package/dist/worker/index.d.ts +60 -0
  681. package/dist/worker/index.d.ts.map +1 -0
  682. package/dist/worker/index.js +67 -0
  683. package/dist/worker/index.js.map +1 -0
  684. package/dist/worker/memory-pressure.d.ts +892 -0
  685. package/dist/worker/memory-pressure.d.ts.map +1 -0
  686. package/dist/worker/memory-pressure.js +1990 -0
  687. package/dist/worker/memory-pressure.js.map +1 -0
  688. package/dist/worker/migration-manager.d.ts +153 -0
  689. package/dist/worker/migration-manager.d.ts.map +1 -0
  690. package/dist/worker/migration-manager.js +461 -0
  691. package/dist/worker/migration-manager.js.map +1 -0
  692. package/dist/worker/plugin-manager.d.ts +147 -0
  693. package/dist/worker/plugin-manager.d.ts.map +1 -0
  694. package/dist/worker/plugin-manager.js +408 -0
  695. package/dist/worker/plugin-manager.js.map +1 -0
  696. package/dist/worker/proxy.d.ts +330 -0
  697. package/dist/worker/proxy.d.ts.map +1 -0
  698. package/dist/worker/proxy.js +504 -0
  699. package/dist/worker/proxy.js.map +1 -0
  700. package/dist/worker/query-execution-manager.d.ts +107 -0
  701. package/dist/worker/query-execution-manager.d.ts.map +1 -0
  702. package/dist/worker/query-execution-manager.js +155 -0
  703. package/dist/worker/query-execution-manager.js.map +1 -0
  704. package/dist/worker/query-executor.d.ts +163 -0
  705. package/dist/worker/query-executor.d.ts.map +1 -0
  706. package/dist/worker/query-executor.js +413 -0
  707. package/dist/worker/query-executor.js.map +1 -0
  708. package/dist/worker/query-stats-manager.d.ts +117 -0
  709. package/dist/worker/query-stats-manager.d.ts.map +1 -0
  710. package/dist/worker/query-stats-manager.js +162 -0
  711. package/dist/worker/query-stats-manager.js.map +1 -0
  712. package/dist/worker/result-handler.d.ts +192 -0
  713. package/dist/worker/result-handler.d.ts.map +1 -0
  714. package/dist/worker/result-handler.js +346 -0
  715. package/dist/worker/result-handler.js.map +1 -0
  716. package/dist/worker/routes.d.ts +135 -0
  717. package/dist/worker/routes.d.ts.map +1 -0
  718. package/dist/worker/routes.js +460 -0
  719. package/dist/worker/routes.js.map +1 -0
  720. package/dist/worker/rpc-methods-manager.d.ts +142 -0
  721. package/dist/worker/rpc-methods-manager.d.ts.map +1 -0
  722. package/dist/worker/rpc-methods-manager.js +195 -0
  723. package/dist/worker/rpc-methods-manager.js.map +1 -0
  724. package/dist/worker/rpc.d.ts +259 -0
  725. package/dist/worker/rpc.d.ts.map +1 -0
  726. package/dist/worker/rpc.js +398 -0
  727. package/dist/worker/rpc.js.map +1 -0
  728. package/dist/worker/schema-version.d.ts +209 -0
  729. package/dist/worker/schema-version.d.ts.map +1 -0
  730. package/dist/worker/schema-version.js +450 -0
  731. package/dist/worker/schema-version.js.map +1 -0
  732. package/dist/worker/session-manager.d.ts +282 -0
  733. package/dist/worker/session-manager.d.ts.map +1 -0
  734. package/dist/worker/session-manager.js +523 -0
  735. package/dist/worker/session-manager.js.map +1 -0
  736. package/dist/worker/shutdown-manager.d.ts +188 -0
  737. package/dist/worker/shutdown-manager.d.ts.map +1 -0
  738. package/dist/worker/shutdown-manager.js +347 -0
  739. package/dist/worker/shutdown-manager.js.map +1 -0
  740. package/dist/worker/sql-transform.d.ts +61 -0
  741. package/dist/worker/sql-transform.d.ts.map +1 -0
  742. package/dist/worker/sql-transform.js +312 -0
  743. package/dist/worker/sql-transform.js.map +1 -0
  744. package/dist/worker/types.d.ts +738 -0
  745. package/dist/worker/types.d.ts.map +1 -0
  746. package/dist/worker/types.js +6 -0
  747. package/dist/worker/types.js.map +1 -0
  748. package/dist/worker/user-routes.d.ts +76 -0
  749. package/dist/worker/user-routes.d.ts.map +1 -0
  750. package/dist/worker/user-routes.js +188 -0
  751. package/dist/worker/user-routes.js.map +1 -0
  752. package/dist/worker/wal-facade.d.ts +138 -0
  753. package/dist/worker/wal-facade.d.ts.map +1 -0
  754. package/dist/worker/wal-facade.js +184 -0
  755. package/dist/worker/wal-facade.js.map +1 -0
  756. package/dist/worker/wal-r2.d.ts +271 -0
  757. package/dist/worker/wal-r2.d.ts.map +1 -0
  758. package/dist/worker/wal-r2.js +689 -0
  759. package/dist/worker/wal-r2.js.map +1 -0
  760. package/dist/worker/wal-replay.d.ts +361 -0
  761. package/dist/worker/wal-replay.d.ts.map +1 -0
  762. package/dist/worker/wal-replay.js +628 -0
  763. package/dist/worker/wal-replay.js.map +1 -0
  764. package/dist/worker/wal-retention.d.ts +389 -0
  765. package/dist/worker/wal-retention.d.ts.map +1 -0
  766. package/dist/worker/wal-retention.js +763 -0
  767. package/dist/worker/wal-retention.js.map +1 -0
  768. package/dist/worker/wal.d.ts +278 -0
  769. package/dist/worker/wal.d.ts.map +1 -0
  770. package/dist/worker/wal.js +467 -0
  771. package/dist/worker/wal.js.map +1 -0
  772. package/dist/worker/websocket.d.ts +85 -0
  773. package/dist/worker/websocket.d.ts.map +1 -0
  774. package/dist/worker/websocket.js +227 -0
  775. package/dist/worker/websocket.js.map +1 -0
  776. package/package.json +108 -0
  777. package/src/cdc/change-stream.ts +137 -0
  778. package/src/cdc/filter.ts +646 -0
  779. package/src/cdc/index.ts +112 -0
  780. package/src/cdc/resume-token.ts +280 -0
  781. package/src/cdc/transport/index.ts +7 -0
  782. package/src/cdc/transport/sse.ts +723 -0
  783. package/src/cdc/transport/websocket.ts +873 -0
  784. package/src/cdc/types.ts +346 -0
  785. package/src/config/index.ts +25 -0
  786. package/src/config/memory.ts +177 -0
  787. package/src/config/storage.ts +204 -0
  788. package/src/config/streaming.ts +147 -0
  789. package/src/config/timeouts.ts +221 -0
  790. package/src/extensions/config.test.ts +187 -0
  791. package/src/extensions/config.ts +278 -0
  792. package/src/extensions/geo.test.ts +455 -0
  793. package/src/extensions/geo.ts +858 -0
  794. package/src/extensions/index.test.ts +259 -0
  795. package/src/extensions/index.ts +227 -0
  796. package/src/extensions/loader.test.ts +555 -0
  797. package/src/extensions/loader.ts +588 -0
  798. package/src/extensions/pgmq-lite.test.ts +727 -0
  799. package/src/extensions/pgmq-lite.ts +770 -0
  800. package/src/extensions/plugins.test.ts +528 -0
  801. package/src/extensions/plugins.ts +718 -0
  802. package/src/extensions/registry.test.ts +202 -0
  803. package/src/extensions/registry.ts +267 -0
  804. package/src/extensions/vector.test.ts +195 -0
  805. package/src/extensions/vector.ts +217 -0
  806. package/src/iceberg/SCHEDULER.md +580 -0
  807. package/src/iceberg/analytics.test.ts +703 -0
  808. package/src/iceberg/analytics.ts +727 -0
  809. package/src/iceberg/catalog-api.test.ts +838 -0
  810. package/src/iceberg/catalog-api.ts +520 -0
  811. package/src/iceberg/catalog.test.ts +680 -0
  812. package/src/iceberg/catalog.ts +1007 -0
  813. package/src/iceberg/iceberg.test.ts +705 -0
  814. package/src/iceberg/index.ts +406 -0
  815. package/src/iceberg/metadata.test.ts +632 -0
  816. package/src/iceberg/metadata.ts +649 -0
  817. package/src/iceberg/optimizer.test.ts +868 -0
  818. package/src/iceberg/optimizer.ts +1287 -0
  819. package/src/iceberg/parquet.test.ts +899 -0
  820. package/src/iceberg/parquet.ts +1640 -0
  821. package/src/iceberg/r2-organization.test.ts +615 -0
  822. package/src/iceberg/r2-organization.ts +951 -0
  823. package/src/iceberg/scheduler-do-example.ts +364 -0
  824. package/src/iceberg/scheduler.test.ts +861 -0
  825. package/src/iceberg/scheduler.ts +1201 -0
  826. package/src/iceberg/schema.test.ts +547 -0
  827. package/src/iceberg/schema.ts +616 -0
  828. package/src/iceberg/snapshot-manager.test.ts +919 -0
  829. package/src/iceberg/snapshot-manager.ts +1369 -0
  830. package/src/iceberg/sql-router.test.ts +334 -0
  831. package/src/iceberg/sql-router.ts +337 -0
  832. package/src/iceberg/test-fixtures.ts +605 -0
  833. package/src/iceberg/time-travel-api.test.ts +1029 -0
  834. package/src/iceberg/time-travel-api.ts +731 -0
  835. package/src/iceberg/time-travel.test.ts +1218 -0
  836. package/src/iceberg/time-travel.ts +1052 -0
  837. package/src/iceberg/transformer.test.ts +689 -0
  838. package/src/iceberg/transformer.ts +1029 -0
  839. package/src/iceberg/types.ts +373 -0
  840. package/src/iceberg/writer.test.ts +716 -0
  841. package/src/iceberg/writer.ts +590 -0
  842. package/src/index.ts +212 -0
  843. package/src/lineage/index.ts +42 -0
  844. package/src/lineage/integration.ts +334 -0
  845. package/src/lineage/tracker.ts +1618 -0
  846. package/src/lineage/types.ts +354 -0
  847. package/src/middleware/index.ts +36 -0
  848. package/src/middleware/rate-limit-concurrent.test.ts +794 -0
  849. package/src/middleware/rate-limit.test.ts +1568 -0
  850. package/src/middleware/rate-limit.ts +840 -0
  851. package/src/migration-tooling/external-migration.test.ts +1864 -0
  852. package/src/migration-tooling/external-migration.ts +2355 -0
  853. package/src/migration-tooling/index.ts +19 -0
  854. package/src/migrations/ARCHITECTURE.md +474 -0
  855. package/src/migrations/PROGRESS_TRACKING.md +485 -0
  856. package/src/migrations/auto-migrator.test.ts +732 -0
  857. package/src/migrations/auto-migrator.ts +531 -0
  858. package/src/migrations/bulk-orchestrator.test.ts +801 -0
  859. package/src/migrations/bulk-orchestrator.ts +1039 -0
  860. package/src/migrations/compatibility.test.ts +958 -0
  861. package/src/migrations/compatibility.ts +902 -0
  862. package/src/migrations/do-migrations.test.ts +2620 -0
  863. package/src/migrations/do-migrations.ts +1289 -0
  864. package/src/migrations/do-migrations.types.ts +715 -0
  865. package/src/migrations/drizzle-compat.test.ts +210 -0
  866. package/src/migrations/drizzle-compat.ts +337 -0
  867. package/src/migrations/index.ts +334 -0
  868. package/src/migrations/migration-api.test.ts +438 -0
  869. package/src/migrations/migration-api.ts +704 -0
  870. package/src/migrations/progress-tracker-do.ts +518 -0
  871. package/src/migrations/progress-tracker-kv.ts +305 -0
  872. package/src/migrations/progress-tracker.test.ts +937 -0
  873. package/src/migrations/progress-tracker.ts +665 -0
  874. package/src/migrations/registry.test.ts +331 -0
  875. package/src/migrations/registry.ts +468 -0
  876. package/src/migrations/rollback.test.ts +644 -0
  877. package/src/migrations/runner.test.ts +807 -0
  878. package/src/migrations/runner.test.ts.backup +759 -0
  879. package/src/migrations/runner.ts +1459 -0
  880. package/src/migrations/schema-generator.test.ts +649 -0
  881. package/src/migrations/schema-generator.ts +513 -0
  882. package/src/migrations/testing.ts +1037 -0
  883. package/src/migrations/types.ts +573 -0
  884. package/src/migrations/validator.test.ts +660 -0
  885. package/src/migrations/validator.ts +741 -0
  886. package/src/observability/alerting.test.ts +1133 -0
  887. package/src/observability/alerting.ts +455 -0
  888. package/src/observability/analytics-engine.ts +733 -0
  889. package/src/observability/cost-metrics.ts +804 -0
  890. package/src/observability/cross-do-tracing.test.ts +516 -0
  891. package/src/observability/cross-do-tracing.ts +588 -0
  892. package/src/observability/dashboards/postgres-do-overview.json +1656 -0
  893. package/src/observability/error-rate-collector.test.ts +977 -0
  894. package/src/observability/error-rate-collector.ts +518 -0
  895. package/src/observability/exporters.test.ts +365 -0
  896. package/src/observability/exporters.ts +650 -0
  897. package/src/observability/health-check.test.ts +353 -0
  898. package/src/observability/health-check.ts +341 -0
  899. package/src/observability/index.test.ts +298 -0
  900. package/src/observability/index.ts +885 -0
  901. package/src/observability/instrumentation.test.ts +428 -0
  902. package/src/observability/instrumentation.ts +788 -0
  903. package/src/observability/memory-metrics.test.ts +355 -0
  904. package/src/observability/memory-metrics.ts +990 -0
  905. package/src/observability/metrics-endpoint.test.ts +402 -0
  906. package/src/observability/metrics-endpoint.ts +374 -0
  907. package/src/observability/metrics.test.ts +291 -0
  908. package/src/observability/metrics.ts +315 -0
  909. package/src/observability/observability-features.ts +1296 -0
  910. package/src/observability/prometheus.test.ts +292 -0
  911. package/src/observability/prometheus.ts +170 -0
  912. package/src/observability/propagation.test.ts +417 -0
  913. package/src/observability/propagation.ts +294 -0
  914. package/src/observability/query-latency.ts +586 -0
  915. package/src/observability/query-performance.test.ts +406 -0
  916. package/src/observability/query-performance.ts +491 -0
  917. package/src/observability/storage-tier-metrics.test.ts +633 -0
  918. package/src/observability/storage-tier-metrics.ts +570 -0
  919. package/src/observability/tier-cost-optimizer.ts +740 -0
  920. package/src/observability/tracer.test.ts +346 -0
  921. package/src/observability/tracer.ts +585 -0
  922. package/src/observability/types.test.ts +726 -0
  923. package/src/observability/types.ts +434 -0
  924. package/src/pglite/auto-demotion.test.ts +477 -0
  925. package/src/pglite/auto-demotion.ts +385 -0
  926. package/src/pglite/auto-promotion.test.ts +824 -0
  927. package/src/pglite/auto-promotion.ts +547 -0
  928. package/src/pglite/cache-layer.test.ts +469 -0
  929. package/src/pglite/cache-layer.ts +271 -0
  930. package/src/pglite/cold-start-manager.ts +1260 -0
  931. package/src/pglite/cold-start-optimizer.test.ts +937 -0
  932. package/src/pglite/cold-start-optimizer.ts +1895 -0
  933. package/src/pglite/dovfs-adapter.ts +1122 -0
  934. package/src/pglite/dovfs.ts +1258 -0
  935. package/src/pglite/etag-cache.test.ts +844 -0
  936. package/src/pglite/etag-cache.ts +526 -0
  937. package/src/pglite/index.ts +442 -0
  938. package/src/pglite/init.test.ts +455 -0
  939. package/src/pglite/init.ts +574 -0
  940. package/src/pglite/lifecycle.test.ts +599 -0
  941. package/src/pglite/lifecycle.ts +704 -0
  942. package/src/pglite/parallel-loader.test.ts +586 -0
  943. package/src/pglite/parallel-loader.ts +481 -0
  944. package/src/pglite/production-pglite.test.ts +666 -0
  945. package/src/pglite/production-pglite.ts +537 -0
  946. package/src/pglite/query-executor.ts +614 -0
  947. package/src/pglite/r2-layer.test.ts +501 -0
  948. package/src/pglite/r2-layer.ts +322 -0
  949. package/src/pglite/tiered-init.test.ts +725 -0
  950. package/src/pglite/tiered-init.ts +556 -0
  951. package/src/pglite/tiered-vfs.test.ts +726 -0
  952. package/src/pglite/tiered-vfs.ts +33 -0
  953. package/src/pglite/tiering-stats.test.ts +531 -0
  954. package/src/pglite/tiering-stats.ts +407 -0
  955. package/src/pglite/transaction-hooks.ts +343 -0
  956. package/src/pglite/warm-loader.test.ts +1701 -0
  957. package/src/pglite/warm-loader.ts +528 -0
  958. package/src/pglite/workers-pglite.ts +224 -0
  959. package/src/pglite-assets/pglite.data +0 -0
  960. package/src/pglite-assets/pglite.wasm +0 -0
  961. package/src/pglite.d.ts +47 -0
  962. package/src/playground/index.ts +137 -0
  963. package/src/playground/keyboard-shortcuts.ts +677 -0
  964. package/src/playground/playground.ts +323 -0
  965. package/src/playground/query-executor.ts +669 -0
  966. package/src/playground/query-history.ts +328 -0
  967. package/src/playground/result-formatter.ts +420 -0
  968. package/src/playground/sample-datasets.ts +674 -0
  969. package/src/playground/sample-queries.ts +1168 -0
  970. package/src/playground/schema-explorer.ts +558 -0
  971. package/src/playground/types.ts +518 -0
  972. package/src/readonly/cache-reader.test.ts +460 -0
  973. package/src/readonly/cache-reader.ts +313 -0
  974. package/src/readonly/config.test.ts +187 -0
  975. package/src/readonly/config.ts +128 -0
  976. package/src/readonly/index.ts +50 -0
  977. package/src/readonly/pglite-wrapper.test.ts +278 -0
  978. package/src/readonly/pglite-wrapper.ts +184 -0
  979. package/src/readonly/worker.test.ts +533 -0
  980. package/src/readonly/worker.ts +341 -0
  981. package/src/readonly/write-blocker.test.ts +459 -0
  982. package/src/readonly/write-blocker.ts +175 -0
  983. package/src/recovery/disaster-recovery.test.ts +618 -0
  984. package/src/recovery/disaster-recovery.ts +1181 -0
  985. package/src/recovery/index.ts +43 -0
  986. package/src/recovery/parquet-parser.ts +974 -0
  987. package/src/retention/index.ts +74 -0
  988. package/src/retention/policy.test.ts +571 -0
  989. package/src/retention/policy.ts +774 -0
  990. package/src/retention/purger.test.ts +465 -0
  991. package/src/retention/purger.ts +558 -0
  992. package/src/rls/auth-integration.test.ts +752 -0
  993. package/src/rls/auth-integration.ts +533 -0
  994. package/src/rls/generator.test.ts +829 -0
  995. package/src/rls/generator.ts +573 -0
  996. package/src/rls/index.ts +128 -0
  997. package/src/rls/policy.ts +208 -0
  998. package/src/rls/rls.test.ts +1071 -0
  999. package/src/rls/validator.test.ts +930 -0
  1000. package/src/rls/validator.ts +895 -0
  1001. package/src/routing/adaptive-router.test.ts +884 -0
  1002. package/src/routing/adaptive-router.ts +845 -0
  1003. package/src/routing/circuit-breaker.test.ts +1505 -0
  1004. package/src/routing/circuit-breaker.ts +852 -0
  1005. package/src/routing/cost-metrics.test.ts +565 -0
  1006. package/src/routing/cost-metrics.ts +408 -0
  1007. package/src/routing/do-connection-pool.test.ts +1109 -0
  1008. package/src/routing/do-connection-pool.ts +828 -0
  1009. package/src/routing/index.ts +158 -0
  1010. package/src/routing/query-complexity-estimator.test.ts +356 -0
  1011. package/src/routing/query-complexity-estimator.ts +444 -0
  1012. package/src/routing/request-coalescing.test.ts +738 -0
  1013. package/src/routing/request-coalescing.ts +475 -0
  1014. package/src/routing/runtime-router.test.ts +436 -0
  1015. package/src/routing/runtime-router.ts +357 -0
  1016. package/src/routing/tenant-router.test.ts +2493 -0
  1017. package/src/routing/tenant-router.ts +1908 -0
  1018. package/src/routing/websocket-pool.test.ts +551 -0
  1019. package/src/routing/websocket-pool.ts +577 -0
  1020. package/src/storage/access-pattern-tracker.test.ts +874 -0
  1021. package/src/storage/cache-layer.test.ts +560 -0
  1022. package/src/storage/cache-layer.ts +328 -0
  1023. package/src/storage/cost-aware-tiering.test.ts +652 -0
  1024. package/src/storage/cost-aware-tiering.ts +794 -0
  1025. package/src/storage/do-sqlite-blobs.test.ts +937 -0
  1026. package/src/storage/index.ts +272 -0
  1027. package/src/storage/interfaces.ts +974 -0
  1028. package/src/storage/r2-layer.test.ts +653 -0
  1029. package/src/storage/r2-layer.ts +434 -0
  1030. package/src/storage/r2-overflow.ts +920 -0
  1031. package/src/storage/r2-page-vfs.test.ts +2348 -0
  1032. package/src/storage/r2-page-vfs.ts +1054 -0
  1033. package/src/storage/swr-cache.test.ts +832 -0
  1034. package/src/storage/swr-cache.ts +398 -0
  1035. package/src/storage/swr-tiered-integration.test.ts +617 -0
  1036. package/src/storage/tiered-orchestrator.test.ts +2441 -0
  1037. package/src/storage/tiered-orchestrator.ts +2081 -0
  1038. package/src/storage/tiered-vfs-swr.test.ts +736 -0
  1039. package/src/storage/tiered-vfs-swr.ts +735 -0
  1040. package/src/storage/tiered-vfs.test.ts +793 -0
  1041. package/src/storage/tiered-vfs.ts +1082 -0
  1042. package/src/streaming/backpressure-controller.ts +452 -0
  1043. package/src/streaming/buffer-pool.ts +484 -0
  1044. package/src/streaming/cdc-iceberg-connector.ts +605 -0
  1045. package/src/streaming/index.ts +225 -0
  1046. package/src/streaming/live-cdc-stream.ts +985 -0
  1047. package/src/streaming/memory-bounded-stream.ts +443 -0
  1048. package/src/streaming/query-streamer.ts +662 -0
  1049. package/src/streaming/response-streaming.ts +557 -0
  1050. package/src/types/branded.ts +1075 -0
  1051. package/src/types/branded.ts.backup +273 -0
  1052. package/src/types/utilities.ts +1023 -0
  1053. package/src/types/wasm.d.ts +30 -0
  1054. package/src/validation/typed-errors.test.ts +420 -0
  1055. package/src/wal/replay-engine.ts +1264 -0
  1056. package/src/worker/__mocks__/capnweb.ts +15 -0
  1057. package/src/worker/__mocks__/pglite.data.ts +22 -0
  1058. package/src/worker/__mocks__/pglite.wasm.ts +33 -0
  1059. package/src/worker/auth-rate-limiter.test.ts +272 -0
  1060. package/src/worker/auth-rate-limiter.ts +448 -0
  1061. package/src/worker/auth.security-red.test.ts +1236 -0
  1062. package/src/worker/auth.security.test.ts +822 -0
  1063. package/src/worker/auth.test.ts +469 -0
  1064. package/src/worker/auth.ts +1104 -0
  1065. package/src/worker/cdc-backpressure.test.ts +726 -0
  1066. package/src/worker/cdc-backpressure.ts +866 -0
  1067. package/src/worker/cdc-sse.test.ts +780 -0
  1068. package/src/worker/cdc-sse.ts +728 -0
  1069. package/src/worker/cdc-websocket.ts +1229 -0
  1070. package/src/worker/cdc-ws.test.ts +1009 -0
  1071. package/src/worker/cdc.test.ts +327 -0
  1072. package/src/worker/cdc.ts +289 -0
  1073. package/src/worker/concerns/auth-concern.ts +179 -0
  1074. package/src/worker/concerns/cdc-concern.ts +247 -0
  1075. package/src/worker/concerns/index.ts +58 -0
  1076. package/src/worker/concerns/query-execution-concern.ts +194 -0
  1077. package/src/worker/concerns/storage-orchestration-concern.ts +373 -0
  1078. package/src/worker/discriminated-types.test.ts +280 -0
  1079. package/src/worker/do-auth-manager.ts +257 -0
  1080. package/src/worker/do-decomposition.test.ts +1236 -0
  1081. package/src/worker/do-pglite-manager.ts +302 -0
  1082. package/src/worker/do.test.ts +2254 -0
  1083. package/src/worker/do.ts +1878 -0
  1084. package/src/worker/entry.ts +417 -0
  1085. package/src/worker/errors.ts +285 -0
  1086. package/src/worker/health-check-manager.test.ts +261 -0
  1087. package/src/worker/health-check-manager.ts +231 -0
  1088. package/src/worker/index.ts +389 -0
  1089. package/src/worker/memory-pressure.test.ts +1460 -0
  1090. package/src/worker/memory-pressure.ts +2650 -0
  1091. package/src/worker/migration-manager.ts +582 -0
  1092. package/src/worker/neon-compat.test.ts +332 -0
  1093. package/src/worker/plugin-manager.ts +485 -0
  1094. package/src/worker/postgres.do-rpc.d.ts +76 -0
  1095. package/src/worker/proxy.ts +694 -0
  1096. package/src/worker/query-execution-manager.test.ts +303 -0
  1097. package/src/worker/query-execution-manager.ts +219 -0
  1098. package/src/worker/query-executor.test.ts +282 -0
  1099. package/src/worker/query-executor.ts +560 -0
  1100. package/src/worker/query-stats-manager.ts +229 -0
  1101. package/src/worker/result-handler.test.ts +364 -0
  1102. package/src/worker/result-handler.ts +510 -0
  1103. package/src/worker/routes.test.ts +795 -0
  1104. package/src/worker/routes.ts +650 -0
  1105. package/src/worker/rpc-methods-manager.test.ts +326 -0
  1106. package/src/worker/rpc-methods-manager.ts +276 -0
  1107. package/src/worker/rpc.ts +524 -0
  1108. package/src/worker/schema-version.ts +605 -0
  1109. package/src/worker/session-manager.test.ts +506 -0
  1110. package/src/worker/session-manager.ts +732 -0
  1111. package/src/worker/shutdown-manager.ts +469 -0
  1112. package/src/worker/sql-transform.test.ts +286 -0
  1113. package/src/worker/sql-transform.ts +368 -0
  1114. package/src/worker/supabase-compat.test.ts +621 -0
  1115. package/src/worker/types.test.ts +292 -0
  1116. package/src/worker/types.ts +873 -0
  1117. package/src/worker/user-routes.test.ts +703 -0
  1118. package/src/worker/user-routes.ts +303 -0
  1119. package/src/worker/wal-facade.ts +235 -0
  1120. package/src/worker/wal-r2.test.ts +570 -0
  1121. package/src/worker/wal-r2.ts +930 -0
  1122. package/src/worker/wal-replay.test.ts +845 -0
  1123. package/src/worker/wal-replay.ts +897 -0
  1124. package/src/worker/wal-retention.test.ts +758 -0
  1125. package/src/worker/wal-retention.ts +1075 -0
  1126. package/src/worker/wal.test.ts +618 -0
  1127. package/src/worker/wal.ts +697 -0
  1128. package/src/worker/websocket.test.ts +296 -0
  1129. package/src/worker/websocket.ts +284 -0
@@ -0,0 +1,1052 @@
1
+ /**
2
+ * Time Travel Query API
3
+ * Task: postgres-3kc - Time travel query API (query as-of timestamp)
4
+ *
5
+ * Enables querying data as of a specific timestamp using Iceberg snapshots.
6
+ * Supports:
7
+ * - Point-in-time queries (exact snapshot at timestamp)
8
+ * - Relative timestamps (e.g., '1 hour ago')
9
+ * - SQL AS OF syntax parsing
10
+ * - Query routing to appropriate storage
11
+ */
12
+
13
+ import type {
14
+ IcebergTableMetadata,
15
+ IcebergSnapshot,
16
+ IcebergManifestFile,
17
+ IcebergManifestEntry,
18
+ IcebergDataFile,
19
+ } from './types'
20
+
21
+ // Re-export Iceberg types for consumers
22
+ export type { IcebergTableMetadata, IcebergSnapshot, IcebergDataFile }
23
+
24
+ // ============================================================================
25
+ // Types
26
+ // ============================================================================
27
+
28
+ /**
29
+ * Time travel query mode
30
+ */
31
+ export type TimeTravelMode = 'point-in-time' | 'range' | 'versions-between' | 'latest'
32
+
33
+ /**
34
+ * Timestamp specification for time travel queries
35
+ * Can be an ISO string, epoch milliseconds, or relative expression
36
+ */
37
+ export type TimestampSpec = string | number | Date
38
+
39
+ /**
40
+ * Parsed timestamp result
41
+ */
42
+ export interface ParsedTimestamp {
43
+ /** Resolved timestamp in milliseconds since epoch */
44
+ timestampMs: number
45
+ /** Original input for reference */
46
+ original: TimestampSpec
47
+ /** Whether this was a relative timestamp */
48
+ isRelative: boolean
49
+ }
50
+
51
+ /**
52
+ * Time travel query options
53
+ */
54
+ export interface TimeTravelQueryOptions {
55
+ /** Target timestamp for the query */
56
+ asOf?: TimestampSpec
57
+ /** Start timestamp for range queries */
58
+ fromTimestamp?: TimestampSpec
59
+ /** End timestamp for range queries */
60
+ toTimestamp?: TimestampSpec
61
+ /** Query mode (default: 'point-in-time' if asOf is provided, 'latest' otherwise) */
62
+ mode?: TimeTravelMode
63
+ }
64
+
65
+ /**
66
+ * Resolved snapshot for time travel query
67
+ */
68
+ export interface ResolvedSnapshot {
69
+ /** The snapshot to query */
70
+ snapshot: IcebergSnapshot
71
+ /** Resolved timestamp in milliseconds */
72
+ timestampMs: number
73
+ /** Whether exact match was found or nearest was used */
74
+ exactMatch: boolean
75
+ /** Time difference from requested timestamp (ms) */
76
+ timeDifferenceMs: number
77
+ }
78
+
79
+ /**
80
+ * Time travel query result metadata
81
+ */
82
+ export interface TimeTravelMetadata {
83
+ /** Resolved snapshot ID */
84
+ snapshotId: number
85
+ /** Snapshot timestamp */
86
+ snapshotTimestampMs: number
87
+ /** Requested timestamp */
88
+ requestedTimestampMs: number
89
+ /** Query mode used */
90
+ mode: TimeTravelMode
91
+ /** Number of data files scanned */
92
+ dataFilesScanned: number
93
+ /** Total records in snapshot */
94
+ totalRecords: number
95
+ /** For versions-between mode: number of snapshots included */
96
+ snapshotCount?: number
97
+ /** For versions-between mode: start timestamp */
98
+ startTimestampMs?: number
99
+ /** For versions-between mode: end timestamp */
100
+ endTimestampMs?: number
101
+ }
102
+
103
+ /**
104
+ * Data files resolved for a time travel query
105
+ */
106
+ export interface ResolvedDataFiles {
107
+ /** List of data files to read */
108
+ dataFiles: IcebergDataFile[]
109
+ /** Metadata about the resolution */
110
+ metadata: TimeTravelMetadata
111
+ }
112
+
113
+ /**
114
+ * Operation type for row versions
115
+ */
116
+ export type RowOperation = 'INSERT' | 'UPDATE' | 'DELETE'
117
+
118
+ /**
119
+ * System columns for version tracking
120
+ */
121
+ export interface VersionSystemColumns {
122
+ /** Operation that created this version */
123
+ _operation: RowOperation
124
+ /** Timestamp when this version became current */
125
+ _valid_from: number
126
+ /** Timestamp when this version was superseded (null if current) */
127
+ _valid_to: number | null
128
+ /** Transaction ID that created this version */
129
+ _transaction_id: number
130
+ /** Snapshot ID where this version exists */
131
+ _snapshot_id: number
132
+ }
133
+
134
+ /**
135
+ * Row version with data and system columns
136
+ */
137
+ export interface RowVersion<T = Record<string, unknown>> {
138
+ /** User data columns */
139
+ data: T
140
+ /** System version tracking columns */
141
+ system: VersionSystemColumns
142
+ }
143
+
144
+ /**
145
+ * Result of a VERSIONS BETWEEN query
146
+ */
147
+ export interface VersionsBetweenResult<T = Record<string, unknown>> {
148
+ /** All versions of rows in the time range */
149
+ versions: RowVersion<T>[]
150
+ /** Metadata about the query */
151
+ metadata: TimeTravelMetadata
152
+ /** Whether there are more versions (for pagination) */
153
+ hasMore: boolean
154
+ /** Continuation token for pagination */
155
+ continuationToken?: string
156
+ }
157
+
158
+ /**
159
+ * Configuration for the time travel reader
160
+ */
161
+ export interface TimeTravelReaderConfig {
162
+ /** R2 bucket for reading Iceberg data */
163
+ bucket: R2Bucket
164
+ /** Default retention window in milliseconds (default: 30 days) */
165
+ retentionWindowMs?: number
166
+ /** Maximum allowed query age in milliseconds (default: 90 days) */
167
+ maxQueryAgeMs?: number
168
+ /** Enable caching of manifest data (default: true) */
169
+ enableManifestCache?: boolean
170
+ /** Cache TTL in milliseconds (default: 5 minutes) */
171
+ manifestCacheTtlMs?: number
172
+ }
173
+
174
+ /**
175
+ * Error thrown when timestamp is out of retention range
176
+ */
177
+ export class TimestampOutOfRangeError extends Error {
178
+ constructor(
179
+ public readonly requestedTimestamp: number,
180
+ public readonly oldestAvailable: number,
181
+ public readonly newestAvailable: number
182
+ ) {
183
+ const requested = new Date(requestedTimestamp).toISOString()
184
+ const oldest = new Date(oldestAvailable).toISOString()
185
+ const newest = new Date(newestAvailable).toISOString()
186
+ super(
187
+ `Requested timestamp ${requested} is out of range. ` +
188
+ `Available range: ${oldest} to ${newest}`
189
+ )
190
+ this.name = 'TimestampOutOfRangeError'
191
+ }
192
+ }
193
+
194
+ /**
195
+ * Error thrown when no snapshot is found
196
+ */
197
+ export class NoSnapshotFoundError extends Error {
198
+ constructor(public readonly requestedTimestamp: number) {
199
+ super(
200
+ `No snapshot found for timestamp ${new Date(requestedTimestamp).toISOString()}. ` +
201
+ `The table may not have any data yet.`
202
+ )
203
+ this.name = 'NoSnapshotFoundError'
204
+ }
205
+ }
206
+
207
+ /**
208
+ * Error thrown for invalid timestamp format
209
+ */
210
+ export class InvalidTimestampError extends Error {
211
+ constructor(public readonly input: unknown) {
212
+ super(`Invalid timestamp format: ${String(input)}`)
213
+ this.name = 'InvalidTimestampError'
214
+ }
215
+ }
216
+
217
+ // ============================================================================
218
+ // Timestamp Parsing
219
+ // ============================================================================
220
+
221
+ /**
222
+ * Relative time patterns and their millisecond multipliers
223
+ */
224
+ const RELATIVE_TIME_PATTERNS: Array<{
225
+ pattern: RegExp
226
+ multiplier: number
227
+ }> = [
228
+ { pattern: /^(\d+)\s*(ms|milliseconds?)\s*ago$/i, multiplier: 1 },
229
+ { pattern: /^(\d+)\s*(s|sec|seconds?)\s*ago$/i, multiplier: 1000 },
230
+ { pattern: /^(\d+)\s*(m|min|minutes?)\s*ago$/i, multiplier: 60 * 1000 },
231
+ { pattern: /^(\d+)\s*(h|hr|hours?)\s*ago$/i, multiplier: 60 * 60 * 1000 },
232
+ { pattern: /^(\d+)\s*(d|days?)\s*ago$/i, multiplier: 24 * 60 * 60 * 1000 },
233
+ { pattern: /^(\d+)\s*(w|wk|weeks?)\s*ago$/i, multiplier: 7 * 24 * 60 * 60 * 1000 },
234
+ { pattern: /^(\d+)\s*(mo|months?)\s*ago$/i, multiplier: 30 * 24 * 60 * 60 * 1000 },
235
+ { pattern: /^(\d+)\s*(y|yr|years?)\s*ago$/i, multiplier: 365 * 24 * 60 * 60 * 1000 },
236
+ ]
237
+
238
+ /**
239
+ * SQL INTERVAL patterns for PostgreSQL-style interval syntax
240
+ * Matches: INTERVAL '1 hour', INTERVAL '30 minutes', etc.
241
+ */
242
+ const SQL_INTERVAL_PATTERNS: Array<{
243
+ pattern: RegExp
244
+ multiplier: number
245
+ }> = [
246
+ { pattern: /^interval\s*'(\d+)\s*(ms|milliseconds?)'$/i, multiplier: 1 },
247
+ { pattern: /^interval\s*'(\d+)\s*(s|sec|seconds?)'$/i, multiplier: 1000 },
248
+ { pattern: /^interval\s*'(\d+)\s*(m|min|minutes?)'$/i, multiplier: 60 * 1000 },
249
+ { pattern: /^interval\s*'(\d+)\s*(h|hr|hours?)'$/i, multiplier: 60 * 60 * 1000 },
250
+ { pattern: /^interval\s*'(\d+)\s*(d|days?)'$/i, multiplier: 24 * 60 * 60 * 1000 },
251
+ { pattern: /^interval\s*'(\d+)\s*(w|wk|weeks?)'$/i, multiplier: 7 * 24 * 60 * 60 * 1000 },
252
+ { pattern: /^interval\s*'(\d+)\s*(mo|months?)'$/i, multiplier: 30 * 24 * 60 * 60 * 1000 },
253
+ { pattern: /^interval\s*'(\d+)\s*(y|yr|years?)'$/i, multiplier: 365 * 24 * 60 * 60 * 1000 },
254
+ ]
255
+
256
+ /**
257
+ * Parse a timestamp specification into milliseconds since epoch
258
+ */
259
+ export function parseTimestamp(spec: TimestampSpec, referenceTime?: number): ParsedTimestamp {
260
+ const now = referenceTime ?? Date.now()
261
+
262
+ // Already a number (epoch ms)
263
+ if (typeof spec === 'number') {
264
+ return {
265
+ timestampMs: spec,
266
+ original: spec,
267
+ isRelative: false,
268
+ }
269
+ }
270
+
271
+ // Date object
272
+ if (spec instanceof Date) {
273
+ return {
274
+ timestampMs: spec.getTime(),
275
+ original: spec,
276
+ isRelative: false,
277
+ }
278
+ }
279
+
280
+ // String - try various formats
281
+ if (typeof spec === 'string') {
282
+ const trimmed = spec.trim()
283
+
284
+ // Check for NOW() or CURRENT_TIMESTAMP (case insensitive)
285
+ if (/^(now\(\)|current_timestamp)$/i.test(trimmed)) {
286
+ return {
287
+ timestampMs: now,
288
+ original: spec,
289
+ isRelative: true,
290
+ }
291
+ }
292
+
293
+ // Check for NOW() - INTERVAL or CURRENT_TIMESTAMP - INTERVAL patterns
294
+ const nowMinusIntervalMatch = trimmed.match(
295
+ /^(now\(\)|current_timestamp)\s*-\s*interval\s*'(\d+)\s*(\w+)'$/i
296
+ )
297
+ if (nowMinusIntervalMatch) {
298
+ const value = parseInt(nowMinusIntervalMatch[2]!, 10)
299
+ const unit = nowMinusIntervalMatch[3]!.toLowerCase()
300
+ const multiplier = getIntervalMultiplier(unit)
301
+ if (multiplier !== null) {
302
+ return {
303
+ timestampMs: now - value * multiplier,
304
+ original: spec,
305
+ isRelative: true,
306
+ }
307
+ }
308
+ }
309
+
310
+ // Check for relative time expressions (e.g., "1 hour ago")
311
+ for (const { pattern, multiplier } of RELATIVE_TIME_PATTERNS) {
312
+ const match = trimmed.match(pattern)
313
+ if (match && match[1]) {
314
+ const value = parseInt(match[1], 10)
315
+ return {
316
+ timestampMs: now - value * multiplier,
317
+ original: spec,
318
+ isRelative: true,
319
+ }
320
+ }
321
+ }
322
+
323
+ // Check for SQL INTERVAL syntax (standalone, treated as relative to now)
324
+ for (const { pattern, multiplier } of SQL_INTERVAL_PATTERNS) {
325
+ const match = trimmed.match(pattern)
326
+ if (match && match[1]) {
327
+ const value = parseInt(match[1], 10)
328
+ return {
329
+ timestampMs: now - value * multiplier,
330
+ original: spec,
331
+ isRelative: true,
332
+ }
333
+ }
334
+ }
335
+
336
+ // Try ISO date parsing
337
+ const parsed = Date.parse(trimmed)
338
+ if (!isNaN(parsed)) {
339
+ return {
340
+ timestampMs: parsed,
341
+ original: spec,
342
+ isRelative: false,
343
+ }
344
+ }
345
+
346
+ // Try numeric string (epoch ms)
347
+ const numeric = parseInt(trimmed, 10)
348
+ if (!isNaN(numeric) && String(numeric) === trimmed) {
349
+ return {
350
+ timestampMs: numeric,
351
+ original: spec,
352
+ isRelative: false,
353
+ }
354
+ }
355
+ }
356
+
357
+ throw new InvalidTimestampError(spec)
358
+ }
359
+
360
+ /**
361
+ * Get the millisecond multiplier for an interval unit
362
+ */
363
+ function getIntervalMultiplier(unit: string): number | null {
364
+ const unitLower = unit.toLowerCase()
365
+ const unitMap: Record<string, number> = {
366
+ ms: 1,
367
+ millisecond: 1,
368
+ milliseconds: 1,
369
+ s: 1000,
370
+ sec: 1000,
371
+ second: 1000,
372
+ seconds: 1000,
373
+ m: 60 * 1000,
374
+ min: 60 * 1000,
375
+ minute: 60 * 1000,
376
+ minutes: 60 * 1000,
377
+ h: 60 * 60 * 1000,
378
+ hr: 60 * 60 * 1000,
379
+ hour: 60 * 60 * 1000,
380
+ hours: 60 * 60 * 1000,
381
+ d: 24 * 60 * 60 * 1000,
382
+ day: 24 * 60 * 60 * 1000,
383
+ days: 24 * 60 * 60 * 1000,
384
+ w: 7 * 24 * 60 * 60 * 1000,
385
+ wk: 7 * 24 * 60 * 60 * 1000,
386
+ week: 7 * 24 * 60 * 60 * 1000,
387
+ weeks: 7 * 24 * 60 * 60 * 1000,
388
+ mo: 30 * 24 * 60 * 60 * 1000,
389
+ month: 30 * 24 * 60 * 60 * 1000,
390
+ months: 30 * 24 * 60 * 60 * 1000,
391
+ y: 365 * 24 * 60 * 60 * 1000,
392
+ yr: 365 * 24 * 60 * 60 * 1000,
393
+ year: 365 * 24 * 60 * 60 * 1000,
394
+ years: 365 * 24 * 60 * 60 * 1000,
395
+ }
396
+ return unitMap[unitLower] ?? null
397
+ }
398
+
399
+ /**
400
+ * Format a timestamp for display
401
+ */
402
+ export function formatTimestamp(timestampMs: number): string {
403
+ return new Date(timestampMs).toISOString()
404
+ }
405
+
406
+ // ============================================================================
407
+ // SQL AS OF Parser
408
+ // ============================================================================
409
+
410
+ /**
411
+ * SQL AS OF clause pattern
412
+ * Matches: AS OF TIMESTAMP '2024-01-01' or AS OF TIMESTAMP '2024-01-01T00:00:00Z'
413
+ */
414
+ const AS_OF_TIMESTAMP_PATTERN =
415
+ /\bAS\s+OF\s+TIMESTAMP\s+['"]([^'"]+)['"]/i
416
+
417
+ /**
418
+ * SQL AS OF SYSTEM TIME pattern (alternative syntax)
419
+ */
420
+ const AS_OF_SYSTEM_TIME_PATTERN =
421
+ /\bAS\s+OF\s+SYSTEM\s+TIME\s+['"]([^'"]+)['"]/i
422
+
423
+ /**
424
+ * SQL FOR SYSTEM_TIME AS OF pattern
425
+ */
426
+ const FOR_SYSTEM_TIME_AS_OF_PATTERN =
427
+ /\bFOR\s+SYSTEM_TIME\s+AS\s+OF\s+['"]([^'"]+)['"]/i
428
+
429
+ /**
430
+ * SQL VERSIONS BETWEEN pattern
431
+ * Matches: VERSIONS BETWEEN TIMESTAMP '2024-01-01' AND '2024-01-15'
432
+ * Also matches: VERSIONS BETWEEN TIMESTAMP '2024-01-01' AND TIMESTAMP '2024-01-15'
433
+ * Also matches: VERSIONS BETWEEN '2024-01-01' AND '2024-01-15'
434
+ */
435
+ const VERSIONS_BETWEEN_PATTERN =
436
+ /\bVERSIONS\s+BETWEEN\s+(?:TIMESTAMP\s+)?['"]([^'"]+)['"]\s+AND\s+(?:TIMESTAMP\s+)?['"]([^'"]+)['"]/i
437
+
438
+ /**
439
+ * SQL VERSIONS BETWEEN with expression pattern
440
+ * Matches: VERSIONS BETWEEN TIMESTAMP '2024-01-01' AND CURRENT_TIMESTAMP
441
+ * Also matches: VERSIONS BETWEEN TIMESTAMP '2024-01-01' AND NOW()
442
+ */
443
+ const VERSIONS_BETWEEN_EXPR_PATTERN =
444
+ /\bVERSIONS\s+BETWEEN\s+(?:TIMESTAMP\s+)?['"]([^'"]+)['"]\s+AND\s+(?:TIMESTAMP\s+)?(now\(\)|current_timestamp)/i
445
+
446
+ /**
447
+ * SQL AS OF with expression pattern (NOW() - INTERVAL '1 hour')
448
+ * Matches: AS OF TIMESTAMP NOW() - INTERVAL '1 hour'
449
+ * Also matches: AS OF TIMESTAMP CURRENT_TIMESTAMP - INTERVAL '30 minutes'
450
+ */
451
+ const AS_OF_TIMESTAMP_EXPR_PATTERN =
452
+ /\bAS\s+OF\s+TIMESTAMP\s+((?:now\(\)|current_timestamp)\s*-\s*interval\s*'[^']+')/i
453
+
454
+ /**
455
+ * SQL AS OF with NOW() or CURRENT_TIMESTAMP (no subtraction)
456
+ * Matches: AS OF TIMESTAMP NOW() or AS OF TIMESTAMP CURRENT_TIMESTAMP
457
+ */
458
+ const AS_OF_TIMESTAMP_NOW_PATTERN =
459
+ /\bAS\s+OF\s+TIMESTAMP\s+(now\(\)|current_timestamp)/i
460
+
461
+ /**
462
+ * Parsed SQL with time travel information
463
+ */
464
+ export interface ParsedTimeTravelSQL {
465
+ /** Original SQL */
466
+ originalSql: string
467
+ /** SQL with AS OF clause removed */
468
+ cleanSql: string
469
+ /** Parsed timestamp if AS OF was found */
470
+ timestamp?: ParsedTimestamp
471
+ /** Whether AS OF clause was found */
472
+ hasTimeTravelClause: boolean
473
+ /** The table name referenced (if detectable) */
474
+ tableName?: string
475
+ /** Query mode detected from SQL */
476
+ mode?: TimeTravelMode
477
+ /** Start timestamp for VERSIONS BETWEEN queries */
478
+ startTimestamp?: ParsedTimestamp
479
+ /** End timestamp for VERSIONS BETWEEN queries */
480
+ endTimestamp?: ParsedTimestamp
481
+ }
482
+
483
+ /**
484
+ * Parse SQL for AS OF TIMESTAMP clause
485
+ *
486
+ * Supports the following syntax variants:
487
+ * - AS OF TIMESTAMP '2024-01-01T00:00:00Z' (ISO timestamp)
488
+ * - AS OF TIMESTAMP '1 hour ago' (relative timestamp)
489
+ * - AS OF TIMESTAMP NOW() - INTERVAL '1 hour' (SQL expression)
490
+ * - AS OF TIMESTAMP CURRENT_TIMESTAMP - INTERVAL '30 minutes'
491
+ * - AS OF TIMESTAMP NOW()
492
+ * - AS OF SYSTEM TIME '2024-01-01' (alternative syntax)
493
+ * - FOR SYSTEM_TIME AS OF '2024-01-01' (SQL:2011 syntax)
494
+ * - VERSIONS BETWEEN TIMESTAMP '2024-01-01' AND '2024-01-15' (range query)
495
+ * - VERSIONS BETWEEN '2024-01-01' AND CURRENT_TIMESTAMP (range with expression)
496
+ */
497
+ export function parseTimeTravelSQL(sql: string): ParsedTimeTravelSQL {
498
+ // First check for VERSIONS BETWEEN patterns (highest precedence)
499
+ let versionsBetweenMatch = sql.match(VERSIONS_BETWEEN_EXPR_PATTERN)
500
+ if (versionsBetweenMatch && versionsBetweenMatch[1] && versionsBetweenMatch[2]) {
501
+ const startTimestamp = parseTimestamp(versionsBetweenMatch[1])
502
+ const endTimestamp = parseTimestamp(versionsBetweenMatch[2])
503
+ const cleanSql = sql.replace(VERSIONS_BETWEEN_EXPR_PATTERN, '').replace(/\s+/g, ' ').trim()
504
+ const tableMatch = cleanSql.match(/\bFROM\s+["']?(\w+)["']?/i)
505
+ const tableName = tableMatch?.[1]
506
+
507
+ const result: ParsedTimeTravelSQL = {
508
+ originalSql: sql,
509
+ cleanSql,
510
+ hasTimeTravelClause: true,
511
+ mode: 'versions-between',
512
+ startTimestamp,
513
+ endTimestamp,
514
+ }
515
+
516
+ if (tableName) {
517
+ result.tableName = tableName
518
+ }
519
+
520
+ return result
521
+ }
522
+
523
+ versionsBetweenMatch = sql.match(VERSIONS_BETWEEN_PATTERN)
524
+ if (versionsBetweenMatch && versionsBetweenMatch[1] && versionsBetweenMatch[2]) {
525
+ const startTimestamp = parseTimestamp(versionsBetweenMatch[1])
526
+ const endTimestamp = parseTimestamp(versionsBetweenMatch[2])
527
+ const cleanSql = sql.replace(VERSIONS_BETWEEN_PATTERN, '').replace(/\s+/g, ' ').trim()
528
+ const tableMatch = cleanSql.match(/\bFROM\s+["']?(\w+)["']?/i)
529
+ const tableName = tableMatch?.[1]
530
+
531
+ const result: ParsedTimeTravelSQL = {
532
+ originalSql: sql,
533
+ cleanSql,
534
+ hasTimeTravelClause: true,
535
+ mode: 'versions-between',
536
+ startTimestamp,
537
+ endTimestamp,
538
+ }
539
+
540
+ if (tableName) {
541
+ result.tableName = tableName
542
+ }
543
+
544
+ return result
545
+ }
546
+
547
+ // Define all AS OF patterns to check, in order of specificity
548
+ type PatternType = { pattern: RegExp; name: string }
549
+ const patterns: PatternType[] = [
550
+ { pattern: AS_OF_TIMESTAMP_EXPR_PATTERN, name: 'expr' },
551
+ { pattern: AS_OF_TIMESTAMP_NOW_PATTERN, name: 'now' },
552
+ { pattern: AS_OF_TIMESTAMP_PATTERN, name: 'timestamp' },
553
+ { pattern: AS_OF_SYSTEM_TIME_PATTERN, name: 'system_time' },
554
+ { pattern: FOR_SYSTEM_TIME_AS_OF_PATTERN, name: 'for_system_time' },
555
+ ]
556
+
557
+ let match: RegExpMatchArray | null = null
558
+ let matchedPattern: RegExp | null = null
559
+
560
+ for (const { pattern } of patterns) {
561
+ match = sql.match(pattern)
562
+ if (match) {
563
+ matchedPattern = pattern
564
+ break
565
+ }
566
+ }
567
+
568
+ if (!match || !match[1] || !matchedPattern) {
569
+ return {
570
+ originalSql: sql,
571
+ cleanSql: sql,
572
+ hasTimeTravelClause: false,
573
+ }
574
+ }
575
+
576
+ const timestampStr = match[1]
577
+ const timestamp = parseTimestamp(timestampStr)
578
+ const cleanSql = sql.replace(matchedPattern, '').replace(/\s+/g, ' ').trim()
579
+
580
+ // Try to extract table name from FROM clause
581
+ const tableMatch = cleanSql.match(/\bFROM\s+["']?(\w+)["']?/i)
582
+ const tableName = tableMatch?.[1]
583
+
584
+ const result: ParsedTimeTravelSQL = {
585
+ originalSql: sql,
586
+ cleanSql,
587
+ timestamp,
588
+ hasTimeTravelClause: true,
589
+ mode: 'point-in-time',
590
+ }
591
+
592
+ if (tableName) {
593
+ result.tableName = tableName
594
+ }
595
+
596
+ return result
597
+ }
598
+
599
+ /**
600
+ * Build SQL with AS OF clause
601
+ */
602
+ export function buildTimeTravelSQL(
603
+ baseSql: string,
604
+ timestamp: TimestampSpec,
605
+ tableName?: string
606
+ ): string {
607
+ const parsed = parseTimestamp(timestamp)
608
+ const isoTimestamp = formatTimestamp(parsed.timestampMs)
609
+
610
+ // If table name provided and SQL has FROM clause, insert AS OF after table name
611
+ if (tableName) {
612
+ const tablePattern = new RegExp(`(\\bFROM\\s+["']?${tableName}["']?)`, 'i')
613
+ if (tablePattern.test(baseSql)) {
614
+ return baseSql.replace(tablePattern, `$1 AS OF TIMESTAMP '${isoTimestamp}'`)
615
+ }
616
+ }
617
+
618
+ // Otherwise, try to insert after FROM table
619
+ const fromPattern = /(\bFROM\s+["']?\w+["']?)/i
620
+ if (fromPattern.test(baseSql)) {
621
+ return baseSql.replace(fromPattern, `$1 AS OF TIMESTAMP '${isoTimestamp}'`)
622
+ }
623
+
624
+ // Fallback: append to end (may not be valid SQL but preserves intent)
625
+ return `${baseSql} AS OF TIMESTAMP '${isoTimestamp}'`
626
+ }
627
+
628
+ // ============================================================================
629
+ // Time Travel Reader
630
+ // ============================================================================
631
+
632
+ /**
633
+ * Cache entry for manifest data
634
+ */
635
+ interface ManifestCacheEntry {
636
+ data: IcebergManifestFile[]
637
+ expiresAt: number
638
+ }
639
+
640
+ /**
641
+ * Iceberg Time Travel Reader
642
+ *
643
+ * Reads Iceberg table data at a specific point in time using snapshots.
644
+ */
645
+ export class IcebergTimeTravelReader {
646
+ private bucket: R2Bucket
647
+ private retentionWindowMs: number
648
+ private maxQueryAgeMs: number
649
+ private enableManifestCache: boolean
650
+ private manifestCacheTtlMs: number
651
+ private manifestCache: Map<string, ManifestCacheEntry> = new Map()
652
+
653
+ constructor(config: TimeTravelReaderConfig) {
654
+ this.bucket = config.bucket
655
+ // Store retention window for future use in validation
656
+ this.retentionWindowMs = config.retentionWindowMs ?? 30 * 24 * 60 * 60 * 1000 // 30 days
657
+ this.maxQueryAgeMs = config.maxQueryAgeMs ?? 90 * 24 * 60 * 60 * 1000 // 90 days
658
+ this.enableManifestCache = config.enableManifestCache ?? true
659
+ this.manifestCacheTtlMs = config.manifestCacheTtlMs ?? 5 * 60 * 1000 // 5 minutes
660
+ }
661
+
662
+ /**
663
+ * Get the retention window in milliseconds
664
+ */
665
+ getRetentionWindowMs(): number {
666
+ return this.retentionWindowMs
667
+ }
668
+
669
+ /**
670
+ * Find the snapshot that was current at the given timestamp
671
+ */
672
+ async findSnapshotAtTimestamp(
673
+ metadata: IcebergTableMetadata,
674
+ timestamp: TimestampSpec
675
+ ): Promise<ResolvedSnapshot> {
676
+ const parsed = parseTimestamp(timestamp)
677
+ const targetMs = parsed.timestampMs
678
+
679
+ const snapshots = metadata.snapshots ?? []
680
+
681
+ if (snapshots.length === 0) {
682
+ throw new NoSnapshotFoundError(targetMs)
683
+ }
684
+
685
+ // Sort snapshots by timestamp descending
686
+ const sortedSnapshots = [...snapshots].sort(
687
+ (a, b) => b['timestamp-ms'] - a['timestamp-ms']
688
+ )
689
+
690
+ // Find the oldest and newest snapshots for range checking
691
+ const oldestSnapshot = sortedSnapshots[sortedSnapshots.length - 1]!
692
+ const newestSnapshot = sortedSnapshots[0]!
693
+
694
+ // Check if timestamp is in valid range
695
+ const now = Date.now()
696
+ if (targetMs > now) {
697
+ throw new TimestampOutOfRangeError(
698
+ targetMs,
699
+ oldestSnapshot['timestamp-ms'],
700
+ now
701
+ )
702
+ }
703
+
704
+ if (targetMs < oldestSnapshot['timestamp-ms'] - this.maxQueryAgeMs) {
705
+ throw new TimestampOutOfRangeError(
706
+ targetMs,
707
+ oldestSnapshot['timestamp-ms'],
708
+ newestSnapshot['timestamp-ms']
709
+ )
710
+ }
711
+
712
+ // Find the snapshot that was current at the target timestamp
713
+ // This is the newest snapshot with timestamp <= target
714
+ let selectedSnapshot: IcebergSnapshot | null = null
715
+ let timeDiff = Infinity
716
+
717
+ for (const snapshot of sortedSnapshots) {
718
+ const snapshotTs = snapshot['timestamp-ms']
719
+ if (snapshotTs <= targetMs) {
720
+ const diff = targetMs - snapshotTs
721
+ if (diff < timeDiff) {
722
+ selectedSnapshot = snapshot
723
+ timeDiff = diff
724
+ }
725
+ break // Since sorted descending, first match is best
726
+ }
727
+ }
728
+
729
+ // If no snapshot found at or before target, use oldest
730
+ if (!selectedSnapshot) {
731
+ selectedSnapshot = oldestSnapshot
732
+ timeDiff = Math.abs(targetMs - oldestSnapshot['timestamp-ms'])
733
+ }
734
+
735
+ return {
736
+ snapshot: selectedSnapshot,
737
+ timestampMs: targetMs,
738
+ exactMatch: timeDiff === 0,
739
+ timeDifferenceMs: timeDiff,
740
+ }
741
+ }
742
+
743
+ /**
744
+ * Get the snapshot range for a time range query
745
+ */
746
+ async findSnapshotsInRange(
747
+ metadata: IcebergTableMetadata,
748
+ fromTimestamp: TimestampSpec,
749
+ toTimestamp: TimestampSpec
750
+ ): Promise<IcebergSnapshot[]> {
751
+ const from = parseTimestamp(fromTimestamp)
752
+ const to = parseTimestamp(toTimestamp)
753
+
754
+ const snapshots = metadata.snapshots ?? []
755
+
756
+ return snapshots.filter((snapshot) => {
757
+ const ts = snapshot['timestamp-ms']
758
+ return ts >= from.timestampMs && ts <= to.timestampMs
759
+ })
760
+ }
761
+
762
+ /**
763
+ * Get data files for a snapshot
764
+ * @param _metadata - Table metadata (reserved for future schema validation)
765
+ * @param snapshot - The snapshot to read files from
766
+ */
767
+ async getDataFilesForSnapshot(
768
+ _metadata: IcebergTableMetadata,
769
+ snapshot: IcebergSnapshot
770
+ ): Promise<ResolvedDataFiles> {
771
+ const manifestListPath = snapshot['manifest-list']
772
+
773
+ // Load manifest list
774
+ const manifestList = await this.loadManifestList(manifestListPath)
775
+
776
+ // Load all manifests and collect data files
777
+ const dataFiles: IcebergDataFile[] = []
778
+
779
+ for (const manifest of manifestList) {
780
+ const entries = await this.loadManifest(manifest['manifest-path'])
781
+
782
+ for (const entry of entries) {
783
+ // Only include EXISTING (0) and ADDED (1) entries
784
+ // DELETED (2) entries are excluded
785
+ if (entry.status === 0 || entry.status === 1) {
786
+ dataFiles.push(entry['data-file'])
787
+ }
788
+ }
789
+ }
790
+
791
+ // Calculate total records
792
+ const totalRecords = dataFiles.reduce(
793
+ (sum, file) => sum + file['record-count'],
794
+ 0
795
+ )
796
+
797
+ return {
798
+ dataFiles,
799
+ metadata: {
800
+ snapshotId: snapshot['snapshot-id'],
801
+ snapshotTimestampMs: snapshot['timestamp-ms'],
802
+ requestedTimestampMs: snapshot['timestamp-ms'],
803
+ mode: 'point-in-time',
804
+ dataFilesScanned: dataFiles.length,
805
+ totalRecords,
806
+ },
807
+ }
808
+ }
809
+
810
+ /**
811
+ * Resolve data files for a time travel query
812
+ */
813
+ async resolveDataFiles(
814
+ metadata: IcebergTableMetadata,
815
+ options: TimeTravelQueryOptions
816
+ ): Promise<ResolvedDataFiles> {
817
+ // Determine query mode
818
+ let mode: TimeTravelMode = options.mode ?? 'latest'
819
+
820
+ if (options.asOf && !options.mode) {
821
+ mode = 'point-in-time'
822
+ } else if (options.fromTimestamp && options.toTimestamp && !options.mode) {
823
+ mode = 'range'
824
+ }
825
+
826
+ switch (mode) {
827
+ case 'point-in-time': {
828
+ if (!options.asOf) {
829
+ throw new Error('asOf timestamp is required for point-in-time queries')
830
+ }
831
+ const resolved = await this.findSnapshotAtTimestamp(metadata, options.asOf)
832
+ const result = await this.getDataFilesForSnapshot(metadata, resolved.snapshot)
833
+ result.metadata.requestedTimestampMs = resolved.timestampMs
834
+ result.metadata.mode = mode
835
+ return result
836
+ }
837
+
838
+ case 'versions-between': {
839
+ if (!options.fromTimestamp || !options.toTimestamp) {
840
+ throw new Error('fromTimestamp and toTimestamp are required for versions-between queries')
841
+ }
842
+
843
+ const fromParsed = parseTimestamp(options.fromTimestamp)
844
+ const toParsed = parseTimestamp(options.toTimestamp)
845
+
846
+ // Find all snapshots in the range
847
+ const snapshots = await this.findSnapshotsInRange(
848
+ metadata,
849
+ fromParsed.timestampMs,
850
+ toParsed.timestampMs
851
+ )
852
+
853
+ if (snapshots.length === 0) {
854
+ throw new NoSnapshotFoundError(fromParsed.timestampMs)
855
+ }
856
+
857
+ // Collect all data files from all snapshots in the range
858
+ const allDataFiles: IcebergDataFile[] = []
859
+ let totalRecords = 0
860
+
861
+ for (const snapshot of snapshots) {
862
+ const { dataFiles } = await this.getDataFilesForSnapshot(metadata, snapshot)
863
+ allDataFiles.push(...dataFiles)
864
+ totalRecords += dataFiles.reduce((sum, file) => sum + file['record-count'], 0)
865
+ }
866
+
867
+ // Deduplicate data files by file path
868
+ const uniqueDataFiles = Array.from(
869
+ new Map(allDataFiles.map(file => [file['file-path'], file])).values()
870
+ )
871
+
872
+ return {
873
+ dataFiles: uniqueDataFiles,
874
+ metadata: {
875
+ snapshotId: snapshots[snapshots.length - 1]!['snapshot-id'],
876
+ snapshotTimestampMs: snapshots[snapshots.length - 1]!['timestamp-ms'],
877
+ requestedTimestampMs: fromParsed.timestampMs,
878
+ mode: 'versions-between',
879
+ dataFilesScanned: uniqueDataFiles.length,
880
+ totalRecords,
881
+ snapshotCount: snapshots.length,
882
+ startTimestampMs: fromParsed.timestampMs,
883
+ endTimestampMs: toParsed.timestampMs,
884
+ },
885
+ }
886
+ }
887
+
888
+ case 'range': {
889
+ if (!options.fromTimestamp || !options.toTimestamp) {
890
+ throw new Error('fromTimestamp and toTimestamp are required for range queries')
891
+ }
892
+
893
+ // For range queries, get the end snapshot's data files
894
+ // The data represents the state at the end of the range
895
+ const toResolved = await this.findSnapshotAtTimestamp(
896
+ metadata,
897
+ options.toTimestamp
898
+ )
899
+ const result = await this.getDataFilesForSnapshot(metadata, toResolved.snapshot)
900
+ result.metadata.mode = mode
901
+ return result
902
+ }
903
+
904
+ case 'latest':
905
+ default: {
906
+ // Use current snapshot
907
+ const currentSnapshotId = metadata['current-snapshot-id']
908
+ if (!currentSnapshotId) {
909
+ throw new NoSnapshotFoundError(Date.now())
910
+ }
911
+
912
+ const snapshot = metadata.snapshots?.find(
913
+ (s) => s['snapshot-id'] === currentSnapshotId
914
+ )
915
+ if (!snapshot) {
916
+ throw new NoSnapshotFoundError(Date.now())
917
+ }
918
+
919
+ const result = await this.getDataFilesForSnapshot(metadata, snapshot)
920
+ result.metadata.mode = mode
921
+ return result
922
+ }
923
+ }
924
+ }
925
+
926
+ /**
927
+ * Get available time range for queries
928
+ */
929
+ getAvailableTimeRange(metadata: IcebergTableMetadata): {
930
+ oldest: number | null
931
+ newest: number | null
932
+ } {
933
+ const snapshots = metadata.snapshots ?? []
934
+
935
+ if (snapshots.length === 0) {
936
+ return { oldest: null, newest: null }
937
+ }
938
+
939
+ const timestamps = snapshots.map((s) => s['timestamp-ms'])
940
+ return {
941
+ oldest: Math.min(...timestamps),
942
+ newest: Math.max(...timestamps),
943
+ }
944
+ }
945
+
946
+ /**
947
+ * List all available snapshots with their timestamps
948
+ */
949
+ listSnapshots(
950
+ metadata: IcebergTableMetadata
951
+ ): Array<{ snapshotId: number; timestampMs: number; timestamp: string }> {
952
+ const snapshots = metadata.snapshots ?? []
953
+
954
+ return snapshots
955
+ .map((s) => ({
956
+ snapshotId: s['snapshot-id'],
957
+ timestampMs: s['timestamp-ms'],
958
+ timestamp: formatTimestamp(s['timestamp-ms']),
959
+ }))
960
+ .sort((a, b) => b.timestampMs - a.timestampMs)
961
+ }
962
+
963
+ /**
964
+ * Load manifest list from R2
965
+ */
966
+ private async loadManifestList(path: string): Promise<IcebergManifestFile[]> {
967
+ // Check cache
968
+ if (this.enableManifestCache) {
969
+ const cached = this.manifestCache.get(path)
970
+ if (cached && cached.expiresAt > Date.now()) {
971
+ return cached.data
972
+ }
973
+ }
974
+
975
+ const obj = await this.bucket.get(path)
976
+ if (!obj) {
977
+ throw new Error(`Manifest list not found: ${path}`)
978
+ }
979
+
980
+ const data = JSON.parse(await obj.text())
981
+ const manifests: IcebergManifestFile[] = data.manifests ?? []
982
+
983
+ // Cache the result
984
+ if (this.enableManifestCache) {
985
+ this.manifestCache.set(path, {
986
+ data: manifests,
987
+ expiresAt: Date.now() + this.manifestCacheTtlMs,
988
+ })
989
+ }
990
+
991
+ return manifests
992
+ }
993
+
994
+ /**
995
+ * Load manifest entries from R2
996
+ */
997
+ private async loadManifest(path: string): Promise<IcebergManifestEntry[]> {
998
+ const cacheKey = `manifest:${path}`
999
+
1000
+ // Check cache (reuse manifest cache for entries too)
1001
+ if (this.enableManifestCache) {
1002
+ const cached = this.manifestCache.get(cacheKey)
1003
+ if (cached && cached.expiresAt > Date.now()) {
1004
+ return cached.data as unknown as IcebergManifestEntry[]
1005
+ }
1006
+ }
1007
+
1008
+ const obj = await this.bucket.get(path)
1009
+ if (!obj) {
1010
+ throw new Error(`Manifest not found: ${path}`)
1011
+ }
1012
+
1013
+ const data = JSON.parse(await obj.text())
1014
+ const entries: IcebergManifestEntry[] = data.entries ?? []
1015
+
1016
+ // Cache the result
1017
+ if (this.enableManifestCache) {
1018
+ this.manifestCache.set(cacheKey, {
1019
+ data: entries as unknown as IcebergManifestFile[],
1020
+ expiresAt: Date.now() + this.manifestCacheTtlMs,
1021
+ })
1022
+ }
1023
+
1024
+ return entries
1025
+ }
1026
+
1027
+ /**
1028
+ * Clear the manifest cache
1029
+ */
1030
+ clearCache(): void {
1031
+ this.manifestCache.clear()
1032
+ }
1033
+
1034
+ /**
1035
+ * Get cache statistics
1036
+ */
1037
+ getCacheStats(): { size: number; ttlMs: number } {
1038
+ return {
1039
+ size: this.manifestCache.size,
1040
+ ttlMs: this.manifestCacheTtlMs,
1041
+ }
1042
+ }
1043
+ }
1044
+
1045
+ /**
1046
+ * Create a time travel reader
1047
+ */
1048
+ export function createTimeTravelReader(
1049
+ config: TimeTravelReaderConfig
1050
+ ): IcebergTimeTravelReader {
1051
+ return new IcebergTimeTravelReader(config)
1052
+ }