@syncular/server 0.0.6-96 → 0.1.1

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 (597) 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 +1 -0
  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 +42 -5
  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/types.d.ts +40 -0
  84. package/dist/dialect/types.d.ts.map +1 -1
  85. package/dist/encrypted-crdt.d.ts +67 -0
  86. package/dist/encrypted-crdt.d.ts.map +1 -0
  87. package/dist/encrypted-crdt.js +426 -0
  88. package/dist/encrypted-crdt.js.map +1 -0
  89. package/dist/errors.d.ts +10 -0
  90. package/dist/errors.d.ts.map +1 -0
  91. package/dist/errors.js +13 -0
  92. package/dist/errors.js.map +1 -0
  93. package/dist/filesystem/index.d.ts +44 -0
  94. package/dist/filesystem/index.d.ts.map +1 -0
  95. package/dist/filesystem/index.js +164 -0
  96. package/dist/filesystem/index.js.map +1 -0
  97. package/dist/handlers/collection.d.ts +11 -3
  98. package/dist/handlers/collection.d.ts.map +1 -1
  99. package/dist/handlers/collection.js +34 -56
  100. package/dist/handlers/collection.js.map +1 -1
  101. package/dist/handlers/create-handler.d.ts +31 -7
  102. package/dist/handlers/create-handler.d.ts.map +1 -1
  103. package/dist/handlers/create-handler.js +332 -115
  104. package/dist/handlers/create-handler.js.map +1 -1
  105. package/dist/handlers/types.d.ts +86 -1
  106. package/dist/handlers/types.d.ts.map +1 -1
  107. package/dist/helpers/conflict.js.map +1 -1
  108. package/dist/helpers/emitted-change.js.map +1 -1
  109. package/dist/helpers/index.d.ts +2 -0
  110. package/dist/helpers/index.d.ts.map +1 -1
  111. package/dist/helpers/index.js +2 -0
  112. package/dist/helpers/index.js.map +1 -1
  113. package/dist/helpers/paginate.js.map +1 -1
  114. package/dist/helpers/scope-authorization.d.ts +7 -0
  115. package/dist/helpers/scope-authorization.d.ts.map +1 -0
  116. package/dist/helpers/scope-authorization.js +19 -0
  117. package/dist/helpers/scope-authorization.js.map +1 -0
  118. package/dist/helpers/scope-commit-index.d.ts +12 -0
  119. package/dist/helpers/scope-commit-index.d.ts.map +1 -0
  120. package/dist/helpers/scope-commit-index.js +35 -0
  121. package/dist/helpers/scope-commit-index.js.map +1 -0
  122. package/dist/helpers/scope-strings.js.map +1 -1
  123. package/dist/hono/api-key-auth.d.ts +49 -0
  124. package/dist/hono/api-key-auth.d.ts.map +1 -0
  125. package/dist/hono/api-key-auth.js +108 -0
  126. package/dist/hono/api-key-auth.js.map +1 -0
  127. package/dist/hono/audit-redaction.d.ts +20 -0
  128. package/dist/hono/audit-redaction.d.ts.map +1 -0
  129. package/dist/hono/audit-redaction.js +85 -0
  130. package/dist/hono/audit-redaction.js.map +1 -0
  131. package/dist/hono/blobs.d.ts +75 -0
  132. package/dist/hono/blobs.d.ts.map +1 -0
  133. package/dist/hono/blobs.js +586 -0
  134. package/dist/hono/blobs.js.map +1 -0
  135. package/dist/hono/console/gateway.d.ts +42 -0
  136. package/dist/hono/console/gateway.d.ts.map +1 -0
  137. package/dist/hono/console/gateway.js +2158 -0
  138. package/dist/hono/console/gateway.js.map +1 -0
  139. package/dist/hono/console/live-auth.d.ts +7 -0
  140. package/dist/hono/console/live-auth.d.ts.map +1 -0
  141. package/dist/hono/console/live-auth.js +39 -0
  142. package/dist/hono/console/live-auth.js.map +1 -0
  143. package/dist/hono/console/route-descriptor.d.ts +6 -0
  144. package/dist/hono/console/route-descriptor.d.ts.map +1 -0
  145. package/dist/hono/console/route-descriptor.js +16 -0
  146. package/dist/hono/console/route-descriptor.js.map +1 -0
  147. package/dist/hono/console/routes/api-keys.d.ts +8 -0
  148. package/dist/hono/console/routes/api-keys.d.ts.map +1 -0
  149. package/dist/hono/console/routes/api-keys.js +575 -0
  150. package/dist/hono/console/routes/api-keys.js.map +1 -0
  151. package/dist/hono/console/routes/clients.d.ts +8 -0
  152. package/dist/hono/console/routes/clients.d.ts.map +1 -0
  153. package/dist/hono/console/routes/clients.js +322 -0
  154. package/dist/hono/console/routes/clients.js.map +1 -0
  155. package/dist/hono/console/routes/commits.d.ts +8 -0
  156. package/dist/hono/console/routes/commits.d.ts.map +1 -0
  157. package/dist/hono/console/routes/commits.js +882 -0
  158. package/dist/hono/console/routes/commits.js.map +1 -0
  159. package/dist/hono/console/routes/context.d.ts +188 -0
  160. package/dist/hono/console/routes/context.d.ts.map +1 -0
  161. package/dist/hono/console/routes/context.js +633 -0
  162. package/dist/hono/console/routes/context.js.map +1 -0
  163. package/dist/hono/console/routes/events.d.ts +8 -0
  164. package/dist/hono/console/routes/events.d.ts.map +1 -0
  165. package/dist/hono/console/routes/events.js +501 -0
  166. package/dist/hono/console/routes/events.js.map +1 -0
  167. package/dist/hono/console/routes/maintenance.d.ts +8 -0
  168. package/dist/hono/console/routes/maintenance.d.ts.map +1 -0
  169. package/dist/hono/console/routes/maintenance.js +341 -0
  170. package/dist/hono/console/routes/maintenance.js.map +1 -0
  171. package/dist/hono/console/routes/shared.d.ts +174 -0
  172. package/dist/hono/console/routes/shared.d.ts.map +1 -0
  173. package/dist/hono/console/routes/shared.js +583 -0
  174. package/dist/hono/console/routes/shared.js.map +1 -0
  175. package/dist/hono/console/routes/stats.d.ts +8 -0
  176. package/dist/hono/console/routes/stats.d.ts.map +1 -0
  177. package/dist/hono/console/routes/stats.js +295 -0
  178. package/dist/hono/console/routes/stats.js.map +1 -0
  179. package/dist/hono/console/routes/storage.d.ts +8 -0
  180. package/dist/hono/console/routes/storage.d.ts.map +1 -0
  181. package/dist/hono/console/routes/storage.js +121 -0
  182. package/dist/hono/console/routes/storage.js.map +1 -0
  183. package/dist/hono/console/routes.d.ts +36 -0
  184. package/dist/hono/console/routes.d.ts.map +1 -0
  185. package/dist/hono/console/routes.js +112 -0
  186. package/dist/hono/console/routes.js.map +1 -0
  187. package/dist/hono/console/schema-errors.d.ts +2 -0
  188. package/dist/hono/console/schema-errors.d.ts.map +1 -0
  189. package/dist/hono/console/schema-errors.js +17 -0
  190. package/dist/hono/console/schema-errors.js.map +1 -0
  191. package/dist/hono/console/schemas.d.ts +1515 -0
  192. package/dist/hono/console/schemas.d.ts.map +1 -0
  193. package/dist/hono/console/schemas.js +661 -0
  194. package/dist/hono/console/schemas.js.map +1 -0
  195. package/dist/hono/console/types.d.ts +213 -0
  196. package/dist/hono/console/types.d.ts.map +1 -0
  197. package/dist/hono/console/types.js +2 -0
  198. package/dist/hono/console/types.js.map +1 -0
  199. package/dist/hono/console/ui.d.ts +38 -0
  200. package/dist/hono/console/ui.d.ts.map +1 -0
  201. package/dist/hono/console/ui.js +43 -0
  202. package/dist/hono/console/ui.js.map +1 -0
  203. package/dist/hono/create-server.d.ts +71 -0
  204. package/dist/hono/create-server.d.ts.map +1 -0
  205. package/dist/hono/create-server.js +121 -0
  206. package/dist/hono/create-server.js.map +1 -0
  207. package/dist/hono/errors.d.ts +13 -0
  208. package/dist/hono/errors.d.ts.map +1 -0
  209. package/dist/hono/errors.js +21 -0
  210. package/dist/hono/errors.js.map +1 -0
  211. package/dist/hono/index.d.ts +20 -0
  212. package/dist/hono/index.d.ts.map +1 -0
  213. package/dist/hono/index.js +31 -0
  214. package/dist/hono/index.js.map +1 -0
  215. package/dist/hono/openapi.d.ts +72 -0
  216. package/dist/hono/openapi.d.ts.map +1 -0
  217. package/dist/hono/openapi.js +99 -0
  218. package/dist/hono/openapi.js.map +1 -0
  219. package/dist/hono/proxy/connection-manager.d.ts +78 -0
  220. package/dist/hono/proxy/connection-manager.d.ts.map +1 -0
  221. package/dist/hono/proxy/connection-manager.js +251 -0
  222. package/dist/hono/proxy/connection-manager.js.map +1 -0
  223. package/dist/hono/proxy/index.d.ts +8 -0
  224. package/dist/hono/proxy/index.d.ts.map +1 -0
  225. package/dist/hono/proxy/index.js +8 -0
  226. package/dist/hono/proxy/index.js.map +1 -0
  227. package/dist/hono/proxy/routes.d.ts +86 -0
  228. package/dist/hono/proxy/routes.d.ts.map +1 -0
  229. package/dist/hono/proxy/routes.js +183 -0
  230. package/dist/hono/proxy/routes.js.map +1 -0
  231. package/dist/hono/rate-limit.d.ts +101 -0
  232. package/dist/hono/rate-limit.d.ts.map +1 -0
  233. package/dist/hono/rate-limit.js +184 -0
  234. package/dist/hono/rate-limit.js.map +1 -0
  235. package/dist/hono/realtime-sync-packs.d.ts +43 -0
  236. package/dist/hono/realtime-sync-packs.d.ts.map +1 -0
  237. package/dist/hono/realtime-sync-packs.js +219 -0
  238. package/dist/hono/realtime-sync-packs.js.map +1 -0
  239. package/dist/hono/routes/audit.d.ts +12 -0
  240. package/dist/hono/routes/audit.d.ts.map +1 -0
  241. package/dist/hono/routes/audit.js +385 -0
  242. package/dist/hono/routes/audit.js.map +1 -0
  243. package/dist/hono/routes/auth-leases.d.ts +8 -0
  244. package/dist/hono/routes/auth-leases.d.ts.map +1 -0
  245. package/dist/hono/routes/auth-leases.js +88 -0
  246. package/dist/hono/routes/auth-leases.js.map +1 -0
  247. package/dist/hono/routes/combined.d.ts +8 -0
  248. package/dist/hono/routes/combined.d.ts.map +1 -0
  249. package/dist/hono/routes/combined.js +392 -0
  250. package/dist/hono/routes/combined.js.map +1 -0
  251. package/dist/hono/routes/context.d.ts +314 -0
  252. package/dist/hono/routes/context.d.ts.map +1 -0
  253. package/dist/hono/routes/context.js +1147 -0
  254. package/dist/hono/routes/context.js.map +1 -0
  255. package/dist/hono/routes/health.d.ts +8 -0
  256. package/dist/hono/routes/health.d.ts.map +1 -0
  257. package/dist/hono/routes/health.js +16 -0
  258. package/dist/hono/routes/health.js.map +1 -0
  259. package/dist/hono/routes/realtime.d.ts +9 -0
  260. package/dist/hono/routes/realtime.d.ts.map +1 -0
  261. package/dist/hono/routes/realtime.js +626 -0
  262. package/dist/hono/routes/realtime.js.map +1 -0
  263. package/dist/hono/routes/shared.d.ts +689 -0
  264. package/dist/hono/routes/shared.d.ts.map +1 -0
  265. package/dist/hono/routes/shared.js +972 -0
  266. package/dist/hono/routes/shared.js.map +1 -0
  267. package/dist/hono/routes/snapshots.d.ts +10 -0
  268. package/dist/hono/routes/snapshots.d.ts.map +1 -0
  269. package/dist/hono/routes/snapshots.js +281 -0
  270. package/dist/hono/routes/snapshots.js.map +1 -0
  271. package/dist/hono/routes.d.ts +19 -0
  272. package/dist/hono/routes.d.ts.map +1 -0
  273. package/dist/hono/routes.js +37 -0
  274. package/dist/hono/routes.js.map +1 -0
  275. package/dist/hono/validation.d.ts +5 -0
  276. package/dist/hono/validation.d.ts.map +1 -0
  277. package/dist/hono/validation.js +47 -0
  278. package/dist/hono/validation.js.map +1 -0
  279. package/dist/hono/websocket-origin.d.ts +9 -0
  280. package/dist/hono/websocket-origin.d.ts.map +1 -0
  281. package/dist/hono/websocket-origin.js +96 -0
  282. package/dist/hono/websocket-origin.js.map +1 -0
  283. package/dist/hono/ws.d.ts +341 -0
  284. package/dist/hono/ws.d.ts.map +1 -0
  285. package/dist/hono/ws.js +711 -0
  286. package/dist/hono/ws.js.map +1 -0
  287. package/dist/index.d.ts +6 -0
  288. package/dist/index.d.ts.map +1 -1
  289. package/dist/index.js +6 -0
  290. package/dist/index.js.map +1 -1
  291. package/dist/libsql.d.ts +29 -0
  292. package/dist/libsql.d.ts.map +1 -0
  293. package/dist/libsql.js +25 -0
  294. package/dist/libsql.js.map +1 -0
  295. package/dist/migrate.js.map +1 -1
  296. package/dist/neon.d.ts +21 -0
  297. package/dist/neon.d.ts.map +1 -0
  298. package/dist/neon.js +22 -0
  299. package/dist/neon.js.map +1 -0
  300. package/dist/notify.d.ts +30 -0
  301. package/dist/notify.d.ts.map +1 -1
  302. package/dist/notify.js +160 -41
  303. package/dist/notify.js.map +1 -1
  304. package/dist/pglite.d.ts +37 -0
  305. package/dist/pglite.d.ts.map +1 -0
  306. package/dist/pglite.js +37 -0
  307. package/dist/pglite.js.map +1 -0
  308. package/dist/plugins/index.d.ts +2 -0
  309. package/dist/plugins/index.d.ts.map +1 -0
  310. package/dist/plugins/index.js +2 -0
  311. package/dist/plugins/index.js.map +1 -0
  312. package/dist/plugins/types.d.ts +73 -0
  313. package/dist/plugins/types.d.ts.map +1 -0
  314. package/dist/plugins/types.js +30 -0
  315. package/dist/plugins/types.js.map +1 -0
  316. package/dist/postgres/index.d.ts +68 -0
  317. package/dist/postgres/index.d.ts.map +1 -0
  318. package/dist/postgres/index.js +924 -0
  319. package/dist/postgres/index.js.map +1 -0
  320. package/dist/proxy/collection.d.ts +0 -2
  321. package/dist/proxy/collection.d.ts.map +1 -1
  322. package/dist/proxy/collection.js +2 -17
  323. package/dist/proxy/collection.js.map +1 -1
  324. package/dist/proxy/handler.d.ts +1 -1
  325. package/dist/proxy/handler.d.ts.map +1 -1
  326. package/dist/proxy/handler.js +1 -2
  327. package/dist/proxy/handler.js.map +1 -1
  328. package/dist/proxy/index.d.ts +1 -1
  329. package/dist/proxy/index.d.ts.map +1 -1
  330. package/dist/proxy/index.js +1 -1
  331. package/dist/proxy/index.js.map +1 -1
  332. package/dist/proxy/mutation-detector.js.map +1 -1
  333. package/dist/proxy/oplog.d.ts.map +1 -1
  334. package/dist/proxy/oplog.js +32 -8
  335. package/dist/proxy/oplog.js.map +1 -1
  336. package/dist/prune.d.ts +8 -1
  337. package/dist/prune.d.ts.map +1 -1
  338. package/dist/prune.js +68 -28
  339. package/dist/prune.js.map +1 -1
  340. package/dist/pull.d.ts +31 -0
  341. package/dist/pull.d.ts.map +1 -1
  342. package/dist/pull.js +1011 -471
  343. package/dist/pull.js.map +1 -1
  344. package/dist/push.d.ts +36 -2
  345. package/dist/push.d.ts.map +1 -1
  346. package/dist/push.js +603 -358
  347. package/dist/push.js.map +1 -1
  348. package/dist/realtime/in-memory.js.map +1 -1
  349. package/dist/realtime/index.d.ts +2 -1
  350. package/dist/realtime/index.d.ts.map +1 -1
  351. package/dist/realtime/index.js +1 -0
  352. package/dist/realtime/index.js.map +1 -1
  353. package/dist/realtime/types.d.ts +12 -0
  354. package/dist/realtime/types.d.ts.map +1 -1
  355. package/dist/realtime/types.js +13 -1
  356. package/dist/realtime/types.js.map +1 -1
  357. package/dist/relay/client-role/forward-engine.d.ts +63 -0
  358. package/dist/relay/client-role/forward-engine.d.ts.map +1 -0
  359. package/dist/relay/client-role/forward-engine.js +267 -0
  360. package/dist/relay/client-role/forward-engine.js.map +1 -0
  361. package/dist/relay/client-role/index.d.ts +9 -0
  362. package/dist/relay/client-role/index.d.ts.map +1 -0
  363. package/dist/relay/client-role/index.js +9 -0
  364. package/dist/relay/client-role/index.js.map +1 -0
  365. package/dist/relay/client-role/pull-engine.d.ts +72 -0
  366. package/dist/relay/client-role/pull-engine.d.ts.map +1 -0
  367. package/dist/relay/client-role/pull-engine.js +249 -0
  368. package/dist/relay/client-role/pull-engine.js.map +1 -0
  369. package/dist/relay/client-role/sequence-mapper.d.ts +65 -0
  370. package/dist/relay/client-role/sequence-mapper.d.ts.map +1 -0
  371. package/dist/relay/client-role/sequence-mapper.js +161 -0
  372. package/dist/relay/client-role/sequence-mapper.js.map +1 -0
  373. package/dist/relay/evaluation/relay-paths.d.ts +41 -0
  374. package/dist/relay/evaluation/relay-paths.d.ts.map +1 -0
  375. package/dist/relay/evaluation/relay-paths.js +504 -0
  376. package/dist/relay/evaluation/relay-paths.js.map +1 -0
  377. package/dist/relay/evaluation/rust-boundary.d.ts +47 -0
  378. package/dist/relay/evaluation/rust-boundary.d.ts.map +1 -0
  379. package/dist/relay/evaluation/rust-boundary.js +220 -0
  380. package/dist/relay/evaluation/rust-boundary.js.map +1 -0
  381. package/dist/relay/index.d.ts +37 -0
  382. package/dist/relay/index.d.ts.map +1 -0
  383. package/dist/relay/index.js +44 -0
  384. package/dist/relay/index.js.map +1 -0
  385. package/dist/relay/migrate.d.ts +18 -0
  386. package/dist/relay/migrate.d.ts.map +1 -0
  387. package/dist/relay/migrate.js +99 -0
  388. package/dist/relay/migrate.js.map +1 -0
  389. package/dist/relay/mode-manager.d.ts +60 -0
  390. package/dist/relay/mode-manager.d.ts.map +1 -0
  391. package/dist/relay/mode-manager.js +114 -0
  392. package/dist/relay/mode-manager.js.map +1 -0
  393. package/dist/relay/realtime.d.ts +90 -0
  394. package/dist/relay/realtime.d.ts.map +1 -0
  395. package/dist/relay/realtime.js +147 -0
  396. package/dist/relay/realtime.js.map +1 -0
  397. package/dist/relay/relay.d.ts +190 -0
  398. package/dist/relay/relay.d.ts.map +1 -0
  399. package/dist/relay/relay.js +320 -0
  400. package/dist/relay/relay.js.map +1 -0
  401. package/dist/relay/schema.d.ts +158 -0
  402. package/dist/relay/schema.d.ts.map +1 -0
  403. package/dist/relay/schema.js +7 -0
  404. package/dist/relay/schema.js.map +1 -0
  405. package/dist/relay/server-role/index.d.ts +56 -0
  406. package/dist/relay/server-role/index.d.ts.map +1 -0
  407. package/dist/relay/server-role/index.js +193 -0
  408. package/dist/relay/server-role/index.js.map +1 -0
  409. package/dist/relay/server-role/pull.d.ts +27 -0
  410. package/dist/relay/server-role/pull.d.ts.map +1 -0
  411. package/dist/relay/server-role/pull.js +24 -0
  412. package/dist/relay/server-role/pull.js.map +1 -0
  413. package/dist/relay/server-role/push.d.ts +29 -0
  414. package/dist/relay/server-role/push.d.ts.map +1 -0
  415. package/dist/relay/server-role/push.js +122 -0
  416. package/dist/relay/server-role/push.js.map +1 -0
  417. package/dist/s3/index.d.ts +83 -0
  418. package/dist/s3/index.d.ts.map +1 -0
  419. package/dist/s3/index.js +223 -0
  420. package/dist/s3/index.js.map +1 -0
  421. package/dist/schema.d.ts +137 -1
  422. package/dist/schema.d.ts.map +1 -1
  423. package/dist/schema.js +1 -0
  424. package/dist/schema.js.map +1 -1
  425. package/dist/service-worker/index.d.ts +114 -0
  426. package/dist/service-worker/index.d.ts.map +1 -0
  427. package/dist/service-worker/index.js +487 -0
  428. package/dist/service-worker/index.js.map +1 -0
  429. package/dist/snapshot-artifacts/sqlite-bun.d.ts +15 -0
  430. package/dist/snapshot-artifacts/sqlite-bun.d.ts.map +1 -0
  431. package/dist/snapshot-artifacts/sqlite-bun.js +128 -0
  432. package/dist/snapshot-artifacts/sqlite-bun.js.map +1 -0
  433. package/dist/snapshot-artifacts.d.ts +206 -0
  434. package/dist/snapshot-artifacts.d.ts.map +1 -0
  435. package/dist/snapshot-artifacts.js +545 -0
  436. package/dist/snapshot-artifacts.js.map +1 -0
  437. package/dist/snapshot-chunks/db-metadata.d.ts +18 -0
  438. package/dist/snapshot-chunks/db-metadata.d.ts.map +1 -1
  439. package/dist/snapshot-chunks/db-metadata.js +91 -63
  440. package/dist/snapshot-chunks/db-metadata.js.map +1 -1
  441. package/dist/snapshot-chunks/types.d.ts +2 -0
  442. package/dist/snapshot-chunks/types.d.ts.map +1 -1
  443. package/dist/snapshot-chunks.d.ts +33 -3
  444. package/dist/snapshot-chunks.d.ts.map +1 -1
  445. package/dist/snapshot-chunks.js +136 -55
  446. package/dist/snapshot-chunks.js.map +1 -1
  447. package/dist/sqlite/index.d.ts +53 -0
  448. package/dist/sqlite/index.d.ts.map +1 -0
  449. package/dist/sqlite/index.js +795 -0
  450. package/dist/sqlite/index.js.map +1 -0
  451. package/dist/sqlite3.d.ts +22 -0
  452. package/dist/sqlite3.d.ts.map +1 -0
  453. package/dist/sqlite3.js +99 -0
  454. package/dist/sqlite3.js.map +1 -0
  455. package/dist/stats.d.ts +8 -0
  456. package/dist/stats.d.ts.map +1 -1
  457. package/dist/stats.js +45 -13
  458. package/dist/stats.js.map +1 -1
  459. package/dist/subscriptions/cache.d.ts +3 -0
  460. package/dist/subscriptions/cache.d.ts.map +1 -1
  461. package/dist/subscriptions/cache.js +44 -0
  462. package/dist/subscriptions/cache.js.map +1 -1
  463. package/dist/subscriptions/resolve.d.ts +3 -1
  464. package/dist/subscriptions/resolve.d.ts.map +1 -1
  465. package/dist/subscriptions/resolve.js +90 -51
  466. package/dist/subscriptions/resolve.js.map +1 -1
  467. package/dist/sync.d.ts +3 -0
  468. package/dist/sync.d.ts.map +1 -1
  469. package/dist/sync.js +8 -4
  470. package/dist/sync.js.map +1 -1
  471. package/package.json +296 -7
  472. package/src/auth-leases.ts +649 -0
  473. package/src/better-sqlite3.ts +35 -0
  474. package/src/blobs/access.ts +244 -0
  475. package/src/blobs/adapters/database.ts +125 -43
  476. package/src/blobs/index.ts +1 -0
  477. package/src/blobs/manager.ts +366 -65
  478. package/src/blobs/migrate.ts +16 -8
  479. package/src/blobs/types.ts +4 -0
  480. package/src/bun-sqlite-ambient.d.ts +19 -0
  481. package/src/bun-sqlite.ts +27 -0
  482. package/src/clients.ts +1 -0
  483. package/src/cloudflare/durable-object.ts +289 -0
  484. package/src/cloudflare/index.ts +22 -0
  485. package/src/cloudflare/r2.ts +526 -0
  486. package/src/cloudflare/scope-cache.ts +341 -0
  487. package/src/cloudflare/sentry.ts +230 -0
  488. package/src/cloudflare/worker.ts +77 -0
  489. package/src/commit-integrity.ts +371 -0
  490. package/src/crdt-yjs/index.ts +931 -0
  491. package/src/d1.ts +16 -0
  492. package/src/dialect/base.ts +71 -5
  493. package/src/dialect/helpers.ts +31 -0
  494. package/src/dialect/types.ts +47 -0
  495. package/src/encrypted-crdt.ts +786 -0
  496. package/src/errors.ts +22 -0
  497. package/src/filesystem/index.ts +262 -0
  498. package/src/handlers/collection.ts +78 -78
  499. package/src/handlers/create-handler.ts +540 -147
  500. package/src/handlers/types.ts +116 -0
  501. package/src/helpers/index.ts +2 -0
  502. package/src/helpers/scope-authorization.ts +27 -0
  503. package/src/helpers/scope-commit-index.ts +52 -0
  504. package/src/hono/api-key-auth.ts +177 -0
  505. package/src/hono/audit-redaction.ts +135 -0
  506. package/src/hono/blobs.ts +851 -0
  507. package/src/hono/console/gateway.ts +3046 -0
  508. package/src/hono/console/live-auth.ts +46 -0
  509. package/src/hono/console/route-descriptor.ts +22 -0
  510. package/src/hono/console/routes/api-keys.ts +721 -0
  511. package/src/hono/console/routes/clients.ts +447 -0
  512. package/src/hono/console/routes/commits.ts +1137 -0
  513. package/src/hono/console/routes/context.ts +956 -0
  514. package/src/hono/console/routes/events.ts +669 -0
  515. package/src/hono/console/routes/maintenance.ts +461 -0
  516. package/src/hono/console/routes/shared.ts +816 -0
  517. package/src/hono/console/routes/stats.ts +392 -0
  518. package/src/hono/console/routes/storage.ts +159 -0
  519. package/src/hono/console/routes.ts +146 -0
  520. package/src/hono/console/schema-errors.ts +23 -0
  521. package/src/hono/console/schemas.ts +914 -0
  522. package/src/hono/console/types.ts +223 -0
  523. package/src/hono/console/ui.ts +100 -0
  524. package/src/hono/create-server.ts +230 -0
  525. package/src/hono/errors.ts +50 -0
  526. package/src/hono/index.ts +54 -0
  527. package/src/hono/openapi.ts +139 -0
  528. package/src/hono/proxy/connection-manager.ts +340 -0
  529. package/src/hono/proxy/index.ts +8 -0
  530. package/src/hono/proxy/routes.ts +272 -0
  531. package/src/hono/rate-limit.ts +319 -0
  532. package/src/hono/realtime-sync-packs.ts +354 -0
  533. package/src/hono/routes/audit.ts +499 -0
  534. package/src/hono/routes/auth-leases.ts +119 -0
  535. package/src/hono/routes/combined.ts +583 -0
  536. package/src/hono/routes/context.ts +1629 -0
  537. package/src/hono/routes/health.ts +26 -0
  538. package/src/hono/routes/realtime.ts +808 -0
  539. package/src/hono/routes/shared.ts +1626 -0
  540. package/src/hono/routes/snapshots.ts +345 -0
  541. package/src/hono/routes.ts +68 -0
  542. package/src/hono/validation.ts +81 -0
  543. package/src/hono/websocket-origin.ts +131 -0
  544. package/src/hono/ws.ts +1134 -0
  545. package/src/index.ts +6 -0
  546. package/src/libsql.ts +51 -0
  547. package/src/neon.ts +28 -0
  548. package/src/notify.ts +224 -44
  549. package/src/pglite.ts +68 -0
  550. package/src/plugins/index.ts +1 -0
  551. package/src/plugins/types.ts +144 -0
  552. package/src/postgres/index.ts +1291 -0
  553. package/src/proxy/collection.ts +5 -27
  554. package/src/proxy/handler.ts +2 -2
  555. package/src/proxy/index.ts +0 -2
  556. package/src/proxy/oplog.ts +41 -10
  557. package/src/prune.ts +137 -36
  558. package/src/pull.ts +1504 -591
  559. package/src/push.ts +881 -443
  560. package/src/realtime/index.ts +2 -0
  561. package/src/realtime/types.ts +35 -0
  562. package/src/relay/bun-types.d.ts +50 -0
  563. package/src/relay/client-role/forward-engine.ts +355 -0
  564. package/src/relay/client-role/index.ts +9 -0
  565. package/src/relay/client-role/pull-engine.ts +329 -0
  566. package/src/relay/client-role/sequence-mapper.ts +201 -0
  567. package/src/relay/evaluation/relay-paths.ts +699 -0
  568. package/src/relay/evaluation/rust-boundary.ts +464 -0
  569. package/src/relay/index.ts +50 -0
  570. package/src/relay/migrate.ts +113 -0
  571. package/src/relay/mode-manager.ts +142 -0
  572. package/src/relay/realtime.ts +207 -0
  573. package/src/relay/relay.ts +431 -0
  574. package/src/relay/schema.ts +171 -0
  575. package/src/relay/server-role/index.ts +338 -0
  576. package/src/relay/server-role/pull.ts +43 -0
  577. package/src/relay/server-role/push.ts +164 -0
  578. package/src/s3/index.ts +346 -0
  579. package/src/schema.ts +141 -1
  580. package/src/service-worker/index.ts +773 -0
  581. package/src/snapshot-artifacts/sqlite-bun.ts +168 -0
  582. package/src/snapshot-artifacts.ts +896 -0
  583. package/src/snapshot-chunks/db-metadata.ts +131 -72
  584. package/src/snapshot-chunks/types.ts +2 -0
  585. package/src/snapshot-chunks.ts +194 -70
  586. package/src/sqlite/index.ts +1064 -0
  587. package/src/sqlite3.ts +137 -0
  588. package/src/stats.ts +76 -13
  589. package/src/subscriptions/cache.ts +58 -0
  590. package/src/subscriptions/resolve.ts +99 -58
  591. package/src/sync.ts +16 -6
  592. package/src/blobs/adapters/database.test.ts +0 -67
  593. package/src/notify.test.ts +0 -520
  594. package/src/proxy/handler.test.ts +0 -126
  595. package/src/proxy/mutation-detector.test.ts +0 -71
  596. package/src/snapshot-chunks/db-metadata.test.ts +0 -172
  597. package/src/subscriptions/resolve.test.ts +0 -180
