@abloatai/ablo 0.26.0 → 0.27.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/CHANGELOG.md +14 -0
- package/README.md +101 -85
- package/dist/BaseSyncedStore.d.ts +85 -88
- package/dist/BaseSyncedStore.js +131 -147
- package/dist/Database.d.ts +54 -68
- package/dist/Database.js +97 -113
- package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
- package/dist/{ObjectPool.js → InstanceCache.js} +85 -83
- package/dist/LazyReferenceCollection.d.ts +11 -15
- package/dist/LazyReferenceCollection.js +12 -16
- package/dist/Model.d.ts +37 -52
- package/dist/Model.js +46 -61
- package/dist/ModelRegistry.d.ts +21 -19
- package/dist/ModelRegistry.js +23 -27
- package/dist/NetworkMonitor.d.ts +5 -6
- package/dist/NetworkMonitor.js +5 -6
- package/dist/SyncClient.d.ts +112 -112
- package/dist/SyncClient.js +165 -172
- package/dist/adapters/alwaysOnline.d.ts +6 -8
- package/dist/adapters/alwaysOnline.js +6 -8
- package/dist/adapters/inMemoryStorage.d.ts +9 -9
- package/dist/adapters/inMemoryStorage.js +9 -9
- package/dist/agent/Agent.d.ts +27 -32
- package/dist/agent/Agent.js +18 -19
- package/dist/agent/index.d.ts +4 -4
- package/dist/agent/index.js +5 -5
- package/dist/agent/session.d.ts +47 -44
- package/dist/agent/session.js +37 -48
- package/dist/agent/types.d.ts +26 -31
- package/dist/agent/types.js +6 -7
- package/dist/ai-sdk/coordinatedTool.d.ts +108 -0
- package/dist/ai-sdk/{coordinated-tool.js → coordinatedTool.js} +44 -38
- package/dist/ai-sdk/coordinationContext.d.ts +46 -0
- package/dist/ai-sdk/{coordination-context.js → coordinationContext.js} +26 -33
- package/dist/ai-sdk/index.d.ts +25 -22
- package/dist/ai-sdk/index.js +25 -22
- package/dist/ai-sdk/wrap.d.ts +6 -7
- package/dist/ai-sdk/wrap.js +1 -1
- package/dist/auth/credentialPolicy.d.ts +69 -74
- package/dist/auth/credentialPolicy.js +51 -56
- package/dist/auth/credentialSource.d.ts +6 -5
- package/dist/auth/credentialSource.js +9 -10
- package/dist/auth/index.d.ts +59 -58
- package/dist/auth/index.js +31 -37
- package/dist/auth/schemas.d.ts +5 -4
- package/dist/auth/schemas.js +5 -4
- package/dist/batching/index.d.ts +19 -21
- package/dist/batching/index.js +14 -17
- package/dist/cli.cjs +167 -119
- package/dist/client/Ablo.d.ts +73 -73
- package/dist/client/Ablo.js +125 -160
- package/dist/client/ApiClient.d.ts +30 -19
- package/dist/client/ApiClient.js +133 -38
- package/dist/client/auth.d.ts +47 -47
- package/dist/client/auth.js +108 -117
- package/dist/client/claimHeartbeatLoop.d.ts +50 -0
- package/dist/client/claimHeartbeatLoop.js +88 -0
- package/dist/client/consoleLogger.d.ts +5 -6
- package/dist/client/consoleLogger.js +5 -6
- package/dist/client/createInternalComponents.d.ts +14 -17
- package/dist/client/createInternalComponents.js +25 -30
- package/dist/client/createModelProxy.d.ts +130 -120
- package/dist/client/createModelProxy.js +152 -122
- package/dist/client/credentialEndpoint.d.ts +40 -42
- package/dist/client/credentialEndpoint.js +35 -36
- package/dist/client/functionalUpdate.d.ts +29 -27
- package/dist/client/functionalUpdate.js +21 -21
- package/dist/client/hostedEndpoints.d.ts +9 -12
- package/dist/client/hostedEndpoints.js +9 -12
- package/dist/client/httpClient.d.ts +57 -53
- package/dist/client/httpClient.js +29 -31
- package/dist/client/identity.d.ts +15 -20
- package/dist/client/identity.js +47 -58
- package/dist/client/modelRegistration.d.ts +5 -9
- package/dist/client/modelRegistration.js +67 -87
- package/dist/client/options.d.ts +134 -157
- package/dist/client/options.js +3 -7
- package/dist/client/registerDataSource.d.ts +9 -9
- package/dist/client/registerDataSource.js +15 -16
- package/dist/client/resourceTypes.d.ts +64 -75
- package/dist/client/resourceTypes.js +4 -10
- package/dist/client/schemaConfig.d.ts +31 -43
- package/dist/client/schemaConfig.js +38 -50
- package/dist/client/sessionMint.d.ts +16 -12
- package/dist/client/sessionMint.js +26 -31
- package/dist/client/validateAbloOptions.d.ts +12 -14
- package/dist/client/validateAbloOptions.js +8 -9
- package/dist/client/writeOptionsSchema.d.ts +18 -16
- package/dist/client/writeOptionsSchema.js +23 -20
- package/dist/client/wsMutationExecutor.d.ts +15 -20
- package/dist/client/wsMutationExecutor.js +17 -23
- package/dist/context.d.ts +6 -4
- package/dist/context.js +6 -4
- package/dist/coordination/index.d.ts +10 -8
- package/dist/coordination/index.js +14 -12
- package/dist/coordination/schema.d.ts +176 -128
- package/dist/coordination/schema.js +197 -133
- package/dist/coordination/trace.d.ts +9 -10
- package/dist/coordination/trace.js +13 -14
- package/dist/core/DatabaseManager.d.ts +5 -7
- package/dist/core/DatabaseManager.js +15 -19
- package/dist/core/QueryProcessor.d.ts +7 -9
- package/dist/core/QueryProcessor.js +22 -28
- package/dist/core/QueryView.d.ts +8 -8
- package/dist/core/QueryView.js +2 -2
- package/dist/core/StoreManager.d.ts +12 -14
- package/dist/core/StoreManager.js +21 -24
- package/dist/core/ViewRegistry.d.ts +5 -5
- package/dist/core/ViewRegistry.js +4 -4
- package/dist/core/index.d.ts +17 -12
- package/dist/core/index.js +32 -26
- package/dist/core/openIDBWithTimeout.d.ts +38 -36
- package/dist/core/openIDBWithTimeout.js +42 -43
- package/dist/core/queryUtils.d.ts +45 -0
- package/dist/core/queryUtils.js +69 -0
- package/dist/core/storeContract.d.ts +63 -61
- package/dist/core/storeContract.js +8 -12
- package/dist/environment.d.ts +28 -0
- package/dist/environment.js +21 -0
- package/dist/errorCodes.d.ts +107 -99
- package/dist/errorCodes.js +131 -132
- package/dist/errors.d.ts +160 -166
- package/dist/errors.js +155 -158
- package/dist/index.d.ts +30 -27
- package/dist/index.js +89 -86
- package/dist/interfaces/index.d.ts +102 -113
- package/dist/interfaces/index.js +5 -4
- package/dist/keys/index.d.ts +27 -29
- package/dist/keys/index.js +41 -40
- package/dist/mutators/RecordingTransaction.d.ts +16 -16
- package/dist/mutators/RecordingTransaction.js +31 -37
- package/dist/mutators/Transaction.d.ts +18 -26
- package/dist/mutators/Transaction.js +14 -20
- package/dist/mutators/UndoManager.d.ts +122 -131
- package/dist/mutators/UndoManager.js +145 -156
- package/dist/mutators/defineMutators.d.ts +23 -34
- package/dist/mutators/defineMutators.js +14 -20
- package/dist/mutators/inverseOp.d.ts +12 -15
- package/dist/mutators/inverseOp.js +12 -15
- package/dist/mutators/mutateActions.d.ts +10 -9
- package/dist/mutators/mutateActions.js +1 -1
- package/dist/mutators/readerActions.d.ts +9 -8
- package/dist/mutators/readerActions.js +2 -2
- package/dist/mutators/undoApply.d.ts +31 -27
- package/dist/mutators/undoApply.js +26 -24
- package/dist/policy/index.d.ts +5 -3
- package/dist/policy/index.js +5 -3
- package/dist/policy/types.d.ts +104 -100
- package/dist/policy/types.js +67 -66
- package/dist/query/client.d.ts +28 -23
- package/dist/query/client.js +45 -43
- package/dist/query/types.d.ts +37 -60
- package/dist/query/types.js +13 -33
- package/dist/react/AbloProvider.d.ts +1 -1
- package/dist/react/AbloProvider.js +2 -2
- package/dist/react/context.d.ts +25 -28
- package/dist/react/context.js +9 -10
- package/dist/react/index.d.ts +41 -42
- package/dist/react/index.js +37 -38
- package/dist/react/internalContext.d.ts +17 -19
- package/dist/react/useAblo.d.ts +23 -22
- package/dist/react/useAblo.js +16 -14
- package/dist/react/useCurrentUserId.d.ts +8 -7
- package/dist/react/useCurrentUserId.js +8 -7
- package/dist/react/useErrorListener.d.ts +7 -7
- package/dist/react/useErrorListener.js +10 -11
- package/dist/react/useMutationFailureListener.d.ts +8 -8
- package/dist/react/useMutationFailureListener.js +8 -8
- package/dist/react/useMutators.d.ts +11 -11
- package/dist/react/useMutators.js +3 -3
- package/dist/react/useReactive.js +2 -2
- package/dist/react/useSyncStatus.d.ts +4 -6
- package/dist/react/useUndoScope.d.ts +7 -9
- package/dist/react/useUndoScope.js +1 -1
- package/dist/schema/coordination.d.ts +21 -25
- package/dist/schema/coordination.js +21 -25
- package/dist/schema/ddl.d.ts +43 -39
- package/dist/schema/ddl.js +75 -68
- package/dist/schema/ddlLock.d.ts +20 -24
- package/dist/schema/ddlLock.js +18 -23
- package/dist/schema/diff.d.ts +99 -61
- package/dist/schema/diff.js +43 -34
- package/dist/schema/field.d.ts +37 -42
- package/dist/schema/field.js +35 -48
- package/dist/schema/generate.d.ts +12 -12
- package/dist/schema/generate.js +12 -12
- package/dist/schema/index.d.ts +2 -2
- package/dist/schema/index.js +21 -23
- package/dist/schema/model.d.ts +118 -143
- package/dist/schema/model.js +22 -33
- package/dist/schema/openapi.d.ts +10 -9
- package/dist/schema/openapi.js +5 -3
- package/dist/schema/queries.d.ts +29 -31
- package/dist/schema/queries.js +23 -25
- package/dist/schema/relation.d.ts +89 -99
- package/dist/schema/relation.js +13 -13
- package/dist/schema/residency.d.ts +16 -13
- package/dist/schema/residency.js +16 -13
- package/dist/schema/roles.d.ts +36 -43
- package/dist/schema/roles.js +31 -37
- package/dist/schema/schema.d.ts +33 -42
- package/dist/schema/schema.js +31 -32
- package/dist/schema/select.d.ts +13 -13
- package/dist/schema/select.js +13 -13
- package/dist/schema/serialize.d.ts +28 -31
- package/dist/schema/serialize.js +27 -31
- package/dist/schema/sugar.d.ts +17 -32
- package/dist/schema/sugar.js +14 -29
- package/dist/schema/{sync-delta-row.d.ts → syncDeltaRow.d.ts} +26 -49
- package/dist/schema/syncDeltaRow.js +89 -0
- package/dist/schema/tenancy.d.ts +44 -46
- package/dist/schema/tenancy.js +46 -48
- package/dist/server/adapter.d.ts +58 -58
- package/dist/server/adapter.js +13 -14
- package/dist/server/commit.d.ts +60 -64
- package/dist/server/index.d.ts +9 -10
- package/dist/server/index.js +1 -1
- package/dist/server/readConfig.d.ts +70 -0
- package/dist/server/readConfig.js +8 -0
- package/dist/server/storageMode.d.ts +23 -0
- package/dist/server/storageMode.js +17 -0
- package/dist/source/adapter.d.ts +30 -25
- package/dist/source/adapter.js +10 -10
- package/dist/source/adapters/drizzle.d.ts +28 -23
- package/dist/source/adapters/drizzle.js +30 -25
- package/dist/source/adapters/kysely.d.ts +27 -25
- package/dist/source/adapters/kysely.js +24 -23
- package/dist/source/adapters/memory.d.ts +8 -7
- package/dist/source/adapters/memory.js +9 -8
- package/dist/source/adapters/prisma.d.ts +13 -12
- package/dist/source/adapters/prisma.js +22 -25
- package/dist/source/conformance.d.ts +18 -11
- package/dist/source/conformance.js +17 -11
- package/dist/source/connector.d.ts +31 -32
- package/dist/source/connector.js +28 -28
- package/dist/source/connectorProtocol.d.ts +160 -0
- package/dist/source/connectorProtocol.js +162 -0
- package/dist/source/contract.d.ts +26 -27
- package/dist/source/contract.js +28 -29
- package/dist/source/factory.d.ts +46 -58
- package/dist/source/factory.js +22 -27
- package/dist/source/index.d.ts +7 -9
- package/dist/source/index.js +12 -14
- package/dist/source/migrations.d.ts +9 -9
- package/dist/source/migrations.js +9 -9
- package/dist/source/next.d.ts +9 -10
- package/dist/source/next.js +6 -7
- package/dist/source/pushQueue.d.ts +69 -47
- package/dist/source/pushQueue.js +32 -28
- package/dist/source/signing.d.ts +46 -17
- package/dist/source/signing.js +28 -11
- package/dist/source/types.d.ts +121 -104
- package/dist/source/types.js +13 -14
- package/dist/stores/ObjectStore.d.ts +10 -11
- package/dist/stores/ObjectStore.js +11 -12
- package/dist/stores/ObjectStoreContract.d.ts +12 -15
- package/dist/stores/SyncActionStore.d.ts +7 -11
- package/dist/stores/SyncActionStore.js +13 -17
- package/dist/surface.d.ts +27 -20
- package/dist/surface.js +27 -20
- package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +36 -42
- package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +76 -76
- package/dist/sync/ConnectionManager.d.ts +39 -50
- package/dist/sync/ConnectionManager.js +55 -66
- package/dist/sync/NetworkProbe.d.ts +24 -29
- package/dist/sync/NetworkProbe.js +63 -69
- package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +42 -41
- package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +59 -54
- package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +43 -57
- package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +43 -51
- package/dist/sync/SyncWebSocket.d.ts +139 -165
- package/dist/sync/SyncWebSocket.js +191 -223
- package/dist/sync/awaitClaimGrant.d.ts +18 -18
- package/dist/sync/awaitClaimGrant.js +11 -11
- package/dist/sync/bootstrapApply.d.ts +34 -24
- package/dist/sync/bootstrapApply.js +27 -19
- package/dist/sync/commitFrames.d.ts +21 -20
- package/dist/sync/commitFrames.js +18 -18
- package/dist/sync/createClaimStream.d.ts +23 -22
- package/dist/sync/createClaimStream.js +105 -23
- package/dist/sync/createPresenceStream.d.ts +19 -18
- package/dist/sync/createPresenceStream.js +25 -26
- package/dist/sync/createSnapshot.d.ts +12 -14
- package/dist/sync/createSnapshot.js +20 -26
- package/dist/sync/credentialLifecycle.d.ts +104 -104
- package/dist/sync/credentialLifecycle.js +140 -147
- package/dist/sync/deltaPipeline.d.ts +36 -34
- package/dist/sync/deltaPipeline.js +64 -65
- package/dist/sync/groupChange.d.ts +63 -61
- package/dist/sync/groupChange.js +74 -78
- package/dist/sync/heartbeat.d.ts +34 -33
- package/dist/sync/heartbeat.js +31 -31
- package/dist/sync/participants.d.ts +19 -19
- package/dist/sync/schemas.d.ts +3 -2
- package/dist/sync/schemas.js +14 -10
- package/dist/sync/syncCursor.d.ts +17 -21
- package/dist/sync/syncCursor.js +17 -21
- package/dist/sync/syncPlan.d.ts +28 -36
- package/dist/sync/syncPlan.js +18 -19
- package/dist/sync/syncPosition.d.ts +54 -49
- package/dist/sync/syncPosition.js +57 -52
- package/dist/sync/wsFrameHandlers.d.ts +35 -36
- package/dist/sync/wsFrameHandlers.js +63 -67
- package/dist/testing/fixtures/bootstrap.d.ts +12 -6
- package/dist/testing/fixtures/bootstrap.js +12 -6
- package/dist/testing/fixtures/deltas.d.ts +30 -33
- package/dist/testing/fixtures/deltas.js +30 -33
- package/dist/testing/fixtures/models.d.ts +11 -10
- package/dist/testing/fixtures/models.js +11 -10
- package/dist/testing/helpers/{react-wrapper.d.ts → reactWrapper.d.ts} +13 -10
- package/dist/testing/helpers/{react-wrapper.js → reactWrapper.js} +15 -12
- package/dist/testing/helpers/{sync-engine-harness.d.ts → syncEngineHarness.d.ts} +17 -15
- package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +12 -10
- package/dist/testing/helpers/wait.d.ts +13 -8
- package/dist/testing/helpers/wait.js +13 -8
- package/dist/testing/index.d.ts +3 -3
- package/dist/testing/index.js +2 -2
- package/dist/testing/mocks/MockMutationExecutor.d.ts +18 -17
- package/dist/testing/mocks/MockMutationExecutor.js +15 -14
- package/dist/testing/mocks/MockNetworkMonitor.d.ts +8 -8
- package/dist/testing/mocks/MockNetworkMonitor.js +8 -8
- package/dist/testing/mocks/MockSyncContext.d.ts +20 -17
- package/dist/testing/mocks/MockSyncContext.js +15 -13
- package/dist/testing/mocks/MockSyncStore.d.ts +10 -10
- package/dist/testing/mocks/MockSyncStore.js +11 -11
- package/dist/testing/mocks/MockWebSocket.d.ts +26 -22
- package/dist/testing/mocks/MockWebSocket.js +22 -21
- package/dist/transactions/TransactionQueue.d.ts +181 -176
- package/dist/transactions/TransactionQueue.js +338 -350
- package/dist/transactions/TransactionStore.d.ts +6 -4
- package/dist/transactions/TransactionStore.js +6 -4
- package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
- package/dist/transactions/UnconfirmedWrites.js +104 -0
- package/dist/transactions/coalesceRules.d.ts +41 -17
- package/dist/transactions/coalesceRules.js +40 -17
- package/dist/transactions/commitPayload.d.ts +48 -52
- package/dist/transactions/commitPayload.js +48 -57
- package/dist/transactions/deltaConfirmation.d.ts +20 -22
- package/dist/transactions/deltaConfirmation.js +37 -45
- package/dist/transactions/optimisticApply.d.ts +49 -0
- package/dist/transactions/optimisticApply.js +65 -0
- package/dist/transactions/{persistedReplay.d.ts → replayValidation.d.ts} +28 -22
- package/dist/transactions/{persistedReplay.js → replayValidation.js} +33 -27
- package/dist/types/global.d.ts +46 -41
- package/dist/types/global.js +20 -19
- package/dist/types/index.d.ts +71 -77
- package/dist/types/index.js +22 -22
- package/dist/types/modelData.d.ts +6 -8
- package/dist/types/modelData.js +5 -7
- package/dist/types/participant.d.ts +10 -11
- package/dist/types/participant.js +6 -8
- package/dist/types/streams.d.ts +208 -195
- package/dist/types/streams.js +7 -7
- package/dist/utils/asyncIterator.d.ts +25 -32
- package/dist/utils/asyncIterator.js +25 -32
- package/dist/utils/duration.d.ts +12 -15
- package/dist/utils/duration.js +12 -15
- package/dist/utils/mobxSetup.d.ts +53 -0
- package/dist/utils/{mobx-setup.js → mobxSetup.js} +42 -98
- package/dist/webhooks/events.d.ts +21 -16
- package/dist/webhooks/events.js +10 -8
- package/dist/webhooks/index.d.ts +5 -7
- package/dist/webhooks/index.js +5 -7
- package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
- package/dist/wire/delta.js +114 -0
- package/dist/wire/errorEnvelope.d.ts +30 -31
- package/dist/wire/errorEnvelope.js +34 -40
- package/dist/wire/frames.d.ts +79 -86
- package/dist/wire/frames.js +26 -33
- package/dist/wire/index.d.ts +14 -12
- package/dist/wire/index.js +30 -26
- package/dist/wire/listEnvelope.d.ts +16 -23
- package/dist/wire/listEnvelope.js +7 -6
- package/dist/wire/protocol.d.ts +25 -32
- package/dist/wire/protocol.js +25 -32
- package/dist/wire/protocolVersion.d.ts +44 -40
- package/dist/wire/protocolVersion.js +44 -40
- package/docs/coordination.md +59 -0
- package/package.json +11 -10
- package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
- package/dist/ai-sdk/coordination-context.d.ts +0 -52
- package/dist/core/query-utils.d.ts +0 -34
- package/dist/core/query-utils.js +0 -59
- package/dist/schema/sync-delta-row.js +0 -103
- package/dist/schema/sync-delta-wire.js +0 -102
- package/dist/server/read-config.d.ts +0 -67
- package/dist/server/read-config.js +0 -8
- package/dist/server/storage-mode.d.ts +0 -8
- package/dist/server/storage-mode.js +0 -28
- package/dist/source/connector-protocol.d.ts +0 -159
- package/dist/source/connector-protocol.js +0 -161
- package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
- package/dist/transactions/OptimisticEchoTracker.js +0 -104
- package/dist/transactions/mutation-error-handler.d.ts +0 -5
- package/dist/transactions/mutation-error-handler.js +0 -39
- package/dist/transactions/optimistic.d.ts +0 -24
- package/dist/transactions/optimistic.js +0 -45
- package/dist/utils/mobx-setup.d.ts +0 -42
package/dist/schema/tenancy.d.ts
CHANGED
|
@@ -1,36 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* whole point:
|
|
2
|
+
* Defines how a model's rows are scoped to a tenant. Two forms live here, and the
|
|
3
|
+
* separation between them is deliberate:
|
|
5
4
|
*
|
|
6
|
-
* 1. The
|
|
7
|
-
*
|
|
8
|
-
* and
|
|
9
|
-
* switchable, so the type system
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
5
|
+
* 1. The canonical form, {@link Tenancy} — a discriminated union that every
|
|
6
|
+
* consumer reads (provisioning and row-level security, introspection, the
|
|
7
|
+
* runtime, and the CLI) and the shape that crosses the wire in `ModelJSON`.
|
|
8
|
+
* One exhaustively switchable shape, so the type system enforces the isolation
|
|
9
|
+
* boundary.
|
|
10
|
+
* 2. The authoring form, {@link PolicyInput} — the `policy: { by }` option a
|
|
11
|
+
* schema author writes. The name follows SQL row-level security, where a
|
|
12
|
+
* policy is the rule that decides which rows a tenant may read.
|
|
13
|
+
* {@link resolvePolicy} converts it to the canonical {@link Tenancy} when the
|
|
14
|
+
* model is built, so the authoring vocabulary never reaches the wire or any
|
|
15
|
+
* consumer.
|
|
17
16
|
*
|
|
18
|
-
*
|
|
19
|
-
* `
|
|
20
|
-
*
|
|
21
|
-
* (`orgScoped: false`) silently exposed a whole table cross-tenant. Collapsing
|
|
22
|
-
* them into a single discriminated union makes the opt-out (`{ by: 'none' }`) a
|
|
23
|
-
* loud, deliberate branch instead of a falsy flag — one concept, one name.
|
|
17
|
+
* Both forms discriminate on a single tag, which makes the opt-out from tenant
|
|
18
|
+
* scoping (`{ by: 'none' }`) an explicit, named branch rather than a falsy flag —
|
|
19
|
+
* important, because that branch makes an entire table readable across tenants.
|
|
24
20
|
*/
|
|
25
21
|
import { z } from 'zod';
|
|
26
|
-
/**
|
|
22
|
+
/** The default physical tenancy column. This is the single canonical definition of that column name. */
|
|
27
23
|
export declare const DEFAULT_ORG_COLUMN = "organization_id";
|
|
28
24
|
/**
|
|
29
|
-
*
|
|
30
|
-
* column of their own
|
|
31
|
-
*
|
|
32
|
-
* `{ by: 'parent', fk, parent }`
|
|
33
|
-
* {@link resolvePolicy}.
|
|
25
|
+
* Scopes a table's rows through a parent table, for rows that carry no tenancy
|
|
26
|
+
* column of their own (for example, slide layers scoped through their slide, deck,
|
|
27
|
+
* and organization). This is the canonical `parent` payload; authors write the
|
|
28
|
+
* friendlier {@link PolicyInput} `{ by: 'parent', fk, parent }` form, which
|
|
29
|
+
* {@link resolvePolicy} normalizes into this.
|
|
34
30
|
*/
|
|
35
31
|
export declare const scopedViaRefSchema: z.ZodObject<{
|
|
36
32
|
localKey: z.ZodString;
|
|
@@ -39,7 +35,7 @@ export declare const scopedViaRefSchema: z.ZodObject<{
|
|
|
39
35
|
parentOrgColumn: z.ZodOptional<z.ZodString>;
|
|
40
36
|
}, z.core.$strip>;
|
|
41
37
|
export type ScopedViaRef = z.infer<typeof scopedViaRefSchema>;
|
|
42
|
-
/** How a model's rows are scoped to a tenant — the
|
|
38
|
+
/** How a model's rows are scoped to a tenant — the canonical, wire-facing form. */
|
|
43
39
|
export declare const tenancySchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
44
40
|
kind: z.ZodLiteral<"column">;
|
|
45
41
|
column: z.ZodString;
|
|
@@ -56,19 +52,19 @@ export declare const tenancySchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
56
52
|
}, z.core.$strip>], "kind">;
|
|
57
53
|
export type Tenancy = z.infer<typeof tenancySchema>;
|
|
58
54
|
/**
|
|
59
|
-
* The
|
|
60
|
-
* `policy` option
|
|
61
|
-
*
|
|
62
|
-
* the three branches are mutually exclusive and the
|
|
55
|
+
* The authoring form of tenancy — what a schema author writes as the model's
|
|
56
|
+
* `policy` option. The name follows SQL row-level security, where a policy is the
|
|
57
|
+
* rule that decides which rows a tenant may read. It is a discriminated union on
|
|
58
|
+
* `by`, so the three branches are mutually exclusive and the opt-out
|
|
63
59
|
* (`{ by: 'none' }`) is an explicit, named choice rather than a falsy flag.
|
|
64
60
|
*
|
|
65
|
-
* - `{ by: 'column' }`
|
|
66
|
-
*
|
|
61
|
+
* - `{ by: 'column' }` — a row-local tenancy column (the default). `column`
|
|
62
|
+
* overrides the name (default {@link DEFAULT_ORG_COLUMN}).
|
|
67
63
|
* - `{ by: 'parent', fk, parent }` — inherit tenancy through a foreign key when
|
|
68
|
-
* this table has no tenancy column of its own. `parentKey` (default `'id'`)
|
|
69
|
-
*
|
|
70
|
-
* - `{ by: 'none' }`
|
|
71
|
-
*
|
|
64
|
+
* this table has no tenancy column of its own. `parentKey` (default `'id'`) and
|
|
65
|
+
* `parentTenantColumn` (default {@link DEFAULT_ORG_COLUMN}) are optional overrides.
|
|
66
|
+
* - `{ by: 'none' }` — genuinely global or reference data. This makes the whole
|
|
67
|
+
* table readable across tenants, so it is correct only for tables that have no tenant.
|
|
72
68
|
*/
|
|
73
69
|
export declare const policyInputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
74
70
|
by: z.ZodLiteral<"column">;
|
|
@@ -84,19 +80,21 @@ export declare const policyInputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
84
80
|
}, z.core.$strip>], "by">;
|
|
85
81
|
export type PolicyInput = z.infer<typeof policyInputSchema>;
|
|
86
82
|
/**
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
*
|
|
83
|
+
* Normalizes the authoring {@link PolicyInput} into the canonical {@link Tenancy}.
|
|
84
|
+
* Called once, when the model is built, so that `ModelDef`, `ModelJSON`, and every
|
|
85
|
+
* consumer see only the canonical union. Omitting `policy` defaults to a row-local
|
|
86
|
+
* `organization_id` column.
|
|
91
87
|
*/
|
|
92
88
|
export declare function resolvePolicy(input?: PolicyInput): Tenancy;
|
|
93
89
|
/**
|
|
94
|
-
*
|
|
95
|
-
* `ModelJSON`), defaulting to a row-local `organization_id` column when
|
|
90
|
+
* Reads the canonical {@link Tenancy} off an already-built model definition (or a
|
|
91
|
+
* parsed `ModelJSON`), defaulting to a row-local `organization_id` column when it is
|
|
92
|
+
* absent.
|
|
96
93
|
*
|
|
97
|
-
* This is the
|
|
98
|
-
* DDL, CLI
|
|
99
|
-
* each
|
|
94
|
+
* This is the read-side helper. Consumers — provisioning and row-level security, the
|
|
95
|
+
* membership resolver, DDL generation, and the CLI — call it to get a model's
|
|
96
|
+
* tenancy without re-deriving the default each time. It is not the authoring
|
|
97
|
+
* normalizer; that is {@link resolvePolicy}.
|
|
100
98
|
*/
|
|
101
99
|
export declare function resolveTenancy(def: {
|
|
102
100
|
tenancy?: Tenancy;
|
package/dist/schema/tenancy.js
CHANGED
|
@@ -1,39 +1,35 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* whole point:
|
|
2
|
+
* Defines how a model's rows are scoped to a tenant. Two forms live here, and the
|
|
3
|
+
* separation between them is deliberate:
|
|
5
4
|
*
|
|
6
|
-
* 1. The
|
|
7
|
-
*
|
|
8
|
-
* and
|
|
9
|
-
* switchable, so the type system
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
5
|
+
* 1. The canonical form, {@link Tenancy} — a discriminated union that every
|
|
6
|
+
* consumer reads (provisioning and row-level security, introspection, the
|
|
7
|
+
* runtime, and the CLI) and the shape that crosses the wire in `ModelJSON`.
|
|
8
|
+
* One exhaustively switchable shape, so the type system enforces the isolation
|
|
9
|
+
* boundary.
|
|
10
|
+
* 2. The authoring form, {@link PolicyInput} — the `policy: { by }` option a
|
|
11
|
+
* schema author writes. The name follows SQL row-level security, where a
|
|
12
|
+
* policy is the rule that decides which rows a tenant may read.
|
|
13
|
+
* {@link resolvePolicy} converts it to the canonical {@link Tenancy} when the
|
|
14
|
+
* model is built, so the authoring vocabulary never reaches the wire or any
|
|
15
|
+
* consumer.
|
|
17
16
|
*
|
|
18
|
-
*
|
|
19
|
-
* `
|
|
20
|
-
*
|
|
21
|
-
* (`orgScoped: false`) silently exposed a whole table cross-tenant. Collapsing
|
|
22
|
-
* them into a single discriminated union makes the opt-out (`{ by: 'none' }`) a
|
|
23
|
-
* loud, deliberate branch instead of a falsy flag — one concept, one name.
|
|
17
|
+
* Both forms discriminate on a single tag, which makes the opt-out from tenant
|
|
18
|
+
* scoping (`{ by: 'none' }`) an explicit, named branch rather than a falsy flag —
|
|
19
|
+
* important, because that branch makes an entire table readable across tenants.
|
|
24
20
|
*/
|
|
25
21
|
import { z } from 'zod';
|
|
26
|
-
/**
|
|
22
|
+
/** The default physical tenancy column. This is the single canonical definition of that column name. */
|
|
27
23
|
export const DEFAULT_ORG_COLUMN = 'organization_id';
|
|
28
24
|
/**
|
|
29
|
-
*
|
|
30
|
-
* column of their own
|
|
31
|
-
*
|
|
32
|
-
* `{ by: 'parent', fk, parent }`
|
|
33
|
-
* {@link resolvePolicy}.
|
|
25
|
+
* Scopes a table's rows through a parent table, for rows that carry no tenancy
|
|
26
|
+
* column of their own (for example, slide layers scoped through their slide, deck,
|
|
27
|
+
* and organization). This is the canonical `parent` payload; authors write the
|
|
28
|
+
* friendlier {@link PolicyInput} `{ by: 'parent', fk, parent }` form, which
|
|
29
|
+
* {@link resolvePolicy} normalizes into this.
|
|
34
30
|
*/
|
|
35
31
|
export const scopedViaRefSchema = z.object({
|
|
36
|
-
/** Column on
|
|
32
|
+
/** Column on this table that points at the parent (for example, `'team_id'`). */
|
|
37
33
|
localKey: z.string().min(1),
|
|
38
34
|
/** Parent table name (e.g. `'team'`). */
|
|
39
35
|
parentTable: z.string().min(1),
|
|
@@ -42,7 +38,7 @@ export const scopedViaRefSchema = z.object({
|
|
|
42
38
|
/** Column on the parent holding the tenant id. Default {@link DEFAULT_ORG_COLUMN}. */
|
|
43
39
|
parentOrgColumn: z.string().min(1).optional(),
|
|
44
40
|
});
|
|
45
|
-
/** How a model's rows are scoped to a tenant — the
|
|
41
|
+
/** How a model's rows are scoped to a tenant — the canonical, wire-facing form. */
|
|
46
42
|
export const tenancySchema = z.discriminatedUnion('kind', [
|
|
47
43
|
/** Row-local tenancy column (default name `organization_id`, overridable). */
|
|
48
44
|
z.object({ kind: z.literal('column'), column: z.string().min(1) }),
|
|
@@ -52,19 +48,19 @@ export const tenancySchema = z.discriminatedUnion('kind', [
|
|
|
52
48
|
z.object({ kind: z.literal('none') }),
|
|
53
49
|
]);
|
|
54
50
|
/**
|
|
55
|
-
* The
|
|
56
|
-
* `policy` option
|
|
57
|
-
*
|
|
58
|
-
* the three branches are mutually exclusive and the
|
|
51
|
+
* The authoring form of tenancy — what a schema author writes as the model's
|
|
52
|
+
* `policy` option. The name follows SQL row-level security, where a policy is the
|
|
53
|
+
* rule that decides which rows a tenant may read. It is a discriminated union on
|
|
54
|
+
* `by`, so the three branches are mutually exclusive and the opt-out
|
|
59
55
|
* (`{ by: 'none' }`) is an explicit, named choice rather than a falsy flag.
|
|
60
56
|
*
|
|
61
|
-
* - `{ by: 'column' }`
|
|
62
|
-
*
|
|
57
|
+
* - `{ by: 'column' }` — a row-local tenancy column (the default). `column`
|
|
58
|
+
* overrides the name (default {@link DEFAULT_ORG_COLUMN}).
|
|
63
59
|
* - `{ by: 'parent', fk, parent }` — inherit tenancy through a foreign key when
|
|
64
|
-
* this table has no tenancy column of its own. `parentKey` (default `'id'`)
|
|
65
|
-
*
|
|
66
|
-
* - `{ by: 'none' }`
|
|
67
|
-
*
|
|
60
|
+
* this table has no tenancy column of its own. `parentKey` (default `'id'`) and
|
|
61
|
+
* `parentTenantColumn` (default {@link DEFAULT_ORG_COLUMN}) are optional overrides.
|
|
62
|
+
* - `{ by: 'none' }` — genuinely global or reference data. This makes the whole
|
|
63
|
+
* table readable across tenants, so it is correct only for tables that have no tenant.
|
|
68
64
|
*/
|
|
69
65
|
export const policyInputSchema = z.discriminatedUnion('by', [
|
|
70
66
|
z.object({
|
|
@@ -74,7 +70,7 @@ export const policyInputSchema = z.discriminatedUnion('by', [
|
|
|
74
70
|
}),
|
|
75
71
|
z.object({
|
|
76
72
|
by: z.literal('parent'),
|
|
77
|
-
/** Column on
|
|
73
|
+
/** Column on this table that points at the parent (for example, `'slideId'`). */
|
|
78
74
|
fk: z.string().min(1),
|
|
79
75
|
/** Parent table name (e.g. `'slides'`). */
|
|
80
76
|
parent: z.string().min(1),
|
|
@@ -86,10 +82,10 @@ export const policyInputSchema = z.discriminatedUnion('by', [
|
|
|
86
82
|
z.object({ by: z.literal('none') }),
|
|
87
83
|
]);
|
|
88
84
|
/**
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
*
|
|
85
|
+
* Normalizes the authoring {@link PolicyInput} into the canonical {@link Tenancy}.
|
|
86
|
+
* Called once, when the model is built, so that `ModelDef`, `ModelJSON`, and every
|
|
87
|
+
* consumer see only the canonical union. Omitting `policy` defaults to a row-local
|
|
88
|
+
* `organization_id` column.
|
|
93
89
|
*/
|
|
94
90
|
export function resolvePolicy(input) {
|
|
95
91
|
if (!input)
|
|
@@ -112,12 +108,14 @@ export function resolvePolicy(input) {
|
|
|
112
108
|
}
|
|
113
109
|
}
|
|
114
110
|
/**
|
|
115
|
-
*
|
|
116
|
-
* `ModelJSON`), defaulting to a row-local `organization_id` column when
|
|
111
|
+
* Reads the canonical {@link Tenancy} off an already-built model definition (or a
|
|
112
|
+
* parsed `ModelJSON`), defaulting to a row-local `organization_id` column when it is
|
|
113
|
+
* absent.
|
|
117
114
|
*
|
|
118
|
-
* This is the
|
|
119
|
-
* DDL, CLI
|
|
120
|
-
* each
|
|
115
|
+
* This is the read-side helper. Consumers — provisioning and row-level security, the
|
|
116
|
+
* membership resolver, DDL generation, and the CLI — call it to get a model's
|
|
117
|
+
* tenancy without re-deriving the default each time. It is not the authoring
|
|
118
|
+
* normalizer; that is {@link resolvePolicy}.
|
|
121
119
|
*/
|
|
122
120
|
export function resolveTenancy(def) {
|
|
123
121
|
return def.tenancy ?? { kind: 'column', column: DEFAULT_ORG_COLUMN };
|
package/dist/server/adapter.d.ts
CHANGED
|
@@ -1,39 +1,39 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `@abloatai/ablo/server` — the DataAdapter
|
|
2
|
+
* `@abloatai/ablo/server` — the `DataAdapter` storage contract.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* browser-shippable package.
|
|
4
|
+
* A `DataAdapter` is the boundary between the sync engine and a database. The
|
|
5
|
+
* engine asks it to do three things — `read` canonical rows, `commit` a change,
|
|
6
|
+
* and `sync` the change log — and expects nothing beyond that. Everything
|
|
7
|
+
* higher up, such as proposing a change or resolving a conflict, is handled
|
|
8
|
+
* before the adapter is ever called.
|
|
10
9
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
10
|
+
* This module declares the contract and the value types that travel through it;
|
|
11
|
+
* you supply the implementation for your own database. The reference Postgres
|
|
12
|
+
* implementation ships separately, because it carries a SQL driver and raw
|
|
13
|
+
* queries that have no place in this browser-safe build.
|
|
14
|
+
*
|
|
15
|
+
* Every shape here builds on {@link Row}, the single canonical form of a
|
|
16
|
+
* database row that the rest of the engine reads and writes.
|
|
18
17
|
*/
|
|
19
18
|
import type { SourceListQuery, SourceOperation, SourceRequestContext } from '../source/index.js';
|
|
20
|
-
import type { ServerSyncDelta } from '../
|
|
21
|
-
import type { BootstrapModel } from './
|
|
19
|
+
import type { ServerSyncDelta } from '../wire/delta.js';
|
|
20
|
+
import type { BootstrapModel } from './readConfig.js';
|
|
22
21
|
import type { CommitContext, CommitResult } from './commit.js';
|
|
23
|
-
import type { StorageMode } from './
|
|
22
|
+
import type { StorageMode } from './storageMode.js';
|
|
24
23
|
/**
|
|
25
|
-
* A canonical row
|
|
26
|
-
* `unknown
|
|
27
|
-
* driver
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
24
|
+
* A canonical database row: one record, keyed by column name. The value type is
|
|
25
|
+
* `unknown` by design, not `any` — columns arrive as JSON or in whatever form
|
|
26
|
+
* the driver hands back, so a caller must narrow a value before using it. Reach
|
|
27
|
+
* for this type wherever a row is passed around; it is the one name for that
|
|
28
|
+
* shape, and a later schema-typed `read<T>()` can specialize it to a concrete
|
|
29
|
+
* model without changing any call site.
|
|
31
30
|
*/
|
|
32
31
|
export type Row = Record<string, unknown>;
|
|
33
32
|
/**
|
|
34
|
-
* The result of a {@link Row} read.
|
|
35
|
-
*
|
|
36
|
-
* - `
|
|
33
|
+
* The result of a {@link Row} read. Its two shapes mirror the two kinds of
|
|
34
|
+
* {@link ReadRequest}:
|
|
35
|
+
* - `bootstrap`: a full load, returned as a map from model name to its rows.
|
|
36
|
+
* - `query`: the rows of a single filtered query.
|
|
37
37
|
*/
|
|
38
38
|
export type ReadResult = {
|
|
39
39
|
readonly kind: 'bootstrap';
|
|
@@ -46,11 +46,12 @@ export type ReadResult = {
|
|
|
46
46
|
readonly rows: readonly Row[];
|
|
47
47
|
};
|
|
48
48
|
/**
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
49
|
+
* Where a `sync` call resumes: the client's last-seen position in the
|
|
50
|
+
* `sync_deltas` change log. The cursor carries only that position. Everything
|
|
51
|
+
* else a sync needs — the organization, the sync groups, the largest gap it
|
|
52
|
+
* will stream — is bound onto the adapter when it is resolved, so a client can
|
|
53
|
+
* never ask to read an organization other than its own. A `lastSyncId` of zero
|
|
54
|
+
* or less means "no position yet", which `sync` answers with `needsFullRead`.
|
|
54
55
|
*/
|
|
55
56
|
export interface SyncCursor {
|
|
56
57
|
readonly lastSyncId: number;
|
|
@@ -76,14 +77,16 @@ export interface ProposalResult {
|
|
|
76
77
|
readonly rows?: readonly Row[];
|
|
77
78
|
}
|
|
78
79
|
/**
|
|
79
|
-
* A request for canonical rows
|
|
80
|
-
* - `bootstrap`: the full-load reader —
|
|
81
|
-
* - `query`: a single filtered model
|
|
80
|
+
* A request for canonical rows, in one of two shapes:
|
|
81
|
+
* - `bootstrap`: the full-load reader — every enabled model's rows at once.
|
|
82
|
+
* - `query`: a single filtered query against one model, used by the live
|
|
83
|
+
* `/sync/query` path.
|
|
82
84
|
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
85
|
+
* A `query` carries its own execution as the `runHosted` closure, the same way
|
|
86
|
+
* a {@link ChangeSet} carries its write. This lets the adapter decide how to
|
|
87
|
+
* answer the request — a data source runs the customer's `list`, a hosted
|
|
88
|
+
* database runs the closure — without the query engine itself having to live
|
|
89
|
+
* inside the adapter.
|
|
87
90
|
*/
|
|
88
91
|
export type ReadRequest = {
|
|
89
92
|
readonly kind: 'bootstrap';
|
|
@@ -99,16 +102,15 @@ export type ReadRequest = {
|
|
|
99
102
|
readonly typename: string;
|
|
100
103
|
readonly query: SourceListQuery;
|
|
101
104
|
readonly scope?: SourceRequestContext;
|
|
102
|
-
/**
|
|
105
|
+
/** Runs the query against a hosted database: compile, take the tenant pool, apply row-level security, unpack the rows. */
|
|
103
106
|
readonly runHosted: () => Promise<Row[]>;
|
|
104
107
|
};
|
|
105
108
|
/**
|
|
106
|
-
* A change to apply to the canonical store. `runHosted`
|
|
107
|
-
*
|
|
108
|
-
*
|
|
109
|
-
* adapter
|
|
110
|
-
*
|
|
111
|
-
* logic stays host-side.
|
|
109
|
+
* A change to apply to the canonical store. `runHosted` holds the write already
|
|
110
|
+
* bound to its execution: a hosted adapter simply runs it, while a data-source
|
|
111
|
+
* adapter ignores it and ships the operations to the customer's own endpoint.
|
|
112
|
+
* The adapter therefore decides how a change is applied, while the write logic
|
|
113
|
+
* itself is prepared above it.
|
|
112
114
|
*/
|
|
113
115
|
export interface ChangeSet {
|
|
114
116
|
readonly operations: readonly SourceOperation[];
|
|
@@ -126,30 +128,28 @@ export interface SyncResult {
|
|
|
126
128
|
readonly needsFullRead: boolean;
|
|
127
129
|
}
|
|
128
130
|
/**
|
|
129
|
-
* The
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
* required method.
|
|
131
|
+
* The interface every storage mode implements. The package defines the
|
|
132
|
+
* contract; you implement it against your own database. An adapter is
|
|
133
|
+
* responsible for one thing — reaching the data — and offers exactly three
|
|
134
|
+
* methods to do it: `read` fetches canonical rows, `commit` applies a change,
|
|
135
|
+
* and `sync` reads the change log. Anything above that line, such as proposing
|
|
136
|
+
* a change or resolving a conflict, happens before the adapter is called.
|
|
137
|
+
* `propose` is an optional capability, not a required method.
|
|
137
138
|
*/
|
|
138
139
|
export interface DataAdapter {
|
|
139
|
-
/**
|
|
140
|
-
*
|
|
140
|
+
/** Names the adapter's storage mode, for diagnostics. Routing is decided by
|
|
141
|
+
* the resolver, not by reading this field. */
|
|
141
142
|
readonly mode: StorageMode;
|
|
142
143
|
readonly capabilities: DataAdapterCapabilities;
|
|
143
144
|
read(req: ReadRequest): Promise<ReadResult>;
|
|
144
145
|
commit(change: ChangeSet): Promise<CommitResult>;
|
|
145
146
|
sync(cursor: SyncCursor): Promise<SyncResult>;
|
|
146
147
|
}
|
|
147
|
-
/**
|
|
148
|
+
/** A `DataAdapter` whose backend can dry-run a change. Narrow to this only after confirming the `propose` capability. */
|
|
148
149
|
export interface ProposableDataAdapter extends DataAdapter {
|
|
149
150
|
propose(change: ChangeSet): Promise<ProposalResult>;
|
|
150
151
|
}
|
|
151
|
-
/** Resolves an authenticated scope to the adapter that serves it
|
|
152
|
-
* `createAdapter` factory seam). */
|
|
152
|
+
/** Resolves an authenticated scope to the adapter that serves it. */
|
|
153
153
|
export type AdapterResolver = (scope: {
|
|
154
154
|
readonly projectId: string;
|
|
155
155
|
readonly accountScope?: string;
|
package/dist/server/adapter.js
CHANGED
|
@@ -1,19 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `@abloatai/ablo/server` — the DataAdapter
|
|
2
|
+
* `@abloatai/ablo/server` — the `DataAdapter` storage contract.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* browser-shippable package.
|
|
4
|
+
* A `DataAdapter` is the boundary between the sync engine and a database. The
|
|
5
|
+
* engine asks it to do three things — `read` canonical rows, `commit` a change,
|
|
6
|
+
* and `sync` the change log — and expects nothing beyond that. Everything
|
|
7
|
+
* higher up, such as proposing a change or resolving a conflict, is handled
|
|
8
|
+
* before the adapter is ever called.
|
|
10
9
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
10
|
+
* This module declares the contract and the value types that travel through it;
|
|
11
|
+
* you supply the implementation for your own database. The reference Postgres
|
|
12
|
+
* implementation ships separately, because it carries a SQL driver and raw
|
|
13
|
+
* queries that have no place in this browser-safe build.
|
|
14
|
+
*
|
|
15
|
+
* Every shape here builds on {@link Row}, the single canonical form of a
|
|
16
|
+
* database row that the rest of the engine reads and writes.
|
|
18
17
|
*/
|
|
19
18
|
export {};
|