@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,669 @@
1
+ /**
2
+ * @syncular/server/hono - Console request event and live event routes.
3
+ *
4
+ * Extracted from console/routes.ts without behavior changes.
5
+ */
6
+
7
+ import {
8
+ createSyncularErrorResponse,
9
+ ErrorResponseSchema,
10
+ logSyncEvent,
11
+ } from '@syncular/core';
12
+ import { coerceNumber, parseJsonValue } from '@syncular/server';
13
+ import type { Context } from 'hono';
14
+ import { resolver } from 'hono-openapi';
15
+ import { consoleValidator as zValidator } from '../../validation';
16
+ import { isWebSocketOriginAllowed } from '../../websocket-origin';
17
+ import {
18
+ closeUnauthenticatedSocket,
19
+ parseWebSocketAuthToken,
20
+ } from '../live-auth';
21
+ import { describeConsoleRoute } from '../route-descriptor';
22
+ import {
23
+ type ConsoleClearEventsResult,
24
+ ConsoleClearEventsResultSchema,
25
+ type ConsolePaginatedResponse,
26
+ ConsolePaginatedResponseSchema,
27
+ type ConsolePruneEventsResult,
28
+ ConsolePruneEventsResultSchema,
29
+ type ConsoleRequestEvent,
30
+ ConsoleRequestEventSchema,
31
+ type ConsoleRequestPayload,
32
+ ConsoleRequestPayloadSchema,
33
+ } from '../schemas';
34
+ import type { ConsoleEventListener } from '../types';
35
+ import type { ConsoleRoutesContext } from './context';
36
+ import {
37
+ consoleNotFound,
38
+ eventDetailQuerySchema,
39
+ eventIdParamSchema,
40
+ eventsQuerySchema,
41
+ measureWebSocketMessageBytes,
42
+ } from './shared';
43
+
44
+ export function registerEventRoutes(ctx: ConsoleRoutesContext): void {
45
+ const {
46
+ routes,
47
+ options,
48
+ db,
49
+ requestEventSelectColumns,
50
+ mapRequestEvent,
51
+ deleteUnreferencedPayloadSnapshots,
52
+ runEventsPrune,
53
+ } = ctx;
54
+
55
+ // -------------------------------------------------------------------------
56
+ // GET /events - Paginated request events list
57
+ // -------------------------------------------------------------------------
58
+
59
+ routes.get(
60
+ '/events',
61
+ describeConsoleRoute({
62
+ summary: 'List request events',
63
+ responses: {
64
+ 200: {
65
+ description: 'Paginated event list',
66
+ content: {
67
+ 'application/json': {
68
+ schema: resolver(
69
+ ConsolePaginatedResponseSchema(ConsoleRequestEventSchema)
70
+ ),
71
+ },
72
+ },
73
+ },
74
+ 401: {
75
+ description: 'Unauthenticated',
76
+ content: {
77
+ 'application/json': { schema: resolver(ErrorResponseSchema) },
78
+ },
79
+ },
80
+ },
81
+ }),
82
+ zValidator('query', eventsQuerySchema),
83
+ async (c) => {
84
+ const {
85
+ limit,
86
+ offset,
87
+ partitionId,
88
+ eventType,
89
+ actorId,
90
+ clientId,
91
+ requestId,
92
+ traceId,
93
+ syncAttemptId,
94
+ outcome,
95
+ } = c.req.valid('query');
96
+ const resolvedTraceId = traceId ?? syncAttemptId;
97
+
98
+ let query = db
99
+ .selectFrom('sync_request_events')
100
+ .select(requestEventSelectColumns);
101
+
102
+ let countQuery = db
103
+ .selectFrom('sync_request_events')
104
+ .select(({ fn }) => fn.countAll().as('total'));
105
+
106
+ if (partitionId) {
107
+ query = query.where('partition_id', '=', partitionId);
108
+ countQuery = countQuery.where('partition_id', '=', partitionId);
109
+ }
110
+ if (eventType) {
111
+ query = query.where('event_type', '=', eventType);
112
+ countQuery = countQuery.where('event_type', '=', eventType);
113
+ }
114
+ if (actorId) {
115
+ query = query.where('actor_id', '=', actorId);
116
+ countQuery = countQuery.where('actor_id', '=', actorId);
117
+ }
118
+ if (clientId) {
119
+ query = query.where('client_id', '=', clientId);
120
+ countQuery = countQuery.where('client_id', '=', clientId);
121
+ }
122
+ if (requestId) {
123
+ query = query.where('request_id', '=', requestId);
124
+ countQuery = countQuery.where('request_id', '=', requestId);
125
+ }
126
+ if (resolvedTraceId) {
127
+ query = query.where('trace_id', '=', resolvedTraceId);
128
+ countQuery = countQuery.where('trace_id', '=', resolvedTraceId);
129
+ }
130
+ if (outcome) {
131
+ query = query.where('outcome', '=', outcome);
132
+ countQuery = countQuery.where('outcome', '=', outcome);
133
+ }
134
+
135
+ const [rows, countRow] = await Promise.all([
136
+ query
137
+ .orderBy('created_at', 'desc')
138
+ .limit(limit)
139
+ .offset(offset)
140
+ .execute(),
141
+ countQuery.executeTakeFirst(),
142
+ ]);
143
+
144
+ const items: ConsoleRequestEvent[] = rows.map((row) =>
145
+ mapRequestEvent(row)
146
+ );
147
+
148
+ const total = coerceNumber(countRow?.total) ?? 0;
149
+
150
+ const response: ConsolePaginatedResponse<ConsoleRequestEvent> = {
151
+ items,
152
+ total,
153
+ offset,
154
+ limit,
155
+ };
156
+
157
+ c.header('X-Total-Count', String(total));
158
+ return c.json(response, 200);
159
+ }
160
+ );
161
+
162
+ // -------------------------------------------------------------------------
163
+ // GET /events/live - WebSocket for live activity feed
164
+ // NOTE: Must be defined BEFORE /events/:id to avoid route conflict
165
+ // -------------------------------------------------------------------------
166
+
167
+ if (
168
+ options.eventEmitter &&
169
+ options.websocket?.enabled &&
170
+ options.websocket?.upgradeWebSocket
171
+ ) {
172
+ const emitter = options.eventEmitter;
173
+ const upgradeWebSocket = options.websocket.upgradeWebSocket;
174
+ const heartbeatIntervalMs = options.websocket.heartbeatIntervalMs ?? 30000;
175
+ const maxMessageBytes = options.websocket.maxMessageBytes ?? 1024 * 1024;
176
+ const maxMessagesPerWindow = options.websocket.maxMessagesPerWindow ?? 120;
177
+ const messageRateWindowMs = options.websocket.messageRateWindowMs ?? 10000;
178
+
179
+ type WebSocketLike = {
180
+ send: (data: string) => void;
181
+ close: (code?: number, reason?: string) => void;
182
+ };
183
+
184
+ const wsState = new WeakMap<
185
+ WebSocketLike,
186
+ {
187
+ listener: ConsoleEventListener | null;
188
+ heartbeatInterval: ReturnType<typeof setInterval> | null;
189
+ authTimeout: ReturnType<typeof setTimeout> | null;
190
+ isAuthenticated: boolean;
191
+ startAuthenticatedSession: (() => void) | null;
192
+ messageRateWindowStart: number;
193
+ messageRateWindowCount: number;
194
+ }
195
+ >();
196
+
197
+ const cleanup = (ws: WebSocketLike) => {
198
+ const state = wsState.get(ws);
199
+ if (!state) return;
200
+ if (state.listener) {
201
+ emitter.removeListener(state.listener);
202
+ }
203
+ if (state.heartbeatInterval) {
204
+ clearInterval(state.heartbeatInterval);
205
+ }
206
+ if (state.authTimeout) {
207
+ clearTimeout(state.authTimeout);
208
+ }
209
+ wsState.delete(ws);
210
+ };
211
+
212
+ const liveEventsWebSocketRoute = upgradeWebSocket(async (c) => {
213
+ const authHeader = c.req.header('Authorization');
214
+ const partitionId = c.req.query('partitionId')?.trim() || undefined;
215
+ const replaySince = c.req.query('since');
216
+ const replayLimitRaw = c.req.query('replayLimit');
217
+ const replayLimitNumber = replayLimitRaw
218
+ ? Number.parseInt(replayLimitRaw, 10)
219
+ : Number.NaN;
220
+ const replayLimit = Number.isFinite(replayLimitNumber)
221
+ ? Math.max(1, Math.min(500, replayLimitNumber))
222
+ : 100;
223
+ const mockContext = {
224
+ req: {
225
+ header: (name: string) =>
226
+ name === 'Authorization' ? authHeader : undefined,
227
+ query: () => undefined,
228
+ },
229
+ } as unknown as Context;
230
+
231
+ const initialAuth = await options.authenticate(mockContext);
232
+
233
+ const authenticateWithBearer = async (token: string) => {
234
+ const trimmedToken = token.trim();
235
+ if (!trimmedToken) return null;
236
+ const authContext = {
237
+ req: {
238
+ header: (name: string) =>
239
+ name === 'Authorization' ? `Bearer ${trimmedToken}` : undefined,
240
+ query: () => undefined,
241
+ },
242
+ } as unknown as Context;
243
+ return options.authenticate(authContext);
244
+ };
245
+
246
+ return {
247
+ onOpen(_event, ws) {
248
+ const state: {
249
+ listener: ConsoleEventListener | null;
250
+ heartbeatInterval: ReturnType<typeof setInterval> | null;
251
+ authTimeout: ReturnType<typeof setTimeout> | null;
252
+ isAuthenticated: boolean;
253
+ startAuthenticatedSession: (() => void) | null;
254
+ messageRateWindowStart: number;
255
+ messageRateWindowCount: number;
256
+ } = {
257
+ listener: null,
258
+ heartbeatInterval: null,
259
+ authTimeout: null,
260
+ isAuthenticated: false,
261
+ startAuthenticatedSession: null,
262
+ messageRateWindowStart: Date.now(),
263
+ messageRateWindowCount: 0,
264
+ };
265
+ wsState.set(ws, state);
266
+
267
+ const startAuthenticatedSession = () => {
268
+ if (state.isAuthenticated) return;
269
+ state.isAuthenticated = true;
270
+ if (state.authTimeout) {
271
+ clearTimeout(state.authTimeout);
272
+ state.authTimeout = null;
273
+ }
274
+
275
+ const listener: ConsoleEventListener = (event) => {
276
+ if (partitionId) {
277
+ const eventPartitionId = event.data.partitionId;
278
+ if (
279
+ typeof eventPartitionId !== 'string' ||
280
+ eventPartitionId !== partitionId
281
+ ) {
282
+ return;
283
+ }
284
+ }
285
+ try {
286
+ ws.send(JSON.stringify(event));
287
+ } catch {
288
+ // Connection closed
289
+ }
290
+ };
291
+
292
+ emitter.addListener(listener);
293
+ state.listener = listener;
294
+
295
+ ws.send(
296
+ JSON.stringify({
297
+ type: 'connected',
298
+ timestamp: new Date().toISOString(),
299
+ })
300
+ );
301
+
302
+ const replayEvents = emitter.replay({
303
+ since: replaySince,
304
+ limit: replayLimit,
305
+ partitionId,
306
+ });
307
+ for (const replayEvent of replayEvents) {
308
+ try {
309
+ ws.send(JSON.stringify(replayEvent));
310
+ } catch {
311
+ // Connection closed
312
+ break;
313
+ }
314
+ }
315
+
316
+ const heartbeatInterval = setInterval(() => {
317
+ try {
318
+ ws.send(
319
+ JSON.stringify({
320
+ type: 'heartbeat',
321
+ timestamp: new Date().toISOString(),
322
+ })
323
+ );
324
+ } catch {
325
+ clearInterval(heartbeatInterval);
326
+ }
327
+ }, heartbeatIntervalMs);
328
+ state.heartbeatInterval = heartbeatInterval;
329
+ };
330
+ state.startAuthenticatedSession = startAuthenticatedSession;
331
+
332
+ if (initialAuth) {
333
+ startAuthenticatedSession();
334
+ return;
335
+ }
336
+
337
+ state.authTimeout = setTimeout(() => {
338
+ const current = wsState.get(ws);
339
+ if (!current || current.isAuthenticated) {
340
+ return;
341
+ }
342
+ closeUnauthenticatedSocket(ws);
343
+ cleanup(ws);
344
+ }, 5_000);
345
+ },
346
+ async onMessage(event, ws) {
347
+ const state = wsState.get(ws);
348
+ if (!state) {
349
+ return;
350
+ }
351
+
352
+ const messageBytes = measureWebSocketMessageBytes(event.data);
353
+ if (messageBytes > maxMessageBytes) {
354
+ ws.close(1009, 'message too large');
355
+ cleanup(ws);
356
+ return;
357
+ }
358
+
359
+ if (maxMessagesPerWindow > 0 && messageRateWindowMs > 0) {
360
+ const nowMs = Date.now();
361
+ if (nowMs - state.messageRateWindowStart >= messageRateWindowMs) {
362
+ state.messageRateWindowStart = nowMs;
363
+ state.messageRateWindowCount = 0;
364
+ }
365
+ state.messageRateWindowCount += 1;
366
+ if (state.messageRateWindowCount > maxMessagesPerWindow) {
367
+ ws.close(1008, 'message rate exceeded');
368
+ cleanup(ws);
369
+ return;
370
+ }
371
+ }
372
+
373
+ if (state.isAuthenticated) {
374
+ return;
375
+ }
376
+
377
+ if (typeof event.data !== 'string') {
378
+ closeUnauthenticatedSocket(ws);
379
+ cleanup(ws);
380
+ return;
381
+ }
382
+
383
+ const token = parseWebSocketAuthToken(event.data);
384
+
385
+ if (!token) {
386
+ closeUnauthenticatedSocket(ws);
387
+ cleanup(ws);
388
+ return;
389
+ }
390
+
391
+ const auth = await authenticateWithBearer(token);
392
+ const currentState = wsState.get(ws);
393
+ if (!currentState || currentState.isAuthenticated) {
394
+ return;
395
+ }
396
+ if (!auth) {
397
+ closeUnauthenticatedSocket(ws);
398
+ cleanup(ws);
399
+ return;
400
+ }
401
+ currentState.startAuthenticatedSession?.();
402
+ },
403
+ onClose(_event, ws) {
404
+ cleanup(ws);
405
+ },
406
+ onError(_event, ws) {
407
+ cleanup(ws);
408
+ },
409
+ };
410
+ });
411
+
412
+ routes.get('/events/live', async (c, next) => {
413
+ if (!isWebSocketOriginAllowed(c, options.websocket?.allowedOrigins)) {
414
+ return c.json(
415
+ createSyncularErrorResponse('console.forbidden_origin'),
416
+ 403
417
+ );
418
+ }
419
+ return liveEventsWebSocketRoute(c, next);
420
+ });
421
+ }
422
+
423
+ // -------------------------------------------------------------------------
424
+ // GET /events/:id - Single event detail
425
+ // -------------------------------------------------------------------------
426
+
427
+ routes.get(
428
+ '/events/:id',
429
+ describeConsoleRoute({
430
+ summary: 'Get event details',
431
+ responses: {
432
+ 200: {
433
+ description: 'Event details',
434
+ content: {
435
+ 'application/json': {
436
+ schema: resolver(ConsoleRequestEventSchema),
437
+ },
438
+ },
439
+ },
440
+ 400: {
441
+ description: 'Invalid request',
442
+ content: {
443
+ 'application/json': { schema: resolver(ErrorResponseSchema) },
444
+ },
445
+ },
446
+ 401: {
447
+ description: 'Unauthenticated',
448
+ content: {
449
+ 'application/json': { schema: resolver(ErrorResponseSchema) },
450
+ },
451
+ },
452
+ 404: {
453
+ description: 'Not found',
454
+ content: {
455
+ 'application/json': { schema: resolver(ErrorResponseSchema) },
456
+ },
457
+ },
458
+ },
459
+ }),
460
+ zValidator('param', eventIdParamSchema),
461
+ zValidator('query', eventDetailQuerySchema),
462
+ async (c) => {
463
+ const { id: eventId } = c.req.valid('param');
464
+ const { partitionId } = c.req.valid('query');
465
+
466
+ let eventQuery = db
467
+ .selectFrom('sync_request_events')
468
+ .select(requestEventSelectColumns)
469
+ .where('event_id', '=', eventId);
470
+
471
+ if (partitionId) {
472
+ eventQuery = eventQuery.where('partition_id', '=', partitionId);
473
+ }
474
+
475
+ const row = await eventQuery.executeTakeFirst();
476
+
477
+ if (!row) {
478
+ return consoleNotFound(c);
479
+ }
480
+
481
+ return c.json(mapRequestEvent(row), 200);
482
+ }
483
+ );
484
+
485
+ // -------------------------------------------------------------------------
486
+ // GET /events/:id/payload - payload snapshot detail (if retained)
487
+ // -------------------------------------------------------------------------
488
+
489
+ routes.get(
490
+ '/events/:id/payload',
491
+ describeConsoleRoute({
492
+ summary: 'Get event payload snapshot',
493
+ responses: {
494
+ 200: {
495
+ description: 'Payload snapshot details',
496
+ content: {
497
+ 'application/json': {
498
+ schema: resolver(ConsoleRequestPayloadSchema),
499
+ },
500
+ },
501
+ },
502
+ 400: {
503
+ description: 'Invalid request',
504
+ content: {
505
+ 'application/json': { schema: resolver(ErrorResponseSchema) },
506
+ },
507
+ },
508
+ 401: {
509
+ description: 'Unauthenticated',
510
+ content: {
511
+ 'application/json': { schema: resolver(ErrorResponseSchema) },
512
+ },
513
+ },
514
+ 404: {
515
+ description: 'Not found',
516
+ content: {
517
+ 'application/json': { schema: resolver(ErrorResponseSchema) },
518
+ },
519
+ },
520
+ },
521
+ }),
522
+ zValidator('param', eventIdParamSchema),
523
+ zValidator('query', eventDetailQuerySchema),
524
+ async (c) => {
525
+ const { id: eventId } = c.req.valid('param');
526
+ const { partitionId } = c.req.valid('query');
527
+
528
+ let eventQuery = db
529
+ .selectFrom('sync_request_events')
530
+ .select(['payload_ref', 'partition_id'])
531
+ .where('event_id', '=', eventId);
532
+
533
+ if (partitionId) {
534
+ eventQuery = eventQuery.where('partition_id', '=', partitionId);
535
+ }
536
+
537
+ const eventRow = await eventQuery.executeTakeFirst();
538
+
539
+ if (!eventRow) {
540
+ return consoleNotFound(c);
541
+ }
542
+
543
+ const payloadRef = eventRow.payload_ref;
544
+ if (!payloadRef) {
545
+ return consoleNotFound(c, 'No payload snapshot recorded');
546
+ }
547
+
548
+ const payloadRow = await db
549
+ .selectFrom('sync_request_payloads')
550
+ .select([
551
+ 'payload_ref',
552
+ 'partition_id',
553
+ 'request_payload',
554
+ 'response_payload',
555
+ 'created_at',
556
+ ])
557
+ .where('payload_ref', '=', payloadRef)
558
+ .where('partition_id', '=', eventRow.partition_id)
559
+ .executeTakeFirst();
560
+
561
+ if (!payloadRow) {
562
+ return consoleNotFound(c, 'Payload snapshot not available');
563
+ }
564
+
565
+ const payload: ConsoleRequestPayload = {
566
+ payloadRef: payloadRow.payload_ref,
567
+ partitionId: payloadRow.partition_id,
568
+ requestPayload: parseJsonValue(payloadRow.request_payload),
569
+ responsePayload: parseJsonValue(payloadRow.response_payload),
570
+ createdAt: payloadRow.created_at,
571
+ };
572
+
573
+ return c.json(payload, 200);
574
+ }
575
+ );
576
+
577
+ // -------------------------------------------------------------------------
578
+ // DELETE /events - Clear all events
579
+ // -------------------------------------------------------------------------
580
+
581
+ routes.delete(
582
+ '/events',
583
+ describeConsoleRoute({
584
+ summary: 'Clear all events',
585
+ responses: {
586
+ 200: {
587
+ description: 'Clear result',
588
+ content: {
589
+ 'application/json': {
590
+ schema: resolver(ConsoleClearEventsResultSchema),
591
+ },
592
+ },
593
+ },
594
+ 401: {
595
+ description: 'Unauthenticated',
596
+ content: {
597
+ 'application/json': { schema: resolver(ErrorResponseSchema) },
598
+ },
599
+ },
600
+ },
601
+ }),
602
+ async (c) => {
603
+ const res = await db.deleteFrom('sync_request_events').executeTakeFirst();
604
+
605
+ const deletedCount = Number(res?.numDeletedRows ?? 0);
606
+ const payloadDeletedCount = await deleteUnreferencedPayloadSnapshots();
607
+
608
+ logSyncEvent({
609
+ event: 'console.clear_events',
610
+ consoleUserId: c.var.consoleAuth.consoleUserId,
611
+ deletedCount,
612
+ payloadDeletedCount,
613
+ });
614
+
615
+ const result: ConsoleClearEventsResult = { deletedCount };
616
+ return c.json(result, 200);
617
+ }
618
+ );
619
+
620
+ // -------------------------------------------------------------------------
621
+ // POST /events/prune - Prune old events
622
+ // -------------------------------------------------------------------------
623
+
624
+ routes.post(
625
+ '/events/prune',
626
+ describeConsoleRoute({
627
+ summary: 'Prune old events',
628
+ responses: {
629
+ 200: {
630
+ description: 'Prune result',
631
+ content: {
632
+ 'application/json': {
633
+ schema: resolver(ConsolePruneEventsResultSchema),
634
+ },
635
+ },
636
+ },
637
+ 401: {
638
+ description: 'Unauthenticated',
639
+ content: {
640
+ 'application/json': { schema: resolver(ErrorResponseSchema) },
641
+ },
642
+ },
643
+ },
644
+ }),
645
+ async (c) => {
646
+ const pruneResult = await runEventsPrune();
647
+ const deletedCount = pruneResult.totalDeleted;
648
+
649
+ logSyncEvent({
650
+ event: 'console.prune_events',
651
+ consoleUserId: c.var.consoleAuth.consoleUserId,
652
+ deletedCount,
653
+ requestEventsDeleted: pruneResult.requestEventsDeleted,
654
+ operationEventsDeleted: pruneResult.operationEventsDeleted,
655
+ realtimeEventsDeleted: pruneResult.realtimeEventsDeleted,
656
+ payloadDeletedCount: pruneResult.payloadSnapshotsDeleted,
657
+ });
658
+
659
+ const result: ConsolePruneEventsResult = {
660
+ deletedCount,
661
+ requestEventsDeleted: pruneResult.requestEventsDeleted,
662
+ operationEventsDeleted: pruneResult.operationEventsDeleted,
663
+ realtimeEventsDeleted: pruneResult.realtimeEventsDeleted,
664
+ payloadDeletedCount: pruneResult.payloadSnapshotsDeleted,
665
+ };
666
+ return c.json(result, 200);
667
+ }
668
+ );
669
+ }