@syncular/server 0.1.3 → 0.2.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 +773 -13
- package/dist/admin.d.ts +136 -0
- package/dist/admin.js +168 -0
- package/dist/blob-handlers.d.ts +69 -0
- package/dist/blob-handlers.js +245 -0
- package/dist/blob-store.d.ts +111 -0
- package/dist/blob-store.js +0 -0
- package/dist/content-encoding.d.ts +27 -0
- package/dist/content-encoding.js +69 -0
- package/dist/context.d.ts +151 -0
- package/dist/context.js +21 -0
- package/dist/crdt-merger.d.ts +28 -0
- package/dist/crdt-merger.js +11 -0
- package/dist/d1-storage.d.ts +50 -0
- package/dist/d1-storage.js +0 -0
- package/dist/errors.d.ts +35 -9
- package/dist/errors.js +220 -11
- package/dist/events-ring.d.ts +55 -0
- package/dist/events-ring.js +96 -0
- package/dist/events.d.ts +231 -0
- package/dist/events.js +22 -0
- package/dist/frame-bytes.d.ts +20 -0
- package/dist/frame-bytes.js +75 -0
- package/dist/handler.d.ts +9 -0
- package/dist/handler.js +490 -0
- package/dist/index.d.ts +42 -33
- package/dist/index.js +45 -27
- package/dist/lease-store.d.ts +50 -0
- package/dist/lease-store.js +0 -0
- package/dist/pg-executor-pglite.d.ts +27 -0
- package/dist/pg-executor-pglite.js +33 -0
- package/dist/pg-executor.d.ts +67 -0
- package/dist/pg-executor.js +56 -0
- package/dist/postgres-fanout.d.ts +83 -0
- package/dist/postgres-fanout.js +71 -0
- package/dist/postgres-storage.d.ts +69 -0
- package/dist/postgres-storage.js +766 -0
- package/dist/prune.d.ts +24 -39
- package/dist/prune.js +44 -146
- package/dist/pull.d.ts +42 -67
- package/dist/pull.js +387 -1187
- package/dist/push.d.ts +31 -66
- package/dist/push.js +406 -655
- package/dist/realtime.d.ts +197 -0
- package/dist/realtime.js +848 -0
- package/dist/relational-rows.d.ts +229 -0
- package/dist/relational-rows.js +514 -0
- package/dist/s3-blob-store.d.ts +142 -0
- package/dist/s3-blob-store.js +458 -0
- package/dist/s3-segment-store.d.ts +95 -0
- package/dist/s3-segment-store.js +380 -0
- package/dist/schema.d.ts +82 -286
- package/dist/schema.js +133 -9
- package/dist/scopes.d.ts +48 -0
- package/dist/scopes.js +98 -0
- package/dist/segment-download.d.ts +14 -0
- package/dist/segment-download.js +125 -0
- package/dist/segment-store.d.ts +81 -0
- package/dist/segment-store.js +63 -0
- package/dist/signed-url.d.ts +139 -0
- package/dist/signed-url.js +143 -0
- package/dist/sigv4.d.ts +97 -0
- package/dist/sigv4.js +161 -0
- package/dist/sqlite-blob-store.d.ts +22 -0
- package/dist/sqlite-blob-store.js +86 -0
- package/dist/sqlite-dialect.d.ts +101 -0
- package/dist/sqlite-dialect.js +250 -0
- package/dist/sqlite-image.d.ts +27 -0
- package/dist/sqlite-image.js +83 -0
- package/dist/sqlite-lease-store.d.ts +21 -0
- package/dist/sqlite-lease-store.js +94 -0
- package/dist/sqlite-segment-store.d.ts +25 -0
- package/dist/sqlite-segment-store.js +115 -0
- package/dist/sqlite-storage.d.ts +47 -0
- package/dist/sqlite-storage.js +477 -0
- package/dist/storage.d.ts +252 -0
- package/dist/storage.js +1 -0
- package/dist/validate.d.ts +83 -0
- package/dist/validate.js +44 -0
- package/package.json +17 -325
- package/src/admin.ts +312 -0
- package/src/blob-handlers.ts +340 -0
- package/src/blob-store.ts +0 -0
- package/src/content-encoding.ts +94 -0
- package/src/context.ts +176 -0
- package/src/crdt-merger.ts +33 -0
- package/src/d1-storage.ts +0 -0
- package/src/errors.ts +241 -19
- package/src/events-ring.ts +116 -0
- package/src/events.ts +291 -0
- package/src/frame-bytes.ts +94 -0
- package/src/handler.ts +678 -0
- package/src/index.ts +44 -27
- package/src/lease-store.ts +0 -0
- package/src/pg-executor-pglite.ts +63 -0
- package/src/pg-executor.ts +87 -0
- package/src/postgres-fanout.ts +143 -0
- package/src/postgres-storage.ts +1182 -0
- package/src/prune.ts +63 -289
- package/src/pull.ts +505 -1805
- package/src/push.ts +623 -1006
- package/src/realtime.ts +1082 -0
- package/src/relational-rows.ts +633 -0
- package/src/s3-blob-store.ts +616 -0
- package/src/s3-segment-store.ts +519 -0
- package/src/schema.ts +242 -281
- package/src/scopes.ts +127 -0
- package/src/segment-download.ts +169 -0
- package/src/segment-store.ts +154 -0
- package/src/signed-url.ts +308 -0
- package/src/sigv4.ts +267 -0
- package/src/sqlite-blob-store.ts +125 -0
- package/src/sqlite-dialect.ts +337 -0
- package/src/sqlite-image.ts +124 -0
- package/src/sqlite-lease-store.ts +144 -0
- package/src/sqlite-segment-store.ts +204 -0
- package/src/sqlite-storage.ts +792 -0
- package/src/storage.ts +316 -0
- package/src/validate.ts +123 -0
- package/dist/auth-leases.d.ts +0 -85
- package/dist/auth-leases.d.ts.map +0 -1
- package/dist/auth-leases.js +0 -368
- package/dist/auth-leases.js.map +0 -1
- package/dist/better-sqlite3.d.ts +0 -22
- package/dist/better-sqlite3.d.ts.map +0 -1
- package/dist/better-sqlite3.js +0 -16
- package/dist/better-sqlite3.js.map +0 -1
- package/dist/blobs/access.d.ts +0 -35
- package/dist/blobs/access.d.ts.map +0 -1
- package/dist/blobs/access.js +0 -149
- package/dist/blobs/access.js.map +0 -1
- package/dist/blobs/adapters/database.d.ts +0 -100
- package/dist/blobs/adapters/database.d.ts.map +0 -1
- package/dist/blobs/adapters/database.js +0 -247
- package/dist/blobs/adapters/database.js.map +0 -1
- package/dist/blobs/index.d.ts +0 -9
- package/dist/blobs/index.d.ts.map +0 -1
- package/dist/blobs/index.js +0 -9
- package/dist/blobs/index.js.map +0 -1
- package/dist/blobs/manager.d.ts +0 -220
- package/dist/blobs/manager.d.ts.map +0 -1
- package/dist/blobs/manager.js +0 -625
- package/dist/blobs/manager.js.map +0 -1
- package/dist/blobs/migrate.d.ts +0 -27
- package/dist/blobs/migrate.d.ts.map +0 -1
- package/dist/blobs/migrate.js +0 -127
- package/dist/blobs/migrate.js.map +0 -1
- package/dist/blobs/types.d.ts +0 -58
- package/dist/blobs/types.d.ts.map +0 -1
- package/dist/blobs/types.js +0 -5
- package/dist/blobs/types.js.map +0 -1
- package/dist/bun-sqlite.d.ts +0 -19
- package/dist/bun-sqlite.d.ts.map +0 -1
- package/dist/bun-sqlite.js +0 -19
- package/dist/bun-sqlite.js.map +0 -1
- package/dist/clients.d.ts +0 -15
- package/dist/clients.d.ts.map +0 -1
- package/dist/clients.js +0 -7
- package/dist/clients.js.map +0 -1
- package/dist/cloudflare/durable-object.d.ts +0 -93
- package/dist/cloudflare/durable-object.d.ts.map +0 -1
- package/dist/cloudflare/durable-object.js +0 -210
- package/dist/cloudflare/durable-object.js.map +0 -1
- package/dist/cloudflare/index.d.ts +0 -22
- package/dist/cloudflare/index.d.ts.map +0 -1
- package/dist/cloudflare/index.js +0 -22
- package/dist/cloudflare/index.js.map +0 -1
- package/dist/cloudflare/r2.d.ts +0 -180
- package/dist/cloudflare/r2.d.ts.map +0 -1
- package/dist/cloudflare/r2.js +0 -258
- package/dist/cloudflare/r2.js.map +0 -1
- package/dist/cloudflare/scope-cache.d.ts +0 -54
- package/dist/cloudflare/scope-cache.d.ts.map +0 -1
- package/dist/cloudflare/scope-cache.js +0 -223
- package/dist/cloudflare/scope-cache.js.map +0 -1
- package/dist/cloudflare/sentry.d.ts +0 -47
- package/dist/cloudflare/sentry.d.ts.map +0 -1
- package/dist/cloudflare/sentry.js +0 -163
- package/dist/cloudflare/sentry.js.map +0 -1
- package/dist/cloudflare/worker.d.ts +0 -46
- package/dist/cloudflare/worker.d.ts.map +0 -1
- package/dist/cloudflare/worker.js +0 -63
- package/dist/cloudflare/worker.js.map +0 -1
- package/dist/commit-integrity.d.ts +0 -38
- package/dist/commit-integrity.d.ts.map +0 -1
- package/dist/commit-integrity.js +0 -260
- package/dist/commit-integrity.js.map +0 -1
- package/dist/compaction.d.ts +0 -27
- package/dist/compaction.d.ts.map +0 -1
- package/dist/compaction.js +0 -49
- package/dist/compaction.js.map +0 -1
- package/dist/crdt-yjs/index.d.ts +0 -99
- package/dist/crdt-yjs/index.d.ts.map +0 -1
- package/dist/crdt-yjs/index.js +0 -629
- package/dist/crdt-yjs/index.js.map +0 -1
- package/dist/d1.d.ts +0 -13
- package/dist/d1.d.ts.map +0 -1
- package/dist/d1.js +0 -14
- package/dist/d1.js.map +0 -1
- package/dist/dialect/base.d.ts +0 -93
- package/dist/dialect/base.d.ts.map +0 -1
- package/dist/dialect/base.js +0 -181
- package/dist/dialect/base.js.map +0 -1
- package/dist/dialect/helpers.d.ts +0 -16
- package/dist/dialect/helpers.d.ts.map +0 -1
- package/dist/dialect/helpers.js +0 -83
- package/dist/dialect/helpers.js.map +0 -1
- package/dist/dialect/index.d.ts +0 -7
- package/dist/dialect/index.d.ts.map +0 -1
- package/dist/dialect/index.js +0 -7
- package/dist/dialect/index.js.map +0 -1
- package/dist/dialect/types.d.ts +0 -187
- package/dist/dialect/types.d.ts.map +0 -1
- package/dist/dialect/types.js +0 -8
- package/dist/dialect/types.js.map +0 -1
- package/dist/encrypted-crdt.d.ts +0 -67
- package/dist/encrypted-crdt.d.ts.map +0 -1
- package/dist/encrypted-crdt.js +0 -426
- package/dist/encrypted-crdt.js.map +0 -1
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js.map +0 -1
- package/dist/filesystem/index.d.ts +0 -44
- package/dist/filesystem/index.d.ts.map +0 -1
- package/dist/filesystem/index.js +0 -164
- package/dist/filesystem/index.js.map +0 -1
- package/dist/handlers/collection.d.ts +0 -20
- package/dist/handlers/collection.d.ts.map +0 -1
- package/dist/handlers/collection.js +0 -42
- package/dist/handlers/collection.js.map +0 -1
- package/dist/handlers/create-handler.d.ts +0 -156
- package/dist/handlers/create-handler.d.ts.map +0 -1
- package/dist/handlers/create-handler.js +0 -626
- package/dist/handlers/create-handler.js.map +0 -1
- package/dist/handlers/index.d.ts +0 -4
- package/dist/handlers/index.d.ts.map +0 -1
- package/dist/handlers/index.js +0 -4
- package/dist/handlers/index.js.map +0 -1
- package/dist/handlers/types.d.ts +0 -295
- package/dist/handlers/types.d.ts.map +0 -1
- package/dist/handlers/types.js +0 -2
- package/dist/handlers/types.js.map +0 -1
- package/dist/helpers/conflict.d.ts +0 -52
- package/dist/helpers/conflict.d.ts.map +0 -1
- package/dist/helpers/conflict.js +0 -49
- package/dist/helpers/conflict.js.map +0 -1
- package/dist/helpers/emitted-change.d.ts +0 -56
- package/dist/helpers/emitted-change.d.ts.map +0 -1
- package/dist/helpers/emitted-change.js +0 -46
- package/dist/helpers/emitted-change.js.map +0 -1
- package/dist/helpers/index.d.ts +0 -12
- package/dist/helpers/index.d.ts.map +0 -1
- package/dist/helpers/index.js +0 -12
- package/dist/helpers/index.js.map +0 -1
- package/dist/helpers/paginate.d.ts +0 -49
- package/dist/helpers/paginate.d.ts.map +0 -1
- package/dist/helpers/paginate.js +0 -54
- package/dist/helpers/paginate.js.map +0 -1
- package/dist/helpers/scope-authorization.d.ts +0 -7
- package/dist/helpers/scope-authorization.d.ts.map +0 -1
- package/dist/helpers/scope-authorization.js +0 -19
- package/dist/helpers/scope-authorization.js.map +0 -1
- package/dist/helpers/scope-commit-index.d.ts +0 -12
- package/dist/helpers/scope-commit-index.d.ts.map +0 -1
- package/dist/helpers/scope-commit-index.js +0 -35
- package/dist/helpers/scope-commit-index.js.map +0 -1
- package/dist/helpers/scope-strings.d.ts +0 -74
- package/dist/helpers/scope-strings.d.ts.map +0 -1
- package/dist/helpers/scope-strings.js +0 -82
- package/dist/helpers/scope-strings.js.map +0 -1
- package/dist/hono/api-key-auth.d.ts +0 -49
- package/dist/hono/api-key-auth.d.ts.map +0 -1
- package/dist/hono/api-key-auth.js +0 -108
- package/dist/hono/api-key-auth.js.map +0 -1
- package/dist/hono/audit-redaction.d.ts +0 -20
- package/dist/hono/audit-redaction.d.ts.map +0 -1
- package/dist/hono/audit-redaction.js +0 -85
- package/dist/hono/audit-redaction.js.map +0 -1
- package/dist/hono/blobs.d.ts +0 -75
- package/dist/hono/blobs.d.ts.map +0 -1
- package/dist/hono/blobs.js +0 -586
- package/dist/hono/blobs.js.map +0 -1
- package/dist/hono/console/gateway.d.ts +0 -42
- package/dist/hono/console/gateway.d.ts.map +0 -1
- package/dist/hono/console/gateway.js +0 -2158
- package/dist/hono/console/gateway.js.map +0 -1
- package/dist/hono/console/live-auth.d.ts +0 -7
- package/dist/hono/console/live-auth.d.ts.map +0 -1
- package/dist/hono/console/live-auth.js +0 -39
- package/dist/hono/console/live-auth.js.map +0 -1
- package/dist/hono/console/route-descriptor.d.ts +0 -6
- package/dist/hono/console/route-descriptor.d.ts.map +0 -1
- package/dist/hono/console/route-descriptor.js +0 -16
- package/dist/hono/console/route-descriptor.js.map +0 -1
- package/dist/hono/console/routes/api-keys.d.ts +0 -8
- package/dist/hono/console/routes/api-keys.d.ts.map +0 -1
- package/dist/hono/console/routes/api-keys.js +0 -575
- package/dist/hono/console/routes/api-keys.js.map +0 -1
- package/dist/hono/console/routes/clients.d.ts +0 -8
- package/dist/hono/console/routes/clients.d.ts.map +0 -1
- package/dist/hono/console/routes/clients.js +0 -322
- package/dist/hono/console/routes/clients.js.map +0 -1
- package/dist/hono/console/routes/commits.d.ts +0 -8
- package/dist/hono/console/routes/commits.d.ts.map +0 -1
- package/dist/hono/console/routes/commits.js +0 -882
- package/dist/hono/console/routes/commits.js.map +0 -1
- package/dist/hono/console/routes/context.d.ts +0 -188
- package/dist/hono/console/routes/context.d.ts.map +0 -1
- package/dist/hono/console/routes/context.js +0 -633
- package/dist/hono/console/routes/context.js.map +0 -1
- package/dist/hono/console/routes/events.d.ts +0 -8
- package/dist/hono/console/routes/events.d.ts.map +0 -1
- package/dist/hono/console/routes/events.js +0 -501
- package/dist/hono/console/routes/events.js.map +0 -1
- package/dist/hono/console/routes/maintenance.d.ts +0 -8
- package/dist/hono/console/routes/maintenance.d.ts.map +0 -1
- package/dist/hono/console/routes/maintenance.js +0 -341
- package/dist/hono/console/routes/maintenance.js.map +0 -1
- package/dist/hono/console/routes/shared.d.ts +0 -174
- package/dist/hono/console/routes/shared.d.ts.map +0 -1
- package/dist/hono/console/routes/shared.js +0 -583
- package/dist/hono/console/routes/shared.js.map +0 -1
- package/dist/hono/console/routes/stats.d.ts +0 -8
- package/dist/hono/console/routes/stats.d.ts.map +0 -1
- package/dist/hono/console/routes/stats.js +0 -295
- package/dist/hono/console/routes/stats.js.map +0 -1
- package/dist/hono/console/routes/storage.d.ts +0 -8
- package/dist/hono/console/routes/storage.d.ts.map +0 -1
- package/dist/hono/console/routes/storage.js +0 -121
- package/dist/hono/console/routes/storage.js.map +0 -1
- package/dist/hono/console/routes.d.ts +0 -36
- package/dist/hono/console/routes.d.ts.map +0 -1
- package/dist/hono/console/routes.js +0 -112
- package/dist/hono/console/routes.js.map +0 -1
- package/dist/hono/console/schema-errors.d.ts +0 -2
- package/dist/hono/console/schema-errors.d.ts.map +0 -1
- package/dist/hono/console/schema-errors.js +0 -17
- package/dist/hono/console/schema-errors.js.map +0 -1
- package/dist/hono/console/schemas.d.ts +0 -1515
- package/dist/hono/console/schemas.d.ts.map +0 -1
- package/dist/hono/console/schemas.js +0 -661
- package/dist/hono/console/schemas.js.map +0 -1
- package/dist/hono/console/types.d.ts +0 -213
- package/dist/hono/console/types.d.ts.map +0 -1
- package/dist/hono/console/types.js +0 -2
- package/dist/hono/console/types.js.map +0 -1
- package/dist/hono/console/ui.d.ts +0 -38
- package/dist/hono/console/ui.d.ts.map +0 -1
- package/dist/hono/console/ui.js +0 -43
- package/dist/hono/console/ui.js.map +0 -1
- package/dist/hono/create-server.d.ts +0 -71
- package/dist/hono/create-server.d.ts.map +0 -1
- package/dist/hono/create-server.js +0 -121
- package/dist/hono/create-server.js.map +0 -1
- package/dist/hono/errors.d.ts +0 -13
- package/dist/hono/errors.d.ts.map +0 -1
- package/dist/hono/errors.js +0 -21
- package/dist/hono/errors.js.map +0 -1
- package/dist/hono/index.d.ts +0 -20
- package/dist/hono/index.d.ts.map +0 -1
- package/dist/hono/index.js +0 -31
- package/dist/hono/index.js.map +0 -1
- package/dist/hono/openapi.d.ts +0 -72
- package/dist/hono/openapi.d.ts.map +0 -1
- package/dist/hono/openapi.js +0 -99
- package/dist/hono/openapi.js.map +0 -1
- package/dist/hono/proxy/connection-manager.d.ts +0 -78
- package/dist/hono/proxy/connection-manager.d.ts.map +0 -1
- package/dist/hono/proxy/connection-manager.js +0 -251
- package/dist/hono/proxy/connection-manager.js.map +0 -1
- package/dist/hono/proxy/index.d.ts +0 -8
- package/dist/hono/proxy/index.d.ts.map +0 -1
- package/dist/hono/proxy/index.js +0 -8
- package/dist/hono/proxy/index.js.map +0 -1
- package/dist/hono/proxy/routes.d.ts +0 -86
- package/dist/hono/proxy/routes.d.ts.map +0 -1
- package/dist/hono/proxy/routes.js +0 -183
- package/dist/hono/proxy/routes.js.map +0 -1
- package/dist/hono/rate-limit.d.ts +0 -101
- package/dist/hono/rate-limit.d.ts.map +0 -1
- package/dist/hono/rate-limit.js +0 -184
- package/dist/hono/rate-limit.js.map +0 -1
- package/dist/hono/realtime-sync-packs.d.ts +0 -43
- package/dist/hono/realtime-sync-packs.d.ts.map +0 -1
- package/dist/hono/realtime-sync-packs.js +0 -219
- package/dist/hono/realtime-sync-packs.js.map +0 -1
- package/dist/hono/routes/audit.d.ts +0 -12
- package/dist/hono/routes/audit.d.ts.map +0 -1
- package/dist/hono/routes/audit.js +0 -385
- package/dist/hono/routes/audit.js.map +0 -1
- package/dist/hono/routes/auth-leases.d.ts +0 -8
- package/dist/hono/routes/auth-leases.d.ts.map +0 -1
- package/dist/hono/routes/auth-leases.js +0 -88
- package/dist/hono/routes/auth-leases.js.map +0 -1
- package/dist/hono/routes/combined.d.ts +0 -8
- package/dist/hono/routes/combined.d.ts.map +0 -1
- package/dist/hono/routes/combined.js +0 -392
- package/dist/hono/routes/combined.js.map +0 -1
- package/dist/hono/routes/context.d.ts +0 -314
- package/dist/hono/routes/context.d.ts.map +0 -1
- package/dist/hono/routes/context.js +0 -1147
- package/dist/hono/routes/context.js.map +0 -1
- package/dist/hono/routes/health.d.ts +0 -8
- package/dist/hono/routes/health.d.ts.map +0 -1
- package/dist/hono/routes/health.js +0 -16
- package/dist/hono/routes/health.js.map +0 -1
- package/dist/hono/routes/realtime.d.ts +0 -9
- package/dist/hono/routes/realtime.d.ts.map +0 -1
- package/dist/hono/routes/realtime.js +0 -626
- package/dist/hono/routes/realtime.js.map +0 -1
- package/dist/hono/routes/shared.d.ts +0 -689
- package/dist/hono/routes/shared.d.ts.map +0 -1
- package/dist/hono/routes/shared.js +0 -972
- package/dist/hono/routes/shared.js.map +0 -1
- package/dist/hono/routes/snapshots.d.ts +0 -10
- package/dist/hono/routes/snapshots.d.ts.map +0 -1
- package/dist/hono/routes/snapshots.js +0 -281
- package/dist/hono/routes/snapshots.js.map +0 -1
- package/dist/hono/routes.d.ts +0 -19
- package/dist/hono/routes.d.ts.map +0 -1
- package/dist/hono/routes.js +0 -37
- package/dist/hono/routes.js.map +0 -1
- package/dist/hono/validation.d.ts +0 -5
- package/dist/hono/validation.d.ts.map +0 -1
- package/dist/hono/validation.js +0 -47
- package/dist/hono/validation.js.map +0 -1
- package/dist/hono/websocket-origin.d.ts +0 -9
- package/dist/hono/websocket-origin.d.ts.map +0 -1
- package/dist/hono/websocket-origin.js +0 -96
- package/dist/hono/websocket-origin.js.map +0 -1
- package/dist/hono/ws.d.ts +0 -341
- package/dist/hono/ws.d.ts.map +0 -1
- package/dist/hono/ws.js +0 -711
- package/dist/hono/ws.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/libsql.d.ts +0 -29
- package/dist/libsql.d.ts.map +0 -1
- package/dist/libsql.js +0 -25
- package/dist/libsql.js.map +0 -1
- package/dist/migrate.d.ts +0 -14
- package/dist/migrate.d.ts.map +0 -1
- package/dist/migrate.js +0 -13
- package/dist/migrate.js.map +0 -1
- package/dist/neon.d.ts +0 -21
- package/dist/neon.d.ts.map +0 -1
- package/dist/neon.js +0 -22
- package/dist/neon.js.map +0 -1
- package/dist/notify.d.ts +0 -77
- package/dist/notify.d.ts.map +0 -1
- package/dist/notify.js +0 -233
- package/dist/notify.js.map +0 -1
- package/dist/pglite.d.ts +0 -37
- package/dist/pglite.d.ts.map +0 -1
- package/dist/pglite.js +0 -37
- package/dist/pglite.js.map +0 -1
- package/dist/plugins/index.d.ts +0 -2
- package/dist/plugins/index.d.ts.map +0 -1
- package/dist/plugins/index.js +0 -2
- package/dist/plugins/index.js.map +0 -1
- package/dist/plugins/types.d.ts +0 -73
- package/dist/plugins/types.d.ts.map +0 -1
- package/dist/plugins/types.js +0 -30
- package/dist/plugins/types.js.map +0 -1
- package/dist/postgres/index.d.ts +0 -68
- package/dist/postgres/index.d.ts.map +0 -1
- package/dist/postgres/index.js +0 -924
- package/dist/postgres/index.js.map +0 -1
- package/dist/proxy/collection.d.ts +0 -7
- package/dist/proxy/collection.d.ts.map +0 -1
- package/dist/proxy/collection.js +0 -6
- package/dist/proxy/collection.js.map +0 -1
- package/dist/proxy/handler.d.ts +0 -42
- package/dist/proxy/handler.d.ts.map +0 -1
- package/dist/proxy/handler.js +0 -102
- package/dist/proxy/handler.js.map +0 -1
- package/dist/proxy/index.d.ts +0 -9
- package/dist/proxy/index.d.ts.map +0 -1
- package/dist/proxy/index.js +0 -14
- package/dist/proxy/index.js.map +0 -1
- package/dist/proxy/mutation-detector.d.ts +0 -35
- package/dist/proxy/mutation-detector.d.ts.map +0 -1
- package/dist/proxy/mutation-detector.js +0 -246
- package/dist/proxy/mutation-detector.js.map +0 -1
- package/dist/proxy/oplog.d.ts +0 -30
- package/dist/proxy/oplog.d.ts.map +0 -1
- package/dist/proxy/oplog.js +0 -137
- package/dist/proxy/oplog.js.map +0 -1
- package/dist/proxy/types.d.ts +0 -44
- package/dist/proxy/types.d.ts.map +0 -1
- package/dist/proxy/types.js +0 -7
- package/dist/proxy/types.js.map +0 -1
- package/dist/prune.d.ts.map +0 -1
- package/dist/prune.js.map +0 -1
- package/dist/pull.d.ts.map +0 -1
- package/dist/pull.js.map +0 -1
- package/dist/push.d.ts.map +0 -1
- package/dist/push.js.map +0 -1
- package/dist/realtime/in-memory.d.ts +0 -13
- package/dist/realtime/in-memory.d.ts.map +0 -1
- package/dist/realtime/in-memory.js +0 -28
- package/dist/realtime/in-memory.js.map +0 -1
- package/dist/realtime/index.d.ts +0 -4
- package/dist/realtime/index.d.ts.map +0 -1
- package/dist/realtime/index.js +0 -3
- package/dist/realtime/index.js.map +0 -1
- package/dist/realtime/types.d.ts +0 -62
- package/dist/realtime/types.d.ts.map +0 -1
- package/dist/realtime/types.js +0 -19
- package/dist/realtime/types.js.map +0 -1
- package/dist/relay/client-role/forward-engine.d.ts +0 -63
- package/dist/relay/client-role/forward-engine.d.ts.map +0 -1
- package/dist/relay/client-role/forward-engine.js +0 -267
- package/dist/relay/client-role/forward-engine.js.map +0 -1
- package/dist/relay/client-role/index.d.ts +0 -9
- package/dist/relay/client-role/index.d.ts.map +0 -1
- package/dist/relay/client-role/index.js +0 -9
- package/dist/relay/client-role/index.js.map +0 -1
- package/dist/relay/client-role/pull-engine.d.ts +0 -72
- package/dist/relay/client-role/pull-engine.d.ts.map +0 -1
- package/dist/relay/client-role/pull-engine.js +0 -249
- package/dist/relay/client-role/pull-engine.js.map +0 -1
- package/dist/relay/client-role/sequence-mapper.d.ts +0 -65
- package/dist/relay/client-role/sequence-mapper.d.ts.map +0 -1
- package/dist/relay/client-role/sequence-mapper.js +0 -161
- package/dist/relay/client-role/sequence-mapper.js.map +0 -1
- package/dist/relay/evaluation/relay-paths.d.ts +0 -41
- package/dist/relay/evaluation/relay-paths.d.ts.map +0 -1
- package/dist/relay/evaluation/relay-paths.js +0 -504
- package/dist/relay/evaluation/relay-paths.js.map +0 -1
- package/dist/relay/evaluation/rust-boundary.d.ts +0 -47
- package/dist/relay/evaluation/rust-boundary.d.ts.map +0 -1
- package/dist/relay/evaluation/rust-boundary.js +0 -220
- package/dist/relay/evaluation/rust-boundary.js.map +0 -1
- package/dist/relay/index.d.ts +0 -37
- package/dist/relay/index.d.ts.map +0 -1
- package/dist/relay/index.js +0 -44
- package/dist/relay/index.js.map +0 -1
- package/dist/relay/migrate.d.ts +0 -18
- package/dist/relay/migrate.d.ts.map +0 -1
- package/dist/relay/migrate.js +0 -99
- package/dist/relay/migrate.js.map +0 -1
- package/dist/relay/mode-manager.d.ts +0 -60
- package/dist/relay/mode-manager.d.ts.map +0 -1
- package/dist/relay/mode-manager.js +0 -114
- package/dist/relay/mode-manager.js.map +0 -1
- package/dist/relay/realtime.d.ts +0 -90
- package/dist/relay/realtime.d.ts.map +0 -1
- package/dist/relay/realtime.js +0 -147
- package/dist/relay/realtime.js.map +0 -1
- package/dist/relay/relay.d.ts +0 -190
- package/dist/relay/relay.d.ts.map +0 -1
- package/dist/relay/relay.js +0 -320
- package/dist/relay/relay.js.map +0 -1
- package/dist/relay/schema.d.ts +0 -158
- package/dist/relay/schema.d.ts.map +0 -1
- package/dist/relay/schema.js +0 -7
- package/dist/relay/schema.js.map +0 -1
- package/dist/relay/server-role/index.d.ts +0 -56
- package/dist/relay/server-role/index.d.ts.map +0 -1
- package/dist/relay/server-role/index.js +0 -193
- package/dist/relay/server-role/index.js.map +0 -1
- package/dist/relay/server-role/pull.d.ts +0 -27
- package/dist/relay/server-role/pull.d.ts.map +0 -1
- package/dist/relay/server-role/pull.js +0 -24
- package/dist/relay/server-role/pull.js.map +0 -1
- package/dist/relay/server-role/push.d.ts +0 -29
- package/dist/relay/server-role/push.d.ts.map +0 -1
- package/dist/relay/server-role/push.js +0 -122
- package/dist/relay/server-role/push.js.map +0 -1
- package/dist/s3/index.d.ts +0 -83
- package/dist/s3/index.d.ts.map +0 -1
- package/dist/s3/index.js +0 -223
- package/dist/s3/index.js.map +0 -1
- package/dist/schema.d.ts.map +0 -1
- package/dist/schema.js.map +0 -1
- package/dist/service-worker/index.d.ts +0 -114
- package/dist/service-worker/index.d.ts.map +0 -1
- package/dist/service-worker/index.js +0 -487
- package/dist/service-worker/index.js.map +0 -1
- package/dist/snapshot-artifacts/sqlite-bun.d.ts +0 -15
- package/dist/snapshot-artifacts/sqlite-bun.d.ts.map +0 -1
- package/dist/snapshot-artifacts/sqlite-bun.js +0 -128
- package/dist/snapshot-artifacts/sqlite-bun.js.map +0 -1
- package/dist/snapshot-artifacts.d.ts +0 -206
- package/dist/snapshot-artifacts.d.ts.map +0 -1
- package/dist/snapshot-artifacts.js +0 -545
- package/dist/snapshot-artifacts.js.map +0 -1
- package/dist/snapshot-chunks/db-metadata.d.ts +0 -56
- package/dist/snapshot-chunks/db-metadata.d.ts.map +0 -1
- package/dist/snapshot-chunks/db-metadata.js +0 -360
- package/dist/snapshot-chunks/db-metadata.js.map +0 -1
- package/dist/snapshot-chunks/index.d.ts +0 -8
- package/dist/snapshot-chunks/index.d.ts.map +0 -1
- package/dist/snapshot-chunks/index.js +0 -8
- package/dist/snapshot-chunks/index.js.map +0 -1
- package/dist/snapshot-chunks/types.d.ts +0 -80
- package/dist/snapshot-chunks/types.d.ts.map +0 -1
- package/dist/snapshot-chunks/types.js +0 -8
- package/dist/snapshot-chunks/types.js.map +0 -1
- package/dist/snapshot-chunks.d.ts +0 -90
- package/dist/snapshot-chunks.d.ts.map +0 -1
- package/dist/snapshot-chunks.js +0 -304
- package/dist/snapshot-chunks.js.map +0 -1
- package/dist/sqlite/index.d.ts +0 -53
- package/dist/sqlite/index.d.ts.map +0 -1
- package/dist/sqlite/index.js +0 -795
- package/dist/sqlite/index.js.map +0 -1
- package/dist/sqlite3.d.ts +0 -22
- package/dist/sqlite3.d.ts.map +0 -1
- package/dist/sqlite3.js +0 -99
- package/dist/sqlite3.js.map +0 -1
- package/dist/stats.d.ts +0 -28
- package/dist/stats.d.ts.map +0 -1
- package/dist/stats.js +0 -93
- package/dist/stats.js.map +0 -1
- package/dist/subscriptions/cache.d.ts +0 -58
- package/dist/subscriptions/cache.d.ts.map +0 -1
- package/dist/subscriptions/cache.js +0 -250
- package/dist/subscriptions/cache.js.map +0 -1
- package/dist/subscriptions/index.d.ts +0 -3
- package/dist/subscriptions/index.d.ts.map +0 -1
- package/dist/subscriptions/index.js +0 -3
- package/dist/subscriptions/index.js.map +0 -1
- package/dist/subscriptions/resolve.d.ts +0 -40
- package/dist/subscriptions/resolve.d.ts.map +0 -1
- package/dist/subscriptions/resolve.js +0 -275
- package/dist/subscriptions/resolve.js.map +0 -1
- package/dist/sync.d.ts +0 -24
- package/dist/sync.d.ts.map +0 -1
- package/dist/sync.js +0 -27
- package/dist/sync.js.map +0 -1
- package/src/auth-leases.ts +0 -649
- package/src/better-sqlite3.ts +0 -35
- package/src/blobs/access.ts +0 -244
- package/src/blobs/adapters/database.ts +0 -397
- package/src/blobs/index.ts +0 -9
- package/src/blobs/manager.ts +0 -901
- package/src/blobs/migrate.ts +0 -158
- package/src/blobs/types.ts +0 -74
- package/src/bun-sqlite-ambient.d.ts +0 -19
- package/src/bun-sqlite.ts +0 -27
- package/src/clients.ts +0 -22
- package/src/cloudflare/durable-object.ts +0 -289
- package/src/cloudflare/index.ts +0 -22
- package/src/cloudflare/r2.ts +0 -526
- package/src/cloudflare/scope-cache.ts +0 -341
- package/src/cloudflare/sentry.ts +0 -230
- package/src/cloudflare/worker.ts +0 -77
- package/src/commit-integrity.ts +0 -371
- package/src/compaction.ts +0 -77
- package/src/crdt-yjs/index.ts +0 -931
- package/src/d1.ts +0 -16
- package/src/dialect/base.ts +0 -360
- package/src/dialect/helpers.ts +0 -92
- package/src/dialect/index.ts +0 -7
- package/src/dialect/types.ts +0 -247
- package/src/encrypted-crdt.ts +0 -786
- package/src/filesystem/index.ts +0 -262
- package/src/handlers/collection.ts +0 -121
- package/src/handlers/create-handler.ts +0 -1134
- package/src/handlers/index.ts +0 -3
- package/src/handlers/types.ts +0 -403
- package/src/helpers/conflict.ts +0 -64
- package/src/helpers/emitted-change.ts +0 -69
- package/src/helpers/index.ts +0 -12
- package/src/helpers/paginate.ts +0 -82
- package/src/helpers/scope-authorization.ts +0 -27
- package/src/helpers/scope-commit-index.ts +0 -52
- package/src/helpers/scope-strings.ts +0 -101
- package/src/hono/api-key-auth.ts +0 -177
- package/src/hono/audit-redaction.ts +0 -135
- package/src/hono/blobs.ts +0 -851
- package/src/hono/console/gateway.ts +0 -3046
- package/src/hono/console/live-auth.ts +0 -46
- package/src/hono/console/route-descriptor.ts +0 -22
- package/src/hono/console/routes/api-keys.ts +0 -721
- package/src/hono/console/routes/clients.ts +0 -447
- package/src/hono/console/routes/commits.ts +0 -1137
- package/src/hono/console/routes/context.ts +0 -956
- package/src/hono/console/routes/events.ts +0 -669
- package/src/hono/console/routes/maintenance.ts +0 -461
- package/src/hono/console/routes/shared.ts +0 -816
- package/src/hono/console/routes/stats.ts +0 -392
- package/src/hono/console/routes/storage.ts +0 -159
- package/src/hono/console/routes.ts +0 -146
- package/src/hono/console/schema-errors.ts +0 -23
- package/src/hono/console/schemas.ts +0 -914
- package/src/hono/console/types.ts +0 -223
- package/src/hono/console/ui.ts +0 -100
- package/src/hono/create-server.ts +0 -230
- package/src/hono/errors.ts +0 -50
- package/src/hono/index.ts +0 -54
- package/src/hono/openapi.ts +0 -139
- package/src/hono/proxy/connection-manager.ts +0 -340
- package/src/hono/proxy/index.ts +0 -8
- package/src/hono/proxy/routes.ts +0 -272
- package/src/hono/rate-limit.ts +0 -319
- package/src/hono/realtime-sync-packs.ts +0 -354
- package/src/hono/routes/audit.ts +0 -499
- package/src/hono/routes/auth-leases.ts +0 -119
- package/src/hono/routes/combined.ts +0 -583
- package/src/hono/routes/context.ts +0 -1629
- package/src/hono/routes/health.ts +0 -26
- package/src/hono/routes/realtime.ts +0 -808
- package/src/hono/routes/shared.ts +0 -1626
- package/src/hono/routes/snapshots.ts +0 -345
- package/src/hono/routes.ts +0 -68
- package/src/hono/validation.ts +0 -81
- package/src/hono/websocket-origin.ts +0 -131
- package/src/hono/ws.ts +0 -1134
- package/src/libsql.ts +0 -51
- package/src/migrate.ts +0 -20
- package/src/neon.ts +0 -28
- package/src/notify.ts +0 -341
- package/src/pglite.ts +0 -68
- package/src/plugins/index.ts +0 -1
- package/src/plugins/types.ts +0 -144
- package/src/postgres/index.ts +0 -1291
- package/src/proxy/collection.ts +0 -17
- package/src/proxy/handler.ts +0 -159
- package/src/proxy/index.ts +0 -21
- package/src/proxy/mutation-detector.ts +0 -281
- package/src/proxy/oplog.ts +0 -181
- package/src/proxy/types.ts +0 -46
- package/src/realtime/in-memory.ts +0 -33
- package/src/realtime/index.ts +0 -7
- package/src/realtime/types.ts +0 -90
- package/src/relay/bun-types.d.ts +0 -50
- package/src/relay/client-role/forward-engine.ts +0 -355
- package/src/relay/client-role/index.ts +0 -9
- package/src/relay/client-role/pull-engine.ts +0 -329
- package/src/relay/client-role/sequence-mapper.ts +0 -201
- package/src/relay/evaluation/relay-paths.ts +0 -699
- package/src/relay/evaluation/rust-boundary.ts +0 -464
- package/src/relay/index.ts +0 -50
- package/src/relay/migrate.ts +0 -113
- package/src/relay/mode-manager.ts +0 -142
- package/src/relay/realtime.ts +0 -207
- package/src/relay/relay.ts +0 -431
- package/src/relay/schema.ts +0 -171
- package/src/relay/server-role/index.ts +0 -338
- package/src/relay/server-role/pull.ts +0 -43
- package/src/relay/server-role/push.ts +0 -164
- package/src/s3/index.ts +0 -346
- package/src/service-worker/index.ts +0 -773
- package/src/snapshot-artifacts/sqlite-bun.ts +0 -168
- package/src/snapshot-artifacts.ts +0 -896
- package/src/snapshot-chunks/db-metadata.ts +0 -537
- package/src/snapshot-chunks/index.ts +0 -8
- package/src/snapshot-chunks/types.ts +0 -105
- package/src/snapshot-chunks.ts +0 -453
- package/src/sqlite/index.ts +0 -1064
- package/src/sqlite3.ts +0 -137
- package/src/stats.ts +0 -180
- package/src/subscriptions/cache.ts +0 -376
- package/src/subscriptions/index.ts +0 -2
- package/src/subscriptions/resolve.ts +0 -357
- package/src/sync.ts +0 -111
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-frame byte production for streaming responses (SPEC.md §1.4).
|
|
3
|
+
*
|
|
4
|
+
* The reference codec encodes whole messages; the server streams frames as
|
|
5
|
+
* they are produced. Rather than duplicating the codec's frame encoders
|
|
6
|
+
* (and risking drift), each frame is encoded inside a minimal legal wrapper
|
|
7
|
+
* message via the reference `encodeMessage`, and its length-prefixed bytes
|
|
8
|
+
* are sliced back out by walking the frame headers. Wrapper stubs are a few
|
|
9
|
+
* bytes; the reference codec remains the single source of wire bytes.
|
|
10
|
+
*/
|
|
11
|
+
import { encodeMessage, PROTOCOL_WIRE_VERSION, } from '@syncular/core';
|
|
12
|
+
const STUB_HEADER = { type: 'RESP_HEADER' };
|
|
13
|
+
const STUB_SUB_START = {
|
|
14
|
+
type: 'SUB_START',
|
|
15
|
+
id: '',
|
|
16
|
+
status: 'active',
|
|
17
|
+
reasonCode: '',
|
|
18
|
+
effectiveScopes: {},
|
|
19
|
+
bootstrap: false,
|
|
20
|
+
};
|
|
21
|
+
const STUB_SUB_END = { type: 'SUB_END', nextCursor: 0 };
|
|
22
|
+
const probe = encodeMessage({
|
|
23
|
+
wireVersion: PROTOCOL_WIRE_VERSION,
|
|
24
|
+
msgKind: 'response',
|
|
25
|
+
frames: [STUB_HEADER],
|
|
26
|
+
});
|
|
27
|
+
/** The 8-byte SSP2 response envelope header (§1.2). */
|
|
28
|
+
export const RESPONSE_ENVELOPE_HEADER = probe.slice(0, 8);
|
|
29
|
+
/** The terminating END frame (§1.2 rule 1). */
|
|
30
|
+
export const END_FRAME_BYTES = probe.slice(probe.length - 5);
|
|
31
|
+
function wrapperFor(frame) {
|
|
32
|
+
switch (frame.type) {
|
|
33
|
+
case 'RESP_HEADER':
|
|
34
|
+
return { frames: [frame], index: 0 };
|
|
35
|
+
case 'LEASE':
|
|
36
|
+
// §7.3.2: LEASE rides immediately after RESP_HEADER.
|
|
37
|
+
return { frames: [STUB_HEADER, frame], index: 1 };
|
|
38
|
+
case 'PUSH_RESULT':
|
|
39
|
+
case 'ERROR':
|
|
40
|
+
case 'UNKNOWN':
|
|
41
|
+
return { frames: [STUB_HEADER, frame], index: 1 };
|
|
42
|
+
case 'SUB_START':
|
|
43
|
+
return { frames: [STUB_HEADER, frame, STUB_SUB_END], index: 1 };
|
|
44
|
+
case 'SUB_END':
|
|
45
|
+
return { frames: [STUB_HEADER, STUB_SUB_START, frame], index: 2 };
|
|
46
|
+
case 'COMMIT':
|
|
47
|
+
case 'SEGMENT_REF':
|
|
48
|
+
case 'SEGMENT_INLINE':
|
|
49
|
+
return {
|
|
50
|
+
frames: [STUB_HEADER, STUB_SUB_START, frame, STUB_SUB_END],
|
|
51
|
+
index: 2,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Encode one response frame (5-byte frame header + payload) using the
|
|
57
|
+
* reference codec.
|
|
58
|
+
*/
|
|
59
|
+
export function encodeResponseFrame(frame) {
|
|
60
|
+
const { frames, index } = wrapperFor(frame);
|
|
61
|
+
const encoded = encodeMessage({
|
|
62
|
+
wireVersion: PROTOCOL_WIRE_VERSION,
|
|
63
|
+
msgKind: 'response',
|
|
64
|
+
frames,
|
|
65
|
+
});
|
|
66
|
+
const view = new DataView(encoded.buffer, encoded.byteOffset, encoded.byteLength);
|
|
67
|
+
let position = 8;
|
|
68
|
+
for (let i = 0;; i++) {
|
|
69
|
+
const length = view.getUint32(position + 1, true);
|
|
70
|
+
const end = position + 5 + length;
|
|
71
|
+
if (i === index)
|
|
72
|
+
return encoded.slice(position, end);
|
|
73
|
+
position = end;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { SyncRequestContext } from './context.js';
|
|
2
|
+
/**
|
|
3
|
+
* Decode and validate the request, then return the streaming response.
|
|
4
|
+
* Request-validation failures (§1.7) throw `SyncError` here, before any
|
|
5
|
+
* bytes are produced; adapters map them to HTTP JSON errors (§1.1).
|
|
6
|
+
*/
|
|
7
|
+
export declare function createSyncResponseStream(bytes: Uint8Array, ctx: SyncRequestContext): Promise<AsyncIterable<Uint8Array>>;
|
|
8
|
+
/** Byte-concatenating wrapper over the streaming core (§1.4). */
|
|
9
|
+
export declare function handleSyncRequest(bytes: Uint8Array, ctx: SyncRequestContext): Promise<Uint8Array>;
|
package/dist/handler.js
ADDED
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `handleSyncRequest(bytes, ctx) → bytes` (SPEC.md §1, REVISE B2).
|
|
3
|
+
*
|
|
4
|
+
* Internally streaming-friendly (§1.4): `createSyncResponseStream` returns
|
|
5
|
+
* an async iterable of encoded chunks — one per frame — after performing
|
|
6
|
+
* request validation (§1.7) eagerly, so validation failures throw as
|
|
7
|
+
* `SyncError`s before any bytes are produced (HTTP-level errors, §1.1).
|
|
8
|
+
* `handleSyncRequest` is the byte-concatenating convenience wrapper.
|
|
9
|
+
* A `SyncError` thrown after streaming began becomes an in-band `ERROR`
|
|
10
|
+
* frame (§1.6).
|
|
11
|
+
*/
|
|
12
|
+
import { DecodeError, decodeMessage, } from '@syncular/core';
|
|
13
|
+
import { clockOf, limitsOf, RESOLVER_OUTAGE } from './context.js';
|
|
14
|
+
import { SyncError, syncError } from './errors.js';
|
|
15
|
+
import { emitEvent, } from './events.js';
|
|
16
|
+
import { END_FRAME_BYTES, encodeResponseFrame, RESPONSE_ENVELOPE_HEADER, } from './frame-bytes.js';
|
|
17
|
+
import { ACCEPT_EXTERNAL_ROWS, ACCEPT_INLINE_ROWS, clampPullLimits, subscriptionSection, } from './pull.js';
|
|
18
|
+
import { processPushCommit } from './push.js';
|
|
19
|
+
import { compileSchema } from './schema.js';
|
|
20
|
+
import { computeEffective } from './scopes.js';
|
|
21
|
+
function validateResolvedKeys(allowed, schema) {
|
|
22
|
+
for (const key of Object.keys(allowed)) {
|
|
23
|
+
if (!schema.declaredVariables.has(key)) {
|
|
24
|
+
// §3.2 step 3: a resolver returning undeclared keys is a server
|
|
25
|
+
// bug — fail the request, do not guess.
|
|
26
|
+
throw syncError('sync.invalid_subscription', `resolveScopes returned undeclared scope variable ${JSON.stringify(key)} (§3.2)`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Authorize the request against the actor's stored lease (§7.3.3), used
|
|
32
|
+
* when the resolver signalled an outage. Throws the request-level lease
|
|
33
|
+
* codes; returns the leased allowed map on success. Never issues/refreshes
|
|
34
|
+
* (an outage cannot re-resolve).
|
|
35
|
+
*/
|
|
36
|
+
async function authorizeFromLease(ctx, clientId, schema) {
|
|
37
|
+
const leases = ctx.leases;
|
|
38
|
+
if (leases === undefined) {
|
|
39
|
+
// §7.3.3: outage signalled but the feature is off — no lease to fall
|
|
40
|
+
// to. The client needs a live authorization.
|
|
41
|
+
throw syncError('sync.auth_lease_required', 'live authorization is unavailable and auth leases are not configured (§7.3.3)');
|
|
42
|
+
}
|
|
43
|
+
const lease = await leases.store.get(ctx.partition, clientId);
|
|
44
|
+
if (lease === undefined || lease.actorId !== ctx.actorId) {
|
|
45
|
+
throw syncError('sync.auth_lease_required', 'no valid auth lease for this client during an authorization outage (§7.3.3)');
|
|
46
|
+
}
|
|
47
|
+
if (lease.revoked) {
|
|
48
|
+
throw syncError('sync.auth_lease_revoked', `auth lease ${lease.leaseId} was revoked (§7.3.4)`);
|
|
49
|
+
}
|
|
50
|
+
if (clockOf(ctx)() >= lease.expiresAtMs) {
|
|
51
|
+
throw syncError('sync.auth_lease_required', `auth lease ${lease.leaseId} is expired (§7.3.3)`);
|
|
52
|
+
}
|
|
53
|
+
validateResolvedKeys(lease.allowedScopes, schema);
|
|
54
|
+
return { ok: true, allowed: lease.allowedScopes };
|
|
55
|
+
}
|
|
56
|
+
async function resolveOnce(ctx, clientId, schema) {
|
|
57
|
+
let allowed;
|
|
58
|
+
try {
|
|
59
|
+
allowed = await ctx.resolveScopes({
|
|
60
|
+
partition: ctx.partition,
|
|
61
|
+
actorId: ctx.actorId,
|
|
62
|
+
clientId,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
if (error instanceof SyncError)
|
|
67
|
+
throw error;
|
|
68
|
+
// §3.2 rule 5 / §3.4 step 4: fail loud, never leak — subscriptions
|
|
69
|
+
// revoke and writes reject with sync.forbidden. A throw is NOT an
|
|
70
|
+
// outage (§7.3.3): it never reaches the lease.
|
|
71
|
+
const events = ctx.events;
|
|
72
|
+
if (events !== undefined) {
|
|
73
|
+
emitEvent(events, {
|
|
74
|
+
type: 'scopes.resolve_failed',
|
|
75
|
+
atMs: clockOf(ctx)(),
|
|
76
|
+
partition: ctx.partition,
|
|
77
|
+
actorId: ctx.actorId,
|
|
78
|
+
phase: 'request',
|
|
79
|
+
message: error instanceof Error ? error.message : String(error),
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
return { resolved: { ok: false }, leaseToEmit: undefined };
|
|
83
|
+
}
|
|
84
|
+
if (allowed === RESOLVER_OUTAGE) {
|
|
85
|
+
// §7.3.3: the host opted this request into lease authorization. No
|
|
86
|
+
// lease is issued/refreshed on an outage-served round.
|
|
87
|
+
const resolved = await authorizeFromLease(ctx, clientId, schema);
|
|
88
|
+
return { resolved, leaseToEmit: undefined };
|
|
89
|
+
}
|
|
90
|
+
validateResolvedKeys(allowed, schema);
|
|
91
|
+
// §7.3.3: a successful authorized round issues/refreshes the lease
|
|
92
|
+
// (sliding window) and emits a LEASE frame — only when configured.
|
|
93
|
+
let leaseToEmit;
|
|
94
|
+
if (ctx.leases !== undefined) {
|
|
95
|
+
leaseToEmit = await ctx.leases.store.issue(ctx.partition, clientId, ctx.actorId, allowed, clockOf(ctx)(), ctx.leases.ttlMs);
|
|
96
|
+
}
|
|
97
|
+
return { resolved: { ok: true, allowed }, leaseToEmit };
|
|
98
|
+
}
|
|
99
|
+
async function planRequest(request, ctx, schema) {
|
|
100
|
+
const header = request.frames[0];
|
|
101
|
+
if (header === undefined || header.type !== 'REQ_HEADER') {
|
|
102
|
+
throw syncError('sync.invalid_request', 'missing REQ_HEADER');
|
|
103
|
+
}
|
|
104
|
+
const pushes = [];
|
|
105
|
+
let pull;
|
|
106
|
+
const subFrames = [];
|
|
107
|
+
for (const frame of request.frames) {
|
|
108
|
+
if (frame.type === 'PUSH_COMMIT')
|
|
109
|
+
pushes.push(frame);
|
|
110
|
+
else if (frame.type === 'PULL_HEADER')
|
|
111
|
+
pull = frame;
|
|
112
|
+
else if (frame.type === 'SUBSCRIPTION')
|
|
113
|
+
subFrames.push(frame);
|
|
114
|
+
}
|
|
115
|
+
if (header.schemaVersion !== schema.version) {
|
|
116
|
+
// §2.4: no degraded encoding — answer with the schema floor (§1.6).
|
|
117
|
+
// No lease is issued on a floor round (§7.3.3).
|
|
118
|
+
return {
|
|
119
|
+
header,
|
|
120
|
+
pushes,
|
|
121
|
+
pull,
|
|
122
|
+
subscriptions: [],
|
|
123
|
+
resolved: { ok: false },
|
|
124
|
+
schemaFloor: true,
|
|
125
|
+
leaseToEmit: undefined,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
// §1.5: a clientId already bound to a different actor is rejected.
|
|
129
|
+
const record = await ctx.storage.getClientRecord(ctx.partition, header.clientId);
|
|
130
|
+
if (record !== undefined && record.actorId !== ctx.actorId) {
|
|
131
|
+
throw syncError('sync.invalid_client_id', 'clientId is bound to a different actor in this partition (§1.5)');
|
|
132
|
+
}
|
|
133
|
+
// §6.1: operation cap per request, whole batch unapplied.
|
|
134
|
+
const totalOperations = pushes.reduce((n, p) => n + p.operations.length, 0);
|
|
135
|
+
const limits = limitsOf(ctx);
|
|
136
|
+
if (totalOperations > limits.maxOperationsPerRequest) {
|
|
137
|
+
throw syncError('sync.too_many_operations', `request carries ${totalOperations} operations (cap ${limits.maxOperationsPerRequest}, §6.1)`);
|
|
138
|
+
}
|
|
139
|
+
if (pull !== undefined) {
|
|
140
|
+
// §4.2: rows support is mandatory (bits 0 and 1) — reject its absence
|
|
141
|
+
// as request validation (the MAY of §1.7).
|
|
142
|
+
if ((pull.accept & (ACCEPT_INLINE_ROWS | ACCEPT_EXTERNAL_ROWS)) === 0) {
|
|
143
|
+
throw syncError('sync.invalid_request', 'accept must include rows-segment support (bits 0 and 1, §4.2)');
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// Request validation for subscriptions (§1.7): duplicate ids, unknown
|
|
147
|
+
// tables, undeclared scope keys, requested '*'.
|
|
148
|
+
const seenIds = new Set();
|
|
149
|
+
const validated = [];
|
|
150
|
+
for (const frame of subFrames) {
|
|
151
|
+
if (seenIds.has(frame.id)) {
|
|
152
|
+
throw syncError('sync.invalid_subscription', `duplicate subscription id ${JSON.stringify(frame.id)} (§4.1)`);
|
|
153
|
+
}
|
|
154
|
+
seenIds.add(frame.id);
|
|
155
|
+
const table = schema.tables.get(frame.table);
|
|
156
|
+
if (table === undefined) {
|
|
157
|
+
throw syncError('sync.unknown_table', `subscription names unknown table ${JSON.stringify(frame.table)} (§4.3)`);
|
|
158
|
+
}
|
|
159
|
+
for (const [key, values] of Object.entries(frame.scopes)) {
|
|
160
|
+
if (!table.declaredVariables.has(key)) {
|
|
161
|
+
throw syncError('sync.invalid_subscription', `requested scope key ${JSON.stringify(key)} is not declared by table ${JSON.stringify(frame.table)} (§3.2)`);
|
|
162
|
+
}
|
|
163
|
+
if (values.includes('*')) {
|
|
164
|
+
throw syncError('sync.invalid_subscription', `requested scope value '*' is reserved for allowed scopes (§3.2)`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
validated.push({ frame, table: frame.table });
|
|
168
|
+
}
|
|
169
|
+
const { resolved, leaseToEmit } = await resolveOnce(ctx, header.clientId, schema);
|
|
170
|
+
const subscriptions = validated.map(({ frame }) => {
|
|
171
|
+
const table = schema.tables.get(frame.table);
|
|
172
|
+
if (table === undefined)
|
|
173
|
+
throw new Error('unreachable: validated table');
|
|
174
|
+
const outcome = computeEffective(frame.scopes, resolved);
|
|
175
|
+
if (outcome.status === 'active') {
|
|
176
|
+
return { frame, table, status: 'active', effective: outcome.effective };
|
|
177
|
+
}
|
|
178
|
+
return { frame, table, status: 'revoked', effective: {} };
|
|
179
|
+
});
|
|
180
|
+
return {
|
|
181
|
+
header,
|
|
182
|
+
pushes,
|
|
183
|
+
pull,
|
|
184
|
+
subscriptions,
|
|
185
|
+
resolved,
|
|
186
|
+
schemaFloor: false,
|
|
187
|
+
leaseToEmit,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
function emitPushEvent(events, ctx, clientId, push, frame) {
|
|
191
|
+
const base = {
|
|
192
|
+
atMs: clockOf(ctx)(),
|
|
193
|
+
partition: ctx.partition,
|
|
194
|
+
actorId: ctx.actorId,
|
|
195
|
+
clientId,
|
|
196
|
+
clientCommitId: push.clientCommitId,
|
|
197
|
+
operations: push.operations.length,
|
|
198
|
+
};
|
|
199
|
+
if (frame.status === 'applied' || frame.status === 'cached') {
|
|
200
|
+
emitEvent(events, {
|
|
201
|
+
type: 'push.applied',
|
|
202
|
+
...base,
|
|
203
|
+
...(frame.commitSeq !== undefined ? { commitSeq: frame.commitSeq } : {}),
|
|
204
|
+
replay: frame.status === 'cached',
|
|
205
|
+
});
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
// Rejected (§6.3): exactly one terminating operation record.
|
|
209
|
+
const record = frame.results[0];
|
|
210
|
+
if (record?.status === 'conflict') {
|
|
211
|
+
emitEvent(events, {
|
|
212
|
+
type: 'push.conflicted',
|
|
213
|
+
...base,
|
|
214
|
+
opIndex: record.opIndex,
|
|
215
|
+
});
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
emitEvent(events, {
|
|
219
|
+
type: 'push.rejected',
|
|
220
|
+
...base,
|
|
221
|
+
code: record !== undefined && record.status === 'error'
|
|
222
|
+
? record.code
|
|
223
|
+
: 'sync.invalid_request',
|
|
224
|
+
opIndex: record?.opIndex ?? 0,
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
async function* streamResponse(plan, ctx, schema, report) {
|
|
228
|
+
const events = ctx.events;
|
|
229
|
+
yield RESPONSE_ENVELOPE_HEADER;
|
|
230
|
+
if (plan.schemaFloor) {
|
|
231
|
+
if (report !== undefined)
|
|
232
|
+
report.outcome = 'schema_floor';
|
|
233
|
+
yield encodeResponseFrame({
|
|
234
|
+
type: 'RESP_HEADER',
|
|
235
|
+
requiredSchemaVersion: schema.version,
|
|
236
|
+
latestSchemaVersion: schema.version,
|
|
237
|
+
});
|
|
238
|
+
yield END_FRAME_BYTES;
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
yield encodeResponseFrame({
|
|
242
|
+
type: 'RESP_HEADER',
|
|
243
|
+
latestSchemaVersion: schema.version,
|
|
244
|
+
});
|
|
245
|
+
// §7.3.2: the LEASE frame rides immediately after RESP_HEADER.
|
|
246
|
+
if (plan.leaseToEmit !== undefined) {
|
|
247
|
+
yield encodeResponseFrame({
|
|
248
|
+
type: 'LEASE',
|
|
249
|
+
leaseId: plan.leaseToEmit.leaseId,
|
|
250
|
+
expiresAtMs: plan.leaseToEmit.expiresAtMs,
|
|
251
|
+
});
|
|
252
|
+
if (events !== undefined) {
|
|
253
|
+
emitEvent(events, {
|
|
254
|
+
type: 'lease.issued',
|
|
255
|
+
atMs: clockOf(ctx)(),
|
|
256
|
+
partition: ctx.partition,
|
|
257
|
+
actorId: ctx.actorId,
|
|
258
|
+
clientId: plan.header.clientId,
|
|
259
|
+
leaseId: plan.leaseToEmit.leaseId,
|
|
260
|
+
expiresAtMs: plan.leaseToEmit.expiresAtMs,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
try {
|
|
265
|
+
// Push half (§6): one PUSH_RESULT per PUSH_COMMIT, in request order.
|
|
266
|
+
for (const push of plan.pushes) {
|
|
267
|
+
const frame = await processPushCommit(ctx, schema, plan.resolved, plan.header.clientId, push);
|
|
268
|
+
if (events !== undefined) {
|
|
269
|
+
emitPushEvent(events, ctx, plan.header.clientId, push, frame);
|
|
270
|
+
}
|
|
271
|
+
yield encodeResponseFrame(frame);
|
|
272
|
+
}
|
|
273
|
+
// Pull half (§4): subscriptions echoed in request order.
|
|
274
|
+
const cursors = [];
|
|
275
|
+
if (plan.pull !== undefined) {
|
|
276
|
+
const summaries = events !== undefined ? [] : undefined;
|
|
277
|
+
const limits = clampPullLimits(plan.pull);
|
|
278
|
+
const maxSeq = await ctx.storage.getMaxCommitSeq(ctx.partition);
|
|
279
|
+
const horizonSeq = await ctx.storage.getHorizonSeq(ctx.partition);
|
|
280
|
+
for (const subscription of plan.subscriptions) {
|
|
281
|
+
const trace = summaries !== undefined ? { segments: [] } : undefined;
|
|
282
|
+
const section = subscriptionSection(ctx, schema, limits, subscription, maxSeq, horizonSeq, trace);
|
|
283
|
+
let status = 'active';
|
|
284
|
+
let bootstrap = false;
|
|
285
|
+
let commits = 0;
|
|
286
|
+
let changes = 0;
|
|
287
|
+
let step = await section.next();
|
|
288
|
+
while (!step.done) {
|
|
289
|
+
const frame = step.value;
|
|
290
|
+
if (summaries !== undefined) {
|
|
291
|
+
if (frame.type === 'SUB_START') {
|
|
292
|
+
status = frame.status;
|
|
293
|
+
bootstrap = frame.bootstrap;
|
|
294
|
+
}
|
|
295
|
+
else if (frame.type === 'COMMIT') {
|
|
296
|
+
commits += 1;
|
|
297
|
+
changes += frame.changes.length;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
yield encodeResponseFrame(frame);
|
|
301
|
+
step = await section.next();
|
|
302
|
+
}
|
|
303
|
+
if (step.value.active)
|
|
304
|
+
cursors.push(step.value.nextCursor);
|
|
305
|
+
if (summaries !== undefined && trace !== undefined) {
|
|
306
|
+
summaries.push({
|
|
307
|
+
id: subscription.frame.id,
|
|
308
|
+
table: subscription.frame.table,
|
|
309
|
+
status,
|
|
310
|
+
mode: status !== 'active'
|
|
311
|
+
? 'none'
|
|
312
|
+
: bootstrap
|
|
313
|
+
? 'bootstrap'
|
|
314
|
+
: 'incremental',
|
|
315
|
+
fromCursor: subscription.frame.cursor,
|
|
316
|
+
nextCursor: step.value.nextCursor,
|
|
317
|
+
commits,
|
|
318
|
+
changes,
|
|
319
|
+
segments: trace.segments,
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
if (events !== undefined && summaries !== undefined) {
|
|
324
|
+
emitEvent(events, {
|
|
325
|
+
type: 'pull.served',
|
|
326
|
+
atMs: clockOf(ctx)(),
|
|
327
|
+
partition: ctx.partition,
|
|
328
|
+
actorId: ctx.actorId,
|
|
329
|
+
clientId: plan.header.clientId,
|
|
330
|
+
subscriptions: summaries,
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
// §4.5/§8.1: persist the cursor watermark and the request's
|
|
335
|
+
// subscription list per (partition, clientId).
|
|
336
|
+
const previous = await ctx.storage.getClientRecord(ctx.partition, plan.header.clientId);
|
|
337
|
+
const subscriptions = plan.pull !== undefined
|
|
338
|
+
? plan.subscriptions.map((s) => ({
|
|
339
|
+
id: s.frame.id,
|
|
340
|
+
table: s.frame.table,
|
|
341
|
+
scopes: s.frame.scopes,
|
|
342
|
+
}))
|
|
343
|
+
: [...(previous?.subscriptions ?? [])];
|
|
344
|
+
const cursor = cursors.length > 0 ? Math.min(...cursors) : (previous?.cursor ?? -1);
|
|
345
|
+
await ctx.storage.putClientRecord(ctx.partition, {
|
|
346
|
+
clientId: plan.header.clientId,
|
|
347
|
+
actorId: ctx.actorId,
|
|
348
|
+
cursor,
|
|
349
|
+
updatedAtMs: clockOf(ctx)(),
|
|
350
|
+
subscriptions,
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
catch (error) {
|
|
354
|
+
if (error instanceof SyncError) {
|
|
355
|
+
if (report !== undefined) {
|
|
356
|
+
report.outcome = 'error';
|
|
357
|
+
report.errorCode = error.code;
|
|
358
|
+
}
|
|
359
|
+
// §1.6: in-band ERROR, then END, nothing else.
|
|
360
|
+
yield encodeResponseFrame({
|
|
361
|
+
type: 'ERROR',
|
|
362
|
+
code: error.code,
|
|
363
|
+
message: error.message,
|
|
364
|
+
category: error.category,
|
|
365
|
+
retryable: error.retryable,
|
|
366
|
+
recommendedAction: error.recommendedAction,
|
|
367
|
+
...(error.details !== undefined ? { details: error.details } : {}),
|
|
368
|
+
});
|
|
369
|
+
yield END_FRAME_BYTES;
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
throw error;
|
|
373
|
+
}
|
|
374
|
+
yield END_FRAME_BYTES;
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Decode and validate the request, then return the streaming response.
|
|
378
|
+
* Request-validation failures (§1.7) throw `SyncError` here, before any
|
|
379
|
+
* bytes are produced; adapters map them to HTTP JSON errors (§1.1).
|
|
380
|
+
*/
|
|
381
|
+
export async function createSyncResponseStream(bytes, ctx) {
|
|
382
|
+
const events = ctx.events;
|
|
383
|
+
if (events === undefined)
|
|
384
|
+
return createStreamCore(bytes, ctx, undefined);
|
|
385
|
+
// Instrumented path: measure with the ctx clock, count bytes at the
|
|
386
|
+
// seam, emit exactly one `request.handled` per request.
|
|
387
|
+
const clock = clockOf(ctx);
|
|
388
|
+
const startedAtMs = clock();
|
|
389
|
+
try {
|
|
390
|
+
return await createStreamCore(bytes, ctx, events, startedAtMs);
|
|
391
|
+
}
|
|
392
|
+
catch (error) {
|
|
393
|
+
emitEvent(events, {
|
|
394
|
+
type: 'request.handled',
|
|
395
|
+
kind: 'sync',
|
|
396
|
+
atMs: clock(),
|
|
397
|
+
partition: ctx.partition,
|
|
398
|
+
actorId: ctx.actorId,
|
|
399
|
+
durationMs: clock() - startedAtMs,
|
|
400
|
+
bytesIn: bytes.length,
|
|
401
|
+
bytesOut: 0,
|
|
402
|
+
outcome: 'rejected',
|
|
403
|
+
errorCode: error instanceof SyncError ? error.code : 'internal',
|
|
404
|
+
pushCommits: 0,
|
|
405
|
+
pulled: false,
|
|
406
|
+
subscriptions: 0,
|
|
407
|
+
});
|
|
408
|
+
throw error;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
async function createStreamCore(bytes, ctx, events, startedAtMs = 0) {
|
|
412
|
+
let request;
|
|
413
|
+
try {
|
|
414
|
+
const message = decodeMessage(bytes);
|
|
415
|
+
if (message.msgKind !== 'request') {
|
|
416
|
+
throw syncError('sync.invalid_request', 'expected a request message');
|
|
417
|
+
}
|
|
418
|
+
request = message;
|
|
419
|
+
}
|
|
420
|
+
catch (error) {
|
|
421
|
+
if (error instanceof DecodeError) {
|
|
422
|
+
throw syncError(error.code, error.message);
|
|
423
|
+
}
|
|
424
|
+
throw error;
|
|
425
|
+
}
|
|
426
|
+
const schema = compileSchema(ctx.schema);
|
|
427
|
+
// Relational row tables (DESIGN-relational-server-storage.md): create/
|
|
428
|
+
// migrate on first contact; memoized per storage instance thereafter.
|
|
429
|
+
await ctx.storage.ensureSchema(schema);
|
|
430
|
+
const plan = await planRequest(request, ctx, schema);
|
|
431
|
+
if (events === undefined)
|
|
432
|
+
return streamResponse(plan, ctx, schema);
|
|
433
|
+
const report = { outcome: 'ok' };
|
|
434
|
+
return instrumentedStream(streamResponse(plan, ctx, schema, report), ctx, events, plan, report, bytes.length, startedAtMs);
|
|
435
|
+
}
|
|
436
|
+
/** Counts response bytes and emits `request.handled` when the stream
|
|
437
|
+
* finishes — including a thrown host failure mid-stream (fail loud). */
|
|
438
|
+
async function* instrumentedStream(stream, ctx, events, plan, report, bytesIn, startedAtMs) {
|
|
439
|
+
const clock = clockOf(ctx);
|
|
440
|
+
let bytesOut = 0;
|
|
441
|
+
const emitHandled = () => {
|
|
442
|
+
emitEvent(events, {
|
|
443
|
+
type: 'request.handled',
|
|
444
|
+
kind: 'sync',
|
|
445
|
+
atMs: clock(),
|
|
446
|
+
partition: ctx.partition,
|
|
447
|
+
actorId: ctx.actorId,
|
|
448
|
+
durationMs: clock() - startedAtMs,
|
|
449
|
+
bytesIn,
|
|
450
|
+
bytesOut,
|
|
451
|
+
outcome: report.outcome,
|
|
452
|
+
...(report.errorCode !== undefined
|
|
453
|
+
? { errorCode: report.errorCode }
|
|
454
|
+
: {}),
|
|
455
|
+
pushCommits: plan.pushes.length,
|
|
456
|
+
pulled: plan.pull !== undefined,
|
|
457
|
+
subscriptions: plan.subscriptions.length,
|
|
458
|
+
});
|
|
459
|
+
};
|
|
460
|
+
try {
|
|
461
|
+
for await (const chunk of stream) {
|
|
462
|
+
bytesOut += chunk.length;
|
|
463
|
+
yield chunk;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
catch (error) {
|
|
467
|
+
report.outcome = 'error';
|
|
468
|
+
report.errorCode = error instanceof SyncError ? error.code : 'internal';
|
|
469
|
+
emitHandled();
|
|
470
|
+
throw error;
|
|
471
|
+
}
|
|
472
|
+
emitHandled();
|
|
473
|
+
}
|
|
474
|
+
/** Byte-concatenating wrapper over the streaming core (§1.4). */
|
|
475
|
+
export async function handleSyncRequest(bytes, ctx) {
|
|
476
|
+
const stream = await createSyncResponseStream(bytes, ctx);
|
|
477
|
+
const chunks = [];
|
|
478
|
+
let total = 0;
|
|
479
|
+
for await (const chunk of stream) {
|
|
480
|
+
chunks.push(chunk);
|
|
481
|
+
total += chunk.length;
|
|
482
|
+
}
|
|
483
|
+
const out = new Uint8Array(total);
|
|
484
|
+
let offset = 0;
|
|
485
|
+
for (const chunk of chunks) {
|
|
486
|
+
out.set(chunk, offset);
|
|
487
|
+
offset += chunk.length;
|
|
488
|
+
}
|
|
489
|
+
return out;
|
|
490
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,36 +1,45 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @syncular/server
|
|
2
|
+
* @syncular/server — framework-free embeddable SSP2 protocol library
|
|
3
|
+
* (SPEC.md is normative; REVISE.md B2 is the architectural mandate).
|
|
3
4
|
*
|
|
4
|
-
*
|
|
5
|
-
* -
|
|
6
|
-
* -
|
|
7
|
-
*
|
|
8
|
-
* - blob/media storage
|
|
5
|
+
* Core surface: `handleSyncRequest(bytes, ctx) → bytes` over host-provided
|
|
6
|
+
* storage / scope-resolution / segment-store interfaces, plus a
|
|
7
|
+
* transport-agnostic realtime session (§8), the direct segment download
|
|
8
|
+
* handler (§5.5), and signed-URL token issuance/verification (§5.4).
|
|
9
9
|
*/
|
|
10
|
-
export * from '
|
|
11
|
-
export * from './
|
|
12
|
-
export * from './
|
|
13
|
-
export * from './
|
|
14
|
-
export * from './
|
|
15
|
-
export * from './
|
|
16
|
-
export * from './
|
|
17
|
-
export * from './
|
|
18
|
-
export * from './
|
|
19
|
-
export * from './
|
|
20
|
-
export * from './
|
|
21
|
-
export * from './
|
|
22
|
-
export * from './
|
|
23
|
-
export * from './
|
|
24
|
-
export * from './
|
|
25
|
-
export * from './
|
|
26
|
-
export * from './
|
|
27
|
-
export * from './
|
|
28
|
-
export * from './
|
|
29
|
-
export * from './
|
|
30
|
-
export * from './
|
|
31
|
-
export * from './
|
|
32
|
-
export
|
|
33
|
-
export * from './
|
|
34
|
-
export * from './
|
|
35
|
-
export * from './
|
|
36
|
-
|
|
10
|
+
export * from './admin.js';
|
|
11
|
+
export * from './blob-handlers.js';
|
|
12
|
+
export * from './blob-store.js';
|
|
13
|
+
export * from './content-encoding.js';
|
|
14
|
+
export * from './context.js';
|
|
15
|
+
export * from './crdt-merger.js';
|
|
16
|
+
export * from './d1-storage.js';
|
|
17
|
+
export * from './errors.js';
|
|
18
|
+
export * from './events.js';
|
|
19
|
+
export * from './events-ring.js';
|
|
20
|
+
export * from './frame-bytes.js';
|
|
21
|
+
export * from './handler.js';
|
|
22
|
+
export * from './lease-store.js';
|
|
23
|
+
export * from './pg-executor.js';
|
|
24
|
+
export * from './postgres-fanout.js';
|
|
25
|
+
export * from './postgres-storage.js';
|
|
26
|
+
export * from './prune.js';
|
|
27
|
+
export * from './pull.js';
|
|
28
|
+
export * from './push.js';
|
|
29
|
+
export * from './realtime.js';
|
|
30
|
+
export * from './relational-rows.js';
|
|
31
|
+
export * from './s3-blob-store.js';
|
|
32
|
+
export * from './s3-segment-store.js';
|
|
33
|
+
export * from './schema.js';
|
|
34
|
+
export * from './scopes.js';
|
|
35
|
+
export * from './segment-download.js';
|
|
36
|
+
export * from './segment-store.js';
|
|
37
|
+
export * from './signed-url.js';
|
|
38
|
+
export * from './sqlite-blob-store.js';
|
|
39
|
+
export * from './sqlite-dialect.js';
|
|
40
|
+
export * from './sqlite-image.js';
|
|
41
|
+
export * from './sqlite-lease-store.js';
|
|
42
|
+
export * from './sqlite-segment-store.js';
|
|
43
|
+
export * from './sqlite-storage.js';
|
|
44
|
+
export * from './storage.js';
|
|
45
|
+
export * from './validate.js';
|