@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
@@ -21,7 +21,8 @@ async function ensureBlobUploadsSchemaPostgres<DB extends SyncBlobUploadsDb>(
21
21
  await db.schema
22
22
  .createTable('sync_blob_uploads')
23
23
  .ifNotExists()
24
- .addColumn('hash', 'text', (col) => col.primaryKey())
24
+ .addColumn('partition_id', 'text', (col) => col.notNull())
25
+ .addColumn('hash', 'text', (col) => col.notNull())
25
26
  .addColumn('size', 'bigint', (col) => col.notNull())
26
27
  .addColumn('mime_type', 'text', (col) => col.notNull())
27
28
  .addColumn('status', 'text', (col) => col.notNull())
@@ -31,20 +32,21 @@ async function ensureBlobUploadsSchemaPostgres<DB extends SyncBlobUploadsDb>(
31
32
  )
32
33
  .addColumn('expires_at', 'timestamptz', (col) => col.notNull())
33
34
  .addColumn('completed_at', 'timestamptz')
35
+ .addPrimaryKeyConstraint('pk_sync_blob_uploads', ['partition_id', 'hash'])
34
36
  .execute();
35
37
 
36
38
  await db.schema
37
39
  .createIndex('idx_sync_blob_uploads_status')
38
40
  .ifNotExists()
39
41
  .on('sync_blob_uploads')
40
- .columns(['status'])
42
+ .columns(['partition_id', 'status'])
41
43
  .execute();
42
44
 
43
45
  await db.schema
44
46
  .createIndex('idx_sync_blob_uploads_expires_at')
45
47
  .ifNotExists()
46
48
  .on('sync_blob_uploads')
47
- .columns(['expires_at'])
49
+ .columns(['partition_id', 'expires_at'])
48
50
  .execute();
49
51
  }
50
52
 
@@ -60,7 +62,8 @@ async function ensureBlobUploadsSchemasSqlite<DB extends SyncBlobUploadsDb>(
60
62
  await db.schema
61
63
  .createTable('sync_blob_uploads')
62
64
  .ifNotExists()
63
- .addColumn('hash', 'text', (col) => col.primaryKey())
65
+ .addColumn('partition_id', 'text', (col) => col.notNull())
66
+ .addColumn('hash', 'text', (col) => col.notNull())
64
67
  .addColumn('size', 'integer', (col) => col.notNull())
65
68
  .addColumn('mime_type', 'text', (col) => col.notNull())
66
69
  .addColumn('status', 'text', (col) => col.notNull())
@@ -70,20 +73,21 @@ async function ensureBlobUploadsSchemasSqlite<DB extends SyncBlobUploadsDb>(
70
73
  )
71
74
  .addColumn('expires_at', 'text', (col) => col.notNull())
72
75
  .addColumn('completed_at', 'text')
76
+ .addPrimaryKeyConstraint('pk_sync_blob_uploads', ['partition_id', 'hash'])
73
77
  .execute();
74
78
 
75
79
  await db.schema
76
80
  .createIndex('idx_sync_blob_uploads_status')
77
81
  .ifNotExists()
78
82
  .on('sync_blob_uploads')
79
- .columns(['status'])
83
+ .columns(['partition_id', 'status'])
80
84
  .execute();
81
85
 
82
86
  await db.schema
83
87
  .createIndex('idx_sync_blob_uploads_expires_at')
84
88
  .ifNotExists()
85
89
  .on('sync_blob_uploads')
86
- .columns(['expires_at'])
90
+ .columns(['partition_id', 'expires_at'])
87
91
  .execute();
88
92
  }
89
93
 
@@ -103,13 +107,15 @@ export async function ensureBlobStorageSchemaPostgres<DB extends SyncBlobDb>(
103
107
  await db.schema
104
108
  .createTable('sync_blobs')
105
109
  .ifNotExists()
106
- .addColumn('hash', 'text', (col) => col.primaryKey())
110
+ .addColumn('partition_id', 'text', (col) => col.notNull())
111
+ .addColumn('hash', 'text', (col) => col.notNull())
107
112
  .addColumn('size', 'bigint', (col) => col.notNull())
108
113
  .addColumn('mime_type', 'text', (col) => col.notNull())
109
114
  .addColumn('body', 'bytea', (col) => col.notNull())
110
115
  .addColumn('created_at', 'timestamptz', (col) =>
111
116
  col.notNull().defaultTo(sql`now()`)
112
117
  )
118
+ .addPrimaryKeyConstraint('pk_sync_blobs', ['partition_id', 'hash'])
113
119
  .execute();
114
120
  }
