@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
|
@@ -0,0 +1,526 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* R2 blob storage adapter using native R2Bucket binding.
|
|
3
|
+
*
|
|
4
|
+
* This adapter stores blobs in Cloudflare R2 using the native binding,
|
|
5
|
+
* without requiring the AWS SDK. Since R2 bindings don't support presigned URLs,
|
|
6
|
+
* this adapter generates signed tokens that allow uploads/downloads through
|
|
7
|
+
* the Worker's blob routes (similar to the database adapter).
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Blob Storage Types (locally defined to avoid DOM/Workers lib conflicts)
|
|
12
|
+
// These match @syncular/core BlobStorageAdapter interface.
|
|
13
|
+
// ============================================================================
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Options for signing an upload URL.
|
|
17
|
+
*/
|
|
18
|
+
export interface BlobSignUploadOptions {
|
|
19
|
+
/** SHA-256 hash (for naming and checksum validation) */
|
|
20
|
+
hash: string;
|
|
21
|
+
/** Optional tenant/partition namespace for storage lookups */
|
|
22
|
+
partitionId?: string;
|
|
23
|
+
/** Content size in bytes */
|
|
24
|
+
size: number;
|
|
25
|
+
/** MIME type */
|
|
26
|
+
mimeType: string;
|
|
27
|
+
/** URL expiration in seconds */
|
|
28
|
+
expiresIn: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Result of signing an upload URL.
|
|
33
|
+
*/
|
|
34
|
+
export interface BlobSignedUpload {
|
|
35
|
+
/** The URL to upload to */
|
|
36
|
+
url: string;
|
|
37
|
+
/** HTTP method */
|
|
38
|
+
method: 'PUT' | 'POST';
|
|
39
|
+
/** Required headers */
|
|
40
|
+
headers?: Record<string, string>;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Options for signing a download URL.
|
|
45
|
+
*/
|
|
46
|
+
export interface BlobSignDownloadOptions {
|
|
47
|
+
/** SHA-256 hash */
|
|
48
|
+
hash: string;
|
|
49
|
+
/** Optional tenant/partition namespace for storage lookups */
|
|
50
|
+
partitionId?: string;
|
|
51
|
+
/** URL expiration in seconds */
|
|
52
|
+
expiresIn: number;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Adapter for blob storage backends.
|
|
57
|
+
* Implements the same interface as @syncular/core BlobStorageAdapter.
|
|
58
|
+
*/
|
|
59
|
+
export interface BlobStorageAdapter {
|
|
60
|
+
/** Adapter name for logging/debugging */
|
|
61
|
+
readonly name: string;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Generate a presigned URL for uploading a blob.
|
|
65
|
+
*/
|
|
66
|
+
signUpload(options: BlobSignUploadOptions): Promise<BlobSignedUpload>;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Generate a presigned URL for downloading a blob.
|
|
70
|
+
*/
|
|
71
|
+
signDownload(options: BlobSignDownloadOptions): Promise<string>;
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Check if a blob exists in storage.
|
|
75
|
+
*/
|
|
76
|
+
exists(hash: string, options?: { partitionId?: string }): Promise<boolean>;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Delete a blob (for garbage collection).
|
|
80
|
+
*/
|
|
81
|
+
delete(hash: string, options?: { partitionId?: string }): Promise<void>;
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Get blob metadata from storage (optional).
|
|
85
|
+
*/
|
|
86
|
+
getMetadata?(
|
|
87
|
+
hash: string,
|
|
88
|
+
options?: { partitionId?: string }
|
|
89
|
+
): Promise<{ size: number; mimeType?: string } | null>;
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Store blob data directly (for adapters that support direct storage).
|
|
93
|
+
*/
|
|
94
|
+
put?(
|
|
95
|
+
hash: string,
|
|
96
|
+
data: Uint8Array,
|
|
97
|
+
metadata?: Record<string, unknown>,
|
|
98
|
+
options?: { partitionId?: string }
|
|
99
|
+
): Promise<void>;
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Store blob data directly from a stream.
|
|
103
|
+
*/
|
|
104
|
+
putStream?(
|
|
105
|
+
hash: string,
|
|
106
|
+
stream: ReadableStream<Uint8Array>,
|
|
107
|
+
metadata?: Record<string, unknown>,
|
|
108
|
+
options?: { partitionId?: string }
|
|
109
|
+
): Promise<void>;
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Get blob data directly (for adapters that support direct retrieval).
|
|
113
|
+
*/
|
|
114
|
+
get?(
|
|
115
|
+
hash: string,
|
|
116
|
+
options?: { partitionId?: string }
|
|
117
|
+
): Promise<Uint8Array | null>;
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Get blob data directly as a stream.
|
|
121
|
+
*/
|
|
122
|
+
getStream?(
|
|
123
|
+
hash: string,
|
|
124
|
+
options?: { partitionId?: string }
|
|
125
|
+
): Promise<ReadableStream<Uint8Array> | null>;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Token signer interface for creating/verifying upload/download tokens.
|
|
130
|
+
*/
|
|
131
|
+
export interface BlobTokenSigner {
|
|
132
|
+
/**
|
|
133
|
+
* Sign a token for blob upload/download authorization.
|
|
134
|
+
* @param payload The data to sign
|
|
135
|
+
* @param expiresIn Expiration time in seconds
|
|
136
|
+
* @returns A signed token string
|
|
137
|
+
*/
|
|
138
|
+
sign(
|
|
139
|
+
payload:
|
|
140
|
+
| {
|
|
141
|
+
hash: string;
|
|
142
|
+
partitionId: string;
|
|
143
|
+
action: 'upload';
|
|
144
|
+
size: number;
|
|
145
|
+
expiresAt: number;
|
|
146
|
+
}
|
|
147
|
+
| {
|
|
148
|
+
hash: string;
|
|
149
|
+
partitionId: string;
|
|
150
|
+
action: 'download';
|
|
151
|
+
expiresAt: number;
|
|
152
|
+
},
|
|
153
|
+
expiresIn: number
|
|
154
|
+
): Promise<string>;
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Verify and decode a signed token.
|
|
158
|
+
* @returns The payload if valid, null if invalid/expired
|
|
159
|
+
*/
|
|
160
|
+
verify(token: string): Promise<
|
|
161
|
+
| {
|
|
162
|
+
hash: string;
|
|
163
|
+
partitionId: string;
|
|
164
|
+
action: 'upload';
|
|
165
|
+
size: number;
|
|
166
|
+
expiresAt: number;
|
|
167
|
+
}
|
|
168
|
+
| {
|
|
169
|
+
hash: string;
|
|
170
|
+
partitionId: string;
|
|
171
|
+
action: 'download';
|
|
172
|
+
expiresAt: number;
|
|
173
|
+
}
|
|
174
|
+
| null
|
|
175
|
+
>;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Create a simple HMAC-based token signer.
|
|
180
|
+
*/
|
|
181
|
+
export function createHmacTokenSigner(secret: string): BlobTokenSigner {
|
|
182
|
+
const encoder = new TextEncoder();
|
|
183
|
+
|
|
184
|
+
async function hmacSign(data: string): Promise<string> {
|
|
185
|
+
const key = await crypto.subtle.importKey(
|
|
186
|
+
'raw',
|
|
187
|
+
encoder.encode(secret),
|
|
188
|
+
{ name: 'HMAC', hash: 'SHA-256' },
|
|
189
|
+
false,
|
|
190
|
+
['sign']
|
|
191
|
+
);
|
|
192
|
+
const signature = await crypto.subtle.sign(
|
|
193
|
+
'HMAC',
|
|
194
|
+
key,
|
|
195
|
+
encoder.encode(data)
|
|
196
|
+
);
|
|
197
|
+
return bufferToHex(new Uint8Array(signature));
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
return {
|
|
201
|
+
async sign(payload, _expiresIn) {
|
|
202
|
+
const data = JSON.stringify(payload);
|
|
203
|
+
const dataB64 = btoa(data);
|
|
204
|
+
const sig = await hmacSign(dataB64);
|
|
205
|
+
return `${dataB64}.${sig}`;
|
|
206
|
+
},
|
|
207
|
+
|
|
208
|
+
async verify(token) {
|
|
209
|
+
const [dataB64, sig] = token.split('.');
|
|
210
|
+
if (!dataB64 || !sig) return null;
|
|
211
|
+
|
|
212
|
+
const expectedSig = await hmacSign(dataB64);
|
|
213
|
+
if (sig !== expectedSig) return null;
|
|
214
|
+
|
|
215
|
+
try {
|
|
216
|
+
const parsed = JSON.parse(atob(dataB64)) as Record<string, unknown>;
|
|
217
|
+
if (typeof parsed.hash !== 'string') return null;
|
|
218
|
+
if (typeof parsed.partitionId !== 'string') return null;
|
|
219
|
+
if (typeof parsed.expiresAt !== 'number') return null;
|
|
220
|
+
if (Date.now() > parsed.expiresAt) return null;
|
|
221
|
+
|
|
222
|
+
if (parsed.action === 'download') {
|
|
223
|
+
return {
|
|
224
|
+
hash: parsed.hash,
|
|
225
|
+
partitionId: parsed.partitionId,
|
|
226
|
+
action: 'download',
|
|
227
|
+
expiresAt: parsed.expiresAt,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
if (
|
|
232
|
+
parsed.action === 'upload' &&
|
|
233
|
+
typeof parsed.size === 'number' &&
|
|
234
|
+
Number.isFinite(parsed.size) &&
|
|
235
|
+
parsed.size >= 0
|
|
236
|
+
) {
|
|
237
|
+
return {
|
|
238
|
+
hash: parsed.hash,
|
|
239
|
+
partitionId: parsed.partitionId,
|
|
240
|
+
action: 'upload',
|
|
241
|
+
size: parsed.size,
|
|
242
|
+
expiresAt: parsed.expiresAt,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
return null;
|
|
247
|
+
} catch {
|
|
248
|
+
return null;
|
|
249
|
+
}
|
|
250
|
+
},
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
function bufferToHex(buffer: Uint8Array): string {
|
|
255
|
+
return Array.from(buffer)
|
|
256
|
+
.map((b) => b.toString(16).padStart(2, '0'))
|
|
257
|
+
.join('');
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
export interface R2BlobStorageAdapterOptions {
|
|
261
|
+
/** R2 bucket binding */
|
|
262
|
+
bucket: R2Bucket;
|
|
263
|
+
/** Optional key prefix for all blobs */
|
|
264
|
+
keyPrefix?: string;
|
|
265
|
+
/** Base URL for the blob routes (e.g., "https://api.example.com/api/sync") */
|
|
266
|
+
baseUrl: string;
|
|
267
|
+
/** Token signer for authorization */
|
|
268
|
+
tokenSigner: BlobTokenSigner;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Create an R2 blob storage adapter using native R2Bucket binding.
|
|
273
|
+
*
|
|
274
|
+
* Since R2 bindings don't support presigned URLs, this adapter generates
|
|
275
|
+
* signed tokens and uses Worker-proxied uploads/downloads.
|
|
276
|
+
*
|
|
277
|
+
* @example
|
|
278
|
+
* ```typescript
|
|
279
|
+
* import { createR2BlobStorageAdapter, createHmacTokenSigner } from '@syncular/server/cloudflare/r2';
|
|
280
|
+
*
|
|
281
|
+
* type Env = { BLOBS: R2Bucket };
|
|
282
|
+
*
|
|
283
|
+
* const adapter = createR2BlobStorageAdapter({
|
|
284
|
+
* bucket: env.BLOBS,
|
|
285
|
+
* baseUrl: 'https://api.example.com/sync',
|
|
286
|
+
* tokenSigner: createHmacTokenSigner(env.BLOB_SECRET),
|
|
287
|
+
* });
|
|
288
|
+
* ```
|
|
289
|
+
*/
|
|
290
|
+
export function createR2BlobStorageAdapter(
|
|
291
|
+
options: R2BlobStorageAdapterOptions
|
|
292
|
+
): BlobStorageAdapter {
|
|
293
|
+
const { bucket, keyPrefix = '', baseUrl, tokenSigner } = options;
|
|
294
|
+
|
|
295
|
+
// Normalize base URL (remove trailing slash)
|
|
296
|
+
const normalizedBaseUrl = baseUrl.replace(/\/$/, '');
|
|
297
|
+
|
|
298
|
+
function getKey(hash: string, partitionId?: string): string {
|
|
299
|
+
// Remove "sha256:" prefix and use hex as key
|
|
300
|
+
const hex = hash.startsWith('sha256:') ? hash.slice(7) : hash;
|
|
301
|
+
const normalizedPartition = partitionId?.trim();
|
|
302
|
+
if (!normalizedPartition || normalizedPartition === 'default') {
|
|
303
|
+
return `${keyPrefix}${hex}`;
|
|
304
|
+
}
|
|
305
|
+
return `${keyPrefix}${encodeURIComponent(normalizedPartition)}/${hex}`;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
function resolveMimeType(metadata?: Record<string, unknown>): string {
|
|
309
|
+
return typeof metadata?.mimeType === 'string'
|
|
310
|
+
? metadata.mimeType
|
|
311
|
+
: 'application/octet-stream';
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
function resolveChecksum(
|
|
315
|
+
hash: string,
|
|
316
|
+
metadata?: Record<string, unknown>
|
|
317
|
+
): string | undefined {
|
|
318
|
+
if (metadata?.disableChecksum === true) {
|
|
319
|
+
return undefined;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
const explicitChecksum = metadata?.checksumSha256;
|
|
323
|
+
if (
|
|
324
|
+
typeof explicitChecksum === 'string' &&
|
|
325
|
+
/^[0-9a-f]{64}$/i.test(explicitChecksum)
|
|
326
|
+
) {
|
|
327
|
+
return explicitChecksum.toLowerCase();
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
return hash.startsWith('sha256:') ? hash.slice(7) : undefined;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
function resolveContentLength(
|
|
334
|
+
metadata?: Record<string, unknown>
|
|
335
|
+
): number | undefined {
|
|
336
|
+
const candidates = [
|
|
337
|
+
metadata?.contentLength,
|
|
338
|
+
metadata?.byteLength,
|
|
339
|
+
metadata?.size,
|
|
340
|
+
];
|
|
341
|
+
for (const candidate of candidates) {
|
|
342
|
+
if (typeof candidate !== 'number') continue;
|
|
343
|
+
if (!Number.isFinite(candidate) || candidate < 0) continue;
|
|
344
|
+
return candidate;
|
|
345
|
+
}
|
|
346
|
+
return undefined;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
async function readAllBytesFromStream(
|
|
350
|
+
stream: ReadableStream<Uint8Array>
|
|
351
|
+
): Promise<Uint8Array> {
|
|
352
|
+
const body = await new Response(stream).arrayBuffer();
|
|
353
|
+
return new Uint8Array(body);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
async function putStreamInternal(
|
|
357
|
+
hash: string,
|
|
358
|
+
stream: ReadableStream<Uint8Array>,
|
|
359
|
+
metadata?: Record<string, unknown>,
|
|
360
|
+
options?: { partitionId?: string }
|
|
361
|
+
): Promise<void> {
|
|
362
|
+
const key = getKey(hash, options?.partitionId);
|
|
363
|
+
const mimeType = resolveMimeType(metadata);
|
|
364
|
+
const checksum = resolveChecksum(hash, metadata);
|
|
365
|
+
const contentLength = resolveContentLength(metadata);
|
|
366
|
+
|
|
367
|
+
if (typeof contentLength === 'number' && contentLength >= 0) {
|
|
368
|
+
if (typeof FixedLengthStream !== 'undefined') {
|
|
369
|
+
const fixedLength = new FixedLengthStream(contentLength);
|
|
370
|
+
await Promise.all([
|
|
371
|
+
stream.pipeTo(fixedLength.writable),
|
|
372
|
+
bucket.put(key, fixedLength.readable, {
|
|
373
|
+
httpMetadata: { contentType: mimeType },
|
|
374
|
+
sha256: checksum,
|
|
375
|
+
}),
|
|
376
|
+
]);
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
const bufferedBody = await readAllBytesFromStream(stream);
|
|
381
|
+
if (bufferedBody.byteLength !== contentLength) {
|
|
382
|
+
throw new Error(
|
|
383
|
+
`Blob content length mismatch: expected ${contentLength}, got ${bufferedBody.byteLength}`
|
|
384
|
+
);
|
|
385
|
+
}
|
|
386
|
+
await bucket.put(key, bufferedBody, {
|
|
387
|
+
httpMetadata: { contentType: mimeType },
|
|
388
|
+
sha256: checksum,
|
|
389
|
+
});
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
const bufferedBody = await readAllBytesFromStream(stream);
|
|
394
|
+
await bucket.put(key, bufferedBody, {
|
|
395
|
+
httpMetadata: {
|
|
396
|
+
contentType: mimeType,
|
|
397
|
+
},
|
|
398
|
+
sha256: checksum,
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
async function getStreamInternal(
|
|
403
|
+
hash: string,
|
|
404
|
+
options?: { partitionId?: string }
|
|
405
|
+
): Promise<ReadableStream<Uint8Array> | null> {
|
|
406
|
+
const key = getKey(hash, options?.partitionId);
|
|
407
|
+
const object = await bucket.get(key);
|
|
408
|
+
if (!object) return null;
|
|
409
|
+
return object.body as ReadableStream<Uint8Array> | null;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
return {
|
|
413
|
+
name: 'r2',
|
|
414
|
+
|
|
415
|
+
async signUpload(opts: BlobSignUploadOptions): Promise<BlobSignedUpload> {
|
|
416
|
+
const partitionId = opts.partitionId ?? 'default';
|
|
417
|
+
const expiresAt = Date.now() + opts.expiresIn * 1000;
|
|
418
|
+
const token = await tokenSigner.sign(
|
|
419
|
+
{
|
|
420
|
+
hash: opts.hash,
|
|
421
|
+
partitionId,
|
|
422
|
+
action: 'upload',
|
|
423
|
+
size: opts.size,
|
|
424
|
+
expiresAt,
|
|
425
|
+
},
|
|
426
|
+
opts.expiresIn
|
|
427
|
+
);
|
|
428
|
+
|
|
429
|
+
// URL points to server's blob upload endpoint
|
|
430
|
+
const url = `${normalizedBaseUrl}/blobs/${encodeURIComponent(opts.hash)}/upload?token=${encodeURIComponent(token)}`;
|
|
431
|
+
|
|
432
|
+
return {
|
|
433
|
+
url,
|
|
434
|
+
method: 'PUT',
|
|
435
|
+
headers: {
|
|
436
|
+
'Content-Type': opts.mimeType,
|
|
437
|
+
'Content-Length': String(opts.size),
|
|
438
|
+
},
|
|
439
|
+
};
|
|
440
|
+
},
|
|
441
|
+
|
|
442
|
+
async signDownload(opts: BlobSignDownloadOptions): Promise<string> {
|
|
443
|
+
const partitionId = opts.partitionId ?? 'default';
|
|
444
|
+
const expiresAt = Date.now() + opts.expiresIn * 1000;
|
|
445
|
+
const token = await tokenSigner.sign(
|
|
446
|
+
{ hash: opts.hash, partitionId, action: 'download', expiresAt },
|
|
447
|
+
opts.expiresIn
|
|
448
|
+
);
|
|
449
|
+
|
|
450
|
+
return `${normalizedBaseUrl}/blobs/${encodeURIComponent(opts.hash)}/download?token=${encodeURIComponent(token)}`;
|
|
451
|
+
},
|
|
452
|
+
|
|
453
|
+
async exists(
|
|
454
|
+
hash: string,
|
|
455
|
+
options?: { partitionId?: string }
|
|
456
|
+
): Promise<boolean> {
|
|
457
|
+
const key = getKey(hash, options?.partitionId);
|
|
458
|
+
const head = await bucket.head(key);
|
|
459
|
+
return head !== null;
|
|
460
|
+
},
|
|
461
|
+
|
|
462
|
+
async delete(
|
|
463
|
+
hash: string,
|
|
464
|
+
options?: { partitionId?: string }
|
|
465
|
+
): Promise<void> {
|
|
466
|
+
const key = getKey(hash, options?.partitionId);
|
|
467
|
+
await bucket.delete(key);
|
|
468
|
+
},
|
|
469
|
+
|
|
470
|
+
async getMetadata(
|
|
471
|
+
hash: string,
|
|
472
|
+
options?: { partitionId?: string }
|
|
473
|
+
): Promise<{ size: number; mimeType?: string } | null> {
|
|
474
|
+
const key = getKey(hash, options?.partitionId);
|
|
475
|
+
const head = await bucket.head(key);
|
|
476
|
+
if (!head) return null;
|
|
477
|
+
|
|
478
|
+
return {
|
|
479
|
+
size: head.size,
|
|
480
|
+
mimeType: head.httpMetadata?.contentType,
|
|
481
|
+
};
|
|
482
|
+
},
|
|
483
|
+
|
|
484
|
+
async put(
|
|
485
|
+
hash: string,
|
|
486
|
+
data: Uint8Array,
|
|
487
|
+
metadata?: Record<string, unknown>,
|
|
488
|
+
options?: { partitionId?: string }
|
|
489
|
+
): Promise<void> {
|
|
490
|
+
const key = getKey(hash, options?.partitionId);
|
|
491
|
+
const mimeType = resolveMimeType(metadata);
|
|
492
|
+
const checksum = resolveChecksum(hash, metadata);
|
|
493
|
+
await bucket.put(key, data, {
|
|
494
|
+
httpMetadata: {
|
|
495
|
+
contentType: mimeType,
|
|
496
|
+
},
|
|
497
|
+
sha256: checksum,
|
|
498
|
+
});
|
|
499
|
+
},
|
|
500
|
+
|
|
501
|
+
async putStream(
|
|
502
|
+
hash: string,
|
|
503
|
+
stream: ReadableStream<Uint8Array>,
|
|
504
|
+
metadata?: Record<string, unknown>,
|
|
505
|
+
options?: { partitionId?: string }
|
|
506
|
+
): Promise<void> {
|
|
507
|
+
await putStreamInternal(hash, stream, metadata, options);
|
|
508
|
+
},
|
|
509
|
+
|
|
510
|
+
async get(
|
|
511
|
+
hash: string,
|
|
512
|
+
options?: { partitionId?: string }
|
|
513
|
+
): Promise<Uint8Array | null> {
|
|
514
|
+
const stream = await getStreamInternal(hash, options);
|
|
515
|
+
if (!stream) return null;
|
|
516
|
+
return readAllBytesFromStream(stream);
|
|
517
|
+
},
|
|
518
|
+
|
|
519
|
+
async getStream(
|
|
520
|
+
hash: string,
|
|
521
|
+
options?: { partitionId?: string }
|
|
522
|
+
): Promise<ReadableStream<Uint8Array> | null> {
|
|
523
|
+
return getStreamInternal(hash, options);
|
|
524
|
+
},
|
|
525
|
+
};
|
|
526
|
+
}
|