@syncular/server 0.0.6-95 → 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.
- package/README.md +1 -2
- package/dist/auth-leases.d.ts +85 -0
- package/dist/auth-leases.d.ts.map +1 -0
- package/dist/auth-leases.js +368 -0
- package/dist/auth-leases.js.map +1 -0
- package/dist/better-sqlite3.d.ts +22 -0
- package/dist/better-sqlite3.d.ts.map +1 -0
- package/dist/better-sqlite3.js +16 -0
- package/dist/better-sqlite3.js.map +1 -0
- package/dist/blobs/access.d.ts +35 -0
- package/dist/blobs/access.d.ts.map +1 -0
- package/dist/blobs/access.js +149 -0
- package/dist/blobs/access.js.map +1 -0
- package/dist/blobs/adapters/database.d.ts +26 -9
- package/dist/blobs/adapters/database.d.ts.map +1 -1
- package/dist/blobs/adapters/database.js +68 -23
- package/dist/blobs/adapters/database.js.map +1 -1
- package/dist/blobs/index.d.ts +1 -0
- package/dist/blobs/index.d.ts.map +1 -1
- package/dist/blobs/index.js +5 -4
- package/dist/blobs/index.js.map +1 -1
- package/dist/blobs/manager.d.ts +69 -44
- package/dist/blobs/manager.d.ts.map +1 -1
- package/dist/blobs/manager.js +250 -65
- package/dist/blobs/manager.js.map +1 -1
- package/dist/blobs/migrate.d.ts.map +1 -1
- package/dist/blobs/migrate.js +16 -8
- package/dist/blobs/migrate.js.map +1 -1
- package/dist/blobs/types.d.ts +4 -0
- package/dist/blobs/types.d.ts.map +1 -1
- package/dist/bun-sqlite.d.ts +19 -0
- package/dist/bun-sqlite.d.ts.map +1 -0
- package/dist/bun-sqlite.js +19 -0
- package/dist/bun-sqlite.js.map +1 -0
- package/dist/clients.d.ts +1 -0
- package/dist/clients.d.ts.map +1 -1
- package/dist/clients.js.map +1 -1
- package/dist/cloudflare/durable-object.d.ts +93 -0
- package/dist/cloudflare/durable-object.d.ts.map +1 -0
- package/dist/cloudflare/durable-object.js +210 -0
- package/dist/cloudflare/durable-object.js.map +1 -0
- package/dist/cloudflare/index.d.ts +22 -0
- package/dist/cloudflare/index.d.ts.map +1 -0
- package/dist/cloudflare/index.js +22 -0
- package/dist/cloudflare/index.js.map +1 -0
- package/dist/cloudflare/r2.d.ts +180 -0
- package/dist/cloudflare/r2.d.ts.map +1 -0
- package/dist/cloudflare/r2.js +258 -0
- package/dist/cloudflare/r2.js.map +1 -0
- package/dist/cloudflare/scope-cache.d.ts +54 -0
- package/dist/cloudflare/scope-cache.d.ts.map +1 -0
- package/dist/cloudflare/scope-cache.js +223 -0
- package/dist/cloudflare/scope-cache.js.map +1 -0
- package/dist/cloudflare/sentry.d.ts +47 -0
- package/dist/cloudflare/sentry.d.ts.map +1 -0
- package/dist/cloudflare/sentry.js +163 -0
- package/dist/cloudflare/sentry.js.map +1 -0
- package/dist/cloudflare/worker.d.ts +46 -0
- package/dist/cloudflare/worker.d.ts.map +1 -0
- package/dist/cloudflare/worker.js +63 -0
- package/dist/cloudflare/worker.js.map +1 -0
- package/dist/commit-integrity.d.ts +38 -0
- package/dist/commit-integrity.d.ts.map +1 -0
- package/dist/commit-integrity.js +260 -0
- package/dist/commit-integrity.js.map +1 -0
- package/dist/compaction.js.map +1 -1
- package/dist/crdt-yjs/index.d.ts +99 -0
- package/dist/crdt-yjs/index.d.ts.map +1 -0
- package/dist/crdt-yjs/index.js +629 -0
- package/dist/crdt-yjs/index.js.map +1 -0
- package/dist/d1.d.ts +13 -0
- package/dist/d1.d.ts.map +1 -0
- package/dist/d1.js +14 -0
- package/dist/d1.js.map +1 -0
- package/dist/dialect/base.d.ts +11 -1
- package/dist/dialect/base.d.ts.map +1 -1
- package/dist/dialect/base.js +43 -6
- package/dist/dialect/base.js.map +1 -1
- package/dist/dialect/helpers.d.ts +6 -0
- package/dist/dialect/helpers.d.ts.map +1 -1
- package/dist/dialect/helpers.js +24 -0
- package/dist/dialect/helpers.js.map +1 -1
- package/dist/dialect/index.js +3 -3
- package/dist/dialect/types.d.ts +40 -0
- package/dist/dialect/types.d.ts.map +1 -1
- package/dist/encrypted-crdt.d.ts +67 -0
- package/dist/encrypted-crdt.d.ts.map +1 -0
- package/dist/encrypted-crdt.js +426 -0
- package/dist/encrypted-crdt.js.map +1 -0
- package/dist/errors.d.ts +10 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +13 -0
- package/dist/errors.js.map +1 -0
- package/dist/filesystem/index.d.ts +44 -0
- package/dist/filesystem/index.d.ts.map +1 -0
- package/dist/filesystem/index.js +164 -0
- package/dist/filesystem/index.js.map +1 -0
- package/dist/handlers/collection.d.ts +11 -3
- package/dist/handlers/collection.d.ts.map +1 -1
- package/dist/handlers/collection.js +34 -56
- package/dist/handlers/collection.js.map +1 -1
- package/dist/handlers/create-handler.d.ts +31 -7
- package/dist/handlers/create-handler.d.ts.map +1 -1
- package/dist/handlers/create-handler.js +332 -115
- package/dist/handlers/create-handler.js.map +1 -1
- package/dist/handlers/index.js +3 -3
- package/dist/handlers/types.d.ts +86 -1
- package/dist/handlers/types.d.ts.map +1 -1
- package/dist/helpers/conflict.js.map +1 -1
- package/dist/helpers/emitted-change.js.map +1 -1
- package/dist/helpers/index.d.ts +2 -0
- package/dist/helpers/index.d.ts.map +1 -1
- package/dist/helpers/index.js +6 -4
- package/dist/helpers/index.js.map +1 -1
- package/dist/helpers/paginate.js.map +1 -1
- package/dist/helpers/scope-authorization.d.ts +7 -0
- package/dist/helpers/scope-authorization.d.ts.map +1 -0
- package/dist/helpers/scope-authorization.js +19 -0
- package/dist/helpers/scope-authorization.js.map +1 -0
- package/dist/helpers/scope-commit-index.d.ts +12 -0
- package/dist/helpers/scope-commit-index.d.ts.map +1 -0
- package/dist/helpers/scope-commit-index.js +35 -0
- package/dist/helpers/scope-commit-index.js.map +1 -0
- package/dist/helpers/scope-strings.js.map +1 -1
- package/dist/hono/api-key-auth.d.ts +49 -0
- package/dist/hono/api-key-auth.d.ts.map +1 -0
- package/dist/hono/api-key-auth.js +108 -0
- package/dist/hono/api-key-auth.js.map +1 -0
- package/dist/hono/audit-redaction.d.ts +20 -0
- package/dist/hono/audit-redaction.d.ts.map +1 -0
- package/dist/hono/audit-redaction.js +85 -0
- package/dist/hono/audit-redaction.js.map +1 -0
- package/dist/hono/blobs.d.ts +75 -0
- package/dist/hono/blobs.d.ts.map +1 -0
- package/dist/hono/blobs.js +586 -0
- package/dist/hono/blobs.js.map +1 -0
- package/dist/hono/console/gateway.d.ts +42 -0
- package/dist/hono/console/gateway.d.ts.map +1 -0
- package/dist/hono/console/gateway.js +2158 -0
- package/dist/hono/console/gateway.js.map +1 -0
- package/dist/hono/console/live-auth.d.ts +7 -0
- package/dist/hono/console/live-auth.d.ts.map +1 -0
- package/dist/hono/console/live-auth.js +39 -0
- package/dist/hono/console/live-auth.js.map +1 -0
- package/dist/hono/console/route-descriptor.d.ts +6 -0
- package/dist/hono/console/route-descriptor.d.ts.map +1 -0
- package/dist/hono/console/route-descriptor.js +16 -0
- package/dist/hono/console/route-descriptor.js.map +1 -0
- package/dist/hono/console/routes/api-keys.d.ts +8 -0
- package/dist/hono/console/routes/api-keys.d.ts.map +1 -0
- package/dist/hono/console/routes/api-keys.js +575 -0
- package/dist/hono/console/routes/api-keys.js.map +1 -0
- package/dist/hono/console/routes/clients.d.ts +8 -0
- package/dist/hono/console/routes/clients.d.ts.map +1 -0
- package/dist/hono/console/routes/clients.js +322 -0
- package/dist/hono/console/routes/clients.js.map +1 -0
- package/dist/hono/console/routes/commits.d.ts +8 -0
- package/dist/hono/console/routes/commits.d.ts.map +1 -0
- package/dist/hono/console/routes/commits.js +882 -0
- package/dist/hono/console/routes/commits.js.map +1 -0
- package/dist/hono/console/routes/context.d.ts +188 -0
- package/dist/hono/console/routes/context.d.ts.map +1 -0
- package/dist/hono/console/routes/context.js +633 -0
- package/dist/hono/console/routes/context.js.map +1 -0
- package/dist/hono/console/routes/events.d.ts +8 -0
- package/dist/hono/console/routes/events.d.ts.map +1 -0
- package/dist/hono/console/routes/events.js +501 -0
- package/dist/hono/console/routes/events.js.map +1 -0
- package/dist/hono/console/routes/maintenance.d.ts +8 -0
- package/dist/hono/console/routes/maintenance.d.ts.map +1 -0
- package/dist/hono/console/routes/maintenance.js +341 -0
- package/dist/hono/console/routes/maintenance.js.map +1 -0
- package/dist/hono/console/routes/shared.d.ts +174 -0
- package/dist/hono/console/routes/shared.d.ts.map +1 -0
- package/dist/hono/console/routes/shared.js +583 -0
- package/dist/hono/console/routes/shared.js.map +1 -0
- package/dist/hono/console/routes/stats.d.ts +8 -0
- package/dist/hono/console/routes/stats.d.ts.map +1 -0
- package/dist/hono/console/routes/stats.js +295 -0
- package/dist/hono/console/routes/stats.js.map +1 -0
- package/dist/hono/console/routes/storage.d.ts +8 -0
- package/dist/hono/console/routes/storage.d.ts.map +1 -0
- package/dist/hono/console/routes/storage.js +121 -0
- package/dist/hono/console/routes/storage.js.map +1 -0
- package/dist/hono/console/routes.d.ts +36 -0
- package/dist/hono/console/routes.d.ts.map +1 -0
- package/dist/hono/console/routes.js +112 -0
- package/dist/hono/console/routes.js.map +1 -0
- package/dist/hono/console/schema-errors.d.ts +2 -0
- package/dist/hono/console/schema-errors.d.ts.map +1 -0
- package/dist/hono/console/schema-errors.js +17 -0
- package/dist/hono/console/schema-errors.js.map +1 -0
- package/dist/hono/console/schemas.d.ts +1515 -0
- package/dist/hono/console/schemas.d.ts.map +1 -0
- package/dist/hono/console/schemas.js +661 -0
- package/dist/hono/console/schemas.js.map +1 -0
- package/dist/hono/console/types.d.ts +213 -0
- package/dist/hono/console/types.d.ts.map +1 -0
- package/dist/hono/console/types.js +2 -0
- package/dist/hono/console/types.js.map +1 -0
- package/dist/hono/console/ui.d.ts +38 -0
- package/dist/hono/console/ui.d.ts.map +1 -0
- package/dist/hono/console/ui.js +43 -0
- package/dist/hono/console/ui.js.map +1 -0
- package/dist/hono/create-server.d.ts +71 -0
- package/dist/hono/create-server.d.ts.map +1 -0
- package/dist/hono/create-server.js +121 -0
- package/dist/hono/create-server.js.map +1 -0
- package/dist/hono/errors.d.ts +13 -0
- package/dist/hono/errors.d.ts.map +1 -0
- package/dist/hono/errors.js +21 -0
- package/dist/hono/errors.js.map +1 -0
- package/dist/hono/index.d.ts +20 -0
- package/dist/hono/index.d.ts.map +1 -0
- package/dist/hono/index.js +31 -0
- package/dist/hono/index.js.map +1 -0
- package/dist/hono/openapi.d.ts +72 -0
- package/dist/hono/openapi.d.ts.map +1 -0
- package/dist/hono/openapi.js +99 -0
- package/dist/hono/openapi.js.map +1 -0
- package/dist/hono/proxy/connection-manager.d.ts +78 -0
- package/dist/hono/proxy/connection-manager.d.ts.map +1 -0
- package/dist/hono/proxy/connection-manager.js +251 -0
- package/dist/hono/proxy/connection-manager.js.map +1 -0
- package/dist/hono/proxy/index.d.ts +8 -0
- package/dist/hono/proxy/index.d.ts.map +1 -0
- package/dist/hono/proxy/index.js +8 -0
- package/dist/hono/proxy/index.js.map +1 -0
- package/dist/hono/proxy/routes.d.ts +86 -0
- package/dist/hono/proxy/routes.d.ts.map +1 -0
- package/dist/hono/proxy/routes.js +183 -0
- package/dist/hono/proxy/routes.js.map +1 -0
- package/dist/hono/rate-limit.d.ts +101 -0
- package/dist/hono/rate-limit.d.ts.map +1 -0
- package/dist/hono/rate-limit.js +184 -0
- package/dist/hono/rate-limit.js.map +1 -0
- package/dist/hono/realtime-sync-packs.d.ts +43 -0
- package/dist/hono/realtime-sync-packs.d.ts.map +1 -0
- package/dist/hono/realtime-sync-packs.js +219 -0
- package/dist/hono/realtime-sync-packs.js.map +1 -0
- package/dist/hono/routes/audit.d.ts +12 -0
- package/dist/hono/routes/audit.d.ts.map +1 -0
- package/dist/hono/routes/audit.js +385 -0
- package/dist/hono/routes/audit.js.map +1 -0
- package/dist/hono/routes/auth-leases.d.ts +8 -0
- package/dist/hono/routes/auth-leases.d.ts.map +1 -0
- package/dist/hono/routes/auth-leases.js +88 -0
- package/dist/hono/routes/auth-leases.js.map +1 -0
- package/dist/hono/routes/combined.d.ts +8 -0
- package/dist/hono/routes/combined.d.ts.map +1 -0
- package/dist/hono/routes/combined.js +392 -0
- package/dist/hono/routes/combined.js.map +1 -0
- package/dist/hono/routes/context.d.ts +314 -0
- package/dist/hono/routes/context.d.ts.map +1 -0
- package/dist/hono/routes/context.js +1147 -0
- package/dist/hono/routes/context.js.map +1 -0
- package/dist/hono/routes/health.d.ts +8 -0
- package/dist/hono/routes/health.d.ts.map +1 -0
- package/dist/hono/routes/health.js +16 -0
- package/dist/hono/routes/health.js.map +1 -0
- package/dist/hono/routes/realtime.d.ts +9 -0
- package/dist/hono/routes/realtime.d.ts.map +1 -0
- package/dist/hono/routes/realtime.js +626 -0
- package/dist/hono/routes/realtime.js.map +1 -0
- package/dist/hono/routes/shared.d.ts +689 -0
- package/dist/hono/routes/shared.d.ts.map +1 -0
- package/dist/hono/routes/shared.js +972 -0
- package/dist/hono/routes/shared.js.map +1 -0
- package/dist/hono/routes/snapshots.d.ts +10 -0
- package/dist/hono/routes/snapshots.d.ts.map +1 -0
- package/dist/hono/routes/snapshots.js +281 -0
- package/dist/hono/routes/snapshots.js.map +1 -0
- package/dist/hono/routes.d.ts +19 -0
- package/dist/hono/routes.d.ts.map +1 -0
- package/dist/hono/routes.js +37 -0
- package/dist/hono/routes.js.map +1 -0
- package/dist/hono/validation.d.ts +5 -0
- package/dist/hono/validation.d.ts.map +1 -0
- package/dist/hono/validation.js +47 -0
- package/dist/hono/validation.js.map +1 -0
- package/dist/hono/websocket-origin.d.ts +9 -0
- package/dist/hono/websocket-origin.d.ts.map +1 -0
- package/dist/hono/websocket-origin.js +96 -0
- package/dist/hono/websocket-origin.js.map +1 -0
- package/dist/hono/ws.d.ts +341 -0
- package/dist/hono/ws.d.ts.map +1 -0
- package/dist/hono/ws.js +711 -0
- package/dist/hono/ws.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -18
- package/dist/index.js.map +1 -1
- package/dist/libsql.d.ts +29 -0
- package/dist/libsql.d.ts.map +1 -0
- package/dist/libsql.js +25 -0
- package/dist/libsql.js.map +1 -0
- package/dist/migrate.js.map +1 -1
- package/dist/neon.d.ts +21 -0
- package/dist/neon.d.ts.map +1 -0
- package/dist/neon.js +22 -0
- package/dist/neon.js.map +1 -0
- package/dist/notify.d.ts +30 -0
- package/dist/notify.d.ts.map +1 -1
- package/dist/notify.js +160 -41
- package/dist/notify.js.map +1 -1
- package/dist/pglite.d.ts +37 -0
- package/dist/pglite.d.ts.map +1 -0
- package/dist/pglite.js +37 -0
- package/dist/pglite.js.map +1 -0
- package/dist/plugins/index.d.ts +2 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +2 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/types.d.ts +73 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +30 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/postgres/index.d.ts +68 -0
- package/dist/postgres/index.d.ts.map +1 -0
- package/dist/postgres/index.js +924 -0
- package/dist/postgres/index.js.map +1 -0
- package/dist/proxy/collection.d.ts +0 -2
- package/dist/proxy/collection.d.ts.map +1 -1
- package/dist/proxy/collection.js +2 -17
- package/dist/proxy/collection.js.map +1 -1
- package/dist/proxy/handler.d.ts +1 -1
- package/dist/proxy/handler.d.ts.map +1 -1
- package/dist/proxy/handler.js +3 -4
- package/dist/proxy/handler.js.map +1 -1
- package/dist/proxy/index.d.ts +1 -1
- package/dist/proxy/index.d.ts.map +1 -1
- package/dist/proxy/index.js +3 -3
- package/dist/proxy/index.js.map +1 -1
- package/dist/proxy/mutation-detector.js.map +1 -1
- package/dist/proxy/oplog.d.ts.map +1 -1
- package/dist/proxy/oplog.js +32 -8
- package/dist/proxy/oplog.js.map +1 -1
- package/dist/prune.d.ts +8 -1
- package/dist/prune.d.ts.map +1 -1
- package/dist/prune.js +68 -28
- package/dist/prune.js.map +1 -1
- package/dist/pull.d.ts +31 -0
- package/dist/pull.d.ts.map +1 -1
- package/dist/pull.js +1014 -474
- package/dist/pull.js.map +1 -1
- package/dist/push.d.ts +36 -2
- package/dist/push.d.ts.map +1 -1
- package/dist/push.js +603 -358
- package/dist/push.js.map +1 -1
- package/dist/realtime/in-memory.js.map +1 -1
- package/dist/realtime/index.d.ts +2 -1
- package/dist/realtime/index.d.ts.map +1 -1
- package/dist/realtime/index.js +2 -1
- package/dist/realtime/index.js.map +1 -1
- package/dist/realtime/types.d.ts +12 -0
- package/dist/realtime/types.d.ts.map +1 -1
- package/dist/realtime/types.js +13 -1
- package/dist/realtime/types.js.map +1 -1
- package/dist/relay/client-role/forward-engine.d.ts +63 -0
- package/dist/relay/client-role/forward-engine.d.ts.map +1 -0
- package/dist/relay/client-role/forward-engine.js +267 -0
- package/dist/relay/client-role/forward-engine.js.map +1 -0
- package/dist/relay/client-role/index.d.ts +9 -0
- package/dist/relay/client-role/index.d.ts.map +1 -0
- package/dist/relay/client-role/index.js +9 -0
- package/dist/relay/client-role/index.js.map +1 -0
- package/dist/relay/client-role/pull-engine.d.ts +72 -0
- package/dist/relay/client-role/pull-engine.d.ts.map +1 -0
- package/dist/relay/client-role/pull-engine.js +249 -0
- package/dist/relay/client-role/pull-engine.js.map +1 -0
- package/dist/relay/client-role/sequence-mapper.d.ts +65 -0
- package/dist/relay/client-role/sequence-mapper.d.ts.map +1 -0
- package/dist/relay/client-role/sequence-mapper.js +161 -0
- package/dist/relay/client-role/sequence-mapper.js.map +1 -0
- package/dist/relay/evaluation/relay-paths.d.ts +41 -0
- package/dist/relay/evaluation/relay-paths.d.ts.map +1 -0
- package/dist/relay/evaluation/relay-paths.js +504 -0
- package/dist/relay/evaluation/relay-paths.js.map +1 -0
- package/dist/relay/evaluation/rust-boundary.d.ts +47 -0
- package/dist/relay/evaluation/rust-boundary.d.ts.map +1 -0
- package/dist/relay/evaluation/rust-boundary.js +220 -0
- package/dist/relay/evaluation/rust-boundary.js.map +1 -0
- package/dist/relay/index.d.ts +37 -0
- package/dist/relay/index.d.ts.map +1 -0
- package/dist/relay/index.js +44 -0
- package/dist/relay/index.js.map +1 -0
- package/dist/relay/migrate.d.ts +18 -0
- package/dist/relay/migrate.d.ts.map +1 -0
- package/dist/relay/migrate.js +99 -0
- package/dist/relay/migrate.js.map +1 -0
- package/dist/relay/mode-manager.d.ts +60 -0
- package/dist/relay/mode-manager.d.ts.map +1 -0
- package/dist/relay/mode-manager.js +114 -0
- package/dist/relay/mode-manager.js.map +1 -0
- package/dist/relay/realtime.d.ts +90 -0
- package/dist/relay/realtime.d.ts.map +1 -0
- package/dist/relay/realtime.js +147 -0
- package/dist/relay/realtime.js.map +1 -0
- package/dist/relay/relay.d.ts +190 -0
- package/dist/relay/relay.d.ts.map +1 -0
- package/dist/relay/relay.js +320 -0
- package/dist/relay/relay.js.map +1 -0
- package/dist/relay/schema.d.ts +158 -0
- package/dist/relay/schema.d.ts.map +1 -0
- package/dist/relay/schema.js +7 -0
- package/dist/relay/schema.js.map +1 -0
- package/dist/relay/server-role/index.d.ts +56 -0
- package/dist/relay/server-role/index.d.ts.map +1 -0
- package/dist/relay/server-role/index.js +193 -0
- package/dist/relay/server-role/index.js.map +1 -0
- package/dist/relay/server-role/pull.d.ts +27 -0
- package/dist/relay/server-role/pull.d.ts.map +1 -0
- package/dist/relay/server-role/pull.js +24 -0
- package/dist/relay/server-role/pull.js.map +1 -0
- package/dist/relay/server-role/push.d.ts +29 -0
- package/dist/relay/server-role/push.d.ts.map +1 -0
- package/dist/relay/server-role/push.js +122 -0
- package/dist/relay/server-role/push.js.map +1 -0
- package/dist/s3/index.d.ts +83 -0
- package/dist/s3/index.d.ts.map +1 -0
- package/dist/s3/index.js +223 -0
- package/dist/s3/index.js.map +1 -0
- package/dist/schema.d.ts +137 -1
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +1 -0
- package/dist/schema.js.map +1 -1
- package/dist/service-worker/index.d.ts +114 -0
- package/dist/service-worker/index.d.ts.map +1 -0
- package/dist/service-worker/index.js +487 -0
- package/dist/service-worker/index.js.map +1 -0
- package/dist/snapshot-artifacts/sqlite-bun.d.ts +15 -0
- package/dist/snapshot-artifacts/sqlite-bun.d.ts.map +1 -0
- package/dist/snapshot-artifacts/sqlite-bun.js +128 -0
- package/dist/snapshot-artifacts/sqlite-bun.js.map +1 -0
- package/dist/snapshot-artifacts.d.ts +206 -0
- package/dist/snapshot-artifacts.d.ts.map +1 -0
- package/dist/snapshot-artifacts.js +545 -0
- package/dist/snapshot-artifacts.js.map +1 -0
- package/dist/snapshot-chunks/db-metadata.d.ts +18 -0
- package/dist/snapshot-chunks/db-metadata.d.ts.map +1 -1
- package/dist/snapshot-chunks/db-metadata.js +91 -63
- package/dist/snapshot-chunks/db-metadata.js.map +1 -1
- package/dist/snapshot-chunks/index.js +2 -2
- package/dist/snapshot-chunks/types.d.ts +2 -0
- package/dist/snapshot-chunks/types.d.ts.map +1 -1
- package/dist/snapshot-chunks.d.ts +33 -3
- package/dist/snapshot-chunks.d.ts.map +1 -1
- package/dist/snapshot-chunks.js +136 -55
- package/dist/snapshot-chunks.js.map +1 -1
- package/dist/sqlite/index.d.ts +53 -0
- package/dist/sqlite/index.d.ts.map +1 -0
- package/dist/sqlite/index.js +795 -0
- package/dist/sqlite/index.js.map +1 -0
- package/dist/sqlite3.d.ts +22 -0
- package/dist/sqlite3.d.ts.map +1 -0
- package/dist/sqlite3.js +99 -0
- package/dist/sqlite3.js.map +1 -0
- package/dist/stats.d.ts +8 -0
- package/dist/stats.d.ts.map +1 -1
- package/dist/stats.js +45 -13
- package/dist/stats.js.map +1 -1
- package/dist/subscriptions/cache.d.ts +3 -0
- package/dist/subscriptions/cache.d.ts.map +1 -1
- package/dist/subscriptions/cache.js +44 -0
- package/dist/subscriptions/cache.js.map +1 -1
- package/dist/subscriptions/index.js +2 -2
- package/dist/subscriptions/resolve.d.ts +3 -1
- package/dist/subscriptions/resolve.d.ts.map +1 -1
- package/dist/subscriptions/resolve.js +91 -52
- package/dist/subscriptions/resolve.js.map +1 -1
- package/dist/sync.d.ts +3 -0
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +9 -5
- package/dist/sync.js.map +1 -1
- package/package.json +297 -8
- package/src/auth-leases.ts +649 -0
- package/src/better-sqlite3.ts +35 -0
- package/src/blobs/access.ts +244 -0
- package/src/blobs/adapters/database.ts +125 -43
- package/src/blobs/index.ts +1 -0
- package/src/blobs/manager.ts +366 -65
- package/src/blobs/migrate.ts +16 -8
- package/src/blobs/types.ts +4 -0
- package/src/bun-sqlite-ambient.d.ts +19 -0
- package/src/bun-sqlite.ts +27 -0
- package/src/clients.ts +1 -0
- package/src/cloudflare/durable-object.ts +289 -0
- package/src/cloudflare/index.ts +22 -0
- package/src/cloudflare/r2.ts +526 -0
- package/src/cloudflare/scope-cache.ts +341 -0
- package/src/cloudflare/sentry.ts +230 -0
- package/src/cloudflare/worker.ts +77 -0
- package/src/commit-integrity.ts +371 -0
- package/src/crdt-yjs/index.ts +931 -0
- package/src/d1.ts +16 -0
- package/src/dialect/base.ts +71 -5
- package/src/dialect/helpers.ts +31 -0
- package/src/dialect/types.ts +47 -0
- package/src/encrypted-crdt.ts +786 -0
- package/src/errors.ts +22 -0
- package/src/filesystem/index.ts +262 -0
- package/src/handlers/collection.ts +78 -78
- package/src/handlers/create-handler.ts +540 -147
- package/src/handlers/types.ts +116 -0
- package/src/helpers/index.ts +2 -0
- package/src/helpers/scope-authorization.ts +27 -0
- package/src/helpers/scope-commit-index.ts +52 -0
- package/src/hono/api-key-auth.ts +177 -0
- package/src/hono/audit-redaction.ts +135 -0
- package/src/hono/blobs.ts +851 -0
- package/src/hono/console/gateway.ts +3046 -0
- package/src/hono/console/live-auth.ts +46 -0
- package/src/hono/console/route-descriptor.ts +22 -0
- package/src/hono/console/routes/api-keys.ts +721 -0
- package/src/hono/console/routes/clients.ts +447 -0
- package/src/hono/console/routes/commits.ts +1137 -0
- package/src/hono/console/routes/context.ts +956 -0
- package/src/hono/console/routes/events.ts +669 -0
- package/src/hono/console/routes/maintenance.ts +461 -0
- package/src/hono/console/routes/shared.ts +816 -0
- package/src/hono/console/routes/stats.ts +392 -0
- package/src/hono/console/routes/storage.ts +159 -0
- package/src/hono/console/routes.ts +146 -0
- package/src/hono/console/schema-errors.ts +23 -0
- package/src/hono/console/schemas.ts +914 -0
- package/src/hono/console/types.ts +223 -0
- package/src/hono/console/ui.ts +100 -0
- package/src/hono/create-server.ts +230 -0
- package/src/hono/errors.ts +50 -0
- package/src/hono/index.ts +54 -0
- package/src/hono/openapi.ts +139 -0
- package/src/hono/proxy/connection-manager.ts +340 -0
- package/src/hono/proxy/index.ts +8 -0
- package/src/hono/proxy/routes.ts +272 -0
- package/src/hono/rate-limit.ts +319 -0
- package/src/hono/realtime-sync-packs.ts +354 -0
- package/src/hono/routes/audit.ts +499 -0
- package/src/hono/routes/auth-leases.ts +119 -0
- package/src/hono/routes/combined.ts +583 -0
- package/src/hono/routes/context.ts +1629 -0
- package/src/hono/routes/health.ts +26 -0
- package/src/hono/routes/realtime.ts +808 -0
- package/src/hono/routes/shared.ts +1626 -0
- package/src/hono/routes/snapshots.ts +345 -0
- package/src/hono/routes.ts +68 -0
- package/src/hono/validation.ts +81 -0
- package/src/hono/websocket-origin.ts +131 -0
- package/src/hono/ws.ts +1134 -0
- package/src/index.ts +6 -0
- package/src/libsql.ts +51 -0
- package/src/neon.ts +28 -0
- package/src/notify.ts +224 -44
- package/src/pglite.ts +68 -0
- package/src/plugins/index.ts +1 -0
- package/src/plugins/types.ts +144 -0
- package/src/postgres/index.ts +1291 -0
- package/src/proxy/collection.ts +5 -27
- package/src/proxy/handler.ts +2 -2
- package/src/proxy/index.ts +0 -2
- package/src/proxy/oplog.ts +41 -10
- package/src/prune.ts +137 -36
- package/src/pull.ts +1504 -591
- package/src/push.ts +881 -443
- package/src/realtime/index.ts +2 -0
- package/src/realtime/types.ts +35 -0
- package/src/relay/bun-types.d.ts +50 -0
- package/src/relay/client-role/forward-engine.ts +355 -0
- package/src/relay/client-role/index.ts +9 -0
- package/src/relay/client-role/pull-engine.ts +329 -0
- package/src/relay/client-role/sequence-mapper.ts +201 -0
- package/src/relay/evaluation/relay-paths.ts +699 -0
- package/src/relay/evaluation/rust-boundary.ts +464 -0
- package/src/relay/index.ts +50 -0
- package/src/relay/migrate.ts +113 -0
- package/src/relay/mode-manager.ts +142 -0
- package/src/relay/realtime.ts +207 -0
- package/src/relay/relay.ts +431 -0
- package/src/relay/schema.ts +171 -0
- package/src/relay/server-role/index.ts +338 -0
- package/src/relay/server-role/pull.ts +43 -0
- package/src/relay/server-role/push.ts +164 -0
- package/src/s3/index.ts +346 -0
- package/src/schema.ts +141 -1
- package/src/service-worker/index.ts +773 -0
- package/src/snapshot-artifacts/sqlite-bun.ts +168 -0
- package/src/snapshot-artifacts.ts +896 -0
- package/src/snapshot-chunks/db-metadata.ts +131 -72
- package/src/snapshot-chunks/types.ts +2 -0
- package/src/snapshot-chunks.ts +194 -70
- package/src/sqlite/index.ts +1064 -0
- package/src/sqlite3.ts +137 -0
- package/src/stats.ts +76 -13
- package/src/subscriptions/cache.ts +58 -0
- package/src/subscriptions/resolve.ts +99 -58
- package/src/sync.ts +16 -6
- package/src/blobs/adapters/database.test.ts +0 -67
- package/src/notify.test.ts +0 -520
- package/src/proxy/handler.test.ts +0 -126
- package/src/proxy/mutation-detector.test.ts +0 -71
- package/src/snapshot-chunks/db-metadata.test.ts +0 -172
- package/src/subscriptions/resolve.test.ts +0 -180
package/src/s3/index.ts
ADDED
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* S3-compatible blob storage adapter.
|
|
3
|
+
*
|
|
4
|
+
* Works with AWS S3, Cloudflare R2, MinIO, and other S3-compatible services.
|
|
5
|
+
* Requires @aws-sdk/client-s3 and @aws-sdk/s3-request-presigner as peer dependencies.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type {
|
|
9
|
+
BlobSignDownloadOptions,
|
|
10
|
+
BlobSignedUpload,
|
|
11
|
+
BlobSignUploadOptions,
|
|
12
|
+
BlobStorageAdapter,
|
|
13
|
+
} from '@syncular/core';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* S3 client interface (minimal subset of @aws-sdk/client-s3).
|
|
17
|
+
* This allows users to pass in their own configured S3 client.
|
|
18
|
+
*/
|
|
19
|
+
export interface S3ClientLike {
|
|
20
|
+
send(command: unknown): Promise<unknown>;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Function to create presigned URLs.
|
|
25
|
+
* This should be getSignedUrl from @aws-sdk/s3-request-presigner.
|
|
26
|
+
*/
|
|
27
|
+
export type GetSignedUrlFn = (
|
|
28
|
+
client: S3ClientLike,
|
|
29
|
+
command: unknown,
|
|
30
|
+
options: { expiresIn: number }
|
|
31
|
+
) => Promise<string>;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* S3 command constructors.
|
|
35
|
+
* These should be imported from @aws-sdk/client-s3.
|
|
36
|
+
*/
|
|
37
|
+
export interface S3Commands {
|
|
38
|
+
PutObjectCommand: new (input: {
|
|
39
|
+
Bucket: string;
|
|
40
|
+
Key: string;
|
|
41
|
+
ContentLength?: number;
|
|
42
|
+
ContentType?: string;
|
|
43
|
+
ChecksumSHA256?: string;
|
|
44
|
+
Body?: Uint8Array | ReadableStream<Uint8Array>;
|
|
45
|
+
}) => unknown;
|
|
46
|
+
GetObjectCommand: new (input: { Bucket: string; Key: string }) => unknown;
|
|
47
|
+
HeadObjectCommand: new (input: { Bucket: string; Key: string }) => unknown;
|
|
48
|
+
DeleteObjectCommand: new (input: { Bucket: string; Key: string }) => unknown;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface S3BlobStorageAdapterOptions {
|
|
52
|
+
/** S3 client instance */
|
|
53
|
+
client: S3ClientLike;
|
|
54
|
+
/** S3 bucket name */
|
|
55
|
+
bucket: string;
|
|
56
|
+
/** Optional key prefix for all blobs */
|
|
57
|
+
keyPrefix?: string;
|
|
58
|
+
/** S3 command constructors */
|
|
59
|
+
commands: S3Commands;
|
|
60
|
+
/** getSignedUrl function from @aws-sdk/s3-request-presigner */
|
|
61
|
+
getSignedUrl: GetSignedUrlFn;
|
|
62
|
+
/**
|
|
63
|
+
* Whether to require SHA-256 checksum validation on upload.
|
|
64
|
+
* Supported by S3 and R2. Default: true.
|
|
65
|
+
*/
|
|
66
|
+
requireChecksum?: boolean;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Create an S3-compatible blob storage adapter.
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* ```typescript
|
|
74
|
+
* import { S3Client, PutObjectCommand, GetObjectCommand, HeadObjectCommand, DeleteObjectCommand } from '@aws-sdk/client-s3';
|
|
75
|
+
* import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
|
|
76
|
+
*
|
|
77
|
+
* const adapter = createS3BlobStorageAdapter({
|
|
78
|
+
* client: new S3Client({ region: 'us-east-1' }),
|
|
79
|
+
* bucket: 'my-bucket',
|
|
80
|
+
* keyPrefix: 'blobs/',
|
|
81
|
+
* commands: { PutObjectCommand, GetObjectCommand, HeadObjectCommand, DeleteObjectCommand },
|
|
82
|
+
* getSignedUrl,
|
|
83
|
+
* });
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
export function createS3BlobStorageAdapter(
|
|
87
|
+
options: S3BlobStorageAdapterOptions
|
|
88
|
+
): BlobStorageAdapter {
|
|
89
|
+
const {
|
|
90
|
+
client,
|
|
91
|
+
bucket,
|
|
92
|
+
keyPrefix = '',
|
|
93
|
+
commands,
|
|
94
|
+
getSignedUrl,
|
|
95
|
+
requireChecksum = true,
|
|
96
|
+
} = options;
|
|
97
|
+
|
|
98
|
+
function getKey(hash: string, partitionId?: string): string {
|
|
99
|
+
// Remove "sha256:" prefix and use hex as key
|
|
100
|
+
const hex = hash.startsWith('sha256:') ? hash.slice(7) : hash;
|
|
101
|
+
const normalizedPartition = partitionId?.trim();
|
|
102
|
+
if (!normalizedPartition || normalizedPartition === 'default') {
|
|
103
|
+
return `${keyPrefix}${hex}`;
|
|
104
|
+
}
|
|
105
|
+
return `${keyPrefix}${encodeURIComponent(normalizedPartition)}/${hex}`;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return {
|
|
109
|
+
name: 's3',
|
|
110
|
+
|
|
111
|
+
async signUpload(opts: BlobSignUploadOptions): Promise<BlobSignedUpload> {
|
|
112
|
+
const key = getKey(opts.hash, opts.partitionId);
|
|
113
|
+
|
|
114
|
+
// Extract hex hash for checksum (S3 expects base64-encoded SHA-256)
|
|
115
|
+
const hexHash = opts.hash.startsWith('sha256:')
|
|
116
|
+
? opts.hash.slice(7)
|
|
117
|
+
: opts.hash;
|
|
118
|
+
|
|
119
|
+
// Convert hex to base64 for S3 checksum header
|
|
120
|
+
const checksumBase64 = hexToBase64(hexHash);
|
|
121
|
+
|
|
122
|
+
const commandInput: {
|
|
123
|
+
Bucket: string;
|
|
124
|
+
Key: string;
|
|
125
|
+
ContentLength: number;
|
|
126
|
+
ContentType: string;
|
|
127
|
+
ChecksumSHA256?: string;
|
|
128
|
+
} = {
|
|
129
|
+
Bucket: bucket,
|
|
130
|
+
Key: key,
|
|
131
|
+
ContentLength: opts.size,
|
|
132
|
+
ContentType: opts.mimeType,
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
if (requireChecksum) {
|
|
136
|
+
commandInput.ChecksumSHA256 = checksumBase64;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const command = new commands.PutObjectCommand(commandInput);
|
|
140
|
+
const url = await getSignedUrl(client, command, {
|
|
141
|
+
expiresIn: opts.expiresIn,
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
const headers: Record<string, string> = {
|
|
145
|
+
'Content-Type': opts.mimeType,
|
|
146
|
+
'Content-Length': String(opts.size),
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
if (requireChecksum) {
|
|
150
|
+
headers['x-amz-checksum-sha256'] = checksumBase64;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return {
|
|
154
|
+
url,
|
|
155
|
+
method: 'PUT',
|
|
156
|
+
headers,
|
|
157
|
+
};
|
|
158
|
+
},
|
|
159
|
+
|
|
160
|
+
async signDownload(opts: BlobSignDownloadOptions): Promise<string> {
|
|
161
|
+
const key = getKey(opts.hash, opts.partitionId);
|
|
162
|
+
const command = new commands.GetObjectCommand({
|
|
163
|
+
Bucket: bucket,
|
|
164
|
+
Key: key,
|
|
165
|
+
});
|
|
166
|
+
return getSignedUrl(client, command, { expiresIn: opts.expiresIn });
|
|
167
|
+
},
|
|
168
|
+
|
|
169
|
+
async exists(
|
|
170
|
+
hash: string,
|
|
171
|
+
options?: { partitionId?: string }
|
|
172
|
+
): Promise<boolean> {
|
|
173
|
+
const key = getKey(hash, options?.partitionId);
|
|
174
|
+
try {
|
|
175
|
+
const command = new commands.HeadObjectCommand({
|
|
176
|
+
Bucket: bucket,
|
|
177
|
+
Key: key,
|
|
178
|
+
});
|
|
179
|
+
await client.send(command);
|
|
180
|
+
return true;
|
|
181
|
+
} catch (err) {
|
|
182
|
+
// Check for NotFound error
|
|
183
|
+
if (isNotFoundError(err)) {
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
throw err;
|
|
187
|
+
}
|
|
188
|
+
},
|
|
189
|
+
|
|
190
|
+
async delete(
|
|
191
|
+
hash: string,
|
|
192
|
+
options?: { partitionId?: string }
|
|
193
|
+
): Promise<void> {
|
|
194
|
+
const key = getKey(hash, options?.partitionId);
|
|
195
|
+
const command = new commands.DeleteObjectCommand({
|
|
196
|
+
Bucket: bucket,
|
|
197
|
+
Key: key,
|
|
198
|
+
});
|
|
199
|
+
await client.send(command);
|
|
200
|
+
},
|
|
201
|
+
|
|
202
|
+
async getMetadata(
|
|
203
|
+
hash: string,
|
|
204
|
+
options?: { partitionId?: string }
|
|
205
|
+
): Promise<{ size: number; mimeType?: string } | null> {
|
|
206
|
+
const key = getKey(hash, options?.partitionId);
|
|
207
|
+
try {
|
|
208
|
+
const command = new commands.HeadObjectCommand({
|
|
209
|
+
Bucket: bucket,
|
|
210
|
+
Key: key,
|
|
211
|
+
});
|
|
212
|
+
const response = (await client.send(command)) as {
|
|
213
|
+
ContentLength?: number;
|
|
214
|
+
ContentType?: string;
|
|
215
|
+
};
|
|
216
|
+
return {
|
|
217
|
+
size: response.ContentLength ?? 0,
|
|
218
|
+
mimeType: response.ContentType,
|
|
219
|
+
};
|
|
220
|
+
} catch (err) {
|
|
221
|
+
if (isNotFoundError(err)) {
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
throw err;
|
|
225
|
+
}
|
|
226
|
+
},
|
|
227
|
+
|
|
228
|
+
async put(
|
|
229
|
+
hash: string,
|
|
230
|
+
data: Uint8Array,
|
|
231
|
+
_metadata?: Record<string, unknown>,
|
|
232
|
+
options?: { partitionId?: string }
|
|
233
|
+
): Promise<void> {
|
|
234
|
+
const key = getKey(hash, options?.partitionId);
|
|
235
|
+
const command = new commands.PutObjectCommand({
|
|
236
|
+
Bucket: bucket,
|
|
237
|
+
Key: key,
|
|
238
|
+
Body: data,
|
|
239
|
+
ContentLength: data.length,
|
|
240
|
+
ContentType: 'application/octet-stream',
|
|
241
|
+
});
|
|
242
|
+
await client.send(command);
|
|
243
|
+
},
|
|
244
|
+
|
|
245
|
+
async get(
|
|
246
|
+
hash: string,
|
|
247
|
+
options?: { partitionId?: string }
|
|
248
|
+
): Promise<Uint8Array | null> {
|
|
249
|
+
const key = getKey(hash, options?.partitionId);
|
|
250
|
+
try {
|
|
251
|
+
const command = new commands.GetObjectCommand({
|
|
252
|
+
Bucket: bucket,
|
|
253
|
+
Key: key,
|
|
254
|
+
});
|
|
255
|
+
const response = (await client.send(command)) as {
|
|
256
|
+
Body?: { transformToByteArray(): Promise<Uint8Array> };
|
|
257
|
+
};
|
|
258
|
+
if (!response.Body) return null;
|
|
259
|
+
return response.Body.transformToByteArray();
|
|
260
|
+
} catch (err) {
|
|
261
|
+
if (isNotFoundError(err)) {
|
|
262
|
+
return null;
|
|
263
|
+
}
|
|
264
|
+
throw err;
|
|
265
|
+
}
|
|
266
|
+
},
|
|
267
|
+
|
|
268
|
+
async getStream(
|
|
269
|
+
hash: string,
|
|
270
|
+
options?: { partitionId?: string }
|
|
271
|
+
): Promise<ReadableStream<Uint8Array> | null> {
|
|
272
|
+
const key = getKey(hash, options?.partitionId);
|
|
273
|
+
try {
|
|
274
|
+
const command = new commands.GetObjectCommand({
|
|
275
|
+
Bucket: bucket,
|
|
276
|
+
Key: key,
|
|
277
|
+
});
|
|
278
|
+
const response = (await client.send(command)) as {
|
|
279
|
+
Body?: { transformToWebStream(): ReadableStream<Uint8Array> };
|
|
280
|
+
};
|
|
281
|
+
if (!response.Body) return null;
|
|
282
|
+
return response.Body.transformToWebStream();
|
|
283
|
+
} catch (err) {
|
|
284
|
+
if (isNotFoundError(err)) {
|
|
285
|
+
return null;
|
|
286
|
+
}
|
|
287
|
+
throw err;
|
|
288
|
+
}
|
|
289
|
+
},
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
function isNotFoundError(err: unknown): boolean {
|
|
294
|
+
if (typeof err !== 'object' || err === null) return false;
|
|
295
|
+
const e = err as { name?: string; $metadata?: { httpStatusCode?: number } };
|
|
296
|
+
return (
|
|
297
|
+
e.name === 'NotFound' ||
|
|
298
|
+
e.name === 'NoSuchKey' ||
|
|
299
|
+
e.$metadata?.httpStatusCode === 404
|
|
300
|
+
);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
function hexToBase64(hex: string): string {
|
|
304
|
+
const bytes = new Uint8Array(hex.length / 2);
|
|
305
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
306
|
+
bytes[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
// Use Buffer if available (Node/Bun), otherwise manual base64
|
|
310
|
+
if (typeof Buffer !== 'undefined') {
|
|
311
|
+
return Buffer.from(bytes).toString('base64');
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// Manual base64 encoding
|
|
315
|
+
const chars =
|
|
316
|
+
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
|
317
|
+
let result = '';
|
|
318
|
+
const len = bytes.length;
|
|
319
|
+
const remainder = len % 3;
|
|
320
|
+
|
|
321
|
+
for (let i = 0; i < len - remainder; i += 3) {
|
|
322
|
+
const a = bytes[i]!;
|
|
323
|
+
const b = bytes[i + 1]!;
|
|
324
|
+
const c = bytes[i + 2]!;
|
|
325
|
+
result +=
|
|
326
|
+
chars.charAt((a >> 2) & 0x3f) +
|
|
327
|
+
chars.charAt(((a << 4) | (b >> 4)) & 0x3f) +
|
|
328
|
+
chars.charAt(((b << 2) | (c >> 6)) & 0x3f) +
|
|
329
|
+
chars.charAt(c & 0x3f);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
if (remainder === 1) {
|
|
333
|
+
const a = bytes[len - 1]!;
|
|
334
|
+
result += `${chars.charAt((a >> 2) & 0x3f) + chars.charAt((a << 4) & 0x3f)}==`;
|
|
335
|
+
} else if (remainder === 2) {
|
|
336
|
+
const a = bytes[len - 2]!;
|
|
337
|
+
const b = bytes[len - 1]!;
|
|
338
|
+
result +=
|
|
339
|
+
chars.charAt((a >> 2) & 0x3f) +
|
|
340
|
+
chars.charAt(((a << 4) | (b >> 4)) & 0x3f) +
|
|
341
|
+
chars.charAt((b << 2) & 0x3f) +
|
|
342
|
+
'=';
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
return result;
|
|
346
|
+
}
|
package/src/schema.ts
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* - sync_commits: one row per committed push
|
|
6
6
|
* - sync_changes: one row per emitted change, stamped with scopes
|
|
7
7
|
* - sync_table_commits: commit routing index for fast pull
|
|
8
|
+
* - sync_scope_commits: scope routing index for scoped incremental pull
|
|
8
9
|
*/
|
|
9
10
|
|
|
10
11
|
import type { SyncOp } from '@syncular/core';
|
|
@@ -32,6 +33,10 @@ export interface SyncCommitsTable {
|
|
|
32
33
|
result_json: unknown | null;
|
|
33
34
|
/** Number of emitted changes (denormalized for observability) */
|
|
34
35
|
change_count: Generated<number>;
|
|
36
|
+
/** Hex SHA-256 digest of the canonical persisted commit payload */
|
|
37
|
+
commit_digest: Generated<string | null>;
|
|
38
|
+
/** Hex SHA-256 root chaining this commit to the previous partition root */
|
|
39
|
+
commit_chain_root: Generated<string | null>;
|
|
35
40
|
/**
|
|
36
41
|
* Tables affected by this commit (for realtime notifications).
|
|
37
42
|
* Array of table names that had changes.
|
|
@@ -83,6 +88,15 @@ export interface SyncClientCursorsTable {
|
|
|
83
88
|
* This is the intersection of requested scopes and allowed scopes.
|
|
84
89
|
*/
|
|
85
90
|
effective_scopes: unknown;
|
|
91
|
+
/**
|
|
92
|
+
* Last active realtime subscription snapshot for websocket binary packs.
|
|
93
|
+
*
|
|
94
|
+
* This duplicates the protocol-level subscription id/table/scope/cursor/root
|
|
95
|
+
* shape from the latest successful pull so a restarted realtime server can
|
|
96
|
+
* rebuild scoped binary notifications before the client performs another
|
|
97
|
+
* HTTP pull.
|
|
98
|
+
*/
|
|
99
|
+
realtime_subscriptions: unknown | null;
|
|
86
100
|
/** Last update timestamp */
|
|
87
101
|
updated_at: Generated<string>;
|
|
88
102
|
}
|
|
@@ -105,7 +119,11 @@ export interface SyncSnapshotChunksTable {
|
|
|
105
119
|
row_cursor: string;
|
|
106
120
|
/** Snapshot row limit used to produce this chunk */
|
|
107
121
|
row_limit: number;
|
|
108
|
-
/**
|
|
122
|
+
/** Cursor after this chunk; null means no next row for this table */
|
|
123
|
+
next_row_cursor?: string | null;
|
|
124
|
+
/** 1 when this chunk reaches the end of the table snapshot */
|
|
125
|
+
is_last_page?: number;
|
|
126
|
+
/** Row encoding (e.g. 'binary-table-v1') */
|
|
109
127
|
encoding: string;
|
|
110
128
|
/** Compression algorithm (e.g. 'gzip') */
|
|
111
129
|
compression: string;
|
|
@@ -123,6 +141,108 @@ export interface SyncSnapshotChunksTable {
|
|
|
123
141
|
expires_at: string;
|
|
124
142
|
}
|
|
125
143
|
|
|
144
|
+
/**
|
|
145
|
+
* Cached scoped snapshot artifacts.
|
|
146
|
+
*
|
|
147
|
+
* Artifacts are larger immutable bootstrap payloads, such as scoped SQLite
|
|
148
|
+
* snapshot files, addressed by a verified manifest and stored in object
|
|
149
|
+
* storage via blob_hash.
|
|
150
|
+
*/
|
|
151
|
+
export interface SyncSnapshotArtifactsTable {
|
|
152
|
+
/** Opaque artifact id */
|
|
153
|
+
artifact_id: string;
|
|
154
|
+
/** Logical partition key (tenant / demo / workspace) */
|
|
155
|
+
partition_id: string;
|
|
156
|
+
/** Effective scope key this artifact belongs to */
|
|
157
|
+
scope_key: string;
|
|
158
|
+
/** Stable subscription id this artifact serves */
|
|
159
|
+
subscription_id: string;
|
|
160
|
+
/** App table represented by the artifact */
|
|
161
|
+
table: string;
|
|
162
|
+
/** Artifact format (e.g. 'sqlite-snapshot-v1') */
|
|
163
|
+
artifact_kind: string;
|
|
164
|
+
/** App schema/cache semantic version */
|
|
165
|
+
schema_version: string;
|
|
166
|
+
/** Snapshot as-of commit sequence */
|
|
167
|
+
as_of_commit_seq: number;
|
|
168
|
+
/** Snapshot row cursor key (empty string represents null) */
|
|
169
|
+
row_cursor: string;
|
|
170
|
+
/** Snapshot row limit used to produce this artifact */
|
|
171
|
+
row_limit: number;
|
|
172
|
+
/** Number of rows included in the artifact */
|
|
173
|
+
row_count: number;
|
|
174
|
+
/** Cursor after this artifact; null means no next row for this table */
|
|
175
|
+
next_row_cursor?: string | null;
|
|
176
|
+
/** 1 when this artifact starts at the table's first page */
|
|
177
|
+
is_first_page: number;
|
|
178
|
+
/** 1 when this artifact reaches the end of the table snapshot */
|
|
179
|
+
is_last_page: number;
|
|
180
|
+
/** Artifact compression algorithm */
|
|
181
|
+
compression: string;
|
|
182
|
+
/** Hex-encoded sha256 of artifact body bytes */
|
|
183
|
+
sha256: string;
|
|
184
|
+
/** Byte length of artifact body bytes */
|
|
185
|
+
byte_length: number;
|
|
186
|
+
/** Hex digest of the scoped artifact manifest */
|
|
187
|
+
manifest_digest: string;
|
|
188
|
+
/** Normalized JSON feature set */
|
|
189
|
+
feature_set_json: string;
|
|
190
|
+
/** Canonical manifest JSON */
|
|
191
|
+
manifest_json: string;
|
|
192
|
+
/** Reference to blob storage */
|
|
193
|
+
blob_hash: string;
|
|
194
|
+
/** Created timestamp */
|
|
195
|
+
created_at: Generated<string>;
|
|
196
|
+
/** Expiration timestamp (server may delete after this) */
|
|
197
|
+
expires_at: string;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Shared encrypted CRDT update log.
|
|
202
|
+
*
|
|
203
|
+
* One physical table stores updates for every encrypted CRDT field. The logical
|
|
204
|
+
* stream is keyed by partition_id + stream_id, where stream_id is derived from
|
|
205
|
+
* app_table + row_id + field_name.
|
|
206
|
+
*/
|
|
207
|
+
export interface SyncCrdtUpdatesTable {
|
|
208
|
+
seq: Generated<number>;
|
|
209
|
+
partition_id: string;
|
|
210
|
+
stream_id: string;
|
|
211
|
+
app_table: string;
|
|
212
|
+
row_id: string;
|
|
213
|
+
field_name: string;
|
|
214
|
+
update_id: string;
|
|
215
|
+
actor_id: string | null;
|
|
216
|
+
client_id: string | null;
|
|
217
|
+
key_id: string;
|
|
218
|
+
ciphertext: string;
|
|
219
|
+
scopes: unknown;
|
|
220
|
+
created_at: Generated<string>;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Shared encrypted CRDT checkpoints.
|
|
225
|
+
*
|
|
226
|
+
* Checkpoints contain encrypted full Yjs/Yrs state snapshots and allow old
|
|
227
|
+
* update-log rows to be garbage-collected after retention rules are satisfied.
|
|
228
|
+
*/
|
|
229
|
+
export interface SyncCrdtCheckpointsTable {
|
|
230
|
+
seq: Generated<number>;
|
|
231
|
+
partition_id: string;
|
|
232
|
+
stream_id: string;
|
|
233
|
+
app_table: string;
|
|
234
|
+
row_id: string;
|
|
235
|
+
field_name: string;
|
|
236
|
+
checkpoint_id: string;
|
|
237
|
+
covers_seq: number;
|
|
238
|
+
actor_id: string | null;
|
|
239
|
+
client_id: string | null;
|
|
240
|
+
key_id: string;
|
|
241
|
+
ciphertext: string;
|
|
242
|
+
scopes: unknown;
|
|
243
|
+
created_at: Generated<string>;
|
|
244
|
+
}
|
|
245
|
+
|
|
126
246
|
/**
|
|
127
247
|
* Index table: which commits affect which tables.
|
|
128
248
|
*
|
|
@@ -136,6 +256,20 @@ export interface SyncTableCommitsTable {
|
|
|
136
256
|
commit_seq: number;
|
|
137
257
|
}
|
|
138
258
|
|
|
259
|
+
/**
|
|
260
|
+
* Index table: which commits affect which table/scope route keys.
|
|
261
|
+
*
|
|
262
|
+
* Used to avoid scanning table-level commits that cannot match a scoped
|
|
263
|
+
* subscription. JSON scope filtering still validates exact multi-scope matches.
|
|
264
|
+
*/
|
|
265
|
+
export interface SyncScopeCommitsTable {
|
|
266
|
+
/** Logical partition key (tenant / demo / workspace) */
|
|
267
|
+
partition_id: string;
|
|
268
|
+
table: string;
|
|
269
|
+
scope_key: string;
|
|
270
|
+
commit_seq: number;
|
|
271
|
+
}
|
|
272
|
+
|
|
139
273
|
/**
|
|
140
274
|
* Database interface for sync infrastructure tables
|
|
141
275
|
* Merge this with your app's database interface
|
|
@@ -144,8 +278,12 @@ export interface SyncCoreDb {
|
|
|
144
278
|
sync_commits: SyncCommitsTable;
|
|
145
279
|
sync_changes: SyncChangesTable;
|
|
146
280
|
sync_client_cursors: SyncClientCursorsTable;
|
|
281
|
+
sync_crdt_updates: SyncCrdtUpdatesTable;
|
|
282
|
+
sync_crdt_checkpoints: SyncCrdtCheckpointsTable;
|
|
147
283
|
sync_table_commits: SyncTableCommitsTable;
|
|
284
|
+
sync_scope_commits: SyncScopeCommitsTable;
|
|
148
285
|
sync_snapshot_chunks: SyncSnapshotChunksTable;
|
|
286
|
+
sync_snapshot_artifacts: SyncSnapshotArtifactsTable;
|
|
149
287
|
}
|
|
150
288
|
|
|
151
289
|
/**
|
|
@@ -156,6 +294,8 @@ export interface SyncCommitRow {
|
|
|
156
294
|
actor_id: string;
|
|
157
295
|
created_at: string;
|
|
158
296
|
result_json: unknown | null;
|
|
297
|
+
commit_digest: string | null;
|
|
298
|
+
commit_chain_root: string | null;
|
|
159
299
|
}
|
|
160
300
|
|
|
161
301
|
/**
|