@syncular/server 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +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
package/dist/index.js
CHANGED
|
@@ -1,35 +1,53 @@
|
|
|
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 './encrypted-crdt.js';
|
|
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';
|
|
18
17
|
export * from './errors.js';
|
|
19
|
-
export * from './
|
|
20
|
-
export * from './
|
|
21
|
-
export * from './
|
|
22
|
-
export * from './
|
|
23
|
-
export * from './
|
|
24
|
-
|
|
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
|
+
// The `PgExecutor` seam + Postgres storage/fanout are driver-agnostic (zero
|
|
24
|
+
// runtime deps). Concrete driver adapters (pglite for tests; Bun.sql /
|
|
25
|
+
// node-postgres for production, documented in the README) live in separate
|
|
26
|
+
// entry points so the barrel never imports a driver.
|
|
27
|
+
export * from './pg-executor.js';
|
|
28
|
+
export * from './postgres-fanout.js';
|
|
29
|
+
export * from './postgres-storage.js';
|
|
25
30
|
export * from './prune.js';
|
|
26
31
|
export * from './pull.js';
|
|
27
32
|
export * from './push.js';
|
|
28
|
-
export * from './realtime
|
|
33
|
+
export * from './realtime.js';
|
|
34
|
+
export * from './relational-rows.js';
|
|
35
|
+
export * from './s3-blob-store.js';
|
|
36
|
+
export * from './s3-segment-store.js';
|
|
29
37
|
export * from './schema.js';
|
|
30
|
-
export * from './
|
|
31
|
-
export * from './
|
|
32
|
-
export * from './
|
|
33
|
-
export * from './
|
|
34
|
-
|
|
35
|
-
|
|
38
|
+
export * from './scopes.js';
|
|
39
|
+
export * from './segment-download.js';
|
|
40
|
+
export * from './segment-store.js';
|
|
41
|
+
export * from './signed-url.js';
|
|
42
|
+
// Bun-specific storages (top-level `bun:sqlite`): re-exported for Bun/Node
|
|
43
|
+
// hosts. Workers/edge builds tree-shake them (and their `bun:sqlite` import)
|
|
44
|
+
// away — the runtime-neutral core closure is enforced by
|
|
45
|
+
// `test/runtime-neutrality.test.ts`.
|
|
46
|
+
export * from './sqlite-blob-store.js';
|
|
47
|
+
export * from './sqlite-dialect.js';
|
|
48
|
+
export * from './sqlite-image.js';
|
|
49
|
+
export * from './sqlite-lease-store.js';
|
|
50
|
+
export * from './sqlite-segment-store.js';
|
|
51
|
+
export * from './sqlite-storage.js';
|
|
52
|
+
export * from './storage.js';
|
|
53
|
+
export * from './validate.js';
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth-lease store (SPEC.md §7.3.1).
|
|
3
|
+
*
|
|
4
|
+
* A lease is a server-issued, time-bounded grant recording the actor's
|
|
5
|
+
* resolved allowed scopes at issuance, keyed by `(partition, clientId)`.
|
|
6
|
+
* It is the authorization the server falls to during a host-authorization
|
|
7
|
+
* outage (§7.3.3), and the client's offline-trust window (§7.3.5).
|
|
8
|
+
*
|
|
9
|
+
* The store is OPTIONAL, wired only when `leases` is configured
|
|
10
|
+
* (`leases` absent ⇒ the feature is off, zero cost — the blob-store
|
|
11
|
+
* pattern). Records are host-owned; a production store signs them at rest
|
|
12
|
+
* and verifies on read (§7.3.1). The reference stores keep them plain in
|
|
13
|
+
* memory / sqlite — the seam is what matters for conformance.
|
|
14
|
+
*/
|
|
15
|
+
import type { ScopeMap } from '@syncular/core';
|
|
16
|
+
/** The stored lease record (§7.3.1). `revoked` is durable (§7.3.4). */
|
|
17
|
+
export interface LeaseRecord {
|
|
18
|
+
readonly leaseId: string;
|
|
19
|
+
readonly actorId: string;
|
|
20
|
+
/** The actor's resolved allowed scopes at issuance (§3.2 step 3). */
|
|
21
|
+
readonly allowedScopes: ScopeMap;
|
|
22
|
+
readonly issuedAtMs: number;
|
|
23
|
+
readonly expiresAtMs: number;
|
|
24
|
+
readonly revoked: boolean;
|
|
25
|
+
}
|
|
26
|
+
export interface LeaseStore {
|
|
27
|
+
/** The lease for `(partition, clientId)`, if any (revoked or not). */
|
|
28
|
+
get(partition: string, clientId: string): Promise<LeaseRecord | undefined>;
|
|
29
|
+
/**
|
|
30
|
+
* Issue or refresh the lease for `(partition, clientId)` (§7.3.3). A
|
|
31
|
+
* refresh slides the SAME `leaseId` — implementations MUST reuse the
|
|
32
|
+
* stored id for the pair unless it is revoked (a revoked handle never
|
|
33
|
+
* silently resurrects: a fresh id is minted only once the host clears
|
|
34
|
+
* the revocation). Returns the stored record.
|
|
35
|
+
*/
|
|
36
|
+
issue(partition: string, clientId: string, actorId: string, allowedScopes: ScopeMap, nowMs: number, ttlMs: number): Promise<LeaseRecord>;
|
|
37
|
+
/** Revoke a lease by `leaseId` (§7.3.4); durable, survives refresh. */
|
|
38
|
+
revoke(partition: string, leaseId: string): Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
/** Stable-per-pair id generator; overridable for deterministic tests. */
|
|
41
|
+
export type LeaseIdFactory = () => string;
|
|
42
|
+
export declare class MemoryLeaseStore implements LeaseStore {
|
|
43
|
+
#private;
|
|
44
|
+
constructor(options?: {
|
|
45
|
+
readonly leaseId?: LeaseIdFactory;
|
|
46
|
+
});
|
|
47
|
+
get(partition: string, clientId: string): Promise<LeaseRecord | undefined>;
|
|
48
|
+
issue(partition: string, clientId: string, actorId: string, allowedScopes: ScopeMap, nowMs: number, ttlMs: number): Promise<LeaseRecord>;
|
|
49
|
+
revoke(partition: string, leaseId: string): Promise<void>;
|
|
50
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A `PgExecutor` over @electric-sql/pglite (embedded WASM Postgres).
|
|
3
|
+
*
|
|
4
|
+
* This is the **test/dev** driver — hermetic, no docker, runs under bun.
|
|
5
|
+
* `@electric-sql/pglite` is a devDependency of `@syncular/server`; this
|
|
6
|
+
* module is exported for tests and local experiments, not the production
|
|
7
|
+
* path. Production wires Bun.sql or node-postgres against the same
|
|
8
|
+
* `PgExecutor` interface (see the server README).
|
|
9
|
+
*
|
|
10
|
+
* pglite is single-connection, so `transaction` runs `BEGIN`/`COMMIT`/
|
|
11
|
+
* `ROLLBACK` on the one connection and relies on the caller not interleaving
|
|
12
|
+
* unrelated queries during a transaction scope (the storage layer holds one
|
|
13
|
+
* transaction at a time per push).
|
|
14
|
+
*/
|
|
15
|
+
import type { PGlite } from '@electric-sql/pglite';
|
|
16
|
+
import type { PgExecutor } from './pg-executor.js';
|
|
17
|
+
/** Minimal structural type for a pglite instance (avoids a hard type dep). */
|
|
18
|
+
interface PgliteLike {
|
|
19
|
+
query<Row>(query: string, params?: unknown[]): Promise<{
|
|
20
|
+
rows: Row[];
|
|
21
|
+
affectedRows?: number;
|
|
22
|
+
}>;
|
|
23
|
+
exec(query: string): Promise<unknown>;
|
|
24
|
+
close(): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
export declare function pgliteExecutor(db: PGlite | PgliteLike): PgExecutor;
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
function queryable(db) {
|
|
2
|
+
return {
|
|
3
|
+
async query(text, params) {
|
|
4
|
+
const result = await db.query(text, params ? [...params] : undefined);
|
|
5
|
+
return {
|
|
6
|
+
rows: result.rows,
|
|
7
|
+
rowCount: result.affectedRows ?? result.rows.length,
|
|
8
|
+
};
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export function pgliteExecutor(db) {
|
|
13
|
+
const like = db;
|
|
14
|
+
const q = queryable(like);
|
|
15
|
+
return {
|
|
16
|
+
query: q.query,
|
|
17
|
+
async transaction(fn) {
|
|
18
|
+
await like.exec('BEGIN');
|
|
19
|
+
try {
|
|
20
|
+
const result = await fn(q);
|
|
21
|
+
await like.exec('COMMIT');
|
|
22
|
+
return result;
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
await like.exec('ROLLBACK');
|
|
26
|
+
throw error;
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
async close() {
|
|
30
|
+
await like.close();
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The minimal Postgres executor seam (REVISE B2: zero runtime deps).
|
|
3
|
+
*
|
|
4
|
+
* `PostgresServerStorage` is written entirely against this interface so the
|
|
5
|
+
* server library never imports a specific driver. Production wires one of:
|
|
6
|
+
*
|
|
7
|
+
* - **Bun.sql** (built into bun) — see `bunSqlExecutor` in the README;
|
|
8
|
+
* - **node-postgres** (`pg`) — a `Pool`/`PoolClient` adapter;
|
|
9
|
+
*
|
|
10
|
+
* and the test lane wires **@electric-sql/pglite** (embedded WASM Postgres,
|
|
11
|
+
* a devDependency) via `pgliteExecutor`. All three speak the same three
|
|
12
|
+
* primitives below.
|
|
13
|
+
*
|
|
14
|
+
* ## Type-parser contract (load-bearing)
|
|
15
|
+
*
|
|
16
|
+
* `commitSeq`/`serverVersion` are `int8`/`bigint` columns. Drivers disagree
|
|
17
|
+
* on how they decode `int8`:
|
|
18
|
+
*
|
|
19
|
+
* - pglite → JS `number`;
|
|
20
|
+
* - node-postgres → `string` (its default `int8` parser is off to avoid
|
|
21
|
+
* silent precision loss past 2^53);
|
|
22
|
+
* - Bun.sql → `bigint`.
|
|
23
|
+
*
|
|
24
|
+
* The storage layer therefore coerces every sequence value it reads through
|
|
25
|
+
* `Number(...)` (see `asNumber`). Sequences here are per-partition commit
|
|
26
|
+
* counters and server_version counters — both comfortably inside 2^53 for
|
|
27
|
+
* any realistic deployment, so the coercion is safe; a host that expects to
|
|
28
|
+
* exceed 2^53 commits in a single partition has bigger problems than this
|
|
29
|
+
* seam. `bytea` columns MUST decode to `Uint8Array`/`Buffer` (all three
|
|
30
|
+
* drivers do); `NULL` decodes to JS `null`.
|
|
31
|
+
*/
|
|
32
|
+
/** One database row as a plain object keyed by (lower-cased) column name. */
|
|
33
|
+
export type PgRow = Record<string, unknown>;
|
|
34
|
+
/**
|
|
35
|
+
* A handle that runs parameterized statements. Both the pool-level executor
|
|
36
|
+
* and a per-transaction client implement it, so storage code is written once
|
|
37
|
+
* against `PgQueryable` regardless of transaction scope.
|
|
38
|
+
*
|
|
39
|
+
* `params` use Postgres positional placeholders (`$1`, `$2`, ...). `text`
|
|
40
|
+
* is a single statement (no multi-statement `;`-joined batches — those are
|
|
41
|
+
* driver-specific and defeat parameterization).
|
|
42
|
+
*/
|
|
43
|
+
export interface PgQueryable {
|
|
44
|
+
query<Row = PgRow>(text: string, params?: readonly unknown[]): Promise<{
|
|
45
|
+
rows: Row[];
|
|
46
|
+
rowCount: number;
|
|
47
|
+
}>;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* The pool-level executor: `PgQueryable` plus transaction control. A
|
|
51
|
+
* `transaction` callback receives a client pinned to one connection for the
|
|
52
|
+
* duration of a real Postgres `BEGIN … COMMIT/ROLLBACK`; throwing rolls back.
|
|
53
|
+
*/
|
|
54
|
+
export interface PgExecutor extends PgQueryable {
|
|
55
|
+
/**
|
|
56
|
+
* Run `fn` inside a single Postgres transaction on one pinned connection.
|
|
57
|
+
* The executor issues `BEGIN` before `fn`, `COMMIT` on resolve, and
|
|
58
|
+
* `ROLLBACK` on throw (rethrowing the original error).
|
|
59
|
+
*/
|
|
60
|
+
transaction<T>(fn: (client: PgQueryable) => Promise<T>): Promise<T>;
|
|
61
|
+
/** Release any pooled resources. Optional (pglite/Bun.sql). */
|
|
62
|
+
close?(): Promise<void>;
|
|
63
|
+
}
|
|
64
|
+
/** Coerce a driver-decoded sequence value (`number | string | bigint`). */
|
|
65
|
+
export declare function asNumber(value: unknown): number;
|
|
66
|
+
/** Coerce a driver-decoded `bytea` value to a `Uint8Array`. */
|
|
67
|
+
export declare function asBytes(value: unknown): Uint8Array;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The minimal Postgres executor seam (REVISE B2: zero runtime deps).
|
|
3
|
+
*
|
|
4
|
+
* `PostgresServerStorage` is written entirely against this interface so the
|
|
5
|
+
* server library never imports a specific driver. Production wires one of:
|
|
6
|
+
*
|
|
7
|
+
* - **Bun.sql** (built into bun) — see `bunSqlExecutor` in the README;
|
|
8
|
+
* - **node-postgres** (`pg`) — a `Pool`/`PoolClient` adapter;
|
|
9
|
+
*
|
|
10
|
+
* and the test lane wires **@electric-sql/pglite** (embedded WASM Postgres,
|
|
11
|
+
* a devDependency) via `pgliteExecutor`. All three speak the same three
|
|
12
|
+
* primitives below.
|
|
13
|
+
*
|
|
14
|
+
* ## Type-parser contract (load-bearing)
|
|
15
|
+
*
|
|
16
|
+
* `commitSeq`/`serverVersion` are `int8`/`bigint` columns. Drivers disagree
|
|
17
|
+
* on how they decode `int8`:
|
|
18
|
+
*
|
|
19
|
+
* - pglite → JS `number`;
|
|
20
|
+
* - node-postgres → `string` (its default `int8` parser is off to avoid
|
|
21
|
+
* silent precision loss past 2^53);
|
|
22
|
+
* - Bun.sql → `bigint`.
|
|
23
|
+
*
|
|
24
|
+
* The storage layer therefore coerces every sequence value it reads through
|
|
25
|
+
* `Number(...)` (see `asNumber`). Sequences here are per-partition commit
|
|
26
|
+
* counters and server_version counters — both comfortably inside 2^53 for
|
|
27
|
+
* any realistic deployment, so the coercion is safe; a host that expects to
|
|
28
|
+
* exceed 2^53 commits in a single partition has bigger problems than this
|
|
29
|
+
* seam. `bytea` columns MUST decode to `Uint8Array`/`Buffer` (all three
|
|
30
|
+
* drivers do); `NULL` decodes to JS `null`.
|
|
31
|
+
*/
|
|
32
|
+
/** Coerce a driver-decoded sequence value (`number | string | bigint`). */
|
|
33
|
+
export function asNumber(value) {
|
|
34
|
+
if (typeof value === 'number')
|
|
35
|
+
return value;
|
|
36
|
+
if (typeof value === 'bigint')
|
|
37
|
+
return Number(value);
|
|
38
|
+
if (typeof value === 'string')
|
|
39
|
+
return Number.parseInt(value, 10);
|
|
40
|
+
if (value === null || value === undefined)
|
|
41
|
+
return 0;
|
|
42
|
+
throw new Error(`expected a numeric column, got ${typeof value}`);
|
|
43
|
+
}
|
|
44
|
+
/** Coerce a driver-decoded `bytea` value to a `Uint8Array`. */
|
|
45
|
+
export function asBytes(value) {
|
|
46
|
+
if (value instanceof Uint8Array)
|
|
47
|
+
return value;
|
|
48
|
+
if (value === null || value === undefined) {
|
|
49
|
+
throw new Error('expected bytea, got null');
|
|
50
|
+
}
|
|
51
|
+
// node-postgres/Bun.sql return Buffer (a Uint8Array subclass); this branch
|
|
52
|
+
// is a defensive copy for any array-like the driver hands back.
|
|
53
|
+
if (Array.isArray(value))
|
|
54
|
+
return new Uint8Array(value);
|
|
55
|
+
throw new Error(`expected bytea, got ${typeof value}`);
|
|
56
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LISTEN/NOTIFY multi-instance fanout (TODO §4.1) — the primitive that lets
|
|
3
|
+
* N server instances behind a load balancer wake each other's realtime
|
|
4
|
+
* sessions when a commit lands on any one of them.
|
|
5
|
+
*
|
|
6
|
+
* ## The multi-instance problem
|
|
7
|
+
*
|
|
8
|
+
* A commit applied on instance A fans out to A's *local* RealtimeHub
|
|
9
|
+
* sessions immediately (in-memory `notifyCommit`, full delta, no re-read).
|
|
10
|
+
* But a client whose socket lives on instance B never saw it. LISTEN/NOTIFY
|
|
11
|
+
* closes that gap:
|
|
12
|
+
*
|
|
13
|
+
* 1. after a commit lands, the originating instance calls `notify(payload)`
|
|
14
|
+
* → `NOTIFY syncular_commit, '<partition>:<commitSeq>'`;
|
|
15
|
+
* 2. every instance runs a `listen()` loop on a dedicated connection;
|
|
16
|
+
* on a notification it parses the payload and calls
|
|
17
|
+
* `hub.wake(partition, 'sync')`.
|
|
18
|
+
*
|
|
19
|
+
* ## Why wake, not re-broadcast the delta
|
|
20
|
+
*
|
|
21
|
+
* Postgres NOTIFY payloads are capped (~8000 bytes) and are not an ordered,
|
|
22
|
+
* lossless delta channel — so we do NOT try to ship commit bytes through
|
|
23
|
+
* them. Remote sessions receive a `sync` wake and pull the delta from the
|
|
24
|
+
* shared Postgres storage they already read from (§8.3 wake semantics). The
|
|
25
|
+
* originating instance keeps the in-memory fast path (its own sessions get
|
|
26
|
+
* the full delta with no extra read); only *cross-instance* delivery pays
|
|
27
|
+
* the re-pull. Single-instance deployments never install a fanout at all.
|
|
28
|
+
*
|
|
29
|
+
* The payload carries `commitSeq` purely for observability/ordering in logs;
|
|
30
|
+
* the wake itself is seq-agnostic (a session pulls whatever it is behind).
|
|
31
|
+
*
|
|
32
|
+
* pglite cannot exercise cross-connection NOTIFY, so the integration
|
|
33
|
+
* (`postgres-fanout.integration.test.ts`) is env-gated on `SYNCULAR_PG_URL`
|
|
34
|
+
* and skips cleanly; the payload encode/parse is unit-tested hermetically.
|
|
35
|
+
*/
|
|
36
|
+
import type { WakeReason } from '@syncular/core';
|
|
37
|
+
/** The channel every syncular instance LISTENs on. */
|
|
38
|
+
export declare const FANOUT_CHANNEL = "syncular_commit";
|
|
39
|
+
export interface FanoutPayload {
|
|
40
|
+
readonly partition: string;
|
|
41
|
+
readonly commitSeq: number;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Encode a fanout payload as `<partition>:<commitSeq>`. The partition is
|
|
45
|
+
* base64url-encoded so a partition string containing `:` cannot corrupt the
|
|
46
|
+
* frame; commitSeq is a plain decimal integer.
|
|
47
|
+
*/
|
|
48
|
+
export declare function encodeFanoutPayload(payload: FanoutPayload): string;
|
|
49
|
+
/** Parse a fanout payload; returns `undefined` for a malformed frame. */
|
|
50
|
+
export declare function parseFanoutPayload(text: string): FanoutPayload | undefined;
|
|
51
|
+
/** The hub surface the fanout wakes (a `RealtimeHub` satisfies this). */
|
|
52
|
+
export interface FanoutWakeTarget {
|
|
53
|
+
wake(partition: string, reason: WakeReason): void;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* A raw notification connection. Production wires a driver's LISTEN support:
|
|
57
|
+
* - node-postgres: a dedicated `Client` with `client.on('notification', …)`
|
|
58
|
+
* after `LISTEN syncular_commit`;
|
|
59
|
+
* - Bun.sql: `sql.listen(channel, handler)`.
|
|
60
|
+
* The `notify` side can reuse the main pool (`SELECT pg_notify($1,$2)`), but
|
|
61
|
+
* LISTEN needs its own long-lived connection.
|
|
62
|
+
*/
|
|
63
|
+
export interface PgNotificationConnection {
|
|
64
|
+
/** Register a payload handler for the channel and begin listening. */
|
|
65
|
+
listen(channel: string, handler: (payload: string) => void): Promise<void> | void;
|
|
66
|
+
/** Send a notification on the channel. */
|
|
67
|
+
notify(channel: string, payload: string): Promise<void>;
|
|
68
|
+
close?(): Promise<void>;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* The fanout primitive. `install(hub)` starts the LISTEN loop that wakes the
|
|
72
|
+
* hub on every remote commit; `notifyCommit` is called after a local commit
|
|
73
|
+
* lands to fan it to the other instances.
|
|
74
|
+
*/
|
|
75
|
+
export declare class PostgresFanout {
|
|
76
|
+
#private;
|
|
77
|
+
constructor(conn: PgNotificationConnection);
|
|
78
|
+
/** Start the LISTEN loop, waking `hub` on every notification received. */
|
|
79
|
+
install(hub: FanoutWakeTarget): Promise<void>;
|
|
80
|
+
/** Fan an applied commit out to the other instances. */
|
|
81
|
+
notifyCommit(partition: string, commitSeq: number): Promise<void>;
|
|
82
|
+
close(): Promise<void>;
|
|
83
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/** The channel every syncular instance LISTENs on. */
|
|
2
|
+
export const FANOUT_CHANNEL = 'syncular_commit';
|
|
3
|
+
/**
|
|
4
|
+
* The wake reason remote instances raise on a fanout notification (§8.3):
|
|
5
|
+
* `catchup-required` — a commit landed on another instance, so the local
|
|
6
|
+
* session pulls the delta it is now behind on from shared storage.
|
|
7
|
+
*/
|
|
8
|
+
const FANOUT_WAKE_REASON = 'catchup-required';
|
|
9
|
+
/**
|
|
10
|
+
* Encode a fanout payload as `<partition>:<commitSeq>`. The partition is
|
|
11
|
+
* base64url-encoded so a partition string containing `:` cannot corrupt the
|
|
12
|
+
* frame; commitSeq is a plain decimal integer.
|
|
13
|
+
*/
|
|
14
|
+
export function encodeFanoutPayload(payload) {
|
|
15
|
+
const partition = Buffer.from(payload.partition, 'utf8').toString('base64url');
|
|
16
|
+
return `${partition}:${payload.commitSeq}`;
|
|
17
|
+
}
|
|
18
|
+
/** Parse a fanout payload; returns `undefined` for a malformed frame. */
|
|
19
|
+
export function parseFanoutPayload(text) {
|
|
20
|
+
const sep = text.indexOf(':');
|
|
21
|
+
if (sep <= 0)
|
|
22
|
+
return undefined;
|
|
23
|
+
const partitionB64 = text.slice(0, sep);
|
|
24
|
+
const seqText = text.slice(sep + 1);
|
|
25
|
+
const commitSeq = Number.parseInt(seqText, 10);
|
|
26
|
+
if (!Number.isFinite(commitSeq) || commitSeq < 0)
|
|
27
|
+
return undefined;
|
|
28
|
+
if (!/^\d+$/.test(seqText))
|
|
29
|
+
return undefined;
|
|
30
|
+
let partition;
|
|
31
|
+
try {
|
|
32
|
+
partition = Buffer.from(partitionB64, 'base64url').toString('utf8');
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
if (partition.length === 0)
|
|
38
|
+
return undefined;
|
|
39
|
+
return { partition, commitSeq };
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* The fanout primitive. `install(hub)` starts the LISTEN loop that wakes the
|
|
43
|
+
* hub on every remote commit; `notifyCommit` is called after a local commit
|
|
44
|
+
* lands to fan it to the other instances.
|
|
45
|
+
*/
|
|
46
|
+
export class PostgresFanout {
|
|
47
|
+
#conn;
|
|
48
|
+
#installed = false;
|
|
49
|
+
constructor(conn) {
|
|
50
|
+
this.#conn = conn;
|
|
51
|
+
}
|
|
52
|
+
/** Start the LISTEN loop, waking `hub` on every notification received. */
|
|
53
|
+
async install(hub) {
|
|
54
|
+
if (this.#installed)
|
|
55
|
+
throw new Error('fanout already installed');
|
|
56
|
+
this.#installed = true;
|
|
57
|
+
await this.#conn.listen(FANOUT_CHANNEL, (payload) => {
|
|
58
|
+
const parsed = parseFanoutPayload(payload);
|
|
59
|
+
if (parsed === undefined)
|
|
60
|
+
return; // ignore malformed frames
|
|
61
|
+
hub.wake(parsed.partition, FANOUT_WAKE_REASON);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/** Fan an applied commit out to the other instances. */
|
|
65
|
+
async notifyCommit(partition, commitSeq) {
|
|
66
|
+
await this.#conn.notify(FANOUT_CHANNEL, encodeFanoutPayload({ partition, commitSeq }));
|
|
67
|
+
}
|
|
68
|
+
async close() {
|
|
69
|
+
await this.#conn.close?.();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { type PgExecutor } from './pg-executor.js';
|
|
2
|
+
import type { CompiledSchema, CompiledTable } from './schema.js';
|
|
3
|
+
import type { ClientCursorInfo, ClientRecord, CommitMetadata, CommitMetadataQuery, CommitWindowQuery, RowScanQuery, ScopeActivityQuery, ScopeCommitActivity, ServerStorage, StorageTransaction, StoredCommit, StoredPushResult, StoredRow } from './storage.js';
|
|
4
|
+
/**
|
|
5
|
+
* Schema DDL. Applied by `PostgresServerStorage.migrate()` (idempotent).
|
|
6
|
+
*
|
|
7
|
+
* Covering index design (the reason this file exists):
|
|
8
|
+
* - `sync_change_scopes_pk (partition, tbl, var, value, commit_seq)` — the
|
|
9
|
+
* candidate scan for `readCommitWindow` ranges on the (partition, tbl,
|
|
10
|
+
* var, value IN …) prefix and returns `commit_seq` already ascending;
|
|
11
|
+
* - `sync_row_scopes_pk (partition, tbl, var, value, row_id)` — same shape
|
|
12
|
+
* for `scanRows`, ordered by `row_id`.
|
|
13
|
+
* Both are the PRIMARY KEY, so they are the clustering/covering index for
|
|
14
|
+
* their table. No secondary index is needed for the hot path.
|
|
15
|
+
*
|
|
16
|
+
* Blob reference index (§5.9.4) — parity with the SQLite dialect's
|
|
17
|
+
* `sync_blob_refs`:
|
|
18
|
+
* - PRIMARY KEY `(partition, tbl, row_id, blob_id)` — the by-row prefix
|
|
19
|
+
* lets `setBlobRefs` replace a row's set with a single ranged DELETE and
|
|
20
|
+
* the delete path clear it by (partition, tbl, row_id);
|
|
21
|
+
* - the secondary `sync_blob_refs_by_blob (partition, blob_id)` index
|
|
22
|
+
* drives `listRowsReferencingBlob` (the download-authorization candidate
|
|
23
|
+
* set, §5.9.5) as an index range, never a scan. `postgres-explain
|
|
24
|
+
* .test.ts` asserts an `Index` node here too.
|
|
25
|
+
*/
|
|
26
|
+
export declare const POSTGRES_DDL = "\nCREATE TABLE IF NOT EXISTS sync_partitions(\n partition TEXT PRIMARY KEY,\n max_commit_seq BIGINT NOT NULL DEFAULT 0,\n horizon_seq BIGINT NOT NULL DEFAULT 0\n);\nCREATE TABLE IF NOT EXISTS sync_row_scopes(\n partition TEXT NOT NULL, tbl TEXT NOT NULL,\n var TEXT NOT NULL, value TEXT NOT NULL, row_id TEXT NOT NULL,\n PRIMARY KEY(partition, tbl, var, value, row_id)\n);\nCREATE TABLE IF NOT EXISTS sync_commits(\n partition TEXT NOT NULL, commit_seq BIGINT NOT NULL,\n client_id TEXT NOT NULL, client_commit_id TEXT NOT NULL,\n actor_id TEXT NOT NULL, created_at_ms BIGINT NOT NULL,\n PRIMARY KEY(partition, commit_seq)\n);\nCREATE INDEX IF NOT EXISTS sync_commits_by_time\n ON sync_commits(partition, created_at_ms);\nCREATE TABLE IF NOT EXISTS sync_changes(\n partition TEXT NOT NULL, commit_seq BIGINT NOT NULL, idx INTEGER NOT NULL,\n tbl TEXT NOT NULL, row_id TEXT NOT NULL, op SMALLINT NOT NULL,\n row_version BIGINT, scopes JSONB NOT NULL, payload BYTEA,\n PRIMARY KEY(partition, commit_seq, idx)\n);\nCREATE INDEX IF NOT EXISTS sync_changes_by_table\n ON sync_changes(partition, commit_seq, tbl, idx);\nCREATE TABLE IF NOT EXISTS sync_change_scopes(\n partition TEXT NOT NULL, tbl TEXT NOT NULL,\n var TEXT NOT NULL, value TEXT NOT NULL, commit_seq BIGINT NOT NULL,\n PRIMARY KEY(partition, tbl, var, value, commit_seq)\n);\nCREATE TABLE IF NOT EXISTS sync_push_results(\n partition TEXT NOT NULL, client_id TEXT NOT NULL,\n client_commit_id TEXT NOT NULL, result JSONB NOT NULL,\n PRIMARY KEY(partition, client_id, client_commit_id)\n);\nCREATE TABLE IF NOT EXISTS sync_clients(\n partition TEXT NOT NULL, client_id TEXT NOT NULL, actor_id TEXT NOT NULL,\n cursor BIGINT NOT NULL, subscriptions JSONB NOT NULL,\n updated_at_ms BIGINT NOT NULL,\n PRIMARY KEY(partition, client_id)\n);\nCREATE TABLE IF NOT EXISTS sync_blob_refs(\n partition TEXT NOT NULL, tbl TEXT NOT NULL, row_id TEXT NOT NULL,\n blob_id TEXT NOT NULL,\n PRIMARY KEY(partition, tbl, row_id, blob_id)\n);\nCREATE INDEX IF NOT EXISTS sync_blob_refs_by_blob\n ON sync_blob_refs(partition, blob_id);\n";
|
|
27
|
+
export declare class PostgresServerStorage implements ServerStorage {
|
|
28
|
+
#private;
|
|
29
|
+
constructor(exec: PgExecutor);
|
|
30
|
+
/** Apply the schema DDL (idempotent). Call once before use. */
|
|
31
|
+
migrate(): Promise<void>;
|
|
32
|
+
/** Resolve a table's compiled schema; row operations require `ensureSchema`. */
|
|
33
|
+
table(name: string): CompiledTable;
|
|
34
|
+
ensureSchema(schema: CompiledSchema): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Open a real Postgres transaction. The push handler drives the returned
|
|
37
|
+
* `StorageTransaction` imperatively (getRow/upsert/…/commit), but the
|
|
38
|
+
* driver seam models a transaction as a callback scope. We bridge the two:
|
|
39
|
+
* `transaction(fn)` blocks inside `fn` on a promise that the imperative
|
|
40
|
+
* `commit()`/`rollback()` resolves/rejects, so BEGIN…COMMIT wraps exactly
|
|
41
|
+
* the handler's writes on one pinned connection.
|
|
42
|
+
*/
|
|
43
|
+
begin(partition: string): Promise<StorageTransaction>;
|
|
44
|
+
getMaxCommitSeq(partition: string): Promise<number>;
|
|
45
|
+
getHorizonSeq(partition: string): Promise<number>;
|
|
46
|
+
setHorizonSeq(partition: string, seq: number): Promise<void>;
|
|
47
|
+
pruneCommitsThrough(partition: string, seq: number): Promise<number>;
|
|
48
|
+
getCommitSeqBefore(partition: string, createdBeforeMs: number): Promise<number>;
|
|
49
|
+
getRow(partition: string, table: string, rowId: string): Promise<StoredRow | undefined>;
|
|
50
|
+
getPushResult(partition: string, clientId: string, clientCommitId: string): Promise<StoredPushResult | undefined>;
|
|
51
|
+
readCommitWindow(partition: string, query: CommitWindowQuery): Promise<StoredCommit[]>;
|
|
52
|
+
scanRows(partition: string, query: RowScanQuery): Promise<StoredRow[]>;
|
|
53
|
+
getClientRecord(partition: string, clientId: string): Promise<ClientRecord | undefined>;
|
|
54
|
+
putClientRecord(partition: string, record: ClientRecord): Promise<void>;
|
|
55
|
+
listClientCursors(partition: string): Promise<ClientCursorInfo[]>;
|
|
56
|
+
listRowsReferencingBlob(partition: string, blobId: string): Promise<{
|
|
57
|
+
readonly table: string;
|
|
58
|
+
readonly rowId: string;
|
|
59
|
+
readonly scopes: Record<string, string>;
|
|
60
|
+
}[]>;
|
|
61
|
+
listReferencedBlobIds(partition: string): Promise<string[]>;
|
|
62
|
+
listClientRecords(partition: string): Promise<ClientRecord[]>;
|
|
63
|
+
listCommitMetadata(partition: string, query: CommitMetadataQuery): Promise<CommitMetadata[]>;
|
|
64
|
+
scopeActivity(partition: string, query: ScopeActivityQuery): Promise<ScopeCommitActivity[]>;
|
|
65
|
+
getRowScopes(partition: string, table: string, rowId: string): Promise<{
|
|
66
|
+
serverVersion: number;
|
|
67
|
+
scopes: Record<string, string>;
|
|
68
|
+
} | undefined>;
|
|
69
|
+
}
|