115
121
 
@@ -129,13 +135,15 @@ export async function ensureBlobStorageSchemaSqlite<DB extends SyncBlobDb>(
129
135
  await db.schema
130
136
  .createTable('sync_blobs')
131
137
  .ifNotExists()
132
- .addColumn('hash', 'text', (col) => col.primaryKey())
138
+ .addColumn('partition_id', 'text', (col) => col.notNull())
139
+ .addColumn('hash', 'text', (col) => col.notNull())
133
140
  .addColumn('size', 'integer', (col) => col.notNull())
134
141
  .addColumn('mime_type', 'text', (col) => col.notNull())
135
142
  .addColumn('body', 'blob', (col) => col.notNull())
136
143
  .addColumn('created_at', 'text', (col) =>
137
144
  col.notNull().defaultTo(sql`(datetime('now'))`)
138
145
  )
146
+ .addPrimaryKeyConstraint('pk_sync_blobs', ['partition_id', 'hash'])
139
147
  .execute();
140
148
  }
141
149
 
@@ -13,6 +13,8 @@ import type { Generated } from 'kysely';
13
13
  * Tracks initiated uploads and their completion status.
14
14
  */
15
15
  export interface SyncBlobUploadsTable {
16
+ /** Partition/tenant namespace */
17
+ partition_id: string;
16
18
  /** SHA-256 hash with prefix: "sha256:<hex>" */
17
19
  hash: string;
18
20
  /** Expected size in bytes */
@@ -44,6 +46,8 @@ export interface SyncBlobUploadsDb {
44
46
  * Stores blob content directly in the database.
45
47
  */
46
48
  export interface SyncBlobsTable {
49
+ /** Partition/tenant namespace */
50
+ partition_id: string;
47
51
  /** SHA-256 hash with prefix: "sha256:<hex>" */
48
52
  hash: string;
49
53
  /** Size in bytes */
@@ -0,0 +1,19 @@
1
+ // Type declarations for bun:sqlite when running tsgo (which doesn't fully support bun-types)
2
+ declare module 'bun:sqlite' {
3
+ export class Database {
4
+ constructor(path: string);
5
+ close(): void;
6
+ exec(sql: string): void;
7
+ query<T = unknown>(sql: string): Statement<T>;
8
+ prepare<T = unknown>(sql: string): Statement<T>;
9
+ transaction<T>(fn: () => T): () => T;
10
+ }
11
+
12
+ export class Statement<T = unknown> {
13
+ run(...params: unknown[]): void;
14
+ get(...params: unknown[]): T | null;
15
+ all(...params: unknown[]): T[];
16
+ values(...params: unknown[]): unknown[][];
17
+ finalize(): void;
18
+ }
19
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @syncular/server/bun-sqlite - Bun SQLite dialect for sync
3
+ *
4
+ * Provides a Kysely dialect for bun:sqlite.
5
+ */
6
+
7
+ import { Database } from 'bun:sqlite';
8
+ import { BunSqliteDialect } from 'kysely-bun-sqlite';
9
+
10
+ export interface BunSqliteOptions {
11
+ /** Path to SQLite database file, or ':memory:' for in-memory */
12
+ path: string;
13
+ }
14
+
15
+ /**
16
+ * Create the Bun SQLite dialect directly.
17
+ *
18
+ * @example
19
+ * const dialect = createBunSqliteDialect({ path: ':memory:' });
20
+ * const db = new Kysely<MyDb>({ dialect });
21
+ */
22
+ export function createBunSqliteDialect(
23
+ options: BunSqliteOptions
24
+ ): BunSqliteDialect {
25
+ const database = new Database(options.path);
26
+ return new BunSqliteDialect({ database });
27
+ }
package/src/clients.ts CHANGED
@@ -15,6 +15,7 @@ export async function recordClientCursor<DB extends SyncCoreDb>(
15
15
  actorId: string;
16
16
  cursor: number;
17
17
  effectiveScopes: ScopeValues;
18
+ realtimeSubscriptions?: unknown;
18
19
  }
19
20
  ): Promise<void> {
20
21
  await dialect.recordClientCursor(db, args);
@@ -0,0 +1,289 @@
1
+ /**
2
+ * @syncular/server/cloudflare - Durable Object handler (WebSocket + polling)
3
+ *
4
+ * Provides a base DurableObject class with Hono routing and WebSocket support.
5
+ * The DO's stateful nature allows it to hold persistent WebSocket connections,
6
+ * bridging Cloudflare's hibernation API to Hono's `upgradeWebSocket` interface.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import { SyncDurableObject, createSyncWorkerWithDO } from '@syncular/server/cloudflare/durable-object';
11
+ * import { createD1Dialect } from '@syncular/server/d1';
12
+ * import { createSqliteServerDialect } from '@syncular/server/sqlite';
13
+ * import { ensureSyncSchema } from '@syncular/server';
14
+ * import { createSyncServer } from '@syncular/server/hono';
15
+ *
16
+ * type Env = { DB: D1Database; SYNC_DO: DurableObjectNamespace };
17
+ *
18
+ * export class SyncDO extends SyncDurableObject<Env> {
19
+ * setup(app, env, upgradeWebSocket) {
20
+ * const db = createD1Dialect(env.DB);
21
+ * const dialect = createSqliteServerDialect();
22
+ * const { syncRoutes, consoleRoutes } = createSyncServer({
23
+ * db, dialect,
24
+ * sync: {
25
+ * handlers: [tasksHandler],
26
+ * authenticate: async (request) => ({
27
+ * actorId: request.headers.get('x-user-id')!,
28
+ * }),
29
+ * },
30
+ * upgradeWebSocket,
31
+ * });
32
+ * app.route('/sync', syncRoutes);
33
+ * if (consoleRoutes) app.route('/console', consoleRoutes);
34
+ * }
35
+ * }
36
+ *
37
+ * // Worker entry — routes all requests to the DO
38
+ * export default createSyncWorkerWithDO<Env>('SYNC_DO');
39
+ * ```
40
+ */
41
+
42
+ import { Hono } from 'hono';
43
+ import type { UpgradeWebSocket, WSEvents } from 'hono/ws';
44
+ import { defineWebSocketHelper, WSContext } from 'hono/ws';
45
+
46
+ // ---------------------------------------------------------------------------
47
+ // WebSocket ↔ Hono bridge
48
+ // ---------------------------------------------------------------------------
49
+
50
+ interface WebSocketTag {
51
+ events: WSEvents<WebSocket>;
52
+ }
53
+
54
+ const STALE_SOCKET_CLOSE_CODE = 1012;
55
+ const STALE_SOCKET_CLOSE_REASON =
56
+ 'WebSocket session expired; reconnect required';
57
+
58
+ /**
59
+ * WeakMap from server-side WebSocket → tag with event handlers.
60
+ * Populated on upgrade, read in webSocketMessage/webSocketClose.
61
+ */
62
+ const socketTags = new WeakMap<WebSocket, WebSocketTag>();
63
+
64
+ function closeStaleSocket(ws: WebSocket): void {
65
+ try {
66
+ ws.close(STALE_SOCKET_CLOSE_CODE, STALE_SOCKET_CLOSE_REASON);
67
+ } catch {
68
+ // ignore
69
+ }
70
+ }
71
+
72
+ function createWSContext(ws: WebSocket): WSContext<WebSocket> {
73
+ return new WSContext<WebSocket>({
74
+ send(data) {
75
+ ws.send(webSocketSendData(data));
76
+ },
77
+ close(code, reason) {
78
+ ws.close(code, reason);
79
+ },
80
+ raw: ws,
81
+ get readyState() {
82
+ return ws.readyState as 0 | 1 | 2 | 3;
83
+ },
84
+ });
85
+ }
86
+
87
+ /**
88
+ * Create an `upgradeWebSocket` function backed by the Durable Object
89
+ * hibernation API (`state.acceptWebSocket`).
90
+ *
91
+ * Each accepted socket is tagged with its Hono `WSEvents` handlers so the
92
+ * DO's `webSocketMessage` / `webSocketClose` callbacks can dispatch to them.
93
+ */
94
+ function createDOUpgradeWebSocket(
95
+ doState: DurableObjectState
96
+ ): UpgradeWebSocket<WebSocket> {
97
+ return defineWebSocketHelper((_c, events) => {
98
+ const pair = new WebSocketPair();
99
+ const [client, server] = Object.values(pair) as [WebSocket, WebSocket];
100
+
101
+ // Accept via hibernation API so the DO can wake on messages
102
+ doState.acceptWebSocket(server);
103
+
104
+ // Tag the server socket so webSocketMessage/webSocketClose can find handlers
105
+ socketTags.set(server, { events: events as WSEvents<WebSocket> });
106
+
107
+ // Fire onOpen synchronously (socket is already accepted)
108
+ const wsCtx = createWSContext(server);
109
+ events.onOpen?.(new Event('open'), wsCtx);
110
+
111
+ return new Response(null, {
112
+ status: 101,
113
+ webSocket: client,
114
+ } as ResponseInit & { webSocket: WebSocket });
115
+ });
116
+ }
117
+
118
+ function webSocketSendData(
119
+ data: string | ArrayBuffer | Uint8Array<ArrayBufferLike>
120
+ ): string | ArrayBuffer {
121
+ if (data instanceof Uint8Array) {
122
+ const buffer = new ArrayBuffer(data.byteLength);
123
+ new Uint8Array(buffer).set(data);
124
+ return buffer;
125
+ }
126
+ return data;
127
+ }
128
+
129
+ // ---------------------------------------------------------------------------
130
+ // SyncDurableObject base class
131
+ // ---------------------------------------------------------------------------
132
+
133
+ /**
134
+ * Base class for a Syncular Durable Object with Hono routing and WebSocket.
135
+ *
136
+ * Subclass and implement `setup()` to configure routes.
137
+ */
138
+ export abstract class SyncDurableObject<
139
+ E extends object = Record<string, unknown>,
140
+ > {
141
+ protected ctx: DurableObjectState;
142
+ protected env: E;
143
+
144
+ private app: Hono<{ Bindings: E }> | null = null;
145
+ private initPromise: Promise<void> | null = null;
146
+ private doUpgradeWebSocket: UpgradeWebSocket<WebSocket>;
147
+
148
+ constructor(ctx: DurableObjectState, env: E) {
149
+ this.ctx = ctx;
150
+ this.env = env;
151
+ this.doUpgradeWebSocket = createDOUpgradeWebSocket(ctx);
152
+ this.closeUntrackedSockets();
153
+ }
154
+
155
+ /**
156
+ * Configure the Hono app with sync routes.
157
+ *
158
+ * Called once when the DO first receives a request.
159
+ * Use `upgradeWebSocket` when creating the sync server to enable realtime.
160
+ */
161
+ abstract setup(
162
+ app: Hono<{ Bindings: E }>,
163
+ env: E,
164
+ upgradeWebSocket: UpgradeWebSocket<WebSocket>
165
+ ): void | Promise<void>;
166
+
167
+ private async getApp(): Promise<Hono<{ Bindings: E }>> {
168
+ if (this.app) return this.app;
169
+ if (!this.initPromise) {
170
+ const honoApp = new Hono<{ Bindings: E }>();
171
+ this.initPromise = Promise.resolve(
172
+ this.setup(honoApp, this.env, this.doUpgradeWebSocket)
173
+ ).then(() => {
174
+ this.app = honoApp;
175
+ });
176
+ }
177
+ await this.initPromise;
178
+ return this.app!;
179
+ }
180
+
181
+ private closeUntrackedSockets(): void {
182
+ const sockets = this.ctx.getWebSockets();
183
+ for (const ws of sockets) {
184
+ if (socketTags.has(ws)) continue;
185
+ closeStaleSocket(ws);
186
+ }
187
+ }
188
+
189
+ /** Handle incoming HTTP requests (and WebSocket upgrades). */
190
+ async fetch(request: Request): Promise<Response> {
191
+ const app = await this.getApp();
192
+ return app.fetch(request, this.env);
193
+ }
194
+
195
+ /** Dispatch incoming WebSocket messages to Hono event handlers. */
196
+ async webSocketMessage(
197
+ ws: WebSocket,
198
+ message: string | ArrayBuffer
199
+ ): Promise<void> {
200
+ const tag = socketTags.get(ws);
201
+ if (!tag?.events.onMessage) {
202
+ closeStaleSocket(ws);
203
+ return;
204
+ }
205
+
206
+ const wsCtx = createWSContext(ws);
207
+ const evt = new MessageEvent('message', { data: message });
208
+ tag.events.onMessage(evt, wsCtx);
209
+ }
210
+
211
+ /** Dispatch WebSocket close events to Hono event handlers. */
212
+ async webSocketClose(
213
+ ws: WebSocket,
214
+ code: number,
215
+ reason: string,
216
+ _wasClean: boolean
217
+ ): Promise<void> {
218
+ const tag = socketTags.get(ws);
219
+ if (!tag?.events.onClose) {
220
+ socketTags.delete(ws);
221
+ return;
222
+ }
223
+
224
+ const wsCtx = createWSContext(ws);
225
+ const evt = new CloseEvent('close', { code, reason });
226
+ tag.events.onClose(evt, wsCtx);
227
+ socketTags.delete(ws);
228
+ }
229
+
230
+ /** Dispatch WebSocket error events to Hono event handlers. */
231
+ async webSocketError(ws: WebSocket, _error: unknown): Promise<void> {
232
+ const tag = socketTags.get(ws);
233
+ if (!tag?.events.onError) {
234
+ closeStaleSocket(ws);
235
+ return;
236
+ }
237
+
238
+ const wsCtx = createWSContext(ws);
239
+ const evt = new Event('error');
240
+ tag.events.onError(evt, wsCtx);
241
+ }
242
+ }
243
+
244
+ // ---------------------------------------------------------------------------
245
+ // Worker → DO router
246
+ // ---------------------------------------------------------------------------
247
+
248
+ /**
249
+ * Create a Worker export that routes all requests to a Durable Object.
250
+ *
251
+ * Uses a single DO instance (derived from a stable ID) to hold all
252
+ * connections. For multi-tenant setups, override `getStubId`.
253
+ *
254
+ * @example
255
+ * ```typescript
256
+ * export default createSyncWorkerWithDO<Env>('SYNC_DO');
257
+ * ```
258
+ */
259
+ export function createSyncWorkerWithDO<E extends object>(
260
+ bindingName: string & keyof E,
261
+ options?: {
262
+ /**
263
+ * Derive a DurableObject ID from the request.
264
+ * Defaults to a single global instance via `idFromName('sync')`.
265
+ */
266
+ getStubId?: (
267
+ ns: DurableObjectNamespace,
268
+ request: Request,
269
+ env: E
270
+ ) => DurableObjectId;
271
+ }
272
+ ): ExportedHandler<E> {
273
+ return {
274
+ async fetch(
275
+ request: Request,
276
+ env: E,
277
+ _ctx: ExecutionContext
278
+ ): Promise<Response> {
279
+ const ns = env[
280
+ bindingName as keyof E
281
+ ] as unknown as DurableObjectNamespace;
282
+ const id = options?.getStubId
283
+ ? options.getStubId(ns, request, env)
284
+ : ns.idFromName('sync');
285
+ const stub = ns.get(id);
286
+ return stub.fetch(request);
287
+ },
288
+ };
289
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @syncular/server/cloudflare - Cloudflare adapters for Syncular
3
+ *
4
+ * Two deployment modes:
5
+ * - Worker (polling only): `@syncular/server/cloudflare/worker`
6
+ * - Durable Object (WebSocket + polling): `@syncular/server/cloudflare/durable-object`
7
+ *
8
+ * Blob storage:
9
+ * - R2 native: `@syncular/server/cloudflare/r2`
10
+ *
11
+ * Scope cache:
12
+ * - Durable Object cache backend: `@syncular/server/cloudflare/scope-cache`
13
+ *
14
+ * Dialect is user-provided:
15
+ * - D1 + SQLite: `@syncular/server/d1` + `@syncular/server/sqlite`
16
+ * - Neon + Postgres: `@syncular/server/neon` + `createNeonServerDialect()` from `@syncular/server/postgres`
17
+ */
18
+
19
+ export * from './durable-object';
20
+ export * from './r2';
21
+ export * from './scope-cache';
22
+ export * from './worker';