@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/src/index.ts
CHANGED
|
@@ -1,36 +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
|
-
|
|
12
|
-
export * from './
|
|
13
|
-
export * from './
|
|
14
|
-
export * from './
|
|
15
|
-
export * from './
|
|
16
|
-
export * from './
|
|
17
|
-
export * from './dialect';
|
|
18
|
-
export * from './encrypted-crdt';
|
|
10
|
+
export * from './admin';
|
|
11
|
+
export * from './blob-handlers';
|
|
12
|
+
export * from './blob-store';
|
|
13
|
+
export * from './content-encoding';
|
|
14
|
+
export * from './context';
|
|
15
|
+
export * from './crdt-merger';
|
|
16
|
+
export * from './d1-storage';
|
|
19
17
|
export * from './errors';
|
|
20
|
-
export * from './
|
|
21
|
-
export * from './
|
|
22
|
-
export * from './
|
|
23
|
-
export * from './
|
|
24
|
-
export * from './
|
|
25
|
-
|
|
18
|
+
export * from './events';
|
|
19
|
+
export * from './events-ring';
|
|
20
|
+
export * from './frame-bytes';
|
|
21
|
+
export * from './handler';
|
|
22
|
+
export * from './lease-store';
|
|
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';
|
|
28
|
+
export * from './postgres-fanout';
|
|
29
|
+
export * from './postgres-storage';
|
|
26
30
|
export * from './prune';
|
|
27
31
|
export * from './pull';
|
|
28
32
|
export * from './push';
|
|
29
33
|
export * from './realtime';
|
|
34
|
+
export * from './relational-rows';
|
|
35
|
+
export * from './s3-blob-store';
|
|
36
|
+
export * from './s3-segment-store';
|
|
30
37
|
export * from './schema';
|
|
31
|
-
export * from './
|
|
32
|
-
export * from './
|
|
33
|
-
export
|
|
34
|
-
export * from './
|
|
35
|
-
|
|
36
|
-
|
|
38
|
+
export * from './scopes';
|
|
39
|
+
export * from './segment-download';
|
|
40
|
+
export * from './segment-store';
|
|
41
|
+
export * from './signed-url';
|
|
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';
|
|
47
|
+
export * from './sqlite-dialect';
|
|
48
|
+
export * from './sqlite-image';
|
|
49
|
+
export * from './sqlite-lease-store';
|
|
50
|
+
export * from './sqlite-segment-store';
|
|
51
|
+
export * from './sqlite-storage';
|
|
52
|
+
export * from './storage';
|
|
53
|
+
export * from './validate';
|
|
Binary file
|
|
@@ -0,0 +1,63 @@
|
|
|
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, PgQueryable, PgRow } from './pg-executor';
|
|
17
|
+
|
|
18
|
+
/** Minimal structural type for a pglite instance (avoids a hard type dep). */
|
|
19
|
+
interface PgliteLike {
|
|
20
|
+
query<Row>(
|
|
21
|
+
query: string,
|
|
22
|
+
params?: unknown[],
|
|
23
|
+
): Promise<{ rows: Row[]; affectedRows?: number }>;
|
|
24
|
+
exec(query: string): Promise<unknown>;
|
|
25
|
+
close(): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function queryable(db: PgliteLike): PgQueryable {
|
|
29
|
+
return {
|
|
30
|
+
async query<Row = PgRow>(text: string, params?: readonly unknown[]) {
|
|
31
|
+
const result = await db.query<Row>(
|
|
32
|
+
text,
|
|
33
|
+
params ? [...params] : undefined,
|
|
34
|
+
);
|
|
35
|
+
return {
|
|
36
|
+
rows: result.rows,
|
|
37
|
+
rowCount: result.affectedRows ?? result.rows.length,
|
|
38
|
+
};
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function pgliteExecutor(db: PGlite | PgliteLike): PgExecutor {
|
|
44
|
+
const like = db as PgliteLike;
|
|
45
|
+
const q = queryable(like);
|
|
46
|
+
return {
|
|
47
|
+
query: q.query,
|
|
48
|
+
async transaction<T>(fn: (client: PgQueryable) => Promise<T>): Promise<T> {
|
|
49
|
+
await like.exec('BEGIN');
|
|
50
|
+
try {
|
|
51
|
+
const result = await fn(q);
|
|
52
|
+
await like.exec('COMMIT');
|
|
53
|
+
return result;
|
|
54
|
+
} catch (error) {
|
|
55
|
+
await like.exec('ROLLBACK');
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
async close() {
|
|
60
|
+
await like.close();
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
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
|
+
|
|
33
|
+
/** One database row as a plain object keyed by (lower-cased) column name. */
|
|
34
|
+
export type PgRow = Record<string, unknown>;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* A handle that runs parameterized statements. Both the pool-level executor
|
|
38
|
+
* and a per-transaction client implement it, so storage code is written once
|
|
39
|
+
* against `PgQueryable` regardless of transaction scope.
|
|
40
|
+
*
|
|
41
|
+
* `params` use Postgres positional placeholders (`$1`, `$2`, ...). `text`
|
|
42
|
+
* is a single statement (no multi-statement `;`-joined batches — those are
|
|
43
|
+
* driver-specific and defeat parameterization).
|
|
44
|
+
*/
|
|
45
|
+
export interface PgQueryable {
|
|
46
|
+
query<Row = PgRow>(
|
|
47
|
+
text: string,
|
|
48
|
+
params?: readonly unknown[],
|
|
49
|
+
): Promise<{ rows: Row[]; rowCount: number }>;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* The pool-level executor: `PgQueryable` plus transaction control. A
|
|
54
|
+
* `transaction` callback receives a client pinned to one connection for the
|
|
55
|
+
* duration of a real Postgres `BEGIN … COMMIT/ROLLBACK`; throwing rolls back.
|
|
56
|
+
*/
|
|
57
|
+
export interface PgExecutor extends PgQueryable {
|
|
58
|
+
/**
|
|
59
|
+
* Run `fn` inside a single Postgres transaction on one pinned connection.
|
|
60
|
+
* The executor issues `BEGIN` before `fn`, `COMMIT` on resolve, and
|
|
61
|
+
* `ROLLBACK` on throw (rethrowing the original error).
|
|
62
|
+
*/
|
|
63
|
+
transaction<T>(fn: (client: PgQueryable) => Promise<T>): Promise<T>;
|
|
64
|
+
/** Release any pooled resources. Optional (pglite/Bun.sql). */
|
|
65
|
+
close?(): Promise<void>;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Coerce a driver-decoded sequence value (`number | string | bigint`). */
|
|
69
|
+
export function asNumber(value: unknown): number {
|
|
70
|
+
if (typeof value === 'number') return value;
|
|
71
|
+
if (typeof value === 'bigint') return Number(value);
|
|
72
|
+
if (typeof value === 'string') return Number.parseInt(value, 10);
|
|
73
|
+
if (value === null || value === undefined) return 0;
|
|
74
|
+
throw new Error(`expected a numeric column, got ${typeof value}`);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** Coerce a driver-decoded `bytea` value to a `Uint8Array`. */
|
|
78
|
+
export function asBytes(value: unknown): Uint8Array {
|
|
79
|
+
if (value instanceof Uint8Array) return value;
|
|
80
|
+
if (value === null || value === undefined) {
|
|
81
|
+
throw new Error('expected bytea, got null');
|
|
82
|
+
}
|
|
83
|
+
// node-postgres/Bun.sql return Buffer (a Uint8Array subclass); this branch
|
|
84
|
+
// is a defensive copy for any array-like the driver hands back.
|
|
85
|
+
if (Array.isArray(value)) return new Uint8Array(value);
|
|
86
|
+
throw new Error(`expected bytea, got ${typeof value}`);
|
|
87
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
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
|
+
|
|
38
|
+
/** The channel every syncular instance LISTENs on. */
|
|
39
|
+
export const FANOUT_CHANNEL = 'syncular_commit';
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The wake reason remote instances raise on a fanout notification (§8.3):
|
|
43
|
+
* `catchup-required` — a commit landed on another instance, so the local
|
|
44
|
+
* session pulls the delta it is now behind on from shared storage.
|
|
45
|
+
*/
|
|
46
|
+
const FANOUT_WAKE_REASON: WakeReason = 'catchup-required';
|
|
47
|
+
|
|
48
|
+
export interface FanoutPayload {
|
|
49
|
+
readonly partition: string;
|
|
50
|
+
readonly commitSeq: number;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Encode a fanout payload as `<partition>:<commitSeq>`. The partition is
|
|
55
|
+
* base64url-encoded so a partition string containing `:` cannot corrupt the
|
|
56
|
+
* frame; commitSeq is a plain decimal integer.
|
|
57
|
+
*/
|
|
58
|
+
export function encodeFanoutPayload(payload: FanoutPayload): string {
|
|
59
|
+
const partition = Buffer.from(payload.partition, 'utf8').toString(
|
|
60
|
+
'base64url',
|
|
61
|
+
);
|
|
62
|
+
return `${partition}:${payload.commitSeq}`;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** Parse a fanout payload; returns `undefined` for a malformed frame. */
|
|
66
|
+
export function parseFanoutPayload(text: string): FanoutPayload | undefined {
|
|
67
|
+
const sep = text.indexOf(':');
|
|
68
|
+
if (sep <= 0) return undefined;
|
|
69
|
+
const partitionB64 = text.slice(0, sep);
|
|
70
|
+
const seqText = text.slice(sep + 1);
|
|
71
|
+
const commitSeq = Number.parseInt(seqText, 10);
|
|
72
|
+
if (!Number.isFinite(commitSeq) || commitSeq < 0) return undefined;
|
|
73
|
+
if (!/^\d+$/.test(seqText)) return undefined;
|
|
74
|
+
let partition: string;
|
|
75
|
+
try {
|
|
76
|
+
partition = Buffer.from(partitionB64, 'base64url').toString('utf8');
|
|
77
|
+
} catch {
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
if (partition.length === 0) return undefined;
|
|
81
|
+
return { partition, commitSeq };
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** The hub surface the fanout wakes (a `RealtimeHub` satisfies this). */
|
|
85
|
+
export interface FanoutWakeTarget {
|
|
86
|
+
wake(partition: string, reason: WakeReason): void;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* A raw notification connection. Production wires a driver's LISTEN support:
|
|
91
|
+
* - node-postgres: a dedicated `Client` with `client.on('notification', …)`
|
|
92
|
+
* after `LISTEN syncular_commit`;
|
|
93
|
+
* - Bun.sql: `sql.listen(channel, handler)`.
|
|
94
|
+
* The `notify` side can reuse the main pool (`SELECT pg_notify($1,$2)`), but
|
|
95
|
+
* LISTEN needs its own long-lived connection.
|
|
96
|
+
*/
|
|
97
|
+
export interface PgNotificationConnection {
|
|
98
|
+
/** Register a payload handler for the channel and begin listening. */
|
|
99
|
+
listen(
|
|
100
|
+
channel: string,
|
|
101
|
+
handler: (payload: string) => void,
|
|
102
|
+
): Promise<void> | void;
|
|
103
|
+
/** Send a notification on the channel. */
|
|
104
|
+
notify(channel: string, payload: string): Promise<void>;
|
|
105
|
+
close?(): Promise<void>;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* The fanout primitive. `install(hub)` starts the LISTEN loop that wakes the
|
|
110
|
+
* hub on every remote commit; `notifyCommit` is called after a local commit
|
|
111
|
+
* lands to fan it to the other instances.
|
|
112
|
+
*/
|
|
113
|
+
export class PostgresFanout {
|
|
114
|
+
readonly #conn: PgNotificationConnection;
|
|
115
|
+
#installed = false;
|
|
116
|
+
|
|
117
|
+
constructor(conn: PgNotificationConnection) {
|
|
118
|
+
this.#conn = conn;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/** Start the LISTEN loop, waking `hub` on every notification received. */
|
|
122
|
+
async install(hub: FanoutWakeTarget): Promise<void> {
|
|
123
|
+
if (this.#installed) throw new Error('fanout already installed');
|
|
124
|
+
this.#installed = true;
|
|
125
|
+
await this.#conn.listen(FANOUT_CHANNEL, (payload) => {
|
|
126
|
+
const parsed = parseFanoutPayload(payload);
|
|
127
|
+
if (parsed === undefined) return; // ignore malformed frames
|
|
128
|
+
hub.wake(parsed.partition, FANOUT_WAKE_REASON);
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** Fan an applied commit out to the other instances. */
|
|
133
|
+
async notifyCommit(partition: string, commitSeq: number): Promise<void> {
|
|
134
|
+
await this.#conn.notify(
|
|
135
|
+
FANOUT_CHANNEL,
|
|
136
|
+
encodeFanoutPayload({ partition, commitSeq }),
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
async close(): Promise<void> {
|
|
141
|
+
await this.#conn.close?.();
|
|
142
|
+
}
|
|
143
|
+
}
|