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