@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,1075 @@
1
+ /**
2
+ * WAL Retention Policy Management
3
+ * Task: postgres-yzu - Configurable WAL retention policy
4
+ *
5
+ * Implements configurable retention policies for WAL data in R2 storage:
6
+ * - Time-based retention (keep last N days)
7
+ * - Size-based retention (keep last N MB)
8
+ * - LSN-based retention (keep from LSN X)
9
+ * - Automatic cleanup of old WAL segments
10
+ * - Legal hold support to prevent deletion
11
+ * - Configuration via DO options or environment variables
12
+ */
13
+
14
+ import type { R2WALStorage } from './wal-r2'
15
+
16
+ /**
17
+ * Retention policy types
18
+ */
19
+ export type RetentionPolicyType = 'time' | 'size' | 'lsn' | 'combined'
20
+
21
+ /**
22
+ * Time-based retention configuration
23
+ * Keep WAL data for a specified duration
24
+ */
25
+ export interface TimeBasedRetention {
26
+ /** Retention type identifier */
27
+ type: 'time'
28
+ /** Minimum retention duration in milliseconds */
29
+ minRetentionMs?: number | undefined
30
+ /** Maximum retention duration in milliseconds (hard cap) */
31
+ maxRetentionMs: number
32
+ }
33
+
34
+ /**
35
+ * Size-based retention configuration
36
+ * Keep WAL data up to a specified size limit
37
+ */
38
+ export interface SizeBasedRetention {
39
+ /** Retention type identifier */
40
+ type: 'size'
41
+ /** Maximum storage size in bytes */
42
+ maxSizeBytes: number
43
+ /** Whether to evict oldest segments first (default: true) */
44
+ evictOldestFirst?: boolean | undefined
45
+ }
46
+
47
+ /**
48
+ * LSN-based retention configuration
49
+ * Keep WAL data from a specific LSN
50
+ */
51
+ export interface LSNBasedRetention {
52
+ /** Retention type identifier */
53
+ type: 'lsn'
54
+ /** Minimum LSN to retain (all data from this LSN onward is kept) */
55
+ minLsn: bigint | string
56
+ }
57
+
58
+ /**
59
+ * Combined retention policy
60
+ * Applies multiple retention rules; data must satisfy ALL rules to be retained
61
+ */
62
+ export interface CombinedRetention {
63
+ /** Retention type identifier */
64
+ type: 'combined'
65
+ /** Time-based component (optional) */
66
+ time?: Omit<TimeBasedRetention, 'type'> | undefined
67
+ /** Size-based component (optional) */
68
+ size?: Omit<SizeBasedRetention, 'type'> | undefined
69
+ /** LSN-based component (optional) */
70
+ lsn?: Omit<LSNBasedRetention, 'type'> | undefined
71
+ }
72
+
73
+ /**
74
+ * Union type for all retention policies
75
+ */
76
+ export type RetentionPolicy =
77
+ | TimeBasedRetention
78
+ | SizeBasedRetention
79
+ | LSNBasedRetention
80
+ | CombinedRetention
81
+
82
+ /**
83
+ * Legal hold configuration
84
+ * Prevents deletion of WAL data regardless of retention policy
85
+ */
86
+ export interface LegalHold {
87
+ /** Whether legal hold is active */
88
+ enabled: boolean
89
+ /** Reason for legal hold (for auditing) */
90
+ reason?: string | undefined
91
+ /** When the legal hold was applied */
92
+ appliedAt?: number | undefined
93
+ /** Who applied the legal hold */
94
+ appliedBy?: string | undefined
95
+ /** Optional expiry time for the legal hold */
96
+ expiresAt?: number | undefined
97
+ }
98
+
99
+ /**
100
+ * Full WAL retention configuration
101
+ */
102
+ export interface WALRetentionConfig {
103
+ /** The retention policy to apply */
104
+ policy: RetentionPolicy
105
+ /** Legal hold settings (overrides retention policy) */
106
+ legalHold?: LegalHold
107
+ /** How often to run automatic cleanup (in milliseconds, default: 1 hour) */
108
+ cleanupIntervalMs?: number
109
+ /** Whether to enable automatic cleanup (default: true) */
110
+ autoCleanup?: boolean
111
+ /** Minimum age before a segment can be deleted (safety buffer, default: 5 minutes) */
112
+ minAgeBeforeDeleteMs?: number
113
+ /** Dry run mode - report what would be deleted without actually deleting */
114
+ dryRun?: boolean
115
+ /** Callback for retention events */
116
+ onRetentionEvent?: (event: RetentionEvent) => void
117
+ }
118
+
119
+ /**
120
+ * Retention event types for monitoring
121
+ */
122
+ export type RetentionEventType =
123
+ | 'cleanup_started'
124
+ | 'cleanup_completed'
125
+ | 'segment_deleted'
126
+ | 'segment_retained'
127
+ | 'legal_hold_prevented_deletion'
128
+ | 'cleanup_error'
129
+ | 'policy_changed'
130
+
131
+ /**
132
+ * Retention event for monitoring
133
+ */
134
+ export interface RetentionEvent {
135
+ /** Event type */
136
+ type: RetentionEventType
137
+ /** Timestamp of the event */
138
+ timestamp: number
139
+ /** Additional details */
140
+ details?: Record<string, unknown> | undefined
141
+ }
142
+
143
+ /**
144
+ * Segment metadata for retention evaluation
145
+ */
146
+ export interface SegmentInfo {
147
+ /** R2 object key */
148
+ key: string
149
+ /** Segment creation timestamp */
150
+ createdAt: number
151
+ /** Compressed size in bytes */
152
+ sizeBytes: number
153
+ /** Start LSN of the segment */
154
+ startLsn: bigint
155
+ /** End LSN of the segment */
156
+ endLsn: bigint
157
+ /** Number of entries in the segment */
158
+ entryCount: number
159
+ }
160
+
161
+ /**
162
+ * Result of a cleanup operation
163
+ */
164
+ export interface CleanupResult {
165
+ /** Whether the cleanup was successful */
166
+ success: boolean
167
+ /** Number of segments deleted */
168
+ segmentsDeleted: number
169
+ /** Total bytes freed */
170
+ bytesFreed: number
171
+ /** Number of segments retained */
172
+ segmentsRetained: number
173
+ /** Total bytes retained */
174
+ bytesRetained: number
175
+ /** LSN range of deleted segments */
176
+ deletedLsnRange?: { start: bigint; end: bigint } | undefined
177
+ /** Duration of cleanup operation in milliseconds */
178
+ durationMs: number
179
+ /** Reason if cleanup was skipped or failed */
180
+ reason?: string | undefined
181
+ /** Error message if cleanup failed */
182
+ error?: string | undefined
183
+ }
184
+
185
+ /**
186
+ * Retention statistics
187
+ */
188
+ export interface RetentionStats {
189
+ /** Total cleanup operations performed */
190
+ totalCleanups: number
191
+ /** Successful cleanup operations */
192
+ successfulCleanups: number
193
+ /** Failed cleanup operations */
194
+ failedCleanups: number
195
+ /** Total segments deleted */
196
+ totalSegmentsDeleted: number
197
+ /** Total bytes freed */
198
+ totalBytesFreed: number
199
+ /** Last cleanup timestamp */
200
+ lastCleanupAt: number | null
201
+ /** Last cleanup result */
202
+ lastCleanupResult: CleanupResult | null
203
+ /** Current storage usage in bytes */
204
+ currentStorageBytes: number
205
+ /** Current segment count */
206
+ currentSegmentCount: number
207
+ /** Oldest segment timestamp */
208
+ oldestSegmentAt: number | null
209
+ /** Newest segment timestamp */
210
+ newestSegmentAt: number | null
211
+ /** Legal hold active status */
212
+ legalHoldActive: boolean
213
+ }
214
+
215
+ /**
216
+ * Default configuration values
217
+ */
218
+ const DEFAULT_CONFIG = {
219
+ cleanupIntervalMs: 60 * 60 * 1000, // 1 hour
220
+ autoCleanup: true,
221
+ minAgeBeforeDeleteMs: 5 * 60 * 1000, // 5 minutes
222
+ dryRun: false,
223
+ }
224
+
225
+ /**
226
+ * Helper to convert duration string to milliseconds
227
+ * Supports: 30d (days), 12h (hours), 30m (minutes), 60s (seconds)
228
+ */
229
+ export function parseDuration(duration: string): number {
230
+ const match = duration.match(/^(\d+(?:\.\d+)?)\s*(d|h|m|s|ms)$/i)
231
+ if (!match) {
232
+ throw new Error(`Invalid duration format: ${duration}. Use format like "30d", "12h", "30m", "60s", or "1000ms"`)
233
+ }
234
+
235
+ const value = parseFloat(match[1]!)
236
+ const unit = match[2]!.toLowerCase()
237
+
238
+ switch (unit) {
239
+ case 'd':
240
+ return value * 24 * 60 * 60 * 1000
241
+ case 'h':
242
+ return value * 60 * 60 * 1000
243
+ case 'm':
244
+ return value * 60 * 1000
245
+ case 's':
246
+ return value * 1000
247
+ case 'ms':
248
+ return value
249
+ default:
250
+ throw new Error(`Unknown duration unit: ${unit}`)
251
+ }
252
+ }
253
+
254
+ /**
255
+ * Helper to convert size string to bytes
256
+ * Supports: 100B (bytes), 10KB, 10MB, 10GB, 10TB
257
+ */
258
+ export function parseSize(size: string): number {
259
+ const match = size.match(/^(\d+(?:\.\d+)?)\s*(B|KB|MB|GB|TB)$/i)
260
+ if (!match) {
261
+ throw new Error(`Invalid size format: ${size}. Use format like "100B", "10KB", "10MB", "10GB", or "10TB"`)
262
+ }
263
+
264
+ const value = parseFloat(match[1]!)
265
+ const unit = match[2]!.toUpperCase()
266
+
267
+ switch (unit) {
268
+ case 'B':
269
+ return value
270
+ case 'KB':
271
+ return value * 1024
272
+ case 'MB':
273
+ return value * 1024 * 1024
274
+ case 'GB':
275
+ return value * 1024 * 1024 * 1024
276
+ case 'TB':
277
+ return value * 1024 * 1024 * 1024 * 1024
278
+ default:
279
+ throw new Error(`Unknown size unit: ${unit}`)
280
+ }
281
+ }
282
+
283
+ /**
284
+ * Create a time-based retention policy
285
+ *
286
+ * @example
287
+ * ```typescript
288
+ * // Keep WAL for 30 days
289
+ * const policy = createTimeRetention('30d')
290
+ *
291
+ * // Keep WAL for minimum 7 days, maximum 90 days
292
+ * const policy = createTimeRetention('90d', '7d')
293
+ * ```
294
+ */
295
+ export function createTimeRetention(maxRetention: string, minRetention?: string): TimeBasedRetention {
296
+ return {
297
+ type: 'time',
298
+ maxRetentionMs: parseDuration(maxRetention),
299
+ minRetentionMs: minRetention ? parseDuration(minRetention) : undefined,
300
+ }
301
+ }
302
+
303
+ /**
304
+ * Create a size-based retention policy
305
+ *
306
+ * @example
307
+ * ```typescript
308
+ * // Keep up to 1GB of WAL data
309
+ * const policy = createSizeRetention('1GB')
310
+ *
311
+ * // Keep up to 500MB, evicting newest first (unusual)
312
+ * const policy = createSizeRetention('500MB', false)
313
+ * ```
314
+ */
315
+ export function createSizeRetention(maxSize: string, evictOldestFirst = true): SizeBasedRetention {
316
+ return {
317
+ type: 'size',
318
+ maxSizeBytes: parseSize(maxSize),
319
+ evictOldestFirst,
320
+ }
321
+ }
322
+
323
+ /**
324
+ * Create an LSN-based retention policy
325
+ *
326
+ * @example
327
+ * ```typescript
328
+ * // Keep all WAL from LSN 1000 onward
329
+ * const policy = createLsnRetention(1000n)
330
+ * const policy = createLsnRetention('1000')
331
+ * ```
332
+ */
333
+ export function createLsnRetention(minLsn: bigint | string): LSNBasedRetention {
334
+ return {
335
+ type: 'lsn',
336
+ minLsn,
337
+ }
338
+ }
339
+
340
+ /**
341
+ * Create a combined retention policy
342
+ *
343
+ * @example
344
+ * ```typescript
345
+ * // Keep WAL for 30 days OR up to 1GB, whichever is more restrictive
346
+ * const policy = createCombinedRetention({
347
+ * time: { maxRetentionMs: 30 * 24 * 60 * 60 * 1000 },
348
+ * size: { maxSizeBytes: 1024 * 1024 * 1024 },
349
+ * })
350
+ * ```
351
+ */
352
+ export function createCombinedRetention(options: {
353
+ time?: Omit<TimeBasedRetention, 'type'>
354
+ size?: Omit<SizeBasedRetention, 'type'>
355
+ lsn?: Omit<LSNBasedRetention, 'type'>
356
+ }): CombinedRetention {
357
+ return {
358
+ type: 'combined',
359
+ ...options,
360
+ }
361
+ }
362
+
363
+ /**
364
+ * WAL Retention Manager
365
+ *
366
+ * Manages WAL retention policies and automatic cleanup for R2 storage.
367
+ * Supports multiple retention strategies and legal hold.
368
+ *
369
+ * @example
370
+ * ```typescript
371
+ * const retention = new WALRetentionManager(storage, {
372
+ * policy: createTimeRetention('30d'),
373
+ * autoCleanup: true,
374
+ * cleanupIntervalMs: 60 * 60 * 1000, // 1 hour
375
+ * })
376
+ *
377
+ * // Start automatic cleanup
378
+ * retention.startAutoCleanup()
379
+ *
380
+ * // Manual cleanup
381
+ * const result = await retention.cleanup()
382
+ * console.log(`Deleted ${result.segmentsDeleted} segments, freed ${result.bytesFreed} bytes`)
383
+ *
384
+ * // Apply legal hold
385
+ * retention.setLegalHold({ enabled: true, reason: 'Investigation' })
386
+ * ```
387
+ */
388
+ export class WALRetentionManager {
389
+ private storage: R2WALStorage
390
+ private config: Required<Omit<WALRetentionConfig, 'onRetentionEvent' | 'legalHold'>> & {
391
+ onRetentionEvent?: (event: RetentionEvent) => void
392
+ legalHold?: LegalHold
393
+ }
394
+ private stats: RetentionStats = {
395
+ totalCleanups: 0,
396
+ successfulCleanups: 0,
397
+ failedCleanups: 0,
398
+ totalSegmentsDeleted: 0,
399
+ totalBytesFreed: 0,
400
+ lastCleanupAt: null,
401
+ lastCleanupResult: null,
402
+ currentStorageBytes: 0,
403
+ currentSegmentCount: 0,
404
+ oldestSegmentAt: null,
405
+ newestSegmentAt: null,
406
+ legalHoldActive: false,
407
+ }
408
+ private cleanupInterval: ReturnType<typeof setInterval> | null = null
409
+ private cleanupInProgress = false
410
+
411
+ constructor(storage: R2WALStorage, config: WALRetentionConfig) {
412
+ this.storage = storage
413
+ // Build config without undefined values for exactOptionalPropertyTypes
414
+ // Explicitly construct the full config object type
415
+ type FullConfig = Required<Omit<WALRetentionConfig, 'onRetentionEvent' | 'legalHold'>> & {
416
+ onRetentionEvent?: (event: RetentionEvent) => void
417
+ legalHold?: LegalHold
418
+ }
419
+ const fullConfig: FullConfig = {
420
+ policy: config.policy,
421
+ cleanupIntervalMs: config.cleanupIntervalMs ?? DEFAULT_CONFIG.cleanupIntervalMs,
422
+ autoCleanup: config.autoCleanup ?? DEFAULT_CONFIG.autoCleanup,
423
+ minAgeBeforeDeleteMs: config.minAgeBeforeDeleteMs ?? DEFAULT_CONFIG.minAgeBeforeDeleteMs,
424
+ dryRun: config.dryRun ?? DEFAULT_CONFIG.dryRun,
425
+ }
426
+ if (config.onRetentionEvent !== undefined) {
427
+ fullConfig.onRetentionEvent = config.onRetentionEvent
428
+ }
429
+ if (config.legalHold !== undefined) {
430
+ fullConfig.legalHold = config.legalHold
431
+ }
432
+ this.config = fullConfig
433
+
434
+ if (config.legalHold?.enabled) {
435
+ this.stats.legalHoldActive = true
436
+ }
437
+ }
438
+
439
+ /**
440
+ * Get current retention configuration
441
+ */
442
+ getConfig(): WALRetentionConfig {
443
+ return { ...this.config }
444
+ }
445
+
446
+ /**
447
+ * Update retention configuration
448
+ */
449
+ setConfig(config: Partial<WALRetentionConfig>): void {
450
+ const oldPolicy = this.config.policy
451
+
452
+ if (config.policy !== undefined) {
453
+ this.config.policy = config.policy
454
+ }
455
+ if (config.cleanupIntervalMs !== undefined) {
456
+ this.config.cleanupIntervalMs = config.cleanupIntervalMs
457
+ }
458
+ if (config.autoCleanup !== undefined) {
459
+ this.config.autoCleanup = config.autoCleanup
460
+ }
461
+ if (config.minAgeBeforeDeleteMs !== undefined) {
462
+ this.config.minAgeBeforeDeleteMs = config.minAgeBeforeDeleteMs
463
+ }
464
+ if (config.dryRun !== undefined) {
465
+ this.config.dryRun = config.dryRun
466
+ }
467
+ if (config.onRetentionEvent !== undefined) {
468
+ this.config.onRetentionEvent = config.onRetentionEvent
469
+ }
470
+ if (config.legalHold !== undefined) {
471
+ this.config.legalHold = config.legalHold
472
+ this.stats.legalHoldActive = config.legalHold?.enabled ?? false
473
+ }
474
+
475
+ // Emit policy changed event
476
+ if (config.policy && config.policy !== oldPolicy) {
477
+ this.emitEvent({
478
+ type: 'policy_changed',
479
+ timestamp: Date.now(),
480
+ details: {
481
+ oldPolicy: oldPolicy.type,
482
+ newPolicy: config.policy.type,
483
+ },
484
+ })
485
+ }
486
+
487
+ // Restart auto cleanup if interval changed
488
+ if (config.cleanupIntervalMs !== undefined && this.cleanupInterval) {
489
+ this.stopAutoCleanup()
490
+ if (this.config.autoCleanup) {
491
+ this.startAutoCleanup()
492
+ }
493
+ }
494
+ }
495
+
496
+ /**
497
+ * Set legal hold status
498
+ */
499
+ setLegalHold(hold: LegalHold): void {
500
+ this.config.legalHold = {
501
+ ...hold,
502
+ appliedAt: hold.appliedAt ?? Date.now(),
503
+ }
504
+ this.stats.legalHoldActive = hold.enabled
505
+ }
506
+
507
+ /**
508
+ * Get current legal hold status
509
+ */
510
+ getLegalHold(): LegalHold | undefined {
511
+ return this.config.legalHold
512
+ }
513
+
514
+ /**
515
+ * Check if legal hold is active
516
+ */
517
+ isLegalHoldActive(): boolean {
518
+ const hold = this.config.legalHold
519
+ if (!hold || !hold.enabled) {
520
+ return false
521
+ }
522
+
523
+ // Check if legal hold has expired
524
+ if (hold.expiresAt && Date.now() > hold.expiresAt) {
525
+ return false
526
+ }
527
+
528
+ return true
529
+ }
530
+
531
+ /**
532
+ * Get retention statistics
533
+ */
534
+ getStats(): RetentionStats {
535
+ return { ...this.stats }
536
+ }
537
+
538
+ /**
539
+ * Start automatic cleanup based on configured interval
540
+ */
541
+ startAutoCleanup(): void {
542
+ if (this.cleanupInterval) {
543
+ return // Already running
544
+ }
545
+
546
+ // Run initial cleanup
547
+ void this.cleanup().catch((error) => {
548
+ console.error('[WALRetentionManager] Initial cleanup error:', error)
549
+ })
550
+
551
+ // Schedule periodic cleanup
552
+ this.cleanupInterval = setInterval(async () => {
553
+ try {
554
+ await this.cleanup()
555
+ } catch (error) {
556
+ console.error('[WALRetentionManager] Periodic cleanup error:', error)
557
+ }
558
+ }, this.config.cleanupIntervalMs)
559
+ }
560
+
561
+ /**
562
+ * Stop automatic cleanup
563
+ */
564
+ stopAutoCleanup(): void {
565
+ if (this.cleanupInterval) {
566
+ clearInterval(this.cleanupInterval)
567
+ this.cleanupInterval = null
568
+ }
569
+ }
570
+
571
+ /**
572
+ * Check if auto cleanup is running
573
+ */
574
+ isAutoCleanupRunning(): boolean {
575
+ return this.cleanupInterval !== null
576
+ }
577
+
578
+ /**
579
+ * Emit a retention event
580
+ */
581
+ private emitEvent(event: RetentionEvent): void {
582
+ if (this.config.onRetentionEvent) {
583
+ try {
584
+ this.config.onRetentionEvent(event)
585
+ } catch (error) {
586
+ console.error('[WALRetentionManager] Event listener error:', error)
587
+ }
588
+ }
589
+ }
590
+
591
+ /**
592
+ * Get all segment information from storage
593
+ */
594
+ private async getSegmentInfos(): Promise<SegmentInfo[]> {
595
+ const segments: SegmentInfo[] = []
596
+ let cursor: string | undefined
597
+
598
+ do {
599
+ // Build options without undefined values for exactOptionalPropertyTypes
600
+ const listOptions: { cursor?: string } = {}
601
+ if (cursor !== undefined) {
602
+ listOptions.cursor = cursor
603
+ }
604
+ const result = await this.storage.listSegmentsWithInfo(listOptions)
605
+
606
+ for (const seg of result.segments) {
607
+ segments.push({
608
+ key: seg.key,
609
+ createdAt: seg.createdAt,
610
+ sizeBytes: seg.size,
611
+ startLsn: seg.startLsn,
612
+ endLsn: seg.endLsn,
613
+ entryCount: seg.entryCount,
614
+ })
615
+ }
616
+
617
+ cursor = result.cursor
618
+ } while (cursor)
619
+
620
+ // Sort by creation time (oldest first)
621
+ return segments.sort((a, b) => a.createdAt - b.createdAt)
622
+ }
623
+
624
+ /**
625
+ * Evaluate whether a segment should be retained based on the retention policy
626
+ */
627
+ private shouldRetain(
628
+ segment: SegmentInfo,
629
+ now: number,
630
+ policy: RetentionPolicy,
631
+ cumulativeSize: number
632
+ ): boolean {
633
+ const age = now - segment.createdAt
634
+
635
+ // Never delete segments younger than minAgeBeforeDeleteMs
636
+ if (age < this.config.minAgeBeforeDeleteMs) {
637
+ return true
638
+ }
639
+
640
+ switch (policy.type) {
641
+ case 'time': {
642
+ // Must be within maxRetentionMs
643
+ if (age > policy.maxRetentionMs) {
644
+ return false
645
+ }
646
+ // If minRetentionMs is set, must retain at least that long
647
+ if (policy.minRetentionMs && age < policy.minRetentionMs) {
648
+ return true
649
+ }
650
+ return true
651
+ }
652
+
653
+ case 'size': {
654
+ // If evicting oldest first, check cumulative size
655
+ if (policy.evictOldestFirst !== false) {
656
+ return cumulativeSize + segment.sizeBytes <= policy.maxSizeBytes
657
+ } else {
658
+ // Evicting newest first is unusual but supported
659
+ return true // Will be handled in reverse order
660
+ }
661
+ }
662
+
663
+ case 'lsn': {
664
+ const minLsn = typeof policy.minLsn === 'string' ? BigInt(policy.minLsn) : policy.minLsn
665
+ return segment.endLsn >= minLsn
666
+ }
667
+
668
+ case 'combined': {
669
+ // All applicable conditions must be satisfied
670
+ let retain = true
671
+
672
+ if (policy.time) {
673
+ const timePolicy: TimeBasedRetention = { type: 'time', ...policy.time }
674
+ retain = retain && this.shouldRetain(segment, now, timePolicy, cumulativeSize)
675
+ }
676
+
677
+ if (policy.size && retain) {
678
+ const sizePolicy: SizeBasedRetention = { type: 'size', ...policy.size }
679
+ retain = retain && this.shouldRetain(segment, now, sizePolicy, cumulativeSize)
680
+ }
681
+
682
+ if (policy.lsn && retain) {
683
+ const lsnPolicy: LSNBasedRetention = { type: 'lsn', ...policy.lsn }
684
+ retain = retain && this.shouldRetain(segment, now, lsnPolicy, cumulativeSize)
685
+ }
686
+
687
+ return retain
688
+ }
689
+
690
+ default:
691
+ return true
692
+ }
693
+ }
694
+
695
+ /**
696
+ * Run cleanup based on retention policy
697
+ */
698
+ async cleanup(): Promise<CleanupResult> {
699
+ // Prevent concurrent cleanup operations
700
+ if (this.cleanupInProgress) {
701
+ return {
702
+ success: false,
703
+ segmentsDeleted: 0,
704
+ bytesFreed: 0,
705
+ segmentsRetained: 0,
706
+ bytesRetained: 0,
707
+ durationMs: 0,
708
+ reason: 'Cleanup already in progress',
709
+ }
710
+ }
711
+
712
+ this.cleanupInProgress = true
713
+ const startTime = performance.now()
714
+
715
+ this.emitEvent({
716
+ type: 'cleanup_started',
717
+ timestamp: Date.now(),
718
+ details: {
719
+ policy: this.config.policy.type,
720
+ dryRun: this.config.dryRun,
721
+ },
722
+ })
723
+
724
+ try {
725
+ // Check for legal hold
726
+ if (this.isLegalHoldActive()) {
727
+ this.emitEvent({
728
+ type: 'legal_hold_prevented_deletion',
729
+ timestamp: Date.now(),
730
+ details: {
731
+ reason: this.config.legalHold?.reason,
732
+ },
733
+ })
734
+
735
+ return {
736
+ success: true,
737
+ segmentsDeleted: 0,
738
+ bytesFreed: 0,
739
+ segmentsRetained: 0,
740
+ bytesRetained: 0,
741
+ durationMs: performance.now() - startTime,
742
+ reason: 'Legal hold active',
743
+ }
744
+ }
745
+
746
+ // Get all segments
747
+ const segments = await this.getSegmentInfos()
748
+
749
+ if (segments.length === 0) {
750
+ return {
751
+ success: true,
752
+ segmentsDeleted: 0,
753
+ bytesFreed: 0,
754
+ segmentsRetained: 0,
755
+ bytesRetained: 0,
756
+ durationMs: performance.now() - startTime,
757
+ }
758
+ }
759
+
760
+ const now = Date.now()
761
+ const toDelete: SegmentInfo[] = []
762
+ const toRetain: SegmentInfo[] = []
763
+ let cumulativeSize = 0
764
+
765
+ // For size-based retention with oldest-first eviction, we need to process in reverse
766
+ // to calculate cumulative size from newest to oldest
767
+ if (
768
+ this.config.policy.type === 'size' ||
769
+ (this.config.policy.type === 'combined' && this.config.policy.size)
770
+ ) {
771
+ // Calculate total size first
772
+ const storageStats = this.storage.getStats()
773
+ const totalSize = storageStats.bytesWritten
774
+
775
+ // Process from newest to oldest
776
+ const segmentsReversed = [...segments].reverse()
777
+ let retainedSize = 0
778
+
779
+ for (const segment of segmentsReversed) {
780
+ // Estimate segment size from storage stats
781
+ segment.sizeBytes = Math.floor(totalSize / segments.length) // Rough estimate
782
+
783
+ if (this.shouldRetain(segment, now, this.config.policy, retainedSize)) {
784
+ toRetain.unshift(segment) // Add to front to maintain order
785
+ retainedSize += segment.sizeBytes
786
+ } else {
787
+ toDelete.unshift(segment)
788
+ }
789
+ }
790
+ } else {
791
+ // Process in chronological order for time and LSN-based retention
792
+ for (const segment of segments) {
793
+ if (this.shouldRetain(segment, now, this.config.policy, cumulativeSize)) {
794
+ toRetain.push(segment)
795
+ cumulativeSize += segment.sizeBytes
796
+ } else {
797
+ toDelete.push(segment)
798
+ }
799
+ }
800
+ }
801
+
802
+ // Calculate statistics
803
+ let bytesFreed = 0
804
+ let bytesRetained = 0
805
+
806
+ for (const segment of toDelete) {
807
+ bytesFreed += segment.sizeBytes
808
+ }
809
+
810
+ for (const segment of toRetain) {
811
+ bytesRetained += segment.sizeBytes
812
+ }
813
+
814
+ // Delete segments (unless dry run)
815
+ if (!this.config.dryRun && toDelete.length > 0) {
816
+ const keysToDelete = toDelete.map((s) => s.key)
817
+ await this.storage.deleteSegments(keysToDelete)
818
+
819
+ // Emit events for each deleted segment
820
+ for (const key of keysToDelete) {
821
+ this.emitEvent({
822
+ type: 'segment_deleted',
823
+ timestamp: Date.now(),
824
+ details: { key },
825
+ })
826
+ }
827
+ }
828
+
829
+ // Build result
830
+ const deletedLsnRange =
831
+ toDelete.length > 0
832
+ ? {
833
+ start: toDelete[0]!.startLsn,
834
+ end: toDelete[toDelete.length - 1]!.endLsn,
835
+ }
836
+ : undefined
837
+
838
+ const result: CleanupResult = {
839
+ success: true,
840
+ segmentsDeleted: toDelete.length,
841
+ bytesFreed,
842
+ segmentsRetained: toRetain.length,
843
+ bytesRetained,
844
+ deletedLsnRange,
845
+ durationMs: performance.now() - startTime,
846
+ }
847
+
848
+ // Update statistics
849
+ this.stats.totalCleanups++
850
+ this.stats.successfulCleanups++
851
+ this.stats.totalSegmentsDeleted += toDelete.length
852
+ this.stats.totalBytesFreed += bytesFreed
853
+ this.stats.lastCleanupAt = Date.now()
854
+ this.stats.lastCleanupResult = result
855
+ this.stats.currentStorageBytes = bytesRetained
856
+ this.stats.currentSegmentCount = toRetain.length
857
+
858
+ if (toRetain.length > 0) {
859
+ this.stats.oldestSegmentAt = toRetain[0]!.createdAt
860
+ this.stats.newestSegmentAt = toRetain[toRetain.length - 1]!.createdAt
861
+ } else {
862
+ this.stats.oldestSegmentAt = null
863
+ this.stats.newestSegmentAt = null
864
+ }
865
+
866
+ this.emitEvent({
867
+ type: 'cleanup_completed',
868
+ timestamp: Date.now(),
869
+ details: {
870
+ segmentsDeleted: toDelete.length,
871
+ bytesFreed,
872
+ segmentsRetained: toRetain.length,
873
+ durationMs: result.durationMs,
874
+ dryRun: this.config.dryRun,
875
+ },
876
+ })
877
+
878
+ return result
879
+ } catch (error) {
880
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error'
881
+
882
+ this.stats.totalCleanups++
883
+ this.stats.failedCleanups++
884
+
885
+ this.emitEvent({
886
+ type: 'cleanup_error',
887
+ timestamp: Date.now(),
888
+ details: { error: errorMessage },
889
+ })
890
+
891
+ return {
892
+ success: false,
893
+ segmentsDeleted: 0,
894
+ bytesFreed: 0,
895
+ segmentsRetained: 0,
896
+ bytesRetained: 0,
897
+ durationMs: performance.now() - startTime,
898
+ error: errorMessage,
899
+ }
900
+ } finally {
901
+ this.cleanupInProgress = false
902
+ }
903
+ }
904
+
905
+ /**
906
+ * Get the estimated time until next cleanup
907
+ */
908
+ getNextCleanupIn(): number | null {
909
+ if (!this.cleanupInterval || !this.stats.lastCleanupAt) {
910
+ return null
911
+ }
912
+
913
+ const elapsed = Date.now() - this.stats.lastCleanupAt
914
+ return Math.max(0, this.config.cleanupIntervalMs - elapsed)
915
+ }
916
+
917
+ /**
918
+ * Force an immediate cleanup (ignores interval)
919
+ */
920
+ async forceCleanup(): Promise<CleanupResult> {
921
+ return this.cleanup()
922
+ }
923
+
924
+ /**
925
+ * Preview what would be cleaned up without actually deleting
926
+ */
927
+ async previewCleanup(): Promise<{
928
+ segmentsToDelete: SegmentInfo[]
929
+ segmentsToRetain: SegmentInfo[]
930
+ bytesToFree: number
931
+ bytesToRetain: number
932
+ }> {
933
+ const segments = await this.getSegmentInfos()
934
+ const now = Date.now()
935
+ const toDelete: SegmentInfo[] = []
936
+ const toRetain: SegmentInfo[] = []
937
+ let cumulativeSize = 0
938
+
939
+ for (const segment of segments) {
940
+ if (this.shouldRetain(segment, now, this.config.policy, cumulativeSize)) {
941
+ toRetain.push(segment)
942
+ cumulativeSize += segment.sizeBytes
943
+ } else {
944
+ toDelete.push(segment)
945
+ }
946
+ }
947
+
948
+ let bytesToFree = 0
949
+ let bytesToRetain = 0
950
+
951
+ for (const segment of toDelete) {
952
+ bytesToFree += segment.sizeBytes
953
+ }
954
+
955
+ for (const segment of toRetain) {
956
+ bytesToRetain += segment.sizeBytes
957
+ }
958
+
959
+ return {
960
+ segmentsToDelete: toDelete,
961
+ segmentsToRetain: toRetain,
962
+ bytesToFree,
963
+ bytesToRetain,
964
+ }
965
+ }
966
+ }
967
+
968
+ /**
969
+ * Create a WAL retention manager with default time-based retention
970
+ *
971
+ * @example
972
+ * ```typescript
973
+ * const retention = createWALRetentionManager(storage, '30d')
974
+ * retention.startAutoCleanup()
975
+ * ```
976
+ */
977
+ export function createWALRetentionManager(
978
+ storage: R2WALStorage,
979
+ retention: string | WALRetentionConfig
980
+ ): WALRetentionManager {
981
+ const config: WALRetentionConfig =
982
+ typeof retention === 'string'
983
+ ? { policy: createTimeRetention(retention) }
984
+ : retention
985
+
986
+ return new WALRetentionManager(storage, config)
987
+ }
988
+
989
+ /**
990
+ * Parse retention configuration from environment variables
991
+ *
992
+ * Supported environment variables:
993
+ * - WAL_RETENTION_TYPE: 'time' | 'size' | 'lsn' | 'combined'
994
+ * - WAL_RETENTION_MAX_TIME: Duration string (e.g., '30d', '12h')
995
+ * - WAL_RETENTION_MIN_TIME: Duration string (e.g., '7d')
996
+ * - WAL_RETENTION_MAX_SIZE: Size string (e.g., '1GB', '500MB')
997
+ * - WAL_RETENTION_MIN_LSN: LSN value
998
+ * - WAL_RETENTION_AUTO_CLEANUP: 'true' | 'false'
999
+ * - WAL_RETENTION_CLEANUP_INTERVAL: Duration string (e.g., '1h')
1000
+ * - WAL_RETENTION_DRY_RUN: 'true' | 'false'
1001
+ *
1002
+ * @example
1003
+ * ```typescript
1004
+ * // In your Worker
1005
+ * const config = parseRetentionConfigFromEnv(env)
1006
+ * const retention = new WALRetentionManager(storage, config)
1007
+ * ```
1008
+ */
1009
+ export function parseRetentionConfigFromEnv(env: Record<string, string | undefined>): WALRetentionConfig {
1010
+ const type = (env.WAL_RETENTION_TYPE as RetentionPolicyType) || 'time'
1011
+
1012
+ let policy: RetentionPolicy
1013
+
1014
+ switch (type) {
1015
+ case 'time':
1016
+ policy = {
1017
+ type: 'time',
1018
+ maxRetentionMs: env.WAL_RETENTION_MAX_TIME
1019
+ ? parseDuration(env.WAL_RETENTION_MAX_TIME)
1020
+ : 30 * 24 * 60 * 60 * 1000, // Default: 30 days
1021
+ minRetentionMs: env.WAL_RETENTION_MIN_TIME
1022
+ ? parseDuration(env.WAL_RETENTION_MIN_TIME)
1023
+ : undefined,
1024
+ }
1025
+ break
1026
+
1027
+ case 'size':
1028
+ policy = {
1029
+ type: 'size',
1030
+ maxSizeBytes: env.WAL_RETENTION_MAX_SIZE
1031
+ ? parseSize(env.WAL_RETENTION_MAX_SIZE)
1032
+ : 1024 * 1024 * 1024, // Default: 1GB
1033
+ }
1034
+ break
1035
+
1036
+ case 'lsn':
1037
+ policy = {
1038
+ type: 'lsn',
1039
+ minLsn: env.WAL_RETENTION_MIN_LSN || '0',
1040
+ }
1041
+ break
1042
+
1043
+ case 'combined':
1044
+ policy = {
1045
+ type: 'combined',
1046
+ time: env.WAL_RETENTION_MAX_TIME
1047
+ ? {
1048
+ maxRetentionMs: parseDuration(env.WAL_RETENTION_MAX_TIME),
1049
+ minRetentionMs: env.WAL_RETENTION_MIN_TIME
1050
+ ? parseDuration(env.WAL_RETENTION_MIN_TIME)
1051
+ : undefined,
1052
+ }
1053
+ : undefined,
1054
+ size: env.WAL_RETENTION_MAX_SIZE
1055
+ ? { maxSizeBytes: parseSize(env.WAL_RETENTION_MAX_SIZE) }
1056
+ : undefined,
1057
+ lsn: env.WAL_RETENTION_MIN_LSN
1058
+ ? { minLsn: env.WAL_RETENTION_MIN_LSN }
1059
+ : undefined,
1060
+ }
1061
+ break
1062
+
1063
+ default:
1064
+ policy = { type: 'time', maxRetentionMs: 30 * 24 * 60 * 60 * 1000 }
1065
+ }
1066
+
1067
+ return {
1068
+ policy,
1069
+ autoCleanup: env.WAL_RETENTION_AUTO_CLEANUP !== 'false',
1070
+ cleanupIntervalMs: env.WAL_RETENTION_CLEANUP_INTERVAL
1071
+ ? parseDuration(env.WAL_RETENTION_CLEANUP_INTERVAL)
1072
+ : DEFAULT_CONFIG.cleanupIntervalMs,
1073
+ dryRun: env.WAL_RETENTION_DRY_RUN === 'true',
1074
+ }
1075
+ }