@@ -0,0 +1,244 @@
1
+ import { collectScopeVars, type ScopeValues } from '@syncular/core';
2
+ import { type Kysely, sql } from 'kysely';
3
+ import type { ServerTableHandler, SyncServerAuth } from '../handlers/types';
4
+ import { rowScopesAllowed } from '../helpers/scope-authorization';
5
+ import type { SyncCoreDb } from '../schema';
6
+
7
+ export type ScopedBlobAccessDecisionReason =
8
+ | 'allowed'
9
+ | 'handler_missing'
10
+ | 'missing_reference'
11
+ | 'resolve_scopes_failed'
12
+ | 'scope_denied';
13
+
14
+ export interface ScopedBlobAccessDecision {
15
+ actorId: string;
16
+ partitionId: string;
17
+ hash: string;
18
+ allowed: boolean;
19
+ reason: ScopedBlobAccessDecisionReason;
20
+ table?: string;
21
+ column?: string;
22
+ rowId?: string;
23
+ }
24
+
25
+ export interface ScopedBlobReferenceTable {
26
+ table: string;
27
+ blobColumns: readonly string[];
28
+ primaryKeyColumn?: string;
29
+ candidateLimit?: number;
30
+ }
31
+
32
+ export interface CreateScopedBlobAccessCheckerOptions<
33
+ DB extends SyncCoreDb = SyncCoreDb,
34
+ Auth extends SyncServerAuth = SyncServerAuth,
35
+ > {
36
+ db: Kysely<DB>;
37
+ handlers: readonly ServerTableHandler<DB, Auth>[];
38
+ references: readonly ScopedBlobReferenceTable[];
39
+ candidateLimit?: number;
40
+ onDecision?: (decision: ScopedBlobAccessDecision) => void;
41
+ }
42
+
43
+ export interface ScopedBlobAccessRequest<Auth extends SyncServerAuth> {
44
+ actorId: string;
45
+ partitionId: string;
46
+ hash: string;
47
+ auth?: Auth;
48
+ }
49
+
50
+ export function createScopedBlobAccessChecker<
51
+ DB extends SyncCoreDb,
52
+ Auth extends SyncServerAuth = SyncServerAuth,
53
+ >(
54
+ options: CreateScopedBlobAccessCheckerOptions<DB, Auth>
55
+ ): (request: ScopedBlobAccessRequest<Auth>) => Promise<boolean> {
56
+ const handlersByTable = new Map(
57
+ options.handlers.map((handler) => [handler.table, handler])
58
+ );
59
+ const candidateLimit = options.candidateLimit ?? 100;
60
+
61
+ const emit = (decision: ScopedBlobAccessDecision): void => {
62
+ options.onDecision?.(decision);
63
+ };
64
+
65
+ return async (request) => {
66
+ let deniedDecision: ScopedBlobAccessDecision | null = null;
67
+ let configurationDecision: ScopedBlobAccessDecision | null = null;
68
+
69
+ for (const reference of options.references) {
70
+ if (reference.blobColumns.length === 0) continue;
71
+
72
+ const rows = await readBlobReferenceCandidateRows({
73
+ db: options.db,
74
+ table: reference.table,
75
+ columns: reference.blobColumns,
76
+ hash: request.hash,
77
+ limit: reference.candidateLimit ?? candidateLimit,
78
+ });
79
+ if (rows.length === 0) {
80
+ continue;
81
+ }
82
+
83
+ const handler = handlersByTable.get(reference.table);
84
+ if (!handler) {
85
+ configurationDecision ??= {
86
+ ...request,
87
+ allowed: false,
88
+ reason: 'handler_missing',
89
+ table: reference.table,
90
+ };
91
+ continue;
92
+ }
93
+
94
+ const allowedScopes = await resolveBlobAccessScopes({
95
+ db: options.db,
96
+ handler,
97
+ request,
98
+ });
99
+ if (!allowedScopes.ok) {
100
+ configurationDecision ??= {
101
+ ...request,
102
+ allowed: false,
103
+ reason: 'resolve_scopes_failed',
104
+ table: reference.table,
105
+ };
106
+ continue;
107
+ }
108
+
109
+ const requiredScopeKeys = Array.from(
110
+ collectScopeVars(handler.scopePatterns)
111
+ );
112
+ for (const row of rows) {
113
+ const matchedColumn = reference.blobColumns.find((column) =>
114
+ blobColumnMatchesHash(row[column], request.hash)
115
+ );
116
+ if (!matchedColumn) continue;
117
+
118
+ const rowScopes = handler.extractScopes(row);
119
+ if (
120
+ !rowScopesAllowed({
121
+ rowScopes,
122
+ allowedScopes: allowedScopes.scopes,
123
+ requiredScopeKeys,
124
+ })
125
+ ) {
126
+ deniedDecision ??= {
127
+ ...request,
128
+ allowed: false,
129
+ reason: 'scope_denied',
130
+ table: reference.table,
131
+ column: matchedColumn,
132
+ rowId: readRowId(
133
+ row,
134
+ reference.primaryKeyColumn ?? handler.primaryKeyColumn
135
+ ),
136
+ };
137
+ continue;
138
+ }
139
+
140
+ emit({
141
+ ...request,
142
+ allowed: true,
143
+ reason: 'allowed',
144
+ table: reference.table,
145
+ column: matchedColumn,
146
+ rowId: readRowId(
147
+ row,
148
+ reference.primaryKeyColumn ?? handler.primaryKeyColumn
149
+ ),
150
+ });
151
+ return true;
152
+ }
153
+ }
154
+
155
+ emit(
156
+ deniedDecision ??
157
+ configurationDecision ?? {
158
+ ...request,
159
+ allowed: false,
160
+ reason: 'missing_reference',
161
+ }
162
+ );
163
+ return false;
164
+ };
165
+ }
166
+
167
+ async function resolveBlobAccessScopes<
168
+ DB extends SyncCoreDb,
169
+ Auth extends SyncServerAuth,
170
+ >(args: {
171
+ db: Kysely<DB>;
172
+ handler: ServerTableHandler<DB, Auth>;
173
+ request: ScopedBlobAccessRequest<Auth>;
174
+ }): Promise<{ ok: true; scopes: ScopeValues } | { ok: false }> {
175
+ try {
176
+ const scopes = await args.handler.resolveScopes({
177
+ db: args.db,
178
+ actorId: args.request.actorId,
179
+ auth:
180
+ args.request.auth ??
181
+ ({
182
+ actorId: args.request.actorId,
183
+ partitionId: args.request.partitionId,
184
+ } as Auth),
185
+ });
186
+ return { ok: true, scopes };
187
+ } catch {
188
+ return { ok: false };
189
+ }
190
+ }
191
+
192
+ async function readBlobReferenceCandidateRows<DB extends SyncCoreDb>(args: {
193
+ db: Kysely<DB>;
194
+ table: string;
195
+ columns: readonly string[];
196
+ hash: string;
197
+ limit: number;
198
+ }): Promise<Record<string, unknown>[]> {
199
+ const pattern = `%${args.hash}%`;
200
+ const predicates = args.columns.map(
201
+ (column) => sql`${sql.ref(column)} like ${pattern}`
202
+ );
203
+ const result = await sql<Record<string, unknown>>`
204
+ select *
205
+ from ${sql.table(args.table)}
206
+ where ${sql.join(predicates, sql` or `)}
207
+ limit ${args.limit}
208
+ `.execute(args.db);
209
+ return result.rows;
210
+ }
211
+
212
+ function readRowId(
213
+ row: Record<string, unknown>,
214
+ primaryKeyColumn: string | undefined
215
+ ): string | undefined {
216
+ const column = primaryKeyColumn ?? 'id';
217
+ const value = row[column];
218
+ return value === null || value === undefined ? undefined : String(value);
219
+ }
220
+
221
+ function blobColumnMatchesHash(value: unknown, hash: string): boolean {
222
+ const parsed = parseMaybeJson(value);
223
+ if (isBlobRefHash(parsed, hash)) return true;
224
+ if (Array.isArray(parsed)) {
225
+ return parsed.some((entry) => isBlobRefHash(parseMaybeJson(entry), hash));
226
+ }
227
+ return false;
228
+ }
229
+
230
+ function parseMaybeJson(value: unknown): unknown {
231
+ if (typeof value !== 'string') return value;
232
+ try {
233
+ return JSON.parse(value);
234
+ } catch {
235
+ return value;
236
+ }
237
+ }
238
+
239
+ function isBlobRefHash(value: unknown, hash: string): boolean {
240
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
241
+ return false;
242
+ }
243
+ return (value as { hash?: unknown }).hash === hash;
244
+ }
@@ -12,6 +12,7 @@ import type {
12
12
  BlobSignUploadOptions,
13
13
  BlobStorageAdapter,
14
14
  } from '@syncular/core';
