@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,341 @@
1
+ /**
2
+ * Durable Object-backed scope cache for @syncular/server.
3
+ *
4
+ * This module provides two parts:
5
+ * 1) `createDurableObjectScopeCache()` - cache backend to pass to createSyncServer/createSyncRoutes
6
+ * 2) `ScopeCacheDurableObject` - Durable Object class that stores scope entries in DO storage
7
+ */
8
+
9
+ import { createSyncularErrorResponse } from '@syncular/core';
10
+
11
+ type ScopeValues = Record<string, string | string[]>;
12
+
13
+ interface ScopeCacheContext {
14
+ db: object;
15
+ auth: {
16
+ actorId: string;
17
+ partitionId?: string;
18
+ };
19
+ table: string;
20
+ cacheKey: string;
21
+ }
22
+
23
+ interface ScopeCacheSetContext extends ScopeCacheContext {
24
+ scopes: ScopeValues;
25
+ }
26
+
27
+ interface ScopeCacheBackend {
28
+ name: string;
29
+ get(args: ScopeCacheContext): Promise<ScopeValues | null>;
30
+ set(args: ScopeCacheSetContext): Promise<void>;
31
+ delete?(args: ScopeCacheContext): Promise<void>;
32
+ }
33
+
34
+ const DEFAULT_SCOPE_CACHE_TTL_MS = 60_000;
35
+ const DEFAULT_SCOPE_CACHE_DO_NAME = 'syncular-scope-cache';
36
+ const DEFAULT_SCOPE_CACHE_PATH = '/scope-cache';
37
+ const JSON_HEADERS = { 'content-type': 'application/json' };
38
+
39
+ interface ScopeCacheLookup {
40
+ cacheKey: string;
41
+ partitionId: string;
42
+ actorId: string;
43
+ table: string;
44
+ }
45
+
46
+ type ScopeCacheRequestBody =
47
+ | {
48
+ action: 'get';
49
+ cacheKey: string;
50
+ }
51
+ | {
52
+ action: 'set';
53
+ cacheKey: string;
54
+ scopes: ScopeValues;
55
+ ttlMs: number;
56
+ }
57
+ | {
58
+ action: 'delete';
59
+ cacheKey: string;
60
+ };
61
+
62
+ function cloneScopeValues(scopes: ScopeValues): ScopeValues {
63
+ const cloned: ScopeValues = {};
64
+ for (const [key, value] of Object.entries(scopes)) {
65
+ if (typeof value === 'string') {
66
+ cloned[key] = value;
67
+ continue;
68
+ }
69
+ cloned[key] = [...value];
70
+ }
71
+ return cloned;
72
+ }
73
+
74
+ function isScopeValues(value: unknown): value is ScopeValues {
75
+ if (value === null || typeof value !== 'object' || Array.isArray(value)) {
76
+ return false;
77
+ }
78
+
79
+ for (const scopeValue of Object.values(value)) {
80
+ if (typeof scopeValue === 'string') {
81
+ continue;
82
+ }
83
+ if (
84
+ Array.isArray(scopeValue) &&
85
+ scopeValue.every((entry) => typeof entry === 'string')
86
+ ) {
87
+ continue;
88
+ }
89
+ return false;
90
+ }
91
+ return true;
92
+ }
93
+
94
+ function parseJsonObject(value: string): Record<string, unknown> | null {
95
+ let parsed: unknown;
96
+ try {
97
+ parsed = JSON.parse(value);
98
+ } catch {
99
+ return null;
100
+ }
101
+
102
+ if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
103
+ return null;
104
+ }
105
+
106
+ const out: Record<string, unknown> = {};
107
+ for (const [key, entry] of Object.entries(parsed)) {
108
+ out[key] = entry;
109
+ }
110
+ return out;
111
+ }
112
+
113
+ async function parseRequestBody(
114
+ request: Request
115
+ ): Promise<ScopeCacheRequestBody | null> {
116
+ let body: string;
117
+ try {
118
+ body = await request.text();
119
+ } catch {
120
+ return null;
121
+ }
122
+
123
+ const parsed = parseJsonObject(body);
124
+ if (!parsed) {
125
+ return null;
126
+ }
127
+
128
+ const action = parsed.action;
129
+ const cacheKey = parsed.cacheKey;
130
+ if (typeof action !== 'string' || typeof cacheKey !== 'string') {
131
+ return null;
132
+ }
133
+
134
+ if (action === 'get') {
135
+ return { action: 'get', cacheKey };
136
+ }
137
+
138
+ if (action === 'delete') {
139
+ return { action: 'delete', cacheKey };
140
+ }
141
+
142
+ if (action === 'set') {
143
+ const ttlMs = parsed.ttlMs;
144
+ const scopes = parsed.scopes;
145
+ if (
146
+ typeof ttlMs !== 'number' ||
147
+ Number.isNaN(ttlMs) ||
148
+ !Number.isFinite(ttlMs)
149
+ ) {
150
+ return null;
151
+ }
152
+ if (!isScopeValues(scopes)) {
153
+ return null;
154
+ }
155
+ return {
156
+ action: 'set',
157
+ cacheKey,
158
+ scopes: cloneScopeValues(scopes),
159
+ ttlMs,
160
+ };
161
+ }
162
+
163
+ return null;
164
+ }
165
+
166
+ interface StoredScopeCacheValue {
167
+ scopes: ScopeValues;
168
+ expiresAt: number;
169
+ }
170
+
171
+ /**
172
+ * Durable Object for scope cache entries.
173
+ *
174
+ * Bind this class in your Worker as a separate DO namespace.
175
+ */
176
+ export class ScopeCacheDurableObject {
177
+ private readonly state: DurableObjectState;
178
+
179
+ constructor(state: DurableObjectState, _env: object) {
180
+ this.state = state;
181
+ }
182
+
183
+ async fetch(request: Request): Promise<Response> {
184
+ if (request.method !== 'POST') {
185
+ return Response.json(
186
+ createSyncularErrorResponse('sync.invalid_request', {
187
+ message: 'Method not allowed',
188
+ }),
189
+ { status: 405, headers: { allow: 'POST' } }
190
+ );
191
+ }
192
+
193
+ const payload = await parseRequestBody(request);
194
+ if (!payload) {
195
+ return Response.json(
196
+ createSyncularErrorResponse('sync.invalid_request', {
197
+ message: 'Invalid scope cache request',
198
+ }),
199
+ { status: 400 }
200
+ );
201
+ }
202
+
203
+ if (payload.action === 'get') {
204
+ const entry = await this.state.storage.get<StoredScopeCacheValue>(
205
+ payload.cacheKey
206
+ );
207
+ if (!entry) {
208
+ return Response.json({ scopes: null });
209
+ }
210
+
211
+ if (entry.expiresAt <= Date.now()) {
212
+ await this.state.storage.delete(payload.cacheKey);
213
+ return Response.json({ scopes: null });
214
+ }
215
+
216
+ return Response.json({ scopes: cloneScopeValues(entry.scopes) });
217
+ }
218
+
219
+ if (payload.action === 'set') {
220
+ if (payload.ttlMs <= 0) {
221
+ await this.state.storage.delete(payload.cacheKey);
222
+ return Response.json({ ok: true });
223
+ }
224
+
225
+ await this.state.storage.put(payload.cacheKey, {
226
+ scopes: cloneScopeValues(payload.scopes),
227
+ expiresAt: Date.now() + payload.ttlMs,
228
+ } satisfies StoredScopeCacheValue);
229
+
230
+ return Response.json({ ok: true });
231
+ }
232
+
233
+ await this.state.storage.delete(payload.cacheKey);
234
+ return Response.json({ ok: true });
235
+ }
236
+ }
237
+
238
+ export interface DurableObjectScopeCacheOptions {
239
+ namespace: DurableObjectNamespace;
240
+ ttlMs?: number;
241
+ path?: string;
242
+ getStubId?: (
243
+ namespace: DurableObjectNamespace,
244
+ lookup: ScopeCacheLookup
245
+ ) => DurableObjectId;
246
+ }
247
+
248
+ /**
249
+ * Create a scope cache backend that reads/writes through a Durable Object.
250
+ */
251
+ export function createDurableObjectScopeCache(
252
+ options: DurableObjectScopeCacheOptions
253
+ ): ScopeCacheBackend {
254
+ const ttlMs = options.ttlMs ?? DEFAULT_SCOPE_CACHE_TTL_MS;
255
+ const path = options.path ?? DEFAULT_SCOPE_CACHE_PATH;
256
+ const getStubId =
257
+ options.getStubId ??
258
+ ((namespace: DurableObjectNamespace) =>
259
+ namespace.idFromName(DEFAULT_SCOPE_CACHE_DO_NAME));
260
+
261
+ async function callDurableObject(
262
+ lookup: ScopeCacheLookup,
263
+ body: ScopeCacheRequestBody
264
+ ): Promise<Record<string, unknown>> {
265
+ const id = getStubId(options.namespace, lookup);
266
+ const stub = options.namespace.get(id);
267
+ const response = await stub.fetch(`https://scope-cache${path}`, {
268
+ method: 'POST',
269
+ headers: JSON_HEADERS,
270
+ body: JSON.stringify(body),
271
+ });
272
+
273
+ if (!response.ok) {
274
+ throw new Error(
275
+ `Scope cache durable object request failed: ${response.status}`
276
+ );
277
+ }
278
+
279
+ const parsed = parseJsonObject(await response.text());
280
+ if (!parsed) {
281
+ throw new Error('Scope cache durable object response was not JSON');
282
+ }
283
+
284
+ return parsed;
285
+ }
286
+
287
+ return {
288
+ name: 'durable-object',
289
+ async get(args) {
290
+ const lookup: ScopeCacheLookup = {
291
+ cacheKey: args.cacheKey,
292
+ partitionId: args.auth.partitionId ?? 'default',
293
+ actorId: args.auth.actorId,
294
+ table: args.table,
295
+ };
296
+
297
+ const response = await callDurableObject(lookup, {
298
+ action: 'get',
299
+ cacheKey: args.cacheKey,
300
+ });
301
+ const scopes = response.scopes;
302
+ if (scopes === null || scopes === undefined) {
303
+ return null;
304
+ }
305
+
306
+ if (!isScopeValues(scopes)) {
307
+ return null;
308
+ }
309
+
310
+ return cloneScopeValues(scopes);
311
+ },
312
+ async set(args) {
313
+ const lookup: ScopeCacheLookup = {
314
+ cacheKey: args.cacheKey,
315
+ partitionId: args.auth.partitionId ?? 'default',
316
+ actorId: args.auth.actorId,
317
+ table: args.table,
318
+ };
319
+
320
+ await callDurableObject(lookup, {
321
+ action: 'set',
322
+ cacheKey: args.cacheKey,
323
+ scopes: cloneScopeValues(args.scopes),
324
+ ttlMs,
325
+ });
326
+ },
327
+ async delete(args) {
328
+ const lookup: ScopeCacheLookup = {
329
+ cacheKey: args.cacheKey,
330
+ partitionId: args.auth.partitionId ?? 'default',
331
+ actorId: args.auth.actorId,
332
+ table: args.table,
333
+ };
334
+
335
+ await callDurableObject(lookup, {
336
+ action: 'delete',
337
+ cacheKey: args.cacheKey,
338
+ });
339
+ },
340
+ };
341
+ }
@@ -0,0 +1,230 @@
1
+ import * as Sentry from '@sentry/cloudflare';
2
+ import {
3
+ configureSyncTelemetry,
4
+ type SyncMetricOptions,
5
+ type SyncTelemetry,
6
+ type SyncTelemetryAttributeValue,
7
+ } from '@syncular/core';
8
+ import { createSentrySyncTelemetry } from '@syncular/core/sentry';
9
+
10
+ function toCountMetricOptions(
11
+ options?: SyncMetricOptions
12
+ ): Parameters<typeof Sentry.metrics.count>[2] | undefined {
13
+ if (!options?.attributes) return undefined;
14
+ return { attributes: options.attributes };
15
+ }
16
+
17
+ function toValueMetricOptions(
18
+ options?: SyncMetricOptions
19
+ ): Parameters<typeof Sentry.metrics.gauge>[2] | undefined {
20
+ if (!options) return undefined;
21
+ const hasAttributes = Boolean(options.attributes);
22
+ const hasUnit = Boolean(options.unit);
23
+ if (!hasAttributes && !hasUnit) return undefined;
24
+ return {
25
+ attributes: options.attributes,
26
+ unit: options.unit,
27
+ };
28
+ }
29
+
30
+ export type CloudflareSentryCaptureMessageLevel = Parameters<
31
+ typeof Sentry.captureMessage
32
+ >[1];
33
+
34
+ interface CloudflareSentryCaptureMessageOptions {
35
+ level?: CloudflareSentryCaptureMessageLevel;
36
+ tags?: Record<string, string>;
37
+ }
38
+
39
+ type CloudflareSentryLogLevel =
40
+ | 'trace'
41
+ | 'debug'
42
+ | 'info'
43
+ | 'warn'
44
+ | 'error'
45
+ | 'fatal';
46
+
47
+ interface CloudflareSentryLogOptions {
48
+ level?: CloudflareSentryLogLevel;
49
+ attributes?: Record<string, SyncTelemetryAttributeValue>;
50
+ }
51
+
52
+ function resolveCloudflareLogMethod(
53
+ level: CloudflareSentryLogLevel
54
+ ):
55
+ | ((
56
+ message: string,
57
+ attributes?: Record<string, SyncTelemetryAttributeValue>
58
+ ) => void)
59
+ | null {
60
+ switch (level) {
61
+ case 'trace':
62
+ return Sentry.logger.trace ?? Sentry.logger.debug ?? Sentry.logger.info;
63
+ case 'debug':
64
+ return Sentry.logger.debug ?? Sentry.logger.info;
65
+ case 'info':
66
+ return Sentry.logger.info;
67
+ case 'warn':
68
+ return Sentry.logger.warn ?? Sentry.logger.info;
69
+ case 'error':
70
+ return Sentry.logger.error ?? Sentry.logger.warn ?? Sentry.logger.info;
71
+ case 'fatal':
72
+ return (
73
+ Sentry.logger.fatal ??
74
+ Sentry.logger.error ??
75
+ Sentry.logger.warn ??
76
+ Sentry.logger.info
77
+ );
78
+ default:
79
+ return Sentry.logger.info;
80
+ }
81
+ }
82
+
83
+ /**
84
+ * Re-export Cloudflare Sentry worker wrapper.
85
+ */
86
+ export const withCloudflareSentry = Sentry.withSentry;
87
+ export const instrumentCloudflareDurableObjectWithSentry =
88
+ Sentry.instrumentDurableObjectWithSentry;
89
+
90
+ export interface CloudflareSentryTraceHeaders {
91
+ sentryTrace?: string;
92
+ baggage?: string;
93
+ }
94
+
95
+ /**
96
+ * Read current trace headers from the active Cloudflare Sentry scope.
97
+ */
98
+ export function getCloudflareSentryTraceHeaders(
99
+ traceData: ReturnType<typeof Sentry.getTraceData> = Sentry.getTraceData()
100
+ ): CloudflareSentryTraceHeaders {
101
+ const sentryTrace = traceData['sentry-trace']?.trim();
102
+ const baggage = traceData.baggage?.trim();
103
+ return {
104
+ ...(sentryTrace ? { sentryTrace } : {}),
105
+ ...(baggage ? { baggage } : {}),
106
+ };
107
+ }
108
+
109
+ /**
110
+ * Clone a request and attach active Cloudflare trace headers when available.
111
+ */
112
+ export function attachCloudflareSentryTraceHeaders(
113
+ request: Request,
114
+ traceHeaders: CloudflareSentryTraceHeaders = getCloudflareSentryTraceHeaders()
115
+ ): Request {
116
+ if (!traceHeaders.sentryTrace && !traceHeaders.baggage) {
117
+ return request;
118
+ }
119
+
120
+ const headers = new Headers(request.headers);
121
+ if (traceHeaders.sentryTrace) {
122
+ headers.set('sentry-trace', traceHeaders.sentryTrace);
123
+ }
124
+ if (traceHeaders.baggage) {
125
+ headers.set('baggage', traceHeaders.baggage);
126
+ }
127
+
128
+ return new Request(request, { headers });
129
+ }
130
+
131
+ /**
132
+ * Create a Syncular telemetry backend wired to `@sentry/cloudflare`.
133
+ */
134
+ export function createCloudflareSentryTelemetry(): SyncTelemetry {
135
+ return createSentrySyncTelemetry({
136
+ logger: Sentry.logger,
137
+ startSpan(options, callback) {
138
+ return Sentry.startSpan(options, (span) =>
139
+ callback({
140
+ setAttribute(name, value) {
141
+ span.setAttribute(name, value);
142
+ },
143
+ setAttributes(attributes) {
144
+ span.setAttributes(attributes);
145
+ },
146
+ setStatus(status) {
147
+ span.setStatus({
148
+ code: status === 'ok' ? 1 : 2,
149
+ });
150
+ },
151
+ })
152
+ );
153
+ },
154
+ metrics: {
155
+ count(name, value, options) {
156
+ const metricOptions = toCountMetricOptions(options);
157
+ if (metricOptions) {
158
+ Sentry.metrics.count(name, value, metricOptions);
159
+ return;
160
+ }
161
+ Sentry.metrics.count(name, value);
162
+ },
163
+ gauge(name, value, options) {
164
+ const metricOptions = toValueMetricOptions(options);
165
+ if (metricOptions) {
166
+ Sentry.metrics.gauge(name, value, metricOptions);
167
+ return;
168
+ }
169
+ Sentry.metrics.gauge(name, value);
170
+ },
171
+ distribution(name, value, options) {
172
+ const metricOptions = toValueMetricOptions(options);
173
+ if (metricOptions) {
174
+ Sentry.metrics.distribution(name, value, metricOptions);
175
+ return;
176
+ }
177
+ Sentry.metrics.distribution(name, value);
178
+ },
179
+ },
180
+ captureException(error) {
181
+ Sentry.captureException(error);
182
+ },
183
+ });
184
+ }
185
+
186
+ /**
187
+ * Configure Syncular core telemetry to use the Cloudflare Sentry adapter.
188
+ */
189
+ export function configureCloudflareSentryTelemetry(): SyncTelemetry {
190
+ const telemetry = createCloudflareSentryTelemetry();
191
+ configureSyncTelemetry(telemetry);
192
+ return telemetry;
193
+ }
194
+
195
+ /**
196
+ * Capture a worker message in Sentry with optional tags.
197
+ */
198
+ export function captureCloudflareSentryMessage(
199
+ message: string,
200
+ options?: CloudflareSentryCaptureMessageOptions
201
+ ): void {
202
+ if (!options?.tags || Object.keys(options.tags).length === 0) {
203
+ Sentry.captureMessage(message, options?.level);
204
+ return;
205
+ }
206
+
207
+ Sentry.withScope((scope) => {
208
+ for (const [name, value] of Object.entries(options.tags ?? {})) {
209
+ scope.setTag(name, value);
210
+ }
211
+ Sentry.captureMessage(message, options?.level);
212
+ });
213
+ }
214
+
215
+ /**
216
+ * Emit a Cloudflare Sentry log entry.
217
+ */
218
+ export function logCloudflareSentryMessage(
219
+ message: string,
220
+ options?: CloudflareSentryLogOptions
221
+ ): void {
222
+ const level = options?.level ?? 'info';
223
+ const logMethod = resolveCloudflareLogMethod(level);
224
+ if (!logMethod) return;
225
+ if (!options?.attributes || Object.keys(options.attributes).length === 0) {
226
+ logMethod(message);
227
+ return;
228
+ }
229
+ logMethod(message, options.attributes);
230
+ }
@@ -0,0 +1,77 @@
1
+ /**
2
+ * @syncular/server/cloudflare - Worker handler (polling only)
3
+ *
4
+ * Creates a stateless Cloudflare Worker that serves sync routes via Hono.
5
+ * No WebSocket support — use the Durable Object adapter for realtime.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { createSyncWorker } from '@syncular/server/cloudflare/worker';
10
+ * import { createD1Dialect } from '@syncular/server/d1';
11
+ * import { createSqliteServerDialect } from '@syncular/server/sqlite';
12
+ * import { ensureSyncSchema } from '@syncular/server';
13
+ * import { createSyncServer } from '@syncular/server/hono';
14
+ *
15
+ * type Env = { DB: D1Database };
16
+ *
17
+ * export default createSyncWorker<Env>((app, env) => {
18
+ * const db = createD1Dialect(env.DB);
19
+ * const dialect = createSqliteServerDialect();
20
+ * const { syncRoutes, consoleRoutes } = createSyncServer({
21
+ * db, dialect,
22
+ * sync: {
23
+ * handlers: [tasksHandler],
24
+ * authenticate: async (request) => ({
25
+ * actorId: request.headers.get('x-user-id')!,
26
+ * }),
27
+ * },
28
+ * });
29
+ * app.route('/sync', syncRoutes);
30
+ * if (consoleRoutes) app.route('/console', consoleRoutes);
31
+ * });
32
+ * ```
33
+ */
34
+
35
+ import { Hono } from 'hono';
36
+
37
+ type SyncWorkerSetup<B extends object> = (
38
+ app: Hono<{ Bindings: B }>,
39
+ env: B
40
+ ) => void | Promise<void>;
41
+
42
+ /**
43
+ * Create a Cloudflare Worker export that lazily initializes a Hono app.
44
+ *
45
+ * The `setup` callback is called once per isolate on the first request.
46
+ * It receives a fresh Hono app and the Worker env bindings.
47
+ */
48
+ export function createSyncWorker<
49
+ Bindings extends object = Record<string, unknown>,
50
+ >(setup: SyncWorkerSetup<Bindings>): ExportedHandler<Bindings> {
51
+ type E = { Bindings: Bindings };
52
+ let app: Hono<E> | null = null;
53
+ let initPromise: Promise<void> | null = null;
54
+
55
+ async function getApp(env: Bindings): Promise<Hono<E>> {
56
+ if (app) return app;
57
+ if (!initPromise) {
58
+ const honoApp = new Hono<E>();
59
+ initPromise = Promise.resolve(setup(honoApp, env)).then(() => {
60
+ app = honoApp;
61
+ });
62
+ }
63
+ await initPromise;
64
+ return app!;
65
+ }
66
+
67
+ return {
68
+ async fetch(
69
+ request: Request,
70
+ env: Bindings,
71
+ ctx: ExecutionContext
72
+ ): Promise<Response> {
73
+ const honoApp = await getApp(env);
74
+ return honoApp.fetch(request, env, ctx);
75
+ },
76
+ };
77
+ }