@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,824 @@
1
+ /**
2
+ * Tests for Auto-promotion logic (cold->warm->hot)
3
+ * Task: postgres-xm8.10 - Auto-promotion logic (cold->warm->hot)
4
+ *
5
+ * Auto-promotion automatically moves frequently accessed pages
6
+ * to hotter tiers for faster access based on:
7
+ * - cold->warm: N reads (configurable threshold)
8
+ * - warm->hot: M reads in T time window
9
+ */
10
+
11
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'
12
+ import {
13
+ AutoPromoter,
14
+ AutoPromoterConfig,
15
+ PromotionEvent,
16
+ PromotionDecision,
17
+ AccessPattern,
18
+ createAutoPromoter,
19
+ } from './auto-promotion'
20
+ import { CacheLayer } from './cache-layer'
21
+ import { R2StorageLayer } from './r2-layer'
22
+ import type { StorageTier } from '../storage/tiered-vfs'
23
+
24
+ // Mock CacheLayer
25
+ const mockCacheLayer = {
26
+ get: vi.fn(),
27
+ put: vi.fn(),
28
+ delete: vi.fn(),
29
+ has: vi.fn(),
30
+ getWithMetadata: vi.fn(),
31
+ getStats: vi.fn(),
32
+ clear: vi.fn(),
33
+ }
34
+
35
+ // Mock DOStorage
36
+ const mockDOStorage = {
37
+ get: vi.fn(),
38
+ put: vi.fn().mockResolvedValue(undefined),
39
+ delete: vi.fn().mockResolvedValue(undefined),
40
+ list: vi.fn(),
41
+ }
42
+
43
+ // Mock R2StorageLayer
44
+ const mockR2Layer = {
45
+ get: vi.fn(),
46
+ getRange: vi.fn(),
47
+ put: vi.fn(),
48
+ delete: vi.fn(),
49
+ deleteMany: vi.fn(),
50
+ head: vi.fn(),
51
+ has: vi.fn(),
52
+ list: vi.fn(),
53
+ getStats: vi.fn(),
54
+ }
55
+
56
+ describe('Auto-promotion logic (cold->warm->hot)', () => {
57
+ beforeEach(() => {
58
+ vi.clearAllMocks()
59
+ })
60
+
61
+ describe('AutoPromoterConfig', () => {
62
+ it('should have required config fields', () => {
63
+ const config: AutoPromoterConfig = {
64
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
65
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
66
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
67
+ coldToWarmThreshold: 3,
68
+ warmToHotThreshold: 5,
69
+ }
70
+ expect(config.coldToWarmThreshold).toBe(3)
71
+ expect(config.warmToHotThreshold).toBe(5)
72
+ })
73
+
74
+ it('should support optional onPromotion callback', () => {
75
+ const onPromotion = vi.fn()
76
+ const config: AutoPromoterConfig = {
77
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
78
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
79
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
80
+ coldToWarmThreshold: 3,
81
+ warmToHotThreshold: 5,
82
+ onPromotion,
83
+ }
84
+ expect(config.onPromotion).toBe(onPromotion)
85
+ })
86
+
87
+ it('should support optional time window config', () => {
88
+ const config: AutoPromoterConfig = {
89
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
90
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
91
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
92
+ coldToWarmThreshold: 3,
93
+ warmToHotThreshold: 5,
94
+ warmToHotTimeWindowMs: 30000,
95
+ accessHistoryMaxAgeMs: 120000,
96
+ }
97
+ expect(config.warmToHotTimeWindowMs).toBe(30000)
98
+ expect(config.accessHistoryMaxAgeMs).toBe(120000)
99
+ })
100
+ })
101
+
102
+ describe('createAutoPromoter()', () => {
103
+ it('should return an AutoPromoter instance', () => {
104
+ const config: AutoPromoterConfig = {
105
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
106
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
107
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
108
+ coldToWarmThreshold: 3,
109
+ warmToHotThreshold: 5,
110
+ }
111
+ const promoter = createAutoPromoter(config)
112
+ expect(promoter).toBeDefined()
113
+ expect(promoter).toBeInstanceOf(AutoPromoter)
114
+ })
115
+ })
116
+
117
+ describe('AutoPromoter.recordAccess()', () => {
118
+ it('should track access count for a page', async () => {
119
+ const config: AutoPromoterConfig = {
120
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
121
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
122
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
123
+ coldToWarmThreshold: 3,
124
+ warmToHotThreshold: 5,
125
+ }
126
+ const promoter = createAutoPromoter(config)
127
+
128
+ await promoter.recordAccess('page-123', 'cold')
129
+ const accessCount = promoter.getAccessCount('page-123')
130
+ expect(accessCount).toBe(1)
131
+ })
132
+
133
+ it('should increment access count on multiple accesses', async () => {
134
+ const config: AutoPromoterConfig = {
135
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
136
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
137
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
138
+ coldToWarmThreshold: 3,
139
+ warmToHotThreshold: 5,
140
+ }
141
+ const promoter = createAutoPromoter(config)
142
+
143
+ await promoter.recordAccess('page-123', 'cold')
144
+ await promoter.recordAccess('page-123', 'cold')
145
+ await promoter.recordAccess('page-123', 'cold')
146
+
147
+ const accessCount = promoter.getAccessCount('page-123')
148
+ expect(accessCount).toBe(3)
149
+ })
150
+
151
+ it('should track last access time', async () => {
152
+ const config: AutoPromoterConfig = {
153
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
154
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
155
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
156
+ coldToWarmThreshold: 3,
157
+ warmToHotThreshold: 5,
158
+ }
159
+ const promoter = createAutoPromoter(config)
160
+
161
+ const before = Date.now()
162
+ await promoter.recordAccess('page-123', 'cold')
163
+ const after = Date.now()
164
+
165
+ const lastAccess = promoter.getLastAccess('page-123')
166
+ expect(lastAccess).toBeGreaterThanOrEqual(before)
167
+ expect(lastAccess).toBeLessThanOrEqual(after)
168
+ })
169
+ })
170
+
171
+ describe('AutoPromoter.shouldPromote()', () => {
172
+ it('should not promote below threshold', () => {
173
+ const config: AutoPromoterConfig = {
174
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
175
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
176
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
177
+ coldToWarmThreshold: 3,
178
+ warmToHotThreshold: 5,
179
+ }
180
+ const promoter = createAutoPromoter(config)
181
+
182
+ // Access twice (below cold->warm threshold of 3)
183
+ promoter.recordAccess('page-123', 'cold')
184
+ promoter.recordAccess('page-123', 'cold')
185
+
186
+ const decision = promoter.shouldPromote('page-123', 'cold')
187
+ expect(decision.shouldPromote).toBe(false)
188
+ })
189
+
190
+ it('should promote cold to warm at threshold', () => {
191
+ const config: AutoPromoterConfig = {
192
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
193
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
194
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
195
+ coldToWarmThreshold: 3,
196
+ warmToHotThreshold: 5,
197
+ }
198
+ const promoter = createAutoPromoter(config)
199
+
200
+ // Access 3 times (at threshold)
201
+ promoter.recordAccess('page-123', 'cold')
202
+ promoter.recordAccess('page-123', 'cold')
203
+ promoter.recordAccess('page-123', 'cold')
204
+
205
+ const decision = promoter.shouldPromote('page-123', 'cold')
206
+ expect(decision.shouldPromote).toBe(true)
207
+ expect(decision.fromTier).toBe('cold')
208
+ expect(decision.toTier).toBe('warm')
209
+ })
210
+
211
+ it('should promote warm to hot at threshold', () => {
212
+ const config: AutoPromoterConfig = {
213
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
214
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
215
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
216
+ coldToWarmThreshold: 3,
217
+ warmToHotThreshold: 5,
218
+ }
219
+ const promoter = createAutoPromoter(config)
220
+
221
+ // Access 5 times (at warm->hot threshold)
222
+ for (let i = 0; i < 5; i++) {
223
+ promoter.recordAccess('page-123', 'warm')
224
+ }
225
+
226
+ const decision = promoter.shouldPromote('page-123', 'warm')
227
+ expect(decision.shouldPromote).toBe(true)
228
+ expect(decision.fromTier).toBe('warm')
229
+ expect(decision.toTier).toBe('hot')
230
+ })
231
+
232
+ it('should not promote pages already in hot tier', () => {
233
+ const config: AutoPromoterConfig = {
234
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
235
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
236
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
237
+ coldToWarmThreshold: 3,
238
+ warmToHotThreshold: 5,
239
+ }
240
+ const promoter = createAutoPromoter(config)
241
+
242
+ // Access many times in hot tier
243
+ for (let i = 0; i < 10; i++) {
244
+ promoter.recordAccess('page-123', 'hot')
245
+ }
246
+
247
+ const decision = promoter.shouldPromote('page-123', 'hot')
248
+ expect(decision.shouldPromote).toBe(false)
249
+ })
250
+ })
251
+
252
+ describe('AutoPromoter.promote()', () => {
253
+ it('should promote cold to warm by copying to DO storage', async () => {
254
+ const data = new Uint8Array([1, 2, 3])
255
+ mockR2Layer.get.mockResolvedValue(data)
256
+
257
+ const config: AutoPromoterConfig = {
258
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
259
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
260
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
261
+ coldToWarmThreshold: 3,
262
+ warmToHotThreshold: 5,
263
+ }
264
+ const promoter = createAutoPromoter(config)
265
+
266
+ const event = await promoter.promote('page-123', 'cold', 'warm')
267
+
268
+ expect(mockR2Layer.get).toHaveBeenCalledWith('page-123')
269
+ expect(mockDOStorage.put).toHaveBeenCalledWith('page-123', data)
270
+ expect(event.success).toBe(true)
271
+ expect(event.fromTier).toBe('cold')
272
+ expect(event.toTier).toBe('warm')
273
+ })
274
+
275
+ it('should promote warm to hot by copying to cache', async () => {
276
+ const data = new Uint8Array([10, 20, 30])
277
+ mockDOStorage.get.mockResolvedValue(data)
278
+
279
+ const config: AutoPromoterConfig = {
280
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
281
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
282
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
283
+ coldToWarmThreshold: 3,
284
+ warmToHotThreshold: 5,
285
+ }
286
+ const promoter = createAutoPromoter(config)
287
+
288
+ const event = await promoter.promote('page-123', 'warm', 'hot')
289
+
290
+ expect(mockDOStorage.get).toHaveBeenCalledWith('page-123')
291
+ expect(mockCacheLayer.put).toHaveBeenCalledWith('page-123', data, expect.any(Object))
292
+ expect(event.success).toBe(true)
293
+ })
294
+
295
+ it('should call onPromotion callback', async () => {
296
+ const data = new Uint8Array([1, 2, 3])
297
+ mockR2Layer.get.mockResolvedValue(data)
298
+ const onPromotion = vi.fn()
299
+
300
+ const config: AutoPromoterConfig = {
301
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
302
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
303
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
304
+ coldToWarmThreshold: 3,
305
+ warmToHotThreshold: 5,
306
+ onPromotion,
307
+ }
308
+ const promoter = createAutoPromoter(config)
309
+
310
+ await promoter.promote('page-123', 'cold', 'warm')
311
+
312
+ expect(onPromotion).toHaveBeenCalledWith(
313
+ expect.objectContaining({
314
+ key: 'page-123',
315
+ fromTier: 'cold',
316
+ toTier: 'warm',
317
+ success: true,
318
+ })
319
+ )
320
+ })
321
+
322
+ it('should handle promotion failure gracefully', async () => {
323
+ mockR2Layer.get.mockResolvedValue(null)
324
+
325
+ const config: AutoPromoterConfig = {
326
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
327
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
328
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
329
+ coldToWarmThreshold: 3,
330
+ warmToHotThreshold: 5,
331
+ }
332
+ const promoter = createAutoPromoter(config)
333
+
334
+ const event = await promoter.promote('nonexistent', 'cold', 'warm')
335
+
336
+ expect(event.success).toBe(false)
337
+ expect(event.error).toBeDefined()
338
+ })
339
+
340
+ it('should reset access count after promotion', async () => {
341
+ const data = new Uint8Array([1, 2, 3])
342
+ mockR2Layer.get.mockResolvedValue(data)
343
+
344
+ const config: AutoPromoterConfig = {
345
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
346
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
347
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
348
+ coldToWarmThreshold: 3,
349
+ warmToHotThreshold: 5,
350
+ }
351
+ const promoter = createAutoPromoter(config)
352
+
353
+ // Build up accesses
354
+ for (let i = 0; i < 5; i++) {
355
+ promoter.recordAccess('page-123', 'cold')
356
+ }
357
+
358
+ await promoter.promote('page-123', 'cold', 'warm')
359
+
360
+ const accessCount = promoter.getAccessCount('page-123')
361
+ expect(accessCount).toBe(0)
362
+ })
363
+ })
364
+
365
+ describe('AutoPromoter.checkAndPromote()', () => {
366
+ it('should automatically promote when threshold is reached', async () => {
367
+ const data = new Uint8Array([1, 2, 3])
368
+ mockR2Layer.get.mockResolvedValue(data)
369
+
370
+ const config: AutoPromoterConfig = {
371
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
372
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
373
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
374
+ coldToWarmThreshold: 3,
375
+ warmToHotThreshold: 5,
376
+ }
377
+ const promoter = createAutoPromoter(config)
378
+
379
+ // Access until threshold
380
+ promoter.recordAccess('page-123', 'cold')
381
+ promoter.recordAccess('page-123', 'cold')
382
+ promoter.recordAccess('page-123', 'cold')
383
+
384
+ const event = await promoter.checkAndPromote('page-123', 'cold')
385
+
386
+ expect(event).not.toBeNull()
387
+ expect(event?.success).toBe(true)
388
+ expect(mockDOStorage.put).toHaveBeenCalled()
389
+ })
390
+
391
+ it('should return null when promotion is not needed', async () => {
392
+ const config: AutoPromoterConfig = {
393
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
394
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
395
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
396
+ coldToWarmThreshold: 3,
397
+ warmToHotThreshold: 5,
398
+ }
399
+ const promoter = createAutoPromoter(config)
400
+
401
+ // Only 1 access (below threshold)
402
+ promoter.recordAccess('page-123', 'cold')
403
+
404
+ const event = await promoter.checkAndPromote('page-123', 'cold')
405
+
406
+ expect(event).toBeNull()
407
+ })
408
+ })
409
+
410
+ describe('PromotionEvent type', () => {
411
+ it('should have required fields', () => {
412
+ const event: PromotionEvent = {
413
+ key: 'page-123',
414
+ fromTier: 'cold',
415
+ toTier: 'warm',
416
+ success: true,
417
+ timestamp: Date.now(),
418
+ accessCount: 5,
419
+ }
420
+ expect(event.key).toBe('page-123')
421
+ expect(event.fromTier).toBe('cold')
422
+ expect(event.toTier).toBe('warm')
423
+ expect(event.success).toBe(true)
424
+ expect(event.timestamp).toBeDefined()
425
+ expect(event.accessCount).toBe(5)
426
+ })
427
+
428
+ it('should support optional error field', () => {
429
+ const event: PromotionEvent = {
430
+ key: 'page-123',
431
+ fromTier: 'cold',
432
+ toTier: 'warm',
433
+ success: false,
434
+ timestamp: Date.now(),
435
+ accessCount: 3,
436
+ error: 'Page not found in source tier',
437
+ }
438
+ expect(event.error).toBe('Page not found in source tier')
439
+ })
440
+ })
441
+
442
+ describe('Time window-based promotion (warm->hot)', () => {
443
+ it('should use time window for warm->hot promotion', () => {
444
+ const config: AutoPromoterConfig = {
445
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
446
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
447
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
448
+ coldToWarmThreshold: 3,
449
+ warmToHotThreshold: 5,
450
+ warmToHotTimeWindowMs: 60000, // 1 minute
451
+ }
452
+ const promoter = createAutoPromoter(config)
453
+
454
+ // Access 5 times in warm tier (within time window)
455
+ for (let i = 0; i < 5; i++) {
456
+ promoter.recordAccess('page-123', 'warm')
457
+ }
458
+
459
+ const decision = promoter.shouldPromote('page-123', 'warm')
460
+ expect(decision.shouldPromote).toBe(true)
461
+ expect(decision.fromTier).toBe('warm')
462
+ expect(decision.toTier).toBe('hot')
463
+ })
464
+
465
+ it('should return configured time window', () => {
466
+ const config: AutoPromoterConfig = {
467
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
468
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
469
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
470
+ coldToWarmThreshold: 3,
471
+ warmToHotThreshold: 5,
472
+ warmToHotTimeWindowMs: 30000,
473
+ }
474
+ const promoter = createAutoPromoter(config)
475
+ expect(promoter.getWarmToHotTimeWindowMs()).toBe(30000)
476
+ })
477
+
478
+ it('should default time window to 60 seconds', () => {
479
+ const config: AutoPromoterConfig = {
480
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
481
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
482
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
483
+ coldToWarmThreshold: 3,
484
+ warmToHotThreshold: 5,
485
+ }
486
+ const promoter = createAutoPromoter(config)
487
+ expect(promoter.getWarmToHotTimeWindowMs()).toBe(60000)
488
+ })
489
+ })
490
+
491
+ describe('AutoPromoter.getAccessesInWindow()', () => {
492
+ it('should return accesses within default time window', () => {
493
+ const config: AutoPromoterConfig = {
494
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
495
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
496
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
497
+ coldToWarmThreshold: 3,
498
+ warmToHotThreshold: 5,
499
+ warmToHotTimeWindowMs: 60000,
500
+ }
501
+ const promoter = createAutoPromoter(config)
502
+
503
+ // Record 3 accesses
504
+ promoter.recordAccess('page-123', 'warm')
505
+ promoter.recordAccess('page-123', 'warm')
506
+ promoter.recordAccess('page-123', 'warm')
507
+
508
+ const windowAccesses = promoter.getAccessesInWindow('page-123')
509
+ expect(windowAccesses).toBe(3)
510
+ })
511
+
512
+ it('should return 0 for untracked page', () => {
513
+ const config: AutoPromoterConfig = {
514
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
515
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
516
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
517
+ coldToWarmThreshold: 3,
518
+ warmToHotThreshold: 5,
519
+ }
520
+ const promoter = createAutoPromoter(config)
521
+
522
+ const windowAccesses = promoter.getAccessesInWindow('unknown-page')
523
+ expect(windowAccesses).toBe(0)
524
+ })
525
+
526
+ it('should allow custom time window', () => {
527
+ const config: AutoPromoterConfig = {
528
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
529
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
530
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
531
+ coldToWarmThreshold: 3,
532
+ warmToHotThreshold: 5,
533
+ warmToHotTimeWindowMs: 60000,
534
+ }
535
+ const promoter = createAutoPromoter(config)
536
+
537
+ promoter.recordAccess('page-123', 'warm')
538
+ promoter.recordAccess('page-123', 'warm')
539
+
540
+ // Custom window of 30 seconds
541
+ const windowAccesses = promoter.getAccessesInWindow('page-123', 30000)
542
+ expect(windowAccesses).toBe(2)
543
+ })
544
+ })
545
+
546
+ describe('AutoPromoter.getAccessPattern()', () => {
547
+ it('should return access pattern for tracked page', () => {
548
+ const config: AutoPromoterConfig = {
549
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
550
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
551
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
552
+ coldToWarmThreshold: 3,
553
+ warmToHotThreshold: 5,
554
+ warmToHotTimeWindowMs: 60000,
555
+ }
556
+ const promoter = createAutoPromoter(config)
557
+
558
+ promoter.recordAccess('page-123', 'cold')
559
+ promoter.recordAccess('page-123', 'cold')
560
+ promoter.recordAccess('page-123', 'cold')
561
+
562
+ const pattern = promoter.getAccessPattern('page-123')
563
+ expect(pattern).not.toBeNull()
564
+ expect(pattern!.totalAccesses).toBe(3)
565
+ expect(pattern!.windowAccesses).toBe(3)
566
+ expect(pattern!.frequency).toBeGreaterThan(0)
567
+ expect(pattern!.recency).toBeGreaterThan(0)
568
+ expect(pattern!.recency).toBeLessThanOrEqual(1)
569
+ expect(pattern!.ageMs).toBeGreaterThanOrEqual(0)
570
+ expect(pattern!.idleMs).toBeGreaterThanOrEqual(0)
571
+ })
572
+
573
+ it('should return null for untracked page', () => {
574
+ const config: AutoPromoterConfig = {
575
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
576
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
577
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
578
+ coldToWarmThreshold: 3,
579
+ warmToHotThreshold: 5,
580
+ }
581
+ const promoter = createAutoPromoter(config)
582
+
583
+ const pattern = promoter.getAccessPattern('unknown-page')
584
+ expect(pattern).toBeNull()
585
+ })
586
+ })
587
+
588
+ describe('Multiple promotion callbacks', () => {
589
+ it('should support adding multiple callbacks', async () => {
590
+ const data = new Uint8Array([1, 2, 3])
591
+ mockR2Layer.get.mockResolvedValue(data)
592
+
593
+ const callback1 = vi.fn()
594
+ const callback2 = vi.fn()
595
+
596
+ const config: AutoPromoterConfig = {
597
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
598
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
599
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
600
+ coldToWarmThreshold: 3,
601
+ warmToHotThreshold: 5,
602
+ onPromotion: callback1,
603
+ }
604
+ const promoter = createAutoPromoter(config)
605
+ promoter.addPromotionCallback(callback2)
606
+
607
+ await promoter.promote('page-123', 'cold', 'warm')
608
+
609
+ expect(callback1).toHaveBeenCalled()
610
+ expect(callback2).toHaveBeenCalled()
611
+ })
612
+
613
+ it('should support removing callbacks', async () => {
614
+ const data = new Uint8Array([1, 2, 3])
615
+ mockR2Layer.get.mockResolvedValue(data)
616
+
617
+ const callback1 = vi.fn()
618
+ const callback2 = vi.fn()
619
+
620
+ const config: AutoPromoterConfig = {
621
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
622
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
623
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
624
+ coldToWarmThreshold: 3,
625
+ warmToHotThreshold: 5,
626
+ }
627
+ const promoter = createAutoPromoter(config)
628
+ promoter.addPromotionCallback(callback1)
629
+ promoter.addPromotionCallback(callback2)
630
+
631
+ const removed = promoter.removePromotionCallback(callback1)
632
+ expect(removed).toBe(true)
633
+
634
+ await promoter.promote('page-123', 'cold', 'warm')
635
+
636
+ expect(callback1).not.toHaveBeenCalled()
637
+ expect(callback2).toHaveBeenCalled()
638
+ })
639
+
640
+ it('should return false when removing non-existent callback', () => {
641
+ const config: AutoPromoterConfig = {
642
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
643
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
644
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
645
+ coldToWarmThreshold: 3,
646
+ warmToHotThreshold: 5,
647
+ }
648
+ const promoter = createAutoPromoter(config)
649
+
650
+ const removed = promoter.removePromotionCallback(vi.fn())
651
+ expect(removed).toBe(false)
652
+ })
653
+
654
+ it('should handle callback errors gracefully', async () => {
655
+ const data = new Uint8Array([1, 2, 3])
656
+ mockR2Layer.get.mockResolvedValue(data)
657
+
658
+ const errorCallback = vi.fn().mockImplementation(() => {
659
+ throw new Error('Callback error')
660
+ })
661
+ const normalCallback = vi.fn()
662
+
663
+ const config: AutoPromoterConfig = {
664
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
665
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
666
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
667
+ coldToWarmThreshold: 3,
668
+ warmToHotThreshold: 5,
669
+ }
670
+ const promoter = createAutoPromoter(config)
671
+ promoter.addPromotionCallback(errorCallback)
672
+ promoter.addPromotionCallback(normalCallback)
673
+
674
+ const event = await promoter.promote('page-123', 'cold', 'warm')
675
+
676
+ // Should not throw, and subsequent callbacks should still run
677
+ expect(event.success).toBe(true)
678
+ expect(normalCallback).toHaveBeenCalled()
679
+ })
680
+ })
681
+
682
+ describe('Thread-safety and concurrent access', () => {
683
+ it('should track if a key is being promoted', async () => {
684
+ // Simulate slow promotion
685
+ mockR2Layer.get.mockImplementation(
686
+ () => new Promise((resolve) => setTimeout(() => resolve(new Uint8Array([1, 2, 3])), 50))
687
+ )
688
+
689
+ const config: AutoPromoterConfig = {
690
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
691
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
692
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
693
+ coldToWarmThreshold: 3,
694
+ warmToHotThreshold: 5,
695
+ }
696
+ const promoter = createAutoPromoter(config)
697
+
698
+ // Start promotion
699
+ const promotePromise = promoter.promote('page-123', 'cold', 'warm')
700
+
701
+ // Check if promoting
702
+ expect(promoter.isPromoting('page-123')).toBe(true)
703
+
704
+ await promotePromise
705
+
706
+ // After promotion completes
707
+ expect(promoter.isPromoting('page-123')).toBe(false)
708
+ })
709
+
710
+ it('should prevent duplicate promotions', async () => {
711
+ mockR2Layer.get.mockImplementation(
712
+ () => new Promise((resolve) => setTimeout(() => resolve(new Uint8Array([1, 2, 3])), 50))
713
+ )
714
+
715
+ const config: AutoPromoterConfig = {
716
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
717
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
718
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
719
+ coldToWarmThreshold: 3,
720
+ warmToHotThreshold: 5,
721
+ }
722
+ const promoter = createAutoPromoter(config)
723
+
724
+ // Start two promotions simultaneously
725
+ const [event1, event2] = await Promise.all([
726
+ promoter.promote('page-123', 'cold', 'warm'),
727
+ promoter.promote('page-123', 'cold', 'warm'),
728
+ ])
729
+
730
+ // One should succeed, one should fail with "already in progress"
731
+ const successes = [event1, event2].filter((e) => e.success)
732
+ const failures = [event1, event2].filter((e) => !e.success)
733
+
734
+ expect(successes.length).toBe(1)
735
+ expect(failures.length).toBe(1)
736
+ expect(failures[0].error).toBe('Promotion already in progress')
737
+ })
738
+
739
+ it('should not promote when already being promoted (shouldPromote)', async () => {
740
+ mockR2Layer.get.mockImplementation(
741
+ () => new Promise((resolve) => setTimeout(() => resolve(new Uint8Array([1, 2, 3])), 50))
742
+ )
743
+
744
+ const config: AutoPromoterConfig = {
745
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
746
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
747
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
748
+ coldToWarmThreshold: 3,
749
+ warmToHotThreshold: 5,
750
+ }
751
+ const promoter = createAutoPromoter(config)
752
+
753
+ // Record enough accesses
754
+ for (let i = 0; i < 5; i++) {
755
+ promoter.recordAccess('page-123', 'cold')
756
+ }
757
+
758
+ // Start promotion
759
+ const promotePromise = promoter.promote('page-123', 'cold', 'warm')
760
+
761
+ // shouldPromote should return false while promoting
762
+ const decision = promoter.shouldPromote('page-123', 'cold')
763
+ expect(decision.shouldPromote).toBe(false)
764
+
765
+ await promotePromise
766
+ })
767
+ })
768
+
769
+ describe('AutoPromoter.getTrackedKeys()', () => {
770
+ it('should return all tracked page keys', () => {
771
+ const config: AutoPromoterConfig = {
772
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
773
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
774
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
775
+ coldToWarmThreshold: 3,
776
+ warmToHotThreshold: 5,
777
+ }
778
+ const promoter = createAutoPromoter(config)
779
+
780
+ promoter.recordAccess('page-1', 'cold')
781
+ promoter.recordAccess('page-2', 'warm')
782
+ promoter.recordAccess('page-3', 'hot')
783
+
784
+ const keys = promoter.getTrackedKeys()
785
+ expect(keys).toContain('page-1')
786
+ expect(keys).toContain('page-2')
787
+ expect(keys).toContain('page-3')
788
+ expect(keys.length).toBe(3)
789
+ })
790
+
791
+ it('should return empty array when no pages tracked', () => {
792
+ const config: AutoPromoterConfig = {
793
+ cacheLayer: mockCacheLayer as unknown as CacheLayer,
794
+ doStorage: mockDOStorage as unknown as DurableObjectStorage,
795
+ r2Layer: mockR2Layer as unknown as R2StorageLayer,
796
+ coldToWarmThreshold: 3,
797
+ warmToHotThreshold: 5,
798
+ }
799
+ const promoter = createAutoPromoter(config)
800
+
801
+ const keys = promoter.getTrackedKeys()
802
+ expect(keys).toEqual([])
803
+ })
804
+ })
805
+
806
+ describe('AccessPattern type', () => {
807
+ it('should have all required fields', () => {
808
+ const pattern: AccessPattern = {
809
+ totalAccesses: 10,
810
+ windowAccesses: 5,
811
+ frequency: 0.5,
812
+ recency: 0.9,
813
+ ageMs: 10000,
814
+ idleMs: 1000,
815
+ }
816
+ expect(pattern.totalAccesses).toBe(10)
817
+ expect(pattern.windowAccesses).toBe(5)
818
+ expect(pattern.frequency).toBe(0.5)
819
+ expect(pattern.recency).toBe(0.9)
820
+ expect(pattern.ageMs).toBe(10000)
821
+ expect(pattern.idleMs).toBe(1000)
822
+ })
823
+ })
824
+ })