@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,1029 @@
1
+ /**
2
+ * Time Travel REST API Module Tests
3
+ * Task: postgres-8gdz.1 - [RED] Audit source files vs test files for iceberg
4
+ *
5
+ * Tests for time-travel-api.ts module exports:
6
+ * - createTimeTravelApi()
7
+ * - timeTravelApiMiddleware()
8
+ * - TimeTravelApiConfig type
9
+ * - API endpoints:
10
+ * - GET /v1/do/{doId}/query
11
+ * - POST /v1/do/{doId}/sql
12
+ * - GET /v1/do/{doId}/snapshots
13
+ * - GET /v1/do/{doId}/snapshots/:snapshotId
14
+ * - GET /v1/do/{doId}/time-range
15
+ * - GET /v1/do/{doId}/resolve-timestamp
16
+ * - GET /v1/do/{doId}/analytics/change-rate
17
+ * - GET /v1/do/{doId}/analytics/growth
18
+ * - GET /v1/do/{doId}/analytics/snapshot-comparison
19
+ *
20
+ * These are stub/failing tests for the RED phase of TDD.
21
+ */
22
+
23
+ import { describe, it, expect, beforeEach, vi } from 'vitest'
24
+ import type { Context } from 'hono'
25
+ import {
26
+ createTimeTravelApi,
27
+ timeTravelApiMiddleware,
28
+ type TimeTravelApiConfig,
29
+ type TimeTravelQueryRequest,
30
+ type TimeTravelQueryResponse,
31
+ type SnapshotListResponse,
32
+ type TimeRangeResponse,
33
+ } from './time-travel-api'
34
+ import { IcebergCatalog, createIcebergCatalog } from './catalog'
35
+ import type { IcebergTableMetadata } from './types'
36
+
37
+ // ============================================================================
38
+ // Mock R2Bucket
39
+ // ============================================================================
40
+
41
+ function createMockBucket(): R2Bucket {
42
+ const storage = new Map<string, { data: string | ArrayBuffer; metadata?: Record<string, string> }>()
43
+
44
+ return {
45
+ put: vi.fn(async (key: string, data: string | ArrayBuffer | ReadableStream, options?: R2PutOptions) => {
46
+ storage.set(key, {
47
+ data: data as string | ArrayBuffer,
48
+ metadata: options?.customMetadata,
49
+ })
50
+ return {
51
+ key,
52
+ version: 'test-version',
53
+ size: typeof data === 'string' ? data.length : (data as ArrayBuffer).byteLength,
54
+ etag: 'test-etag',
55
+ httpEtag: '"test-etag"',
56
+ uploaded: new Date(),
57
+ httpMetadata: options?.httpMetadata || {},
58
+ customMetadata: options?.customMetadata || {},
59
+ } as R2Object
60
+ }),
61
+ get: vi.fn(async (key: string) => {
62
+ const item = storage.get(key)
63
+ if (!item) return null
64
+
65
+ return {
66
+ key,
67
+ version: 'test-version',
68
+ size: typeof item.data === 'string' ? item.data.length : (item.data as ArrayBuffer).byteLength,
69
+ etag: 'test-etag',
70
+ httpEtag: '"test-etag"',
71
+ uploaded: new Date(),
72
+ httpMetadata: {},
73
+ customMetadata: item.metadata || {},
74
+ text: async () => typeof item.data === 'string' ? item.data : new TextDecoder().decode(item.data as ArrayBuffer),
75
+ json: async () => JSON.parse(typeof item.data === 'string' ? item.data : new TextDecoder().decode(item.data as ArrayBuffer)),
76
+ arrayBuffer: async () => typeof item.data === 'string' ? new TextEncoder().encode(item.data).buffer : item.data,
77
+ bytes: async () => typeof item.data === 'string' ? new TextEncoder().encode(item.data) : new Uint8Array(item.data as ArrayBuffer),
78
+ blob: async () => new Blob([item.data]),
79
+ body: null,
80
+ bodyUsed: false,
81
+ writeHttpMetadata: () => {},
82
+ } as R2ObjectBody
83
+ }),
84
+ head: vi.fn(async (key: string) => {
85
+ const item = storage.get(key)
86
+ if (!item) return null
87
+
88
+ return {
89
+ key,
90
+ version: 'test-version',
91
+ size: typeof item.data === 'string' ? item.data.length : (item.data as ArrayBuffer).byteLength,
92
+ etag: 'test-etag',
93
+ httpEtag: '"test-etag"',
94
+ uploaded: new Date(),
95
+ httpMetadata: {},
96
+ customMetadata: item.metadata || {},
97
+ } as R2Object
98
+ }),
99
+ delete: vi.fn(async (keys: string | string[]) => {
100
+ const keyList = Array.isArray(keys) ? keys : [keys]
101
+ for (const key of keyList) {
102
+ storage.delete(key)
103
+ }
104
+ }),
105
+ list: vi.fn(async (options?: R2ListOptions) => {
106
+ const prefix = options?.prefix || ''
107
+ const objects: R2Object[] = []
108
+
109
+ for (const [key, item] of storage) {
110
+ if (key.startsWith(prefix)) {
111
+ objects.push({
112
+ key,
113
+ version: 'test-version',
114
+ size: typeof item.data === 'string' ? item.data.length : (item.data as ArrayBuffer).byteLength,
115
+ etag: 'test-etag',
116
+ httpEtag: '"test-etag"',
117
+ uploaded: new Date(),
118
+ httpMetadata: {},
119
+ customMetadata: item.metadata || {},
120
+ } as R2Object)
121
+ }
122
+ }
123
+
124
+ return {
125
+ objects,
126
+ truncated: false,
127
+ cursor: undefined,
128
+ delimitedPrefixes: [],
129
+ } as R2Objects
130
+ }),
131
+ createMultipartUpload: vi.fn(),
132
+ resumeMultipartUpload: vi.fn(),
133
+ } as unknown as R2Bucket
134
+ }
135
+
136
+ // ============================================================================
137
+ // Test Helpers
138
+ // ============================================================================
139
+
140
+ // The table location must match the catalog's structure
141
+ const TABLE_LOCATION = 'iceberg/namespaces/default/test-table'
142
+
143
+ function createTestMetadata(
144
+ snapshots: Array<{ id: number; timestampMs: number }> = []
145
+ ): IcebergTableMetadata {
146
+ return {
147
+ 'format-version': 2,
148
+ 'table-uuid': 'test-uuid-123',
149
+ location: TABLE_LOCATION,
150
+ 'last-sequence-number': snapshots.length,
151
+ 'last-updated-ms': Date.now(),
152
+ 'last-column-id': 12,
153
+ 'current-schema-id': 0,
154
+ schemas: [{ type: 'struct', 'schema-id': 0, fields: [] }],
155
+ 'default-spec-id': 0,
156
+ 'partition-specs': [{ 'spec-id': 0, fields: [] }],
157
+ 'last-partition-id': 0,
158
+ 'default-sort-order-id': 0,
159
+ 'sort-orders': [{ 'order-id': 0, fields: [] }],
160
+ 'current-snapshot-id': snapshots.length > 0 ? snapshots[snapshots.length - 1]!.id : undefined,
161
+ snapshots: snapshots.map((s, i) => ({
162
+ 'snapshot-id': s.id,
163
+ 'sequence-number': i + 1,
164
+ 'timestamp-ms': s.timestampMs,
165
+ 'manifest-list': `${TABLE_LOCATION}/metadata/snap-${s.id}.avro`,
166
+ summary: { operation: 'append' as const, 'total-records': '100', 'total-data-files': '1' },
167
+ })),
168
+ }
169
+ }
170
+
171
+ async function setupTestCatalog(bucket: R2Bucket, metadata: IcebergTableMetadata): Promise<IcebergCatalog> {
172
+ // Create catalog instance
173
+ const catalog = createIcebergCatalog({
174
+ bucket,
175
+ prefix: 'iceberg/',
176
+ })
177
+
178
+ // Initialize the catalog
179
+ await catalog.initialize()
180
+
181
+ // Create the default namespace
182
+ await catalog.createNamespace({ levels: ['default'] })
183
+
184
+ // Create the test table using the catalog API (registers it in the catalog)
185
+ await catalog.createTable(
186
+ {
187
+ namespace: { levels: ['default'] },
188
+ name: 'test-table',
189
+ },
190
+ metadata
191
+ )
192
+
193
+ // Create manifest list files for each snapshot
194
+ for (const snapshot of metadata.snapshots ?? []) {
195
+ const manifestListPath = snapshot['manifest-list']
196
+ const manifestPath = `${TABLE_LOCATION}/manifests/manifest-${snapshot['snapshot-id']}.avro`
197
+
198
+ // Create manifest list (contains references to manifests)
199
+ const manifestList = {
200
+ manifests: [
201
+ {
202
+ 'manifest-path': manifestPath,
203
+ 'manifest-length': 1000,
204
+ 'partition-spec-id': 0,
205
+ 'content': 0, // data
206
+ 'sequence-number': snapshot['sequence-number'],
207
+ 'min-sequence-number': 1,
208
+ 'added-snapshot-id': snapshot['snapshot-id'],
209
+ 'added-data-files-count': 1,
210
+ 'existing-data-files-count': 0,
211
+ 'deleted-data-files-count': 0,
212
+ 'added-rows-count': 100,
213
+ 'existing-rows-count': 0,
214
+ 'deleted-rows-count': 0,
215
+ },
216
+ ],
217
+ }
218
+ await bucket.put(manifestListPath, JSON.stringify(manifestList))
219
+
220
+ // Create manifest file (contains data file entries)
221
+ const manifest = {
222
+ entries: [
223
+ {
224
+ status: 1, // ADDED
225
+ 'snapshot-id': snapshot['snapshot-id'],
226
+ 'data-file': {
227
+ 'file-path': `${TABLE_LOCATION}/data/data-${snapshot['snapshot-id']}.parquet`,
228
+ 'file-format': 'PARQUET',
229
+ 'partition': {},
230
+ 'record-count': 100,
231
+ 'file-size-in-bytes': 1024,
232
+ 'column-sizes': {},
233
+ 'value-counts': {},
234
+ 'null-value-counts': {},
235
+ 'nan-value-counts': {},
236
+ 'lower-bounds': {},
237
+ 'upper-bounds': {},
238
+ },
239
+ },
240
+ ],
241
+ }
242
+ await bucket.put(manifestPath, JSON.stringify(manifest))
243
+ }
244
+
245
+ return catalog
246
+ }
247
+
248
+ // ============================================================================
249
+ // createTimeTravelApi Tests
250
+ // ============================================================================
251
+
252
+ describe('createTimeTravelApi', () => {
253
+ let mockBucket: R2Bucket
254
+ let catalog: IcebergCatalog
255
+
256
+ beforeEach(async () => {
257
+ mockBucket = createMockBucket()
258
+ const metadata = createTestMetadata([
259
+ { id: 1, timestampMs: 1704067200000 },
260
+ { id: 2, timestampMs: 1704153600000 },
261
+ ])
262
+ catalog = await setupTestCatalog(mockBucket, metadata)
263
+ })
264
+
265
+ it('should create Hono app instance', () => {
266
+ const api = createTimeTravelApi({
267
+ catalog,
268
+ bucket: mockBucket,
269
+ })
270
+
271
+ expect(api).toBeDefined()
272
+ expect(typeof api.fetch).toBe('function')
273
+ })
274
+
275
+ it('should use default prefix /v1', () => {
276
+ const api = createTimeTravelApi({
277
+ catalog,
278
+ bucket: mockBucket,
279
+ })
280
+
281
+ expect(api).toBeDefined()
282
+ })
283
+
284
+ it('should accept custom prefix', () => {
285
+ const api = createTimeTravelApi({
286
+ catalog,
287
+ bucket: mockBucket,
288
+ prefix: '/api/v2',
289
+ })
290
+
291
+ expect(api).toBeDefined()
292
+ })
293
+
294
+ it('should enable CORS by default', () => {
295
+ const api = createTimeTravelApi({
296
+ catalog,
297
+ bucket: mockBucket,
298
+ })
299
+
300
+ expect(api).toBeDefined()
301
+ })
302
+
303
+ it('should support authentication handler', () => {
304
+ const authenticate = vi.fn().mockResolvedValue(true)
305
+
306
+ const api = createTimeTravelApi({
307
+ catalog,
308
+ bucket: mockBucket,
309
+ authenticate,
310
+ })
311
+
312
+ expect(api).toBeDefined()
313
+ })
314
+ })
315
+
316
+ // ============================================================================
317
+ // Query Endpoint Tests
318
+ // ============================================================================
319
+
320
+ describe('GET /v1/do/:doId/query', () => {
321
+ let mockBucket: R2Bucket
322
+ let catalog: IcebergCatalog
323
+ let api: ReturnType<typeof createTimeTravelApi>
324
+
325
+ beforeEach(async () => {
326
+ mockBucket = createMockBucket()
327
+ const metadata = createTestMetadata([
328
+ { id: 1, timestampMs: 1704067200000 },
329
+ { id: 2, timestampMs: 1704153600000 },
330
+ ])
331
+ catalog = await setupTestCatalog(mockBucket, metadata)
332
+ api = createTimeTravelApi({ catalog, bucket: mockBucket })
333
+ })
334
+
335
+ it('should return 400 when sql parameter is missing', async () => {
336
+ const request = new Request('http://localhost/v1/do/test-table/query')
337
+ const response = await api.fetch(request)
338
+
339
+ expect(response.status).toBe(400)
340
+ const body = await response.json()
341
+ expect(body.error.type).toBe('BadRequestError')
342
+ })
343
+
344
+ it('should execute query with as_of parameter', async () => {
345
+ const request = new Request(
346
+ 'http://localhost/v1/do/test-table/query?sql=SELECT%20*%20FROM%20users&as_of=2024-01-01T00:00:00Z'
347
+ )
348
+ const response = await api.fetch(request)
349
+
350
+ expect(response.status).toBe(200)
351
+ const body = await response.json() as TimeTravelQueryResponse
352
+ expect(body.success).toBe(true)
353
+ expect(body.timeTravel.mode).toBe('point-in-time')
354
+ })
355
+
356
+ it('should accept as_of from X-As-Of-Timestamp header', async () => {
357
+ const request = new Request(
358
+ 'http://localhost/v1/do/test-table/query?sql=SELECT%20*%20FROM%20users',
359
+ {
360
+ headers: { 'X-As-Of-Timestamp': '2024-01-01T00:00:00Z' },
361
+ }
362
+ )
363
+ const response = await api.fetch(request)
364
+
365
+ expect(response.status).toBe(200)
366
+ })
367
+
368
+ it('should return 404 for non-existent table', async () => {
369
+ const request = new Request(
370
+ 'http://localhost/v1/do/non-existent/query?sql=SELECT%201'
371
+ )
372
+ const response = await api.fetch(request)
373
+
374
+ expect(response.status).toBe(404)
375
+ })
376
+ })
377
+
378
+ // ============================================================================
379
+ // POST /v1/do/:doId/sql Tests
380
+ // ============================================================================
381
+
382
+ describe('POST /v1/do/:doId/sql', () => {
383
+ let mockBucket: R2Bucket
384
+ let catalog: IcebergCatalog
385
+ let api: ReturnType<typeof createTimeTravelApi>
386
+
387
+ beforeEach(async () => {
388
+ mockBucket = createMockBucket()
389
+ const metadata = createTestMetadata([
390
+ { id: 1, timestampMs: 1704067200000 },
391
+ { id: 2, timestampMs: 1704153600000 },
392
+ ])
393
+ catalog = await setupTestCatalog(mockBucket, metadata)
394
+ api = createTimeTravelApi({ catalog, bucket: mockBucket })
395
+ })
396
+
397
+ it('should return 400 when query is missing', async () => {
398
+ const request = new Request('http://localhost/v1/do/test-table/sql', {
399
+ method: 'POST',
400
+ headers: { 'Content-Type': 'application/json' },
401
+ body: JSON.stringify({}),
402
+ })
403
+ const response = await api.fetch(request)
404
+
405
+ expect(response.status).toBe(400)
406
+ })
407
+
408
+ it('should execute SQL with as_of in body', async () => {
409
+ const request = new Request('http://localhost/v1/do/test-table/sql', {
410
+ method: 'POST',
411
+ headers: { 'Content-Type': 'application/json' },
412
+ body: JSON.stringify({
413
+ query: 'SELECT * FROM users',
414
+ as_of: '2024-01-01T00:00:00Z',
415
+ } satisfies TimeTravelQueryRequest),
416
+ })
417
+ const response = await api.fetch(request)
418
+
419
+ expect(response.status).toBe(200)
420
+ const body = await response.json() as TimeTravelQueryResponse
421
+ expect(body.success).toBe(true)
422
+ })
423
+
424
+ it('should parse AS OF clause from SQL', async () => {
425
+ const request = new Request('http://localhost/v1/do/test-table/sql', {
426
+ method: 'POST',
427
+ headers: { 'Content-Type': 'application/json' },
428
+ body: JSON.stringify({
429
+ query: "SELECT * FROM users AS OF TIMESTAMP '2024-01-01T00:00:00Z'",
430
+ }),
431
+ })
432
+ const response = await api.fetch(request)
433
+
434
+ expect(response.status).toBe(200)
435
+ const body = await response.json() as TimeTravelQueryResponse
436
+ expect(body.timeTravel.mode).toBe('point-in-time')
437
+ })
438
+
439
+ it('should support range queries with from/to timestamps', async () => {
440
+ const request = new Request('http://localhost/v1/do/test-table/sql', {
441
+ method: 'POST',
442
+ headers: { 'Content-Type': 'application/json' },
443
+ body: JSON.stringify({
444
+ query: 'SELECT * FROM users',
445
+ from_timestamp: '2024-01-01T00:00:00Z',
446
+ to_timestamp: '2024-01-02T00:00:00Z',
447
+ }),
448
+ })
449
+ const response = await api.fetch(request)
450
+
451
+ expect(response.status).toBe(200)
452
+ const body = await response.json() as TimeTravelQueryResponse
453
+ expect(body.timeTravel.mode).toBe('range')
454
+ })
455
+ })
456
+
457
+ // ============================================================================
458
+ // Snapshot Endpoints Tests
459
+ // ============================================================================
460
+
461
+ describe('GET /v1/do/:doId/snapshots', () => {
462
+ let mockBucket: R2Bucket
463
+ let catalog: IcebergCatalog
464
+ let api: ReturnType<typeof createTimeTravelApi>
465
+
466
+ beforeEach(async () => {
467
+ mockBucket = createMockBucket()
468
+ const metadata = createTestMetadata([
469
+ { id: 1, timestampMs: 1704067200000 },
470
+ { id: 2, timestampMs: 1704153600000 },
471
+ { id: 3, timestampMs: 1704240000000 },
472
+ ])
473
+ catalog = await setupTestCatalog(mockBucket, metadata)
474
+ api = createTimeTravelApi({ catalog, bucket: mockBucket })
475
+ })
476
+
477
+ it('should list all snapshots', async () => {
478
+ const request = new Request('http://localhost/v1/do/test-table/snapshots')
479
+ const response = await api.fetch(request)
480
+
481
+ expect(response.status).toBe(200)
482
+ const body = await response.json() as SnapshotListResponse
483
+ expect(body.snapshots).toHaveLength(3)
484
+ expect(body.count).toBe(3)
485
+ })
486
+
487
+ it('should include current snapshot ID', async () => {
488
+ const request = new Request('http://localhost/v1/do/test-table/snapshots')
489
+ const response = await api.fetch(request)
490
+
491
+ const body = await response.json() as SnapshotListResponse
492
+ expect(body.currentSnapshotId).toBe(3)
493
+ })
494
+
495
+ it('should sort snapshots by timestamp descending', async () => {
496
+ const request = new Request('http://localhost/v1/do/test-table/snapshots')
497
+ const response = await api.fetch(request)
498
+
499
+ const body = await response.json() as SnapshotListResponse
500
+ expect(body.snapshots[0]?.snapshotId).toBe(3) // Most recent first
501
+ expect(body.snapshots[2]?.snapshotId).toBe(1)
502
+ })
503
+ })
504
+
505
+ describe('GET /v1/do/:doId/snapshots/:snapshotId', () => {
506
+ let mockBucket: R2Bucket
507
+ let catalog: IcebergCatalog
508
+ let api: ReturnType<typeof createTimeTravelApi>
509
+
510
+ beforeEach(async () => {
511
+ mockBucket = createMockBucket()
512
+ const metadata = createTestMetadata([
513
+ { id: 1, timestampMs: 1704067200000 },
514
+ ])
515
+ // Also add a manifest list for the snapshot
516
+ await mockBucket.put(
517
+ 'iceberg/test-table/metadata/snap-1.avro',
518
+ JSON.stringify({ manifests: [] })
519
+ )
520
+ catalog = await setupTestCatalog(mockBucket, metadata)
521
+ api = createTimeTravelApi({ catalog, bucket: mockBucket })
522
+ })
523
+
524
+ it('should return snapshot details', async () => {
525
+ const request = new Request('http://localhost/v1/do/test-table/snapshots/1')
526
+ const response = await api.fetch(request)
527
+
528
+ expect(response.status).toBe(200)
529
+ const body = await response.json()
530
+ expect(body.snapshotId).toBe(1)
531
+ expect(body.timestampMs).toBe(1704067200000)
532
+ })
533
+
534
+ it('should return 400 for invalid snapshot ID', async () => {
535
+ const request = new Request('http://localhost/v1/do/test-table/snapshots/invalid')
536
+ const response = await api.fetch(request)
537
+
538
+ expect(response.status).toBe(400)
539
+ })
540
+
541
+ it('should return 404 for non-existent snapshot', async () => {
542
+ const request = new Request('http://localhost/v1/do/test-table/snapshots/999')
543
+ const response = await api.fetch(request)
544
+
545
+ expect(response.status).toBe(404)
546
+ })
547
+ })
548
+
549
+ // ============================================================================
550
+ // Time Range Endpoints Tests
551
+ // ============================================================================
552
+
553
+ describe('GET /v1/do/:doId/time-range', () => {
554
+ let mockBucket: R2Bucket
555
+ let catalog: IcebergCatalog
556
+ let api: ReturnType<typeof createTimeTravelApi>
557
+
558
+ beforeEach(async () => {
559
+ mockBucket = createMockBucket()
560
+ const metadata = createTestMetadata([
561
+ { id: 1, timestampMs: 1704067200000 },
562
+ { id: 2, timestampMs: 1704153600000 },
563
+ { id: 3, timestampMs: 1704240000000 },
564
+ ])
565
+ catalog = await setupTestCatalog(mockBucket, metadata)
566
+ api = createTimeTravelApi({ catalog, bucket: mockBucket })
567
+ })
568
+
569
+ it('should return time range', async () => {
570
+ const request = new Request('http://localhost/v1/do/test-table/time-range')
571
+ const response = await api.fetch(request)
572
+
573
+ expect(response.status).toBe(200)
574
+ const body = await response.json() as TimeRangeResponse
575
+ expect(body.oldestTimestampMs).toBe(1704067200000)
576
+ expect(body.newestTimestampMs).toBe(1704240000000)
577
+ })
578
+
579
+ it('should include ISO formatted timestamps', async () => {
580
+ const request = new Request('http://localhost/v1/do/test-table/time-range')
581
+ const response = await api.fetch(request)
582
+
583
+ const body = await response.json() as TimeRangeResponse
584
+ expect(body.oldest).toBe('2024-01-01T00:00:00.000Z')
585
+ expect(body.newest).toBe('2024-01-03T00:00:00.000Z')
586
+ })
587
+
588
+ it('should include retention window', async () => {
589
+ const request = new Request('http://localhost/v1/do/test-table/time-range')
590
+ const response = await api.fetch(request)
591
+
592
+ const body = await response.json() as TimeRangeResponse
593
+ expect(body.retentionWindowMs).toBeDefined()
594
+ })
595
+ })
596
+
597
+ describe('GET /v1/do/:doId/resolve-timestamp', () => {
598
+ let mockBucket: R2Bucket
599
+ let catalog: IcebergCatalog
600
+ let api: ReturnType<typeof createTimeTravelApi>
601
+
602
+ beforeEach(async () => {
603
+ mockBucket = createMockBucket()
604
+ const metadata = createTestMetadata([
605
+ { id: 1, timestampMs: 1704067200000 },
606
+ { id: 2, timestampMs: 1704153600000 },
607
+ ])
608
+ catalog = await setupTestCatalog(mockBucket, metadata)
609
+ api = createTimeTravelApi({ catalog, bucket: mockBucket })
610
+ })
611
+
612
+ it('should return 400 when timestamp parameter is missing', async () => {
613
+ const request = new Request('http://localhost/v1/do/test-table/resolve-timestamp')
614
+ const response = await api.fetch(request)
615
+
616
+ expect(response.status).toBe(400)
617
+ })
618
+
619
+ it('should resolve timestamp to nearest snapshot', async () => {
620
+ const request = new Request(
621
+ 'http://localhost/v1/do/test-table/resolve-timestamp?timestamp=2024-01-01T12:00:00Z'
622
+ )
623
+ const response = await api.fetch(request)
624
+
625
+ expect(response.status).toBe(200)
626
+ const body = await response.json()
627
+ expect(body.resolved.snapshotId).toBe(1)
628
+ expect(body.resolved.exactMatch).toBe(false)
629
+ })
630
+
631
+ it('should indicate exact match when timestamp matches snapshot', async () => {
632
+ const request = new Request(
633
+ 'http://localhost/v1/do/test-table/resolve-timestamp?timestamp=2024-01-01T00:00:00Z'
634
+ )
635
+ const response = await api.fetch(request)
636
+
637
+ const body = await response.json()
638
+ expect(body.resolved.exactMatch).toBe(true)
639
+ })
640
+
641
+ it('should parse relative timestamps', async () => {
642
+ const request = new Request(
643
+ 'http://localhost/v1/do/test-table/resolve-timestamp?timestamp=1%20hour%20ago'
644
+ )
645
+ const response = await api.fetch(request)
646
+
647
+ expect(response.status).toBe(200)
648
+ const body = await response.json()
649
+ expect(body.parsed.isRelative).toBe(true)
650
+ })
651
+ })
652
+
653
+ // ============================================================================
654
+ // Analytics Endpoints Tests
655
+ // ============================================================================
656
+
657
+ describe('GET /v1/do/:doId/analytics/change-rate', () => {
658
+ let mockBucket: R2Bucket
659
+ let catalog: IcebergCatalog
660
+ let api: ReturnType<typeof createTimeTravelApi>
661
+
662
+ beforeEach(async () => {
663
+ mockBucket = createMockBucket()
664
+ const metadata = createTestMetadata([
665
+ { id: 1, timestampMs: 1704067200000 },
666
+ { id: 2, timestampMs: 1704153600000 },
667
+ ])
668
+ catalog = await setupTestCatalog(mockBucket, metadata)
669
+ api = createTimeTravelApi({ catalog, bucket: mockBucket })
670
+ })
671
+
672
+ it('should return 400 when start_time is missing', async () => {
673
+ const request = new Request(
674
+ 'http://localhost/v1/do/test-table/analytics/change-rate?end_time=2024-01-02'
675
+ )
676
+ const response = await api.fetch(request)
677
+
678
+ expect(response.status).toBe(400)
679
+ })
680
+
681
+ it('should return 400 when end_time is missing', async () => {
682
+ const request = new Request(
683
+ 'http://localhost/v1/do/test-table/analytics/change-rate?start_time=2024-01-01'
684
+ )
685
+ const response = await api.fetch(request)
686
+
687
+ expect(response.status).toBe(400)
688
+ })
689
+
690
+ it('should return change rate analysis', async () => {
691
+ const request = new Request(
692
+ 'http://localhost/v1/do/test-table/analytics/change-rate?start_time=2024-01-01&end_time=2024-01-02'
693
+ )
694
+ const response = await api.fetch(request)
695
+
696
+ expect(response.status).toBe(200)
697
+ const body = await response.json()
698
+ // ChangeRateAnalysis uses netChangePerDay rather than changesPerSecond
699
+ expect(body).toHaveProperty('netChangePerDay')
700
+ })
701
+ })
702
+
703
+ describe('GET /v1/do/:doId/analytics/growth', () => {
704
+ let mockBucket: R2Bucket
705
+ let catalog: IcebergCatalog
706
+ let api: ReturnType<typeof createTimeTravelApi>
707
+
708
+ beforeEach(async () => {
709
+ mockBucket = createMockBucket()
710
+ const metadata = createTestMetadata([
711
+ { id: 1, timestampMs: 1704067200000 },
712
+ ])
713
+ catalog = await setupTestCatalog(mockBucket, metadata)
714
+ api = createTimeTravelApi({ catalog, bucket: mockBucket })
715
+ })
716
+
717
+ it('should return growth metrics', async () => {
718
+ const request = new Request('http://localhost/v1/do/test-table/analytics/growth')
719
+ const response = await api.fetch(request)
720
+
721
+ expect(response.status).toBe(200)
722
+ const body = await response.json()
723
+ // GrowthMetrics uses currentRecordCount and currentDataSizeBytes
724
+ expect(body).toHaveProperty('currentRecordCount')
725
+ expect(body).toHaveProperty('currentDataSizeBytes')
726
+ })
727
+
728
+ it('should accept sampling_interval parameter', async () => {
729
+ const request = new Request(
730
+ 'http://localhost/v1/do/test-table/analytics/growth?sampling_interval=86400000'
731
+ )
732
+ const response = await api.fetch(request)
733
+
734
+ expect(response.status).toBe(200)
735
+ })
736
+ })
737
+
738
+ describe('GET /v1/do/:doId/analytics/snapshot-comparison', () => {
739
+ let mockBucket: R2Bucket
740
+ let catalog: IcebergCatalog
741
+ let api: ReturnType<typeof createTimeTravelApi>
742
+
743
+ beforeEach(async () => {
744
+ mockBucket = createMockBucket()
745
+ const metadata = createTestMetadata([
746
+ { id: 1, timestampMs: 1704067200000 },
747
+ { id: 2, timestampMs: 1704153600000 },
748
+ ])
749
+ catalog = await setupTestCatalog(mockBucket, metadata)
750
+ api = createTimeTravelApi({ catalog, bucket: mockBucket })
751
+ })
752
+
753
+ it('should return 400 when snapshot1 is missing', async () => {
754
+ const request = new Request(
755
+ 'http://localhost/v1/do/test-table/analytics/snapshot-comparison?snapshot2=2'
756
+ )
757
+ const response = await api.fetch(request)
758
+
759
+ expect(response.status).toBe(400)
760
+ })
761
+
762
+ it('should return 400 when snapshot2 is missing', async () => {
763
+ const request = new Request(
764
+ 'http://localhost/v1/do/test-table/analytics/snapshot-comparison?snapshot1=1'
765
+ )
766
+ const response = await api.fetch(request)
767
+
768
+ expect(response.status).toBe(400)
769
+ })
770
+
771
+ it('should return 400 for invalid snapshot IDs', async () => {
772
+ const request = new Request(
773
+ 'http://localhost/v1/do/test-table/analytics/snapshot-comparison?snapshot1=invalid&snapshot2=2'
774
+ )
775
+ const response = await api.fetch(request)
776
+
777
+ expect(response.status).toBe(400)
778
+ })
779
+
780
+ it('should return snapshot comparison', async () => {
781
+ const request = new Request(
782
+ 'http://localhost/v1/do/test-table/analytics/snapshot-comparison?snapshot1=1&snapshot2=2'
783
+ )
784
+ const response = await api.fetch(request)
785
+
786
+ expect(response.status).toBe(200)
787
+ const body = await response.json()
788
+ // SnapshotComparison uses recordCountDelta and dataSizeDelta
789
+ expect(body).toHaveProperty('recordCountDelta')
790
+ expect(body).toHaveProperty('dataSizeDelta')
791
+ })
792
+ })
793
+
794
+ // ============================================================================
795
+ // CORS and Authentication Tests
796
+ // ============================================================================
797
+
798
+ describe('CORS handling', () => {
799
+ let mockBucket: R2Bucket
800
+ let catalog: IcebergCatalog
801
+
802
+ beforeEach(async () => {
803
+ mockBucket = createMockBucket()
804
+ const metadata = createTestMetadata([])
805
+ catalog = await setupTestCatalog(mockBucket, metadata)
806
+ })
807
+
808
+ it('should respond to OPTIONS preflight requests', async () => {
809
+ const api = createTimeTravelApi({ catalog, bucket: mockBucket, cors: true })
810
+ const request = new Request('http://localhost/v1/do/test/query', {
811
+ method: 'OPTIONS',
812
+ })
813
+ const response = await api.fetch(request)
814
+
815
+ expect(response.status).toBe(204)
816
+ expect(response.headers.get('Access-Control-Allow-Origin')).toBe('*')
817
+ })
818
+
819
+ it('should include CORS headers on responses', async () => {
820
+ const api = createTimeTravelApi({ catalog, bucket: mockBucket, cors: true })
821
+ const request = new Request('http://localhost/v1/do/test/time-range')
822
+ const response = await api.fetch(request)
823
+
824
+ expect(response.headers.get('Access-Control-Allow-Origin')).toBe('*')
825
+ })
826
+
827
+ it('should skip CORS when disabled', async () => {
828
+ const api = createTimeTravelApi({ catalog, bucket: mockBucket, cors: false })
829
+ const request = new Request('http://localhost/v1/do/test/time-range')
830
+ const response = await api.fetch(request)
831
+
832
+ expect(response.headers.get('Access-Control-Allow-Origin')).toBeNull()
833
+ })
834
+ })
835
+
836
+ describe('Authentication', () => {
837
+ let mockBucket: R2Bucket
838
+ let catalog: IcebergCatalog
839
+
840
+ beforeEach(async () => {
841
+ mockBucket = createMockBucket()
842
+ const metadata = createTestMetadata([])
843
+ catalog = await setupTestCatalog(mockBucket, metadata)
844
+ })
845
+
846
+ it('should return 401 when authentication fails', async () => {
847
+ const authenticate = vi.fn().mockResolvedValue(false)
848
+ const api = createTimeTravelApi({ catalog, bucket: mockBucket, authenticate })
849
+
850
+ const request = new Request('http://localhost/v1/do/test/snapshots')
851
+ const response = await api.fetch(request)
852
+
853
+ expect(response.status).toBe(401)
854
+ expect(authenticate).toHaveBeenCalled()
855
+ })
856
+
857
+ it('should proceed when authentication succeeds', async () => {
858
+ const authenticate = vi.fn().mockResolvedValue(true)
859
+ const api = createTimeTravelApi({ catalog, bucket: mockBucket, authenticate })
860
+
861
+ const request = new Request('http://localhost/v1/do/test/time-range')
862
+ const response = await api.fetch(request)
863
+
864
+ expect(authenticate).toHaveBeenCalled()
865
+ // Would be 200 or 404 depending on table existence, not 401
866
+ expect(response.status).not.toBe(401)
867
+ })
868
+ })
869
+
870
+ // ============================================================================
871
+ // Error Handling Tests
872
+ // ============================================================================
873
+
874
+ describe('Error handling', () => {
875
+ let mockBucket: R2Bucket
876
+ let catalog: IcebergCatalog
877
+ let api: ReturnType<typeof createTimeTravelApi>
878
+
879
+ beforeEach(async () => {
880
+ mockBucket = createMockBucket()
881
+ const metadata = createTestMetadata([
882
+ { id: 1, timestampMs: 1704067200000 },
883
+ ])
884
+ catalog = await setupTestCatalog(mockBucket, metadata)
885
+ api = createTimeTravelApi({ catalog, bucket: mockBucket })
886
+ })
887
+
888
+ it('should return TimestampOutOfRangeError for future timestamps', async () => {
889
+ const futureTime = new Date(Date.now() + 86400000).toISOString() // Tomorrow
890
+ const request = new Request(
891
+ `http://localhost/v1/do/test-table/resolve-timestamp?timestamp=${encodeURIComponent(futureTime)}`
892
+ )
893
+ const response = await api.fetch(request)
894
+
895
+ expect(response.status).toBe(400)
896
+ const body = await response.json()
897
+ expect(body.error.type).toBe('TimestampOutOfRangeError')
898
+ })
899
+
900
+ it('should return InvalidTimestampError for invalid timestamp format', async () => {
901
+ const request = new Request(
902
+ 'http://localhost/v1/do/test-table/resolve-timestamp?timestamp=not-a-timestamp'
903
+ )
904
+ const response = await api.fetch(request)
905
+
906
+ expect(response.status).toBe(400)
907
+ const body = await response.json()
908
+ expect(body.error.type).toBe('InvalidTimestampError')
909
+ })
910
+
911
+ it('should return TableNotFoundError for non-existent table', async () => {
912
+ const request = new Request('http://localhost/v1/do/non-existent-table/snapshots')
913
+ const response = await api.fetch(request)
914
+
915
+ expect(response.status).toBe(404)
916
+ const body = await response.json()
917
+ expect(body.error.type).toBe('TableNotFoundError')
918
+ })
919
+ })
920
+
921
+ // ============================================================================
922
+ // timeTravelApiMiddleware Tests
923
+ // ============================================================================
924
+
925
+ describe('timeTravelApiMiddleware', () => {
926
+ it('should create same API as createTimeTravelApi', async () => {
927
+ const mockBucket = createMockBucket()
928
+ const metadata = createTestMetadata([])
929
+ const catalog = await setupTestCatalog(mockBucket, metadata)
930
+
931
+ const middleware = timeTravelApiMiddleware({ catalog, bucket: mockBucket })
932
+
933
+ expect(middleware).toBeDefined()
934
+ expect(typeof middleware.fetch).toBe('function')
935
+ })
936
+ })
937
+
938
+ // ============================================================================
939
+ // DO ID Parsing Tests
940
+ // ============================================================================
941
+
942
+ describe('DO ID parsing', () => {
943
+ let mockBucket: R2Bucket
944
+ let catalog: IcebergCatalog
945
+ let api: ReturnType<typeof createTimeTravelApi>
946
+
947
+ beforeEach(async () => {
948
+ mockBucket = createMockBucket()
949
+ const metadata = createTestMetadata([
950
+ { id: 1, timestampMs: 1704067200000 },
951
+ ])
952
+ catalog = await setupTestCatalog(mockBucket, metadata)
953
+ api = createTimeTravelApi({ catalog, bucket: mockBucket })
954
+ })
955
+
956
+ it('should parse simple DO ID', async () => {
957
+ // 'test-table' should be resolved to namespace: ['default'], name: 'test-table'
958
+ const request = new Request('http://localhost/v1/do/test-table/time-range')
959
+ const response = await api.fetch(request)
960
+
961
+ // Should find the table in default namespace
962
+ expect(response.status).toBe(200)
963
+ const body = await response.json() as TimeRangeResponse
964
+ expect(body.oldestTimestampMs).toBe(1704067200000)
965
+ })
966
+
967
+ it('should parse namespace.doId format', async () => {
968
+ // Create a table in a custom namespace
969
+ await catalog.createNamespace({ levels: ['custom'] })
970
+ const customMetadata = createTestMetadata([
971
+ { id: 2, timestampMs: 1704153600000 },
972
+ ])
973
+ customMetadata.location = 'iceberg/namespaces/custom/my-table'
974
+ await catalog.createTable(
975
+ { namespace: { levels: ['custom'] }, name: 'my-table' },
976
+ customMetadata
977
+ )
978
+
979
+ // 'custom.my-table' should be resolved to namespace: ['custom'], name: 'my-table'
980
+ const request = new Request('http://localhost/v1/do/custom.my-table/time-range')
981
+ const response = await api.fetch(request)
982
+
983
+ expect(response.status).toBe(200)
984
+ const body = await response.json() as TimeRangeResponse
985
+ expect(body.oldestTimestampMs).toBe(1704153600000)
986
+ })
987
+
988
+ it('should parse namespace/doId format', async () => {
989
+ // Create a table in a custom namespace
990
+ await catalog.createNamespace({ levels: ['org'] })
991
+ const orgMetadata = createTestMetadata([
992
+ { id: 3, timestampMs: 1704240000000 },
993
+ ])
994
+ orgMetadata.location = 'iceberg/namespaces/org/org-table'
995
+ await catalog.createTable(
996
+ { namespace: { levels: ['org'] }, name: 'org-table' },
997
+ orgMetadata
998
+ )
999
+
1000
+ // URL-encode the slash: 'org%2Forg-table'
1001
+ const request = new Request('http://localhost/v1/do/org%2Forg-table/time-range')
1002
+ const response = await api.fetch(request)
1003
+
1004
+ expect(response.status).toBe(200)
1005
+ const body = await response.json() as TimeRangeResponse
1006
+ expect(body.oldestTimestampMs).toBe(1704240000000)
1007
+ })
1008
+
1009
+ it('should handle URL-encoded separators', async () => {
1010
+ // Create a table with encoded characters
1011
+ await catalog.createNamespace({ levels: ['encoded'] })
1012
+ const encodedMetadata = createTestMetadata([
1013
+ { id: 4, timestampMs: 1704326400000 },
1014
+ ])
1015
+ encodedMetadata.location = 'iceberg/namespaces/encoded/special-table'
1016
+ await catalog.createTable(
1017
+ { namespace: { levels: ['encoded'] }, name: 'special-table' },
1018
+ encodedMetadata
1019
+ )
1020
+
1021
+ // URL-encode the dot: 'encoded%2Especial-table'
1022
+ const request = new Request('http://localhost/v1/do/encoded%2Especial-table/time-range')
1023
+ const response = await api.fetch(request)
1024
+
1025
+ expect(response.status).toBe(200)
1026
+ const body = await response.json() as TimeRangeResponse
1027
+ expect(body.oldestTimestampMs).toBe(1704326400000)
1028
+ })
1029
+ })