15
+ import { resolveUrlFromBase } from '@syncular/core';
15
16
  import { type Kysely, sql } from 'kysely';
16
17
  import type { SyncBlobsDb } from '../types';
17
18
 
@@ -20,25 +21,49 @@ import type { SyncBlobsDb } from '../types';
20
21
  */
21
22
  export interface BlobTokenSigner {
22
23
  /**
23
- * Sign a token for blob upload/download authorization.
24
- * @param payload The data to sign
25
- * @param expiresIn Expiration time in seconds
26
- * @returns A signed token string
24
+ * Token payload for upload/download authorization.
25
+ * Upload tokens are bound to hash + expected byte size.
27
26
  */
28
27
  sign(
29
- payload: { hash: string; action: 'upload' | 'download'; expiresAt: number },
28
+ payload:
29
+ | {
30
+ hash: string;
31
+ partitionId: string;
32
+ action: 'upload';
33
+ size: number;
34
+ expiresAt: number;
35
+ }
36
+ | {
37
+ hash: string;
38
+ partitionId: string;
39
+ action: 'download';
40
+ expiresAt: number;
41
+ },
30
42
  expiresIn: number
31
43
  ): Promise<string>;
32
44
 
33
45
  /**
34
- * Verify and decode a signed token.
35
- * @returns The payload if valid, null if invalid/expired
46
+ * Sign a token for blob upload/download authorization.
47
+ * @param payload The data to sign
48
+ * @param expiresIn Expiration time in seconds
49
+ * @returns A signed token string
36
50
  */
37
- verify(token: string): Promise<{
38
- hash: string;
39
- action: 'upload' | 'download';
40
- expiresAt: number;
41
- } | null>;
51
+ verify(token: string): Promise<
52
+ | {
53
+ hash: string;
54
+ partitionId: string;
55
+ action: 'upload';
56
+ size: number;
57
+ expiresAt: number;
58
+ }
59
+ | {
60
+ hash: string;
61
+ partitionId: string;
62
+ action: 'download';
63
+ expiresAt: number;
64
+ }
65
+ | null
66
+ >;
42
67
  }
43
68
 
44
69
  /**
@@ -92,15 +117,37 @@ export function createHmacTokenSigner(secret: string): BlobTokenSigner {
92
117
  if (!isValidSig) return null;
93
118
 
94
119
  try {
95
- const data = JSON.parse(atob(dataB64)) as {
96
- hash: string;
97
- action: 'upload' | 'download';
98
- expiresAt: number;
99
- };
100
-
101
- if (Date.now() > data.expiresAt) return null;
120
+ const parsed = JSON.parse(atob(dataB64)) as Record<string, unknown>;
121
+ if (typeof parsed.hash !== 'string') return null;
122
+ if (typeof parsed.partitionId !== 'string') return null;
123
+ if (typeof parsed.expiresAt !== 'number') return null;
124
+ if (Date.now() > parsed.expiresAt) return null;
125
+
126
+ if (parsed.action === 'download') {
127
+ return {
128
+ hash: parsed.hash,
129
+ partitionId: parsed.partitionId,
130
+ action: 'download',
131
+ expiresAt: parsed.expiresAt,
132
+ };
133
+ }
134
+
135
+ if (
136
+ parsed.action === 'upload' &&
137
+ typeof parsed.size === 'number' &&
138
+ Number.isFinite(parsed.size) &&
139
+ parsed.size >= 0
140
+ ) {
141
+ return {
142
+ hash: parsed.hash,
143
+ partitionId: parsed.partitionId,
144
+ action: 'upload',
145
+ size: parsed.size,
146
+ expiresAt: parsed.expiresAt,
147
+ };
148
+ }
102
149
 
103
- return data;
150
+ return null;
104
151
  } catch {
105
152
  return null;
106
153
  }
@@ -156,22 +203,31 @@ export function createDatabaseBlobStorageAdapter<DB extends SyncBlobsDb>(
156
203
  options: DatabaseBlobStorageAdapterOptions<DB>
157
204
  ): BlobStorageAdapter {
158
205
  const { db, baseUrl, tokenSigner } = options;
159
-
160
- // Normalize base URL (remove trailing slash)
161
- const normalizedBaseUrl = baseUrl.replace(/\/$/, '');
206
+ const resolvePartitionId = (partitionId?: string): string =>
207
+ partitionId ?? 'default';
208
+ const normalizeBlobSizeValue = (value: number | string): number =>
209
+ typeof value === 'number' ? value : Number(value);
162
210
 
163
211
  return {
164
212
  name: 'database',
165
213
 
166
214
  async signUpload(opts: BlobSignUploadOptions): Promise<BlobSignedUpload> {
215
+ const partitionId = resolvePartitionId(opts.partitionId);
167
216
  const expiresAt = Date.now() + opts.expiresIn * 1000;
168
217
  const token = await tokenSigner.sign(
169
- { hash: opts.hash, action: 'upload', expiresAt },
218
+ {
219
+ hash: opts.hash,
220
+ partitionId,
221
+ action: 'upload',
222
+ size: opts.size,
223
+ expiresAt,
224
+ },
170
225
  opts.expiresIn
171
226
  );
172
227
 
173
228
  // URL points to server's blob upload endpoint
174
- const url = `${normalizedBaseUrl}/blobs/${encodeURIComponent(opts.hash)}/upload?token=${encodeURIComponent(token)}`;
229
+ const uploadPath = `/blobs/${encodeURIComponent(opts.hash)}/upload?token=${encodeURIComponent(token)}`;
230
+ const url = resolveUrlFromBase(baseUrl, uploadPath);
175
231
 
176
232
  return {
177
233
  url,
@@ -184,39 +240,53 @@ export function createDatabaseBlobStorageAdapter<DB extends SyncBlobsDb>(
184
240
  },
185
241
 
186
242
  async signDownload(opts: BlobSignDownloadOptions): Promise<string> {
243
+ const partitionId = resolvePartitionId(opts.partitionId);
187
244
  const expiresAt = Date.now() + opts.expiresIn * 1000;
188
245
  const token = await tokenSigner.sign(
189
- { hash: opts.hash, action: 'download', expiresAt },
246
+ { hash: opts.hash, partitionId, action: 'download', expiresAt },
190
247
  opts.expiresIn
191
248
  );
192
249
 
193
- return `${normalizedBaseUrl}/blobs/${encodeURIComponent(opts.hash)}/download?token=${encodeURIComponent(token)}`;
250
+ return resolveUrlFromBase(
251
+ baseUrl,
252
+ `/blobs/${encodeURIComponent(opts.hash)}/download?token=${encodeURIComponent(token)}`
253
+ );
194
254
  },
195
255
 
196
- async exists(hash: string): Promise<boolean> {
256
+ async exists(
257
+ hash: string,
258
+ options?: { partitionId?: string }
259
+ ): Promise<boolean> {
260
+ const partitionId = resolvePartitionId(options?.partitionId);
197
261
  const rowResult = await sql<{ hash: string }>`
198
262
  select hash
199
263
  from ${sql.table('sync_blobs')}
200
- where hash = ${hash}
264
+ where partition_id = ${partitionId} and hash = ${hash}
201
265
  limit 1
202
266
  `.execute(db);
203
267
  return rowResult.rows.length > 0;
204
268
  },
205
269
 
206
- async delete(hash: string): Promise<void> {
270
+ async delete(
271
+ hash: string,
272
+ options?: { partitionId?: string }
273
+ ): Promise<void> {
274
+ const partitionId = resolvePartitionId(options?.partitionId);
207
275
  await sql`
208
276
  delete from ${sql.table('sync_blobs')}
209
- where hash = ${hash}
277
+ where partition_id = ${partitionId} and hash = ${hash}
210
278
  `.execute(db);
211
279
  },
212
280
 
213
281
  async getMetadata(
214
- hash: string
282
+ hash: string,
283
+ options?: { partitionId?: string }
215
284
  ): Promise<{ size: number; mimeType?: string } | null> {
216
- const rowResult = await sql<{ size: number; mime_type: string }>`
285
+ const partitionId = resolvePartitionId(options?.partitionId);
286
+ const rowResult = await sql<{ size: number | string; mime_type: string }>`
217
287
  select size, mime_type
218
288
  from ${sql.table('sync_blobs')}
219
- where hash = ${hash}
289
+ where partition_id = ${partitionId} and hash = ${hash}
220
290
  limit 1
221
291
  `.execute(db);
222
292
  const row = rowResult.rows[0];
@@ -224,7 +294,7 @@ export function createDatabaseBlobStorageAdapter<DB extends SyncBlobsDb>(
224
294
  if (!row) return null;
225
295
 
226
296
  return {
227
- size: row.size,
297
+ size: normalizeBlobSizeValue(row.size),
228
298
  mimeType: row.mime_type,
229
299
  };
230
300
  },
@@ -232,13 +302,16 @@ export function createDatabaseBlobStorageAdapter<DB extends SyncBlobsDb>(
232
302
  async put(
233
303
  hash: string,
234
304
  data: Uint8Array,
235
- metadata?: Record<string, unknown>
305
+ metadata?: Record<string, unknown>,
306
+ options?: { partitionId?: string }
236
307
  ): Promise<void> {
308
+ const partitionId = resolvePartitionId(options?.partitionId);
237
309
  const mimeType =
238
310
  typeof metadata?.mimeType === 'string'
239
311
  ? metadata.mimeType
240
312
  : 'application/octet-stream';
241
313
  await storeBlobInDatabase(db, {
314
+ partitionId,
242
315
  hash,
243
316
  size: data.length,
244
317
  mimeType,
@@ -246,8 +319,12 @@ export function createDatabaseBlobStorageAdapter<DB extends SyncBlobsDb>(
246
319
  });
247
320
  },
248
321
 
249
- async get(hash: string): Promise<Uint8Array | null> {
250
- const result = await readBlobFromDatabase(db, hash);
322
+ async get(
323
+ hash: string,
324
+ options?: { partitionId?: string }
325
+ ): Promise<Uint8Array | null> {
326
+ const partitionId = resolvePartitionId(options?.partitionId);
327
+ const result = await readBlobFromDatabase(db, hash, { partitionId });
251
328
  return result?.body ?? null;
252
329
  },
253
330
  };
@@ -260,6 +337,7 @@ export function createDatabaseBlobStorageAdapter<DB extends SyncBlobsDb>(
260
337
  export async function storeBlobInDatabase<DB extends SyncBlobsDb>(
261
338
  db: Kysely<DB>,
262
339
  args: {
340
+ partitionId: string;
263
341
  hash: string;
264
342
  size: number;
265
343
  mimeType: string;
@@ -268,6 +346,7 @@ export async function storeBlobInDatabase<DB extends SyncBlobsDb>(
268
346
  ): Promise<void> {
269
347
  await sql`
270
348
  insert into ${sql.table('sync_blobs')} (
349
+ partition_id,
271
350
  hash,
272
351
  size,
273
352
  mime_type,
@@ -275,13 +354,14 @@ export async function storeBlobInDatabase<DB extends SyncBlobsDb>(
275
354
  created_at
276
355
  )
277
356
  values (
357
+ ${args.partitionId},
278
358
  ${args.hash},
279
359
  ${args.size},
280
360
  ${args.mimeType},
281
361
  ${args.body},
282
362
  ${new Date().toISOString()}
283
363
  )
284
- on conflict (hash) do nothing
364
+ on conflict (partition_id, hash) do nothing
285
365
  `.execute(db);
286
366
  }
287
367
 
@@ -291,16 +371,18 @@ export async function storeBlobInDatabase<DB extends SyncBlobsDb>(
291
371
  */
292
372
  export async function readBlobFromDatabase<DB extends SyncBlobsDb>(
293
373
  db: Kysely<DB>,
294
- hash: string
374
+ hash: string,
375
+ options?: { partitionId?: string }
295
376
  ): Promise<{ body: Uint8Array; mimeType: string; size: number } | null> {
377
+ const partitionId = options?.partitionId ?? 'default';
296
378
  const rowResult = await sql<{
297
379
  body: Uint8Array;
298
380
  mime_type: string;
299
- size: number;
381
+ size: number | string;
300
382
  }>`
301
383
  select body, mime_type, size
302
384
  from ${sql.table('sync_blobs')}
303
- where hash = ${hash}
385
+ where partition_id = ${partitionId} and hash = ${hash}
304
386
  limit 1
305
387
  `.execute(db);
306
388
  const row = rowResult.rows[0];
@@ -310,6 +392,6 @@ export async function readBlobFromDatabase<DB extends SyncBlobsDb>(
310
392
  return {
311
393
  body: row.body,
312
394
  mimeType: row.mime_type,
313
- size: row.size,
395
+ size: typeof row.size === 'number' ? row.size : Number(row.size),
314
396
  };
315
397
  }
@@ -2,6 +2,7 @@
2
2
  * @syncular/server - Blob storage exports
3
3
  */
4
4
 
5
+ export * from './access';
5
6
  export * from './adapters/database';
6
7
  export * from './manager';
7
8
  export * from './migrate';