@syncular/server 0.0.6-96 → 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 (601) hide show
  1. package/README.md +1 -2
  2. package/dist/auth-leases.d.ts +85 -0
  3. package/dist/auth-leases.d.ts.map +1 -0
  4. package/dist/auth-leases.js +368 -0
  5. package/dist/auth-leases.js.map +1 -0
  6. package/dist/better-sqlite3.d.ts +22 -0
  7. package/dist/better-sqlite3.d.ts.map +1 -0
  8. package/dist/better-sqlite3.js +16 -0
  9. package/dist/better-sqlite3.js.map +1 -0
  10. package/dist/blobs/access.d.ts +35 -0
  11. package/dist/blobs/access.d.ts.map +1 -0
  12. package/dist/blobs/access.js +149 -0
  13. package/dist/blobs/access.js.map +1 -0
  14. package/dist/blobs/adapters/database.d.ts +26 -9
  15. package/dist/blobs/adapters/database.d.ts.map +1 -1
  16. package/dist/blobs/adapters/database.js +68 -23
  17. package/dist/blobs/adapters/database.js.map +1 -1
  18. package/dist/blobs/index.d.ts +1 -0
  19. package/dist/blobs/index.d.ts.map +1 -1
  20. package/dist/blobs/index.js +5 -4
  21. package/dist/blobs/index.js.map +1 -1
  22. package/dist/blobs/manager.d.ts +69 -44
  23. package/dist/blobs/manager.d.ts.map +1 -1
  24. package/dist/blobs/manager.js +250 -65
  25. package/dist/blobs/manager.js.map +1 -1
  26. package/dist/blobs/migrate.d.ts.map +1 -1
  27. package/dist/blobs/migrate.js +16 -8
  28. package/dist/blobs/migrate.js.map +1 -1
  29. package/dist/blobs/types.d.ts +4 -0
  30. package/dist/blobs/types.d.ts.map +1 -1
  31. package/dist/bun-sqlite.d.ts +19 -0
  32. package/dist/bun-sqlite.d.ts.map +1 -0
  33. package/dist/bun-sqlite.js +19 -0
  34. package/dist/bun-sqlite.js.map +1 -0
  35. package/dist/clients.d.ts +1 -0
  36. package/dist/clients.d.ts.map +1 -1
  37. package/dist/clients.js.map +1 -1
  38. package/dist/cloudflare/durable-object.d.ts +93 -0
  39. package/dist/cloudflare/durable-object.d.ts.map +1 -0
  40. package/dist/cloudflare/durable-object.js +210 -0
  41. package/dist/cloudflare/durable-object.js.map +1 -0
  42. package/dist/cloudflare/index.d.ts +22 -0
  43. package/dist/cloudflare/index.d.ts.map +1 -0
  44. package/dist/cloudflare/index.js +22 -0
  45. package/dist/cloudflare/index.js.map +1 -0
  46. package/dist/cloudflare/r2.d.ts +180 -0
  47. package/dist/cloudflare/r2.d.ts.map +1 -0
  48. package/dist/cloudflare/r2.js +258 -0
  49. package/dist/cloudflare/r2.js.map +1 -0
  50. package/dist/cloudflare/scope-cache.d.ts +54 -0
  51. package/dist/cloudflare/scope-cache.d.ts.map +1 -0
  52. package/dist/cloudflare/scope-cache.js +223 -0
  53. package/dist/cloudflare/scope-cache.js.map +1 -0
  54. package/dist/cloudflare/sentry.d.ts +47 -0
  55. package/dist/cloudflare/sentry.d.ts.map +1 -0
  56. package/dist/cloudflare/sentry.js +163 -0
  57. package/dist/cloudflare/sentry.js.map +1 -0
  58. package/dist/cloudflare/worker.d.ts +46 -0
  59. package/dist/cloudflare/worker.d.ts.map +1 -0
  60. package/dist/cloudflare/worker.js +63 -0
  61. package/dist/cloudflare/worker.js.map +1 -0
  62. package/dist/commit-integrity.d.ts +38 -0
  63. package/dist/commit-integrity.d.ts.map +1 -0
  64. package/dist/commit-integrity.js +260 -0
  65. package/dist/commit-integrity.js.map +1 -0
  66. package/dist/compaction.js.map +1 -1
  67. package/dist/crdt-yjs/index.d.ts +99 -0
  68. package/dist/crdt-yjs/index.d.ts.map +1 -0
  69. package/dist/crdt-yjs/index.js +629 -0
  70. package/dist/crdt-yjs/index.js.map +1 -0
  71. package/dist/d1.d.ts +13 -0
  72. package/dist/d1.d.ts.map +1 -0
  73. package/dist/d1.js +14 -0
  74. package/dist/d1.js.map +1 -0
  75. package/dist/dialect/base.d.ts +11 -1
  76. package/dist/dialect/base.d.ts.map +1 -1
  77. package/dist/dialect/base.js +43 -6
  78. package/dist/dialect/base.js.map +1 -1
  79. package/dist/dialect/helpers.d.ts +6 -0
  80. package/dist/dialect/helpers.d.ts.map +1 -1
  81. package/dist/dialect/helpers.js +24 -0
  82. package/dist/dialect/helpers.js.map +1 -1
  83. package/dist/dialect/index.js +3 -3
  84. package/dist/dialect/types.d.ts +40 -0
  85. package/dist/dialect/types.d.ts.map +1 -1
  86. package/dist/encrypted-crdt.d.ts +67 -0
  87. package/dist/encrypted-crdt.d.ts.map +1 -0
  88. package/dist/encrypted-crdt.js +426 -0
  89. package/dist/encrypted-crdt.js.map +1 -0
  90. package/dist/errors.d.ts +10 -0
  91. package/dist/errors.d.ts.map +1 -0
  92. package/dist/errors.js +13 -0
  93. package/dist/errors.js.map +1 -0
  94. package/dist/filesystem/index.d.ts +44 -0
  95. package/dist/filesystem/index.d.ts.map +1 -0
  96. package/dist/filesystem/index.js +164 -0
  97. package/dist/filesystem/index.js.map +1 -0
  98. package/dist/handlers/collection.d.ts +11 -3
  99. package/dist/handlers/collection.d.ts.map +1 -1
  100. package/dist/handlers/collection.js +34 -56
  101. package/dist/handlers/collection.js.map +1 -1
  102. package/dist/handlers/create-handler.d.ts +31 -7
  103. package/dist/handlers/create-handler.d.ts.map +1 -1
  104. package/dist/handlers/create-handler.js +332 -115
  105. package/dist/handlers/create-handler.js.map +1 -1
  106. package/dist/handlers/index.js +3 -3
  107. package/dist/handlers/types.d.ts +86 -1
  108. package/dist/handlers/types.d.ts.map +1 -1
  109. package/dist/helpers/conflict.js.map +1 -1
  110. package/dist/helpers/emitted-change.js.map +1 -1
  111. package/dist/helpers/index.d.ts +2 -0
  112. package/dist/helpers/index.d.ts.map +1 -1
  113. package/dist/helpers/index.js +6 -4
  114. package/dist/helpers/index.js.map +1 -1
  115. package/dist/helpers/paginate.js.map +1 -1
  116. package/dist/helpers/scope-authorization.d.ts +7 -0
  117. package/dist/helpers/scope-authorization.d.ts.map +1 -0
  118. package/dist/helpers/scope-authorization.js +19 -0
  119. package/dist/helpers/scope-authorization.js.map +1 -0
  120. package/dist/helpers/scope-commit-index.d.ts +12 -0
  121. package/dist/helpers/scope-commit-index.d.ts.map +1 -0
  122. package/dist/helpers/scope-commit-index.js +35 -0
  123. package/dist/helpers/scope-commit-index.js.map +1 -0
  124. package/dist/helpers/scope-strings.js.map +1 -1
  125. package/dist/hono/api-key-auth.d.ts +49 -0
  126. package/dist/hono/api-key-auth.d.ts.map +1 -0
  127. package/dist/hono/api-key-auth.js +108 -0
  128. package/dist/hono/api-key-auth.js.map +1 -0
  129. package/dist/hono/audit-redaction.d.ts +20 -0
  130. package/dist/hono/audit-redaction.d.ts.map +1 -0
  131. package/dist/hono/audit-redaction.js +85 -0
  132. package/dist/hono/audit-redaction.js.map +1 -0
  133. package/dist/hono/blobs.d.ts +75 -0
  134. package/dist/hono/blobs.d.ts.map +1 -0
  135. package/dist/hono/blobs.js +586 -0
  136. package/dist/hono/blobs.js.map +1 -0
  137. package/dist/hono/console/gateway.d.ts +42 -0
  138. package/dist/hono/console/gateway.d.ts.map +1 -0
  139. package/dist/hono/console/gateway.js +2158 -0
  140. package/dist/hono/console/gateway.js.map +1 -0
  141. package/dist/hono/console/live-auth.d.ts +7 -0
  142. package/dist/hono/console/live-auth.d.ts.map +1 -0
  143. package/dist/hono/console/live-auth.js +39 -0
  144. package/dist/hono/console/live-auth.js.map +1 -0
  145. package/dist/hono/console/route-descriptor.d.ts +6 -0
  146. package/dist/hono/console/route-descriptor.d.ts.map +1 -0
  147. package/dist/hono/console/route-descriptor.js +16 -0
  148. package/dist/hono/console/route-descriptor.js.map +1 -0
  149. package/dist/hono/console/routes/api-keys.d.ts +8 -0
  150. package/dist/hono/console/routes/api-keys.d.ts.map +1 -0
  151. package/dist/hono/console/routes/api-keys.js +575 -0
  152. package/dist/hono/console/routes/api-keys.js.map +1 -0
  153. package/dist/hono/console/routes/clients.d.ts +8 -0
  154. package/dist/hono/console/routes/clients.d.ts.map +1 -0
  155. package/dist/hono/console/routes/clients.js +322 -0
  156. package/dist/hono/console/routes/clients.js.map +1 -0
  157. package/dist/hono/console/routes/commits.d.ts +8 -0
  158. package/dist/hono/console/routes/commits.d.ts.map +1 -0
  159. package/dist/hono/console/routes/commits.js +882 -0
  160. package/dist/hono/console/routes/commits.js.map +1 -0
  161. package/dist/hono/console/routes/context.d.ts +188 -0
  162. package/dist/hono/console/routes/context.d.ts.map +1 -0
  163. package/dist/hono/console/routes/context.js +633 -0
  164. package/dist/hono/console/routes/context.js.map +1 -0
  165. package/dist/hono/console/routes/events.d.ts +8 -0
  166. package/dist/hono/console/routes/events.d.ts.map +1 -0
  167. package/dist/hono/console/routes/events.js +501 -0
  168. package/dist/hono/console/routes/events.js.map +1 -0
  169. package/dist/hono/console/routes/maintenance.d.ts +8 -0
  170. package/dist/hono/console/routes/maintenance.d.ts.map +1 -0
  171. package/dist/hono/console/routes/maintenance.js +341 -0
  172. package/dist/hono/console/routes/maintenance.js.map +1 -0
  173. package/dist/hono/console/routes/shared.d.ts +174 -0
  174. package/dist/hono/console/routes/shared.d.ts.map +1 -0
  175. package/dist/hono/console/routes/shared.js +583 -0
  176. package/dist/hono/console/routes/shared.js.map +1 -0
  177. package/dist/hono/console/routes/stats.d.ts +8 -0
  178. package/dist/hono/console/routes/stats.d.ts.map +1 -0
  179. package/dist/hono/console/routes/stats.js +295 -0
  180. package/dist/hono/console/routes/stats.js.map +1 -0
  181. package/dist/hono/console/routes/storage.d.ts +8 -0
  182. package/dist/hono/console/routes/storage.d.ts.map +1 -0
  183. package/dist/hono/console/routes/storage.js +121 -0
  184. package/dist/hono/console/routes/storage.js.map +1 -0
  185. package/dist/hono/console/routes.d.ts +36 -0
  186. package/dist/hono/console/routes.d.ts.map +1 -0
  187. package/dist/hono/console/routes.js +112 -0
  188. package/dist/hono/console/routes.js.map +1 -0
  189. package/dist/hono/console/schema-errors.d.ts +2 -0
  190. package/dist/hono/console/schema-errors.d.ts.map +1 -0
  191. package/dist/hono/console/schema-errors.js +17 -0
  192. package/dist/hono/console/schema-errors.js.map +1 -0
  193. package/dist/hono/console/schemas.d.ts +1515 -0
  194. package/dist/hono/console/schemas.d.ts.map +1 -0
  195. package/dist/hono/console/schemas.js +661 -0
  196. package/dist/hono/console/schemas.js.map +1 -0
  197. package/dist/hono/console/types.d.ts +213 -0
  198. package/dist/hono/console/types.d.ts.map +1 -0
  199. package/dist/hono/console/types.js +2 -0
  200. package/dist/hono/console/types.js.map +1 -0
  201. package/dist/hono/console/ui.d.ts +38 -0
  202. package/dist/hono/console/ui.d.ts.map +1 -0
  203. package/dist/hono/console/ui.js +43 -0
  204. package/dist/hono/console/ui.js.map +1 -0
  205. package/dist/hono/create-server.d.ts +71 -0
  206. package/dist/hono/create-server.d.ts.map +1 -0
  207. package/dist/hono/create-server.js +121 -0
  208. package/dist/hono/create-server.js.map +1 -0
  209. package/dist/hono/errors.d.ts +13 -0
  210. package/dist/hono/errors.d.ts.map +1 -0
  211. package/dist/hono/errors.js +21 -0
  212. package/dist/hono/errors.js.map +1 -0
  213. package/dist/hono/index.d.ts +20 -0
  214. package/dist/hono/index.d.ts.map +1 -0
  215. package/dist/hono/index.js +31 -0
  216. package/dist/hono/index.js.map +1 -0
  217. package/dist/hono/openapi.d.ts +72 -0
  218. package/dist/hono/openapi.d.ts.map +1 -0
  219. package/dist/hono/openapi.js +99 -0
  220. package/dist/hono/openapi.js.map +1 -0
  221. package/dist/hono/proxy/connection-manager.d.ts +78 -0
  222. package/dist/hono/proxy/connection-manager.d.ts.map +1 -0
  223. package/dist/hono/proxy/connection-manager.js +251 -0
  224. package/dist/hono/proxy/connection-manager.js.map +1 -0
  225. package/dist/hono/proxy/index.d.ts +8 -0
  226. package/dist/hono/proxy/index.d.ts.map +1 -0
  227. package/dist/hono/proxy/index.js +8 -0
  228. package/dist/hono/proxy/index.js.map +1 -0
  229. package/dist/hono/proxy/routes.d.ts +86 -0
  230. package/dist/hono/proxy/routes.d.ts.map +1 -0
  231. package/dist/hono/proxy/routes.js +183 -0
  232. package/dist/hono/proxy/routes.js.map +1 -0
  233. package/dist/hono/rate-limit.d.ts +101 -0
  234. package/dist/hono/rate-limit.d.ts.map +1 -0
  235. package/dist/hono/rate-limit.js +184 -0
  236. package/dist/hono/rate-limit.js.map +1 -0
  237. package/dist/hono/realtime-sync-packs.d.ts +43 -0
  238. package/dist/hono/realtime-sync-packs.d.ts.map +1 -0
  239. package/dist/hono/realtime-sync-packs.js +219 -0
  240. package/dist/hono/realtime-sync-packs.js.map +1 -0
  241. package/dist/hono/routes/audit.d.ts +12 -0
  242. package/dist/hono/routes/audit.d.ts.map +1 -0
  243. package/dist/hono/routes/audit.js +385 -0
  244. package/dist/hono/routes/audit.js.map +1 -0
  245. package/dist/hono/routes/auth-leases.d.ts +8 -0
  246. package/dist/hono/routes/auth-leases.d.ts.map +1 -0
  247. package/dist/hono/routes/auth-leases.js +88 -0
  248. package/dist/hono/routes/auth-leases.js.map +1 -0
  249. package/dist/hono/routes/combined.d.ts +8 -0
  250. package/dist/hono/routes/combined.d.ts.map +1 -0
  251. package/dist/hono/routes/combined.js +392 -0
  252. package/dist/hono/routes/combined.js.map +1 -0
  253. package/dist/hono/routes/context.d.ts +314 -0
  254. package/dist/hono/routes/context.d.ts.map +1 -0
  255. package/dist/hono/routes/context.js +1147 -0
  256. package/dist/hono/routes/context.js.map +1 -0
  257. package/dist/hono/routes/health.d.ts +8 -0
  258. package/dist/hono/routes/health.d.ts.map +1 -0
  259. package/dist/hono/routes/health.js +16 -0
  260. package/dist/hono/routes/health.js.map +1 -0
  261. package/dist/hono/routes/realtime.d.ts +9 -0
  262. package/dist/hono/routes/realtime.d.ts.map +1 -0
  263. package/dist/hono/routes/realtime.js +626 -0
  264. package/dist/hono/routes/realtime.js.map +1 -0
  265. package/dist/hono/routes/shared.d.ts +689 -0
  266. package/dist/hono/routes/shared.d.ts.map +1 -0
  267. package/dist/hono/routes/shared.js +972 -0
  268. package/dist/hono/routes/shared.js.map +1 -0
  269. package/dist/hono/routes/snapshots.d.ts +10 -0
  270. package/dist/hono/routes/snapshots.d.ts.map +1 -0
  271. package/dist/hono/routes/snapshots.js +281 -0
  272. package/dist/hono/routes/snapshots.js.map +1 -0
  273. package/dist/hono/routes.d.ts +19 -0
  274. package/dist/hono/routes.d.ts.map +1 -0
  275. package/dist/hono/routes.js +37 -0
  276. package/dist/hono/routes.js.map +1 -0
  277. package/dist/hono/validation.d.ts +5 -0
  278. package/dist/hono/validation.d.ts.map +1 -0
  279. package/dist/hono/validation.js +47 -0
  280. package/dist/hono/validation.js.map +1 -0
  281. package/dist/hono/websocket-origin.d.ts +9 -0
  282. package/dist/hono/websocket-origin.d.ts.map +1 -0
  283. package/dist/hono/websocket-origin.js +96 -0
  284. package/dist/hono/websocket-origin.js.map +1 -0
  285. package/dist/hono/ws.d.ts +341 -0
  286. package/dist/hono/ws.d.ts.map +1 -0
  287. package/dist/hono/ws.js +711 -0
  288. package/dist/hono/ws.js.map +1 -0
  289. package/dist/index.d.ts +6 -0
  290. package/dist/index.d.ts.map +1 -1
  291. package/dist/index.js +24 -18
  292. package/dist/index.js.map +1 -1
  293. package/dist/libsql.d.ts +29 -0
  294. package/dist/libsql.d.ts.map +1 -0
  295. package/dist/libsql.js +25 -0
  296. package/dist/libsql.js.map +1 -0
  297. package/dist/migrate.js.map +1 -1
  298. package/dist/neon.d.ts +21 -0
  299. package/dist/neon.d.ts.map +1 -0
  300. package/dist/neon.js +22 -0
  301. package/dist/neon.js.map +1 -0
  302. package/dist/notify.d.ts +30 -0
  303. package/dist/notify.d.ts.map +1 -1
  304. package/dist/notify.js +160 -41
  305. package/dist/notify.js.map +1 -1
  306. package/dist/pglite.d.ts +37 -0
  307. package/dist/pglite.d.ts.map +1 -0
  308. package/dist/pglite.js +37 -0
  309. package/dist/pglite.js.map +1 -0
  310. package/dist/plugins/index.d.ts +2 -0
  311. package/dist/plugins/index.d.ts.map +1 -0
  312. package/dist/plugins/index.js +2 -0
  313. package/dist/plugins/index.js.map +1 -0
  314. package/dist/plugins/types.d.ts +73 -0
  315. package/dist/plugins/types.d.ts.map +1 -0
  316. package/dist/plugins/types.js +30 -0
  317. package/dist/plugins/types.js.map +1 -0
  318. package/dist/postgres/index.d.ts +68 -0
  319. package/dist/postgres/index.d.ts.map +1 -0
  320. package/dist/postgres/index.js +924 -0
  321. package/dist/postgres/index.js.map +1 -0
  322. package/dist/proxy/collection.d.ts +0 -2
  323. package/dist/proxy/collection.d.ts.map +1 -1
  324. package/dist/proxy/collection.js +2 -17
  325. package/dist/proxy/collection.js.map +1 -1
  326. package/dist/proxy/handler.d.ts +1 -1
  327. package/dist/proxy/handler.d.ts.map +1 -1
  328. package/dist/proxy/handler.js +3 -4
  329. package/dist/proxy/handler.js.map +1 -1
  330. package/dist/proxy/index.d.ts +1 -1
  331. package/dist/proxy/index.d.ts.map +1 -1
  332. package/dist/proxy/index.js +3 -3
  333. package/dist/proxy/index.js.map +1 -1
  334. package/dist/proxy/mutation-detector.js.map +1 -1
  335. package/dist/proxy/oplog.d.ts.map +1 -1
  336. package/dist/proxy/oplog.js +32 -8
  337. package/dist/proxy/oplog.js.map +1 -1
  338. package/dist/prune.d.ts +8 -1
  339. package/dist/prune.d.ts.map +1 -1
  340. package/dist/prune.js +68 -28
  341. package/dist/prune.js.map +1 -1
  342. package/dist/pull.d.ts +31 -0
  343. package/dist/pull.d.ts.map +1 -1
  344. package/dist/pull.js +1014 -474
  345. package/dist/pull.js.map +1 -1
  346. package/dist/push.d.ts +36 -2
  347. package/dist/push.d.ts.map +1 -1
  348. package/dist/push.js +603 -358
  349. package/dist/push.js.map +1 -1
  350. package/dist/realtime/in-memory.js.map +1 -1
  351. package/dist/realtime/index.d.ts +2 -1
  352. package/dist/realtime/index.d.ts.map +1 -1
  353. package/dist/realtime/index.js +2 -1
  354. package/dist/realtime/index.js.map +1 -1
  355. package/dist/realtime/types.d.ts +12 -0
  356. package/dist/realtime/types.d.ts.map +1 -1
  357. package/dist/realtime/types.js +13 -1
  358. package/dist/realtime/types.js.map +1 -1
  359. package/dist/relay/client-role/forward-engine.d.ts +63 -0
  360. package/dist/relay/client-role/forward-engine.d.ts.map +1 -0
  361. package/dist/relay/client-role/forward-engine.js +267 -0
  362. package/dist/relay/client-role/forward-engine.js.map +1 -0
  363. package/dist/relay/client-role/index.d.ts +9 -0
  364. package/dist/relay/client-role/index.d.ts.map +1 -0
  365. package/dist/relay/client-role/index.js +9 -0
  366. package/dist/relay/client-role/index.js.map +1 -0
  367. package/dist/relay/client-role/pull-engine.d.ts +72 -0
  368. package/dist/relay/client-role/pull-engine.d.ts.map +1 -0
  369. package/dist/relay/client-role/pull-engine.js +249 -0
  370. package/dist/relay/client-role/pull-engine.js.map +1 -0
  371. package/dist/relay/client-role/sequence-mapper.d.ts +65 -0
  372. package/dist/relay/client-role/sequence-mapper.d.ts.map +1 -0
  373. package/dist/relay/client-role/sequence-mapper.js +161 -0
  374. package/dist/relay/client-role/sequence-mapper.js.map +1 -0
  375. package/dist/relay/evaluation/relay-paths.d.ts +41 -0
  376. package/dist/relay/evaluation/relay-paths.d.ts.map +1 -0
  377. package/dist/relay/evaluation/relay-paths.js +504 -0
  378. package/dist/relay/evaluation/relay-paths.js.map +1 -0
  379. package/dist/relay/evaluation/rust-boundary.d.ts +47 -0
  380. package/dist/relay/evaluation/rust-boundary.d.ts.map +1 -0
  381. package/dist/relay/evaluation/rust-boundary.js +220 -0
  382. package/dist/relay/evaluation/rust-boundary.js.map +1 -0
  383. package/dist/relay/index.d.ts +37 -0
  384. package/dist/relay/index.d.ts.map +1 -0
  385. package/dist/relay/index.js +44 -0
  386. package/dist/relay/index.js.map +1 -0
  387. package/dist/relay/migrate.d.ts +18 -0
  388. package/dist/relay/migrate.d.ts.map +1 -0
  389. package/dist/relay/migrate.js +99 -0
  390. package/dist/relay/migrate.js.map +1 -0
  391. package/dist/relay/mode-manager.d.ts +60 -0
  392. package/dist/relay/mode-manager.d.ts.map +1 -0
  393. package/dist/relay/mode-manager.js +114 -0
  394. package/dist/relay/mode-manager.js.map +1 -0
  395. package/dist/relay/realtime.d.ts +90 -0
  396. package/dist/relay/realtime.d.ts.map +1 -0
  397. package/dist/relay/realtime.js +147 -0
  398. package/dist/relay/realtime.js.map +1 -0
  399. package/dist/relay/relay.d.ts +190 -0
  400. package/dist/relay/relay.d.ts.map +1 -0
  401. package/dist/relay/relay.js +320 -0
  402. package/dist/relay/relay.js.map +1 -0
  403. package/dist/relay/schema.d.ts +158 -0
  404. package/dist/relay/schema.d.ts.map +1 -0
  405. package/dist/relay/schema.js +7 -0
  406. package/dist/relay/schema.js.map +1 -0
  407. package/dist/relay/server-role/index.d.ts +56 -0
  408. package/dist/relay/server-role/index.d.ts.map +1 -0
  409. package/dist/relay/server-role/index.js +193 -0
  410. package/dist/relay/server-role/index.js.map +1 -0
  411. package/dist/relay/server-role/pull.d.ts +27 -0
  412. package/dist/relay/server-role/pull.d.ts.map +1 -0
  413. package/dist/relay/server-role/pull.js +24 -0
  414. package/dist/relay/server-role/pull.js.map +1 -0
  415. package/dist/relay/server-role/push.d.ts +29 -0
  416. package/dist/relay/server-role/push.d.ts.map +1 -0
  417. package/dist/relay/server-role/push.js +122 -0
  418. package/dist/relay/server-role/push.js.map +1 -0
  419. package/dist/s3/index.d.ts +83 -0
  420. package/dist/s3/index.d.ts.map +1 -0
  421. package/dist/s3/index.js +223 -0
  422. package/dist/s3/index.js.map +1 -0
  423. package/dist/schema.d.ts +137 -1
  424. package/dist/schema.d.ts.map +1 -1
  425. package/dist/schema.js +1 -0
  426. package/dist/schema.js.map +1 -1
  427. package/dist/service-worker/index.d.ts +114 -0
  428. package/dist/service-worker/index.d.ts.map +1 -0
  429. package/dist/service-worker/index.js +487 -0
  430. package/dist/service-worker/index.js.map +1 -0
  431. package/dist/snapshot-artifacts/sqlite-bun.d.ts +15 -0
  432. package/dist/snapshot-artifacts/sqlite-bun.d.ts.map +1 -0
  433. package/dist/snapshot-artifacts/sqlite-bun.js +128 -0
  434. package/dist/snapshot-artifacts/sqlite-bun.js.map +1 -0
  435. package/dist/snapshot-artifacts.d.ts +206 -0
  436. package/dist/snapshot-artifacts.d.ts.map +1 -0
  437. package/dist/snapshot-artifacts.js +545 -0
  438. package/dist/snapshot-artifacts.js.map +1 -0
  439. package/dist/snapshot-chunks/db-metadata.d.ts +18 -0
  440. package/dist/snapshot-chunks/db-metadata.d.ts.map +1 -1
  441. package/dist/snapshot-chunks/db-metadata.js +91 -63
  442. package/dist/snapshot-chunks/db-metadata.js.map +1 -1
  443. package/dist/snapshot-chunks/index.js +2 -2
  444. package/dist/snapshot-chunks/types.d.ts +2 -0
  445. package/dist/snapshot-chunks/types.d.ts.map +1 -1
  446. package/dist/snapshot-chunks.d.ts +33 -3
  447. package/dist/snapshot-chunks.d.ts.map +1 -1
  448. package/dist/snapshot-chunks.js +136 -55
  449. package/dist/snapshot-chunks.js.map +1 -1
  450. package/dist/sqlite/index.d.ts +53 -0
  451. package/dist/sqlite/index.d.ts.map +1 -0
  452. package/dist/sqlite/index.js +795 -0
  453. package/dist/sqlite/index.js.map +1 -0
  454. package/dist/sqlite3.d.ts +22 -0
  455. package/dist/sqlite3.d.ts.map +1 -0
  456. package/dist/sqlite3.js +99 -0
  457. package/dist/sqlite3.js.map +1 -0
  458. package/dist/stats.d.ts +8 -0
  459. package/dist/stats.d.ts.map +1 -1
  460. package/dist/stats.js +45 -13
  461. package/dist/stats.js.map +1 -1
  462. package/dist/subscriptions/cache.d.ts +3 -0
  463. package/dist/subscriptions/cache.d.ts.map +1 -1
  464. package/dist/subscriptions/cache.js +44 -0
  465. package/dist/subscriptions/cache.js.map +1 -1
  466. package/dist/subscriptions/index.js +2 -2
  467. package/dist/subscriptions/resolve.d.ts +3 -1
  468. package/dist/subscriptions/resolve.d.ts.map +1 -1
  469. package/dist/subscriptions/resolve.js +91 -52
  470. package/dist/subscriptions/resolve.js.map +1 -1
  471. package/dist/sync.d.ts +3 -0
  472. package/dist/sync.d.ts.map +1 -1
  473. package/dist/sync.js +9 -5
  474. package/dist/sync.js.map +1 -1
  475. package/package.json +297 -8
  476. package/src/auth-leases.ts +649 -0
  477. package/src/better-sqlite3.ts +35 -0
  478. package/src/blobs/access.ts +244 -0
  479. package/src/blobs/adapters/database.ts +125 -43
  480. package/src/blobs/index.ts +1 -0
  481. package/src/blobs/manager.ts +366 -65
  482. package/src/blobs/migrate.ts +16 -8
  483. package/src/blobs/types.ts +4 -0
  484. package/src/bun-sqlite-ambient.d.ts +19 -0
  485. package/src/bun-sqlite.ts +27 -0
  486. package/src/clients.ts +1 -0
  487. package/src/cloudflare/durable-object.ts +289 -0
  488. package/src/cloudflare/index.ts +22 -0
  489. package/src/cloudflare/r2.ts +526 -0
  490. package/src/cloudflare/scope-cache.ts +341 -0
  491. package/src/cloudflare/sentry.ts +230 -0
  492. package/src/cloudflare/worker.ts +77 -0
  493. package/src/commit-integrity.ts +371 -0
  494. package/src/crdt-yjs/index.ts +931 -0
  495. package/src/d1.ts +16 -0
  496. package/src/dialect/base.ts +71 -5
  497. package/src/dialect/helpers.ts +31 -0
  498. package/src/dialect/types.ts +47 -0
  499. package/src/encrypted-crdt.ts +786 -0
  500. package/src/errors.ts +22 -0
  501. package/src/filesystem/index.ts +262 -0
  502. package/src/handlers/collection.ts +78 -78
  503. package/src/handlers/create-handler.ts +540 -147
  504. package/src/handlers/types.ts +116 -0
  505. package/src/helpers/index.ts +2 -0
  506. package/src/helpers/scope-authorization.ts +27 -0
  507. package/src/helpers/scope-commit-index.ts +52 -0
  508. package/src/hono/api-key-auth.ts +177 -0
  509. package/src/hono/audit-redaction.ts +135 -0
  510. package/src/hono/blobs.ts +851 -0
  511. package/src/hono/console/gateway.ts +3046 -0
  512. package/src/hono/console/live-auth.ts +46 -0
  513. package/src/hono/console/route-descriptor.ts +22 -0
  514. package/src/hono/console/routes/api-keys.ts +721 -0
  515. package/src/hono/console/routes/clients.ts +447 -0
  516. package/src/hono/console/routes/commits.ts +1137 -0
  517. package/src/hono/console/routes/context.ts +956 -0
  518. package/src/hono/console/routes/events.ts +669 -0
  519. package/src/hono/console/routes/maintenance.ts +461 -0
  520. package/src/hono/console/routes/shared.ts +816 -0
  521. package/src/hono/console/routes/stats.ts +392 -0
  522. package/src/hono/console/routes/storage.ts +159 -0
  523. package/src/hono/console/routes.ts +146 -0
  524. package/src/hono/console/schema-errors.ts +23 -0
  525. package/src/hono/console/schemas.ts +914 -0
  526. package/src/hono/console/types.ts +223 -0
  527. package/src/hono/console/ui.ts +100 -0
  528. package/src/hono/create-server.ts +230 -0
  529. package/src/hono/errors.ts +50 -0
  530. package/src/hono/index.ts +54 -0
  531. package/src/hono/openapi.ts +139 -0
  532. package/src/hono/proxy/connection-manager.ts +340 -0
  533. package/src/hono/proxy/index.ts +8 -0
  534. package/src/hono/proxy/routes.ts +272 -0
  535. package/src/hono/rate-limit.ts +319 -0
  536. package/src/hono/realtime-sync-packs.ts +354 -0
  537. package/src/hono/routes/audit.ts +499 -0
  538. package/src/hono/routes/auth-leases.ts +119 -0
  539. package/src/hono/routes/combined.ts +583 -0
  540. package/src/hono/routes/context.ts +1629 -0
  541. package/src/hono/routes/health.ts +26 -0
  542. package/src/hono/routes/realtime.ts +808 -0
  543. package/src/hono/routes/shared.ts +1626 -0
  544. package/src/hono/routes/snapshots.ts +345 -0
  545. package/src/hono/routes.ts +68 -0
  546. package/src/hono/validation.ts +81 -0
  547. package/src/hono/websocket-origin.ts +131 -0
  548. package/src/hono/ws.ts +1134 -0
  549. package/src/index.ts +6 -0
  550. package/src/libsql.ts +51 -0
  551. package/src/neon.ts +28 -0
  552. package/src/notify.ts +224 -44
  553. package/src/pglite.ts +68 -0
  554. package/src/plugins/index.ts +1 -0
  555. package/src/plugins/types.ts +144 -0
  556. package/src/postgres/index.ts +1291 -0
  557. package/src/proxy/collection.ts +5 -27
  558. package/src/proxy/handler.ts +2 -2
  559. package/src/proxy/index.ts +0 -2
  560. package/src/proxy/oplog.ts +41 -10
  561. package/src/prune.ts +137 -36
  562. package/src/pull.ts +1504 -591
  563. package/src/push.ts +881 -443
  564. package/src/realtime/index.ts +2 -0
  565. package/src/realtime/types.ts +35 -0
  566. package/src/relay/bun-types.d.ts +50 -0
  567. package/src/relay/client-role/forward-engine.ts +355 -0
  568. package/src/relay/client-role/index.ts +9 -0
  569. package/src/relay/client-role/pull-engine.ts +329 -0
  570. package/src/relay/client-role/sequence-mapper.ts +201 -0
  571. package/src/relay/evaluation/relay-paths.ts +699 -0
  572. package/src/relay/evaluation/rust-boundary.ts +464 -0
  573. package/src/relay/index.ts +50 -0
  574. package/src/relay/migrate.ts +113 -0
  575. package/src/relay/mode-manager.ts +142 -0
  576. package/src/relay/realtime.ts +207 -0
  577. package/src/relay/relay.ts +431 -0
  578. package/src/relay/schema.ts +171 -0
  579. package/src/relay/server-role/index.ts +338 -0
  580. package/src/relay/server-role/pull.ts +43 -0
  581. package/src/relay/server-role/push.ts +164 -0
  582. package/src/s3/index.ts +346 -0
  583. package/src/schema.ts +141 -1
  584. package/src/service-worker/index.ts +773 -0
  585. package/src/snapshot-artifacts/sqlite-bun.ts +168 -0
  586. package/src/snapshot-artifacts.ts +896 -0
  587. package/src/snapshot-chunks/db-metadata.ts +131 -72
  588. package/src/snapshot-chunks/types.ts +2 -0
  589. package/src/snapshot-chunks.ts +194 -70
  590. package/src/sqlite/index.ts +1064 -0
  591. package/src/sqlite3.ts +137 -0
  592. package/src/stats.ts +76 -13
  593. package/src/subscriptions/cache.ts +58 -0
  594. package/src/subscriptions/resolve.ts +99 -58
  595. package/src/sync.ts +16 -6
  596. package/src/blobs/adapters/database.test.ts +0 -67
  597. package/src/notify.test.ts +0 -520
  598. package/src/proxy/handler.test.ts +0 -126
  599. package/src/proxy/mutation-detector.test.ts +0 -71
  600. package/src/snapshot-chunks/db-metadata.test.ts +0 -172
  601. package/src/subscriptions/resolve.test.ts +0 -180
@@ -0,0 +1,882 @@
1
+ /**
2
+ * @syncular/server/hono - Console timeline, commit, and row-history routes.
3
+ *
4
+ * Extracted from console/routes.ts without behavior changes.
5
+ */
6
+ import { ErrorResponseSchema } from '@syncular/core';
7
+ import { coerceNumber } from '@syncular/server';
8
+ import { resolver } from 'hono-openapi';
9
+ import { summarizeAuditChange } from '../../audit-redaction';
10
+ import { consoleValidator as zValidator } from '../../validation';
11
+ import { describeConsoleRoute } from '../route-descriptor';
12
+ import { ConsoleCommitDetailSchema, ConsoleCommitListItemSchema, ConsoleDebugExportResponseSchema, ConsolePaginatedResponseSchema, ConsolePartitionedPaginationQuerySchema, ConsoleRowHistoryResponseSchema, ConsoleRowInvestigationResponseSchema, ConsoleTimelineItemSchema, ConsoleTimelineQuerySchema, } from '../schemas';
13
+ import { assessScopeEligibility, commitDetailQuerySchema, commitSeqParamSchema, consoleNotFound, debugExportQuerySchema, includesSearchTerm, parseDate, parseJsonStringArray, rowHistoryParamSchema, rowHistoryQuerySchema, rowInvestigationQuerySchema, summarizeRealtimeEvidence, summarizeRequestEvidence, summarizeSnapshotEvidence, summarizeSubscriptionEvidence, } from './shared';
14
+ export function registerCommitRoutes(ctx) {
15
+ const { routes, options, db, timelineScanMaxRows, requestEventSelectColumns, mapRequestEvent, mapDebugExportEvent, readRedactedCommitChanges, } = ctx;
16
+ // -------------------------------------------------------------------------
17
+ // GET /timeline
18
+ // -------------------------------------------------------------------------
19
+ routes.get('/timeline', describeConsoleRoute({
20
+ summary: 'List timeline items',
21
+ responses: {
22
+ 200: {
23
+ description: 'Paginated merged timeline',
24
+ content: {
25
+ 'application/json': {
26
+ schema: resolver(ConsolePaginatedResponseSchema(ConsoleTimelineItemSchema)),
27
+ },
28
+ },
29
+ },
30
+ 401: {
31
+ description: 'Unauthenticated',
32
+ content: {
33
+ 'application/json': { schema: resolver(ErrorResponseSchema) },
34
+ },
35
+ },
36
+ },
37
+ }), zValidator('query', ConsoleTimelineQuerySchema), async (c) => {
38
+ const { limit, offset, view, partitionId, eventType, actorId, clientId, requestId, traceId, syncAttemptId, table, outcome, search, from, to, } = c.req.valid('query');
39
+ const resolvedTraceId = traceId ?? syncAttemptId;
40
+ const items = [];
41
+ const normalizedSearchTerm = search?.trim().toLowerCase() || null;
42
+ const normalizedTable = table?.trim() || null;
43
+ const timelineSourceScanLimit = timelineScanMaxRows > 0 ? timelineScanMaxRows : null;
44
+ let timelineTruncated = false;
45
+ if (view !== 'events' &&
46
+ !eventType &&
47
+ !outcome &&
48
+ !requestId &&
49
+ !resolvedTraceId) {
50
+ let commitsQuery = db
51
+ .selectFrom('sync_commits')
52
+ .select([
53
+ 'commit_seq',
54
+ 'actor_id',
55
+ 'client_id',
56
+ 'client_commit_id',
57
+ 'created_at',
58
+ 'change_count',
59
+ 'affected_tables',
60
+ ]);
61
+ if (partitionId) {
62
+ commitsQuery = commitsQuery.where('partition_id', '=', partitionId);
63
+ }
64
+ if (actorId) {
65
+ commitsQuery = commitsQuery.where('actor_id', '=', actorId);
66
+ }
67
+ if (clientId) {
68
+ commitsQuery = commitsQuery.where('client_id', '=', clientId);
69
+ }
70
+ if (from) {
71
+ commitsQuery = commitsQuery.where('created_at', '>=', from);
72
+ }
73
+ if (to) {
74
+ commitsQuery = commitsQuery.where('created_at', '<=', to);
75
+ }
76
+ let commitsQueryWithOrdering = commitsQuery.orderBy('created_at', 'desc');
77
+ if (timelineSourceScanLimit !== null) {
78
+ commitsQueryWithOrdering = commitsQueryWithOrdering.limit(timelineSourceScanLimit + 1);
79
+ }
80
+ const commitRows = await commitsQueryWithOrdering.execute();
81
+ const scannedCommitRows = timelineSourceScanLimit === null
82
+ ? commitRows
83
+ : commitRows.slice(0, timelineSourceScanLimit);
84
+ if (timelineSourceScanLimit !== null &&
85
+ commitRows.length > timelineSourceScanLimit) {
86
+ timelineTruncated = true;
87
+ }
88
+ for (const row of scannedCommitRows) {
89
+ const commit = {
90
+ commitSeq: coerceNumber(row.commit_seq) ?? 0,
91
+ actorId: row.actor_id ?? '',
92
+ clientId: row.client_id ?? '',
93
+ clientCommitId: row.client_commit_id ?? '',
94
+ createdAt: row.created_at ?? '',
95
+ changeCount: coerceNumber(row.change_count) ?? 0,
96
+ affectedTables: options.dialect.dbToArray(row.affected_tables),
97
+ };
98
+ items.push({
99
+ type: 'commit',
100
+ timestamp: commit.createdAt,
101
+ commit,
102
+ event: null,
103
+ });
104
+ }
105
+ }
106
+ if (view !== 'commits') {
107
+ let eventsQuery = db
108
+ .selectFrom('sync_request_events')
109
+ .select(requestEventSelectColumns);
110
+ if (partitionId) {
111
+ eventsQuery = eventsQuery.where('partition_id', '=', partitionId);
112
+ }
113
+ if (eventType) {
114
+ eventsQuery = eventsQuery.where('event_type', '=', eventType);
115
+ }
116
+ if (actorId) {
117
+ eventsQuery = eventsQuery.where('actor_id', '=', actorId);
118
+ }
119
+ if (clientId) {
120
+ eventsQuery = eventsQuery.where('client_id', '=', clientId);
121
+ }
122
+ if (requestId) {
123
+ eventsQuery = eventsQuery.where('request_id', '=', requestId);
124
+ }
125
+ if (resolvedTraceId) {
126
+ eventsQuery = eventsQuery.where('trace_id', '=', resolvedTraceId);
127
+ }
128
+ if (outcome) {
129
+ eventsQuery = eventsQuery.where('outcome', '=', outcome);
130
+ }
131
+ if (from) {
132
+ eventsQuery = eventsQuery.where('created_at', '>=', from);
133
+ }
134
+ if (to) {
135
+ eventsQuery = eventsQuery.where('created_at', '<=', to);
136
+ }
137
+ let eventsQueryWithOrdering = eventsQuery.orderBy('created_at', 'desc');
138
+ if (timelineSourceScanLimit !== null) {
139
+ eventsQueryWithOrdering = eventsQueryWithOrdering.limit(timelineSourceScanLimit + 1);
140
+ }
141
+ const eventRows = await eventsQueryWithOrdering.execute();
142
+ const scannedEventRows = timelineSourceScanLimit === null
143
+ ? eventRows
144
+ : eventRows.slice(0, timelineSourceScanLimit);
145
+ if (timelineSourceScanLimit !== null &&
146
+ eventRows.length > timelineSourceScanLimit) {
147
+ timelineTruncated = true;
148
+ }
149
+ for (const row of scannedEventRows) {
150
+ const event = mapRequestEvent(row);
151
+ items.push({
152
+ type: 'event',
153
+ timestamp: event.createdAt,
154
+ commit: null,
155
+ event,
156
+ });
157
+ }
158
+ }
159
+ const filteredItems = items.filter((item) => {
160
+ if (item.type === 'commit') {
161
+ const commit = item.commit;
162
+ if (!commit)
163
+ return false;
164
+ if (normalizedTable &&
165
+ !(commit.affectedTables ?? []).includes(normalizedTable)) {
166
+ return false;
167
+ }
168
+ if (!normalizedSearchTerm)
169
+ return true;
170
+ const searchableCommitFields = [
171
+ String(commit.commitSeq),
172
+ commit.actorId,
173
+ commit.clientId,
174
+ commit.clientCommitId,
175
+ ...(commit.affectedTables ?? []),
176
+ ];
177
+ return searchableCommitFields.some((field) => includesSearchTerm(field, normalizedSearchTerm));
178
+ }
179
+ const event = item.event;
180
+ if (!event)
181
+ return false;
182
+ if (normalizedTable &&
183
+ !(event.tables ?? []).includes(normalizedTable)) {
184
+ return false;
185
+ }
186
+ if (!normalizedSearchTerm)
187
+ return true;
188
+ const searchableEventFields = [
189
+ String(event.eventId),
190
+ event.requestId,
191
+ event.traceId ?? '',
192
+ event.actorId,
193
+ event.clientId,
194
+ event.outcome,
195
+ event.responseStatus,
196
+ event.errorCode ?? '',
197
+ event.errorMessage ?? '',
198
+ ...(event.tables ?? []),
199
+ ];
200
+ return searchableEventFields.some((field) => includesSearchTerm(field, normalizedSearchTerm));
201
+ });
202
+ filteredItems.sort((a, b) => (parseDate(b.timestamp) ?? 0) - (parseDate(a.timestamp) ?? 0));
203
+ const total = filteredItems.length;
204
+ const pagedItems = filteredItems.slice(offset, offset + limit);
205
+ const response = {
206
+ items: pagedItems,
207
+ total,
208
+ offset,
209
+ limit,
210
+ };
211
+ c.header('X-Total-Count', String(total));
212
+ if (timelineTruncated) {
213
+ c.header('X-Timeline-Truncated', 'true');
214
+ if (timelineSourceScanLimit !== null) {
215
+ c.header('X-Timeline-Scan-Limit', String(timelineSourceScanLimit));
216
+ }
217
+ }
218
+ return c.json(response, 200);
219
+ });
220
+ // -------------------------------------------------------------------------
221
+ // GET /commits
222
+ // -------------------------------------------------------------------------
223
+ routes.get('/commits', describeConsoleRoute({
224
+ summary: 'List commits',
225
+ responses: {
226
+ 200: {
227
+ description: 'Paginated commit list',
228
+ content: {
229
+ 'application/json': {
230
+ schema: resolver(ConsolePaginatedResponseSchema(ConsoleCommitListItemSchema)),
231
+ },
232
+ },
233
+ },
234
+ 401: {
235
+ description: 'Unauthenticated',
236
+ content: {
237
+ 'application/json': { schema: resolver(ErrorResponseSchema) },
238
+ },
239
+ },
240
+ },
241
+ }), zValidator('query', ConsolePartitionedPaginationQuerySchema), async (c) => {
242
+ const { limit, offset, partitionId } = c.req.valid('query');
243
+ let query = db
244
+ .selectFrom('sync_commits')
245
+ .select([
246
+ 'commit_seq',
247
+ 'actor_id',
248
+ 'client_id',
249
+ 'client_commit_id',
250
+ 'created_at',
251
+ 'change_count',
252
+ 'affected_tables',
253
+ ]);
254
+ let countQuery = db
255
+ .selectFrom('sync_commits')
256
+ .select(({ fn }) => fn.countAll().as('total'));
257
+ if (partitionId) {
258
+ query = query.where('partition_id', '=', partitionId);
259
+ countQuery = countQuery.where('partition_id', '=', partitionId);
260
+ }
261
+ const [rows, countRow] = await Promise.all([
262
+ query
263
+ .orderBy('commit_seq', 'desc')
264
+ .limit(limit)
265
+ .offset(offset)
266
+ .execute(),
267
+ countQuery.executeTakeFirst(),
268
+ ]);
269
+ const items = rows.map((row) => ({
270
+ commitSeq: coerceNumber(row.commit_seq) ?? 0,
271
+ actorId: row.actor_id ?? '',
272
+ clientId: row.client_id ?? '',
273
+ clientCommitId: row.client_commit_id ?? '',
274
+ createdAt: row.created_at ?? '',
275
+ changeCount: coerceNumber(row.change_count) ?? 0,
276
+ affectedTables: options.dialect.dbToArray(row.affected_tables),
277
+ }));
278
+ const total = coerceNumber(countRow?.total) ?? 0;
279
+ const response = {
280
+ items,
281
+ total,
282
+ offset,
283
+ limit,
284
+ };
285
+ c.header('X-Total-Count', String(total));
286
+ return c.json(response, 200);
287
+ });
288
+ // -------------------------------------------------------------------------
289
+ // GET /commits/:seq
290
+ // -------------------------------------------------------------------------
291
+ routes.get('/commits/:seq', describeConsoleRoute({
292
+ summary: 'Get commit details',
293
+ responses: {
294
+ 200: {
295
+ description: 'Commit with changes',
296
+ content: {
297
+ 'application/json': { schema: resolver(ConsoleCommitDetailSchema) },
298
+ },
299
+ },
300
+ 400: {
301
+ description: 'Invalid request',
302
+ content: {
303
+ 'application/json': { schema: resolver(ErrorResponseSchema) },
304
+ },
305
+ },
306
+ 401: {
307
+ description: 'Unauthenticated',
308
+ content: {
309
+ 'application/json': { schema: resolver(ErrorResponseSchema) },
310
+ },
311
+ },
312
+ 404: {
313
+ description: 'Not found',
314
+ content: {
315
+ 'application/json': { schema: resolver(ErrorResponseSchema) },
316
+ },
317
+ },
318
+ },
319
+ }), zValidator('param', commitSeqParamSchema), zValidator('query', commitDetailQuerySchema), async (c) => {
320
+ const { seq } = c.req.valid('param');
321
+ const { partitionId } = c.req.valid('query');
322
+ let commitQuery = db
323
+ .selectFrom('sync_commits')
324
+ .select([
325
+ 'commit_seq',
326
+ 'actor_id',
327
+ 'client_id',
328
+ 'client_commit_id',
329
+ 'created_at',
330
+ 'change_count',
331
+ 'affected_tables',
332
+ ])
333
+ .where('commit_seq', '=', seq);
334
+ if (partitionId) {
335
+ commitQuery = commitQuery.where('partition_id', '=', partitionId);
336
+ }
337
+ const commitRow = await commitQuery.executeTakeFirst();
338
+ if (!commitRow) {
339
+ return consoleNotFound(c);
340
+ }
341
+ let changesQuery = db
342
+ .selectFrom('sync_changes')
343
+ .select([
344
+ 'change_id',
345
+ 'table',
346
+ 'row_id',
347
+ 'op',
348
+ 'row_json',
349
+ 'row_version',
350
+ 'scopes',
351
+ ])
352
+ .where('commit_seq', '=', seq);
353
+ if (partitionId) {
354
+ changesQuery = changesQuery.where('partition_id', '=', partitionId);
355
+ }
356
+ const changeRows = await changesQuery
357
+ .orderBy('change_id', 'asc')
358
+ .execute();
359
+ const changes = changeRows.map((row) => {
360
+ const op = row.op === 'delete' ? 'delete' : 'upsert';
361
+ return {
362
+ ...summarizeAuditChange({
363
+ table: row.table ?? '',
364
+ op,
365
+ rowJson: row.row_json,
366
+ scopes: row.scopes,
367
+ }),
368
+ changeId: coerceNumber(row.change_id) ?? 0,
369
+ table: row.table ?? '',
370
+ rowId: row.row_id ?? '',
371
+ op,
372
+ rowVersion: coerceNumber(row.row_version),
373
+ };
374
+ });
375
+ const commit = {
376
+ commitSeq: coerceNumber(commitRow.commit_seq) ?? 0,
377
+ actorId: commitRow.actor_id ?? '',
378
+ clientId: commitRow.client_id ?? '',
379
+ clientCommitId: commitRow.client_commit_id ?? '',
380
+ createdAt: commitRow.created_at ?? '',
381
+ changeCount: coerceNumber(commitRow.change_count) ?? 0,
382
+ affectedTables: parseJsonStringArray(commitRow.affected_tables),
383
+ changes,
384
+ };
385
+ return c.json(commit, 200);
386
+ });
387
+ // -------------------------------------------------------------------------
388
+ // GET /row-history/:table/:rowId
389
+ // -------------------------------------------------------------------------
390
+ routes.get('/row-history/:table/:rowId', describeConsoleRoute({
391
+ summary: 'Get redacted row history',
392
+ responses: {
393
+ 200: {
394
+ description: 'Redacted row history with request-event links',
395
+ content: {
396
+ 'application/json': {
397
+ schema: resolver(ConsoleRowHistoryResponseSchema),
398
+ },
399
+ },
400
+ },
401
+ 400: {
402
+ description: 'Invalid request',
403
+ content: {
404
+ 'application/json': { schema: resolver(ErrorResponseSchema) },
405
+ },
406
+ },
407
+ 401: {
408
+ description: 'Unauthenticated',
409
+ content: {
410
+ 'application/json': { schema: resolver(ErrorResponseSchema) },
411
+ },
412
+ },
413
+ 404: {
414
+ description: 'Not found',
415
+ content: {
416
+ 'application/json': { schema: resolver(ErrorResponseSchema) },
417
+ },
418
+ },
419
+ },
420
+ }), zValidator('param', rowHistoryParamSchema), zValidator('query', rowHistoryQuerySchema), async (c) => {
421
+ const { table, rowId } = c.req.valid('param');
422
+ const { partitionId: requestedPartitionId, limit, beforeCommitSeq, afterCommitSeq, } = c.req.valid('query');
423
+ const partitionId = requestedPartitionId ?? 'default';
424
+ const rows = await options.dialect.readAuditRowHistory(options.db, {
425
+ partitionId,
426
+ table,
427
+ rowId,
428
+ scopes: {},
429
+ limit,
430
+ beforeCommitSeq,
431
+ afterCommitSeq,
432
+ });
433
+ if (rows.length === 0) {
434
+ return consoleNotFound(c);
435
+ }
436
+ const hasMore = rows.length > limit;
437
+ const selectedRows = hasMore ? rows.slice(0, limit) : rows;
438
+ const nextCursor = hasMore
439
+ ? Number(selectedRows[selectedRows.length - 1]?.commit_seq ?? 0)
440
+ : null;
441
+ const commitSeqs = Array.from(new Set(selectedRows.map((row) => Number(row.commit_seq))));
442
+ const eventRows = commitSeqs.length > 0
443
+ ? await db
444
+ .selectFrom('sync_request_events')
445
+ .select(['event_id', 'commit_seq', 'request_id', 'trace_id'])
446
+ .where('partition_id', '=', partitionId)
447
+ .where('commit_seq', 'in', commitSeqs)
448
+ .orderBy('event_id', 'asc')
449
+ .execute()
450
+ : [];
451
+ const eventLinksByCommitSeq = new Map();
452
+ for (const row of eventRows) {
453
+ const commitSeq = coerceNumber(row.commit_seq);
454
+ if (commitSeq === null)
455
+ continue;
456
+ const links = eventLinksByCommitSeq.get(commitSeq) ?? {
457
+ eventIds: new Set(),
458
+ requestIds: new Set(),
459
+ traceIds: new Set(),
460
+ };
461
+ const eventId = coerceNumber(row.event_id);
462
+ if (eventId !== null)
463
+ links.eventIds.add(eventId);
464
+ if (row.request_id)
465
+ links.requestIds.add(row.request_id);
466
+ if (row.trace_id)
467
+ links.traceIds.add(row.trace_id);
468
+ eventLinksByCommitSeq.set(commitSeq, links);
469
+ }
470
+ const response = {
471
+ table,
472
+ rowId,
473
+ partitionId,
474
+ history: selectedRows.map((row) => {
475
+ const commitSeq = Number(row.commit_seq);
476
+ const links = eventLinksByCommitSeq.get(commitSeq);
477
+ const summary = summarizeAuditChange({
478
+ table: row.table,
479
+ op: row.op,
480
+ rowJson: row.row_json,
481
+ scopes: row.scopes,
482
+ });
483
+ return {
484
+ commitSeq,
485
+ actorId: row.actor_id,
486
+ clientId: row.client_id,
487
+ clientCommitId: row.client_commit_id,
488
+ createdAt: row.created_at,
489
+ changeId: Number(row.change_id),
490
+ table: row.table,
491
+ rowId: row.row_id,
492
+ op: row.op,
493
+ rowVersion: row.row_version === null ? null : Number(row.row_version),
494
+ ...summary,
495
+ requestEventIds: links ? Array.from(links.eventIds) : [],
496
+ requestIds: links ? Array.from(links.requestIds) : [],
497
+ traceIds: links ? Array.from(links.traceIds) : [],
498
+ };
499
+ }),
500
+ nextCursor,
501
+ };
502
+ return c.json(response, 200);
503
+ });
504
+ // -------------------------------------------------------------------------
505
+ // GET /row-investigation/:table/:rowId
506
+ // -------------------------------------------------------------------------
507
+ routes.get('/row-investigation/:table/:rowId', describeConsoleRoute({
508
+ summary: 'Investigate row visibility',
509
+ responses: {
510
+ 200: {
511
+ description: 'Redacted row investigation with client/event hints',
512
+ content: {
513
+ 'application/json': {
514
+ schema: resolver(ConsoleRowInvestigationResponseSchema),
515
+ },
516
+ },
517
+ },
518
+ 400: {
519
+ description: 'Invalid request',
520
+ content: {
521
+ 'application/json': { schema: resolver(ErrorResponseSchema) },
522
+ },
523
+ },
524
+ 401: {
525
+ description: 'Unauthenticated',
526
+ content: {
527
+ 'application/json': { schema: resolver(ErrorResponseSchema) },
528
+ },
529
+ },
530
+ },
531
+ }), zValidator('param', rowHistoryParamSchema), zValidator('query', rowInvestigationQuerySchema), async (c) => {
532
+ const { table, rowId } = c.req.valid('param');
533
+ const { partitionId: requestedPartitionId, clientId, limit, beforeCommitSeq, afterCommitSeq, } = c.req.valid('query');
534
+ const partitionId = requestedPartitionId ?? 'default';
535
+ const rows = await options.dialect.readAuditRowHistory(options.db, {
536
+ partitionId,
537
+ table,
538
+ rowId,
539
+ scopes: {},
540
+ limit,
541
+ beforeCommitSeq,
542
+ afterCommitSeq,
543
+ });
544
+ const hasMore = rows.length > limit;
545
+ const selectedRows = hasMore ? rows.slice(0, limit) : rows;
546
+ const nextCursor = hasMore
547
+ ? Number(selectedRows[selectedRows.length - 1]?.commit_seq ?? 0)
548
+ : null;
549
+ const commitSeqs = Array.from(new Set(selectedRows.map((row) => Number(row.commit_seq))));
550
+ const eventLinkRows = commitSeqs.length > 0
551
+ ? await db
552
+ .selectFrom('sync_request_events')
553
+ .select(['event_id', 'commit_seq', 'request_id', 'trace_id'])
554
+ .where('partition_id', '=', partitionId)
555
+ .where('commit_seq', 'in', commitSeqs)
556
+ .orderBy('event_id', 'asc')
557
+ .execute()
558
+ : [];
559
+ const eventLinksByCommitSeq = new Map();
560
+ for (const row of eventLinkRows) {
561
+ const commitSeq = coerceNumber(row.commit_seq);
562
+ if (commitSeq === null)
563
+ continue;
564
+ const links = eventLinksByCommitSeq.get(commitSeq) ?? {
565
+ eventIds: new Set(),
566
+ requestIds: new Set(),
567
+ traceIds: new Set(),
568
+ };
569
+ const eventId = coerceNumber(row.event_id);
570
+ if (eventId !== null)
571
+ links.eventIds.add(eventId);
572
+ if (row.request_id)
573
+ links.requestIds.add(row.request_id);
574
+ if (row.trace_id)
575
+ links.traceIds.add(row.trace_id);
576
+ eventLinksByCommitSeq.set(commitSeq, links);
577
+ }
578
+ const history = selectedRows.map((row) => {
579
+ const commitSeq = Number(row.commit_seq);
580
+ const links = eventLinksByCommitSeq.get(commitSeq);
581
+ const summary = summarizeAuditChange({
582
+ table: row.table,
583
+ op: row.op,
584
+ rowJson: row.row_json,
585
+ scopes: row.scopes,
586
+ });
587
+ return {
588
+ commitSeq,
589
+ actorId: row.actor_id,
590
+ clientId: row.client_id,
591
+ clientCommitId: row.client_commit_id,
592
+ createdAt: row.created_at,
593
+ changeId: Number(row.change_id),
594
+ table: row.table,
595
+ rowId: row.row_id,
596
+ op: row.op,
597
+ rowVersion: row.row_version === null ? null : Number(row.row_version),
598
+ ...summary,
599
+ requestEventIds: links ? Array.from(links.eventIds) : [],
600
+ requestIds: links ? Array.from(links.requestIds) : [],
601
+ traceIds: links ? Array.from(links.traceIds) : [],
602
+ };
603
+ });
604
+ const latestRow = selectedRows[0] ?? null;
605
+ const latestCommitSeq = latestRow
606
+ ? (coerceNumber(latestRow.commit_seq) ?? 0)
607
+ : null;
608
+ const latestOp = latestRow?.op === 'delete' || latestRow?.op === 'upsert'
609
+ ? latestRow.op
610
+ : null;
611
+ const clientRow = clientId
612
+ ? await db
613
+ .selectFrom('sync_client_cursors')
614
+ .select([
615
+ 'client_id',
616
+ 'actor_id',
617
+ 'cursor',
618
+ 'effective_scopes',
619
+ 'updated_at',
620
+ ])
621
+ .where('partition_id', '=', partitionId)
622
+ .where('client_id', '=', clientId)
623
+ .executeTakeFirst()
624
+ : null;
625
+ const eventRows = await db
626
+ .selectFrom('sync_request_events')
627
+ .select(requestEventSelectColumns)
628
+ .where('partition_id', '=', partitionId)
629
+ .$if(Boolean(clientId), (query) => query.where('client_id', '=', clientId ?? ''))
630
+ .orderBy('created_at', 'desc')
631
+ .limit(Math.min(Math.max(limit * 5, 25), 200))
632
+ .execute();
633
+ const relevantEvents = eventRows
634
+ .map((row) => mapRequestEvent(row))
635
+ .filter((event) => (event.tables ?? []).includes(table))
636
+ .slice(0, limit);
637
+ const subscriptionEvidence = summarizeSubscriptionEvidence(relevantEvents);
638
+ const requestEvidence = summarizeRequestEvidence(relevantEvents);
639
+ const snapshotEvidence = summarizeSnapshotEvidence(relevantEvents);
640
+ const realtimeRows = clientId
641
+ ? await db
642
+ .selectFrom('sync_realtime_events')
643
+ .select([
644
+ 'event_id',
645
+ 'event_type',
646
+ 'reason',
647
+ 'cursor',
648
+ 'latest_cursor',
649
+ ])
650
+ .where('partition_id', '=', partitionId)
651
+ .where('client_id', '=', clientId)
652
+ .orderBy('created_at', 'desc')
653
+ .limit(Math.min(Math.max(limit * 5, 25), 200))
654
+ .execute()
655
+ : [];
656
+ const realtimeEvidence = summarizeRealtimeEvidence(realtimeRows);
657
+ const latestClientEvent = relevantEvents.find((event) => !clientId || event.clientId === clientId);
658
+ const clientScopes = clientRow
659
+ ? options.dialect.dbToScopes(clientRow.effective_scopes)
660
+ : null;
661
+ const latestRowScopes = latestRow
662
+ ? options.dialect.dbToScopes(latestRow.scopes)
663
+ : null;
664
+ const client = clientRow
665
+ ? {
666
+ clientId: clientRow.client_id ?? '',
667
+ actorId: clientRow.actor_id ?? '',
668
+ cursor: coerceNumber(clientRow.cursor) ?? 0,
669
+ effectiveScopeKeys: Object.keys(clientScopes ?? {}).sort(),
670
+ updatedAt: clientRow.updated_at ?? '',
671
+ lastRequestAt: latestClientEvent?.createdAt ?? null,
672
+ lastRequestType: latestClientEvent?.eventType ?? null,
673
+ lastRequestOutcome: latestClientEvent?.outcome ?? null,
674
+ }
675
+ : null;
676
+ const scopeEligibility = assessScopeEligibility({
677
+ rowScopes: latestRowScopes,
678
+ clientScopes,
679
+ });
680
+ const findings = [];
681
+ if (!latestRow) {
682
+ findings.push({
683
+ severity: 'warning',
684
+ code: 'row.not_found',
685
+ message: 'No audit entry exists for this table and row in the selected partition.',
686
+ });
687
+ }
688
+ if (!clientId) {
689
+ findings.push({
690
+ severity: 'info',
691
+ code: 'client.not_selected',
692
+ message: 'Provide a client id to check cursor position and scope eligibility.',
693
+ });
694
+ }
695
+ else if (!client) {
696
+ findings.push({
697
+ severity: 'warning',
698
+ code: 'client.not_found',
699
+ message: 'No client cursor exists for this client in the selected partition.',
700
+ });
701
+ }
702
+ if (latestOp === 'delete') {
703
+ findings.push({
704
+ severity: 'warning',
705
+ code: 'row.deleted',
706
+ message: 'The latest recorded operation for this row is a delete.',
707
+ });
708
+ }
709
+ if (client &&
710
+ latestCommitSeq !== null &&
711
+ client.cursor < latestCommitSeq) {
712
+ findings.push({
713
+ severity: 'warning',
714
+ code: 'client.cursor_behind',
715
+ message: 'The client cursor is behind the latest row commit, so the row may not have been pulled yet.',
716
+ });
717
+ }
718
+ if (scopeEligibility.status === 'not_eligible') {
719
+ findings.push({
720
+ severity: 'warning',
721
+ code: 'scope.not_eligible',
722
+ message: 'The client effective scopes do not cover the latest row scopes.',
723
+ });
724
+ }
725
+ if (relevantEvents.length === 0) {
726
+ findings.push({
727
+ severity: 'info',
728
+ code: 'events.none_for_table',
729
+ message: 'No recent request events mention this table for the selected filters.',
730
+ });
731
+ }
732
+ else if (subscriptionEvidence.status === 'revoked') {
733
+ findings.push({
734
+ severity: 'warning',
735
+ code: 'subscription.revoked',
736
+ message: 'A relevant pull event reported at least one revoked subscription.',
737
+ });
738
+ }
739
+ else if (subscriptionEvidence.status === 'unknown') {
740
+ findings.push({
741
+ severity: 'info',
742
+ code: 'subscription.not_recorded',
743
+ message: 'Relevant events exist, but none include subscription-count evidence.',
744
+ });
745
+ }
746
+ else if (subscriptionEvidence.status === 'not_observed') {
747
+ findings.push({
748
+ severity: 'warning',
749
+ code: 'subscription.not_observed',
750
+ message: 'Relevant pull events did not report an active subscription for this table.',
751
+ });
752
+ }
753
+ if (latestClientEvent && latestClientEvent.responseStatus !== 'success') {
754
+ findings.push({
755
+ severity: 'warning',
756
+ code: 'events.latest_not_success',
757
+ message: 'The latest relevant request event did not complete successfully.',
758
+ });
759
+ }
760
+ const response = {
761
+ table,
762
+ rowId,
763
+ partitionId,
764
+ clientId: clientId ?? null,
765
+ rowKnown: history.length > 0,
766
+ latestCommitSeq,
767
+ latestOp,
768
+ client,
769
+ scopeEligibility,
770
+ subscriptionEvidence,
771
+ requestEvidence,
772
+ snapshotEvidence,
773
+ realtimeEvidence,
774
+ history,
775
+ relevantEvents,
776
+ findings,
777
+ nextCursor,
778
+ };
779
+ return c.json(response, 200);
780
+ });
781
+ // -------------------------------------------------------------------------
782
+ // GET /debug/export
783
+ // -------------------------------------------------------------------------
784
+ routes.get('/debug/export', describeConsoleRoute({
785
+ summary: 'Export a redacted debug bundle',
786
+ responses: {
787
+ 200: {
788
+ description: 'Size-bounded redacted debug export',
789
+ content: {
790
+ 'application/json': {
791
+ schema: resolver(ConsoleDebugExportResponseSchema),
792
+ },
793
+ },
794
+ },
795
+ 400: {
796
+ description: 'Invalid request',
797
+ content: {
798
+ 'application/json': { schema: resolver(ErrorResponseSchema) },
799
+ },
800
+ },
801
+ 401: {
802
+ description: 'Unauthenticated',
803
+ content: {
804
+ 'application/json': { schema: resolver(ErrorResponseSchema) },
805
+ },
806
+ },
807
+ },
808
+ }), zValidator('query', debugExportQuerySchema), async (c) => {
809
+ const { partitionId: requestedPartitionId, limitCommits, limitEvents, } = c.req.valid('query');
810
+ const { from, to } = c.req.valid('query');
811
+ const partitionId = requestedPartitionId ?? 'default';
812
+ let commitsQuery = db
813
+ .selectFrom('sync_commits')
814
+ .select([
815
+ 'commit_seq',
816
+ 'actor_id',
817
+ 'client_id',
818
+ 'client_commit_id',
819
+ 'created_at',
820
+ 'change_count',
821
+ 'affected_tables',
822
+ ])
823
+ .where('partition_id', '=', partitionId);
824
+ if (from)
825
+ commitsQuery = commitsQuery.where('created_at', '>=', from);
826
+ if (to)
827
+ commitsQuery = commitsQuery.where('created_at', '<=', to);
828
+ let eventsQuery = db
829
+ .selectFrom('sync_request_events')
830
+ .select(requestEventSelectColumns)
831
+ .where('partition_id', '=', partitionId);
832
+ if (from)
833
+ eventsQuery = eventsQuery.where('created_at', '>=', from);
834
+ if (to)
835
+ eventsQuery = eventsQuery.where('created_at', '<=', to);
836
+ const [commitRows, eventRows] = await Promise.all([
837
+ commitsQuery
838
+ .orderBy('commit_seq', 'desc')
839
+ .limit(limitCommits + 1)
840
+ .execute(),
841
+ eventsQuery
842
+ .orderBy('created_at', 'desc')
843
+ .limit(limitEvents + 1)
844
+ .execute(),
845
+ ]);
846
+ const selectedCommitRows = commitRows.slice(0, limitCommits);
847
+ const selectedEventRows = eventRows.slice(0, limitEvents);
848
+ const commitSeqs = selectedCommitRows
849
+ .map((row) => coerceNumber(row.commit_seq))
850
+ .filter((seq) => seq !== null);
851
+ const changesByCommitSeq = await readRedactedCommitChanges(partitionId, commitSeqs);
852
+ const commits = selectedCommitRows.map((row) => {
853
+ const commitSeq = coerceNumber(row.commit_seq) ?? 0;
854
+ return {
855
+ commitSeq,
856
+ actorId: row.actor_id ?? '',
857
+ clientId: row.client_id ?? '',
858
+ clientCommitId: row.client_commit_id ?? '',
859
+ createdAt: row.created_at ?? '',
860
+ changeCount: coerceNumber(row.change_count) ?? 0,
861
+ affectedTables: options.dialect.dbToArray(row.affected_tables),
862
+ changes: changesByCommitSeq.get(commitSeq) ?? [],
863
+ };
864
+ });
865
+ const response = {
866
+ generatedAt: new Date().toISOString(),
867
+ partitionId,
868
+ limits: {
869
+ commits: limitCommits,
870
+ requestEvents: limitEvents,
871
+ },
872
+ truncated: {
873
+ commits: commitRows.length > limitCommits,
874
+ requestEvents: eventRows.length > limitEvents,
875
+ },
876
+ commits,
877
+ requestEvents: selectedEventRows.map(mapDebugExportEvent),
878
+ };
879
+ return c.json(response, 200);
880
+ });
881
+ }
882
+ //# sourceMappingURL=commits.js.map