@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/server/commit.d.ts
CHANGED
|
@@ -1,126 +1,122 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* The commit contract types for the sync engine's server surface.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* are
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
4
|
+
* {@link CommitContext} is the attribution envelope stamped onto every delta a
|
|
5
|
+
* commit produces; {@link CommitResult} is the receipt returned when the commit
|
|
6
|
+
* finishes. Both are plain data descriptors — no database driver, no SQL, no
|
|
7
|
+
* functions — so they belong to this package's public contract, which your commit
|
|
8
|
+
* implementation reads and writes. They feed the `ChangeSet` and `DataAdapter`
|
|
9
|
+
* contracts defined alongside them.
|
|
10
10
|
*
|
|
11
|
-
* The attribution fields reuse the
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
11
|
+
* The attribution fields reuse the shared {@link ParticipantKind},
|
|
12
|
+
* {@link ConfirmationState}, and {@link ParticipantRef} types, so the shape at
|
|
13
|
+
* commit time and the shape of a stored or broadcast delta share one definition
|
|
14
|
+
* rather than being kept in step by hand.
|
|
15
15
|
*/
|
|
16
|
-
import type { ParticipantKind, ConfirmationState } from '../schema/
|
|
17
|
-
import type { ParticipantRef } from '../
|
|
16
|
+
import type { ParticipantKind, ConfirmationState } from '../schema/syncDeltaRow.js';
|
|
17
|
+
import type { ParticipantRef } from '../wire/delta.js';
|
|
18
18
|
import type { Environment } from '../environment.js';
|
|
19
19
|
import type { StaleNotification, ReadDependency } from '../coordination/schema.js';
|
|
20
20
|
export interface CommitContext {
|
|
21
21
|
participantId: string;
|
|
22
22
|
/**
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* convention.
|
|
23
|
+
* The kind of participant making the commit. Required, so that every delta carries
|
|
24
|
+
* structured attribution rather than a string-prefix convention.
|
|
26
25
|
*/
|
|
27
26
|
participantKind: ParticipantKind;
|
|
28
27
|
organizationId: string;
|
|
29
28
|
/**
|
|
30
|
-
*
|
|
31
|
-
*
|
|
29
|
+
* Project scope used to route source-mode storage. When omitted, the commit
|
|
30
|
+
* targets the organization's default project.
|
|
32
31
|
*/
|
|
33
32
|
projectId?: string;
|
|
34
33
|
/** Optional external account scope forwarded to storage resolvers. */
|
|
35
34
|
accountScope?: string;
|
|
36
35
|
/**
|
|
37
|
-
*
|
|
38
|
-
* customer handlers so sandbox and production traffic can
|
|
36
|
+
* The environment this commit runs in. Source-mode adapters forward it to the
|
|
37
|
+
* customer's handlers so that sandbox and production traffic can reach distinct
|
|
39
38
|
* customer-owned stores.
|
|
40
39
|
*/
|
|
41
40
|
environment?: Environment;
|
|
42
41
|
/**
|
|
43
|
-
* The participant
|
|
44
|
-
* capability token
|
|
45
|
-
* out to
|
|
46
|
-
* default `org:X`
|
|
47
|
-
*
|
|
42
|
+
* The sync groups this participant subscribes to, taken from the connection
|
|
43
|
+
* upgrade or the capability token. Each is appended to every delta's `sync_groups`
|
|
44
|
+
* so that writes fan out to subscribers of entity-level groups (such as
|
|
45
|
+
* `deck:abc`), not only the default `org:X` and `user:Y` groups. When omitted, the
|
|
46
|
+
* commit fans out to just the organization and user groups.
|
|
48
47
|
*/
|
|
49
48
|
syncGroups?: readonly string[];
|
|
50
49
|
/**
|
|
51
|
-
*
|
|
52
|
-
*
|
|
50
|
+
* When true, the commit does not add `org:<organizationId>` to a delta's sync
|
|
51
|
+
* groups. Set this for sandbox writes, so that live organization subscribers do
|
|
52
|
+
* not receive test-environment changes.
|
|
53
53
|
*/
|
|
54
54
|
omitOrgSyncGroup?: boolean;
|
|
55
55
|
/**
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
56
|
+
* The participant on whose authority the actor acted. For a direct human commit
|
|
57
|
+
* this equals the actor; for an agent commit it is the human at the root of the
|
|
58
|
+
* capability's delegation chain. Null for `system` principals.
|
|
59
59
|
*/
|
|
60
60
|
onBehalfOf?: ParticipantRef | null;
|
|
61
61
|
/**
|
|
62
|
-
*
|
|
63
|
-
*
|
|
62
|
+
* The id of the scoped credential that authorized the commit. Non-null for agent
|
|
63
|
+
* and system commits when that credential is known; null for direct human commits.
|
|
64
64
|
*/
|
|
65
65
|
capabilityId?: string | null;
|
|
66
66
|
/**
|
|
67
|
-
*
|
|
68
|
-
* on `sync_deltas` so audit triggers
|
|
69
|
-
*
|
|
67
|
+
* The id of the human user at the root of the delegated-authority chain. Stored
|
|
68
|
+
* directly on `sync_deltas` so that audit triggers appending the hash chain never
|
|
69
|
+
* need to join mutable credential tables.
|
|
70
70
|
*/
|
|
71
71
|
delegationChainRootUserId?: string | null;
|
|
72
72
|
/**
|
|
73
|
-
*
|
|
74
|
-
* idempotency cache and usage attribution. Null for session
|
|
73
|
+
* The id of the API key row when the caller authenticated with an API key. Used by
|
|
74
|
+
* the idempotency cache and for usage attribution. Null for session and capability
|
|
75
75
|
* callers.
|
|
76
76
|
*/
|
|
77
77
|
apiKeyId?: string | null;
|
|
78
78
|
/**
|
|
79
|
-
* Whether
|
|
80
|
-
*
|
|
79
|
+
* Whether a human explicitly approved the change. Defaults to `auto` when the
|
|
80
|
+
* caller does not specify an approval state.
|
|
81
81
|
*/
|
|
82
82
|
confirmationState?: ConfirmationState;
|
|
83
83
|
/**
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
* `caused_by_task_id` when present, but client writes leave it `null`.
|
|
84
|
+
* Optional foreign key to the task that caused the change, written to the
|
|
85
|
+
* `caused_by_task_id` column when present. Validated when set; clients typically
|
|
86
|
+
* leave it null and let attribution ride on the actor and capability instead.
|
|
88
87
|
*/
|
|
89
88
|
causedByTaskId?: string | null;
|
|
90
89
|
/**
|
|
91
|
-
*
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
* validates the rows being
|
|
90
|
+
* Read dependencies for the whole batch. The committer declares the rows or groups
|
|
91
|
+
* it read to form this batch; the engine checks that none of them changed since
|
|
92
|
+
* each entry's `readAt` timestamp and applies that entry's `onStale` disposition
|
|
93
|
+
* across the batch. This differs from the per-operation `readAt` guard, which
|
|
94
|
+
* validates only the rows being written. Omit it to check the write targets alone.
|
|
96
95
|
*/
|
|
97
96
|
reads?: ReadDependency[] | null;
|
|
98
97
|
}
|
|
99
98
|
/**
|
|
100
|
-
* The receipt
|
|
101
|
-
* produced, so a caller can broadcast just
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
* deltas (empty ops / all no-ops).
|
|
99
|
+
* The receipt returned when a commit finishes. It pins the exact range of
|
|
100
|
+
* `sync_deltas` ids the batch produced, so a caller can broadcast just this batch's
|
|
101
|
+
* deltas without racing concurrent commits that hold adjacent ids. `firstSyncId` is
|
|
102
|
+
* 0 when the batch produced no deltas (no operations, or all of them were no-ops).
|
|
105
103
|
*/
|
|
106
104
|
export interface CommitResult {
|
|
107
105
|
lastSyncId: number;
|
|
108
106
|
firstSyncId: number;
|
|
109
107
|
/**
|
|
110
|
-
* Stale-context notifications for
|
|
111
|
-
* `onStale: 'notify'
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
* `StaleNotification` in `coordination/schema.ts`.
|
|
108
|
+
* Stale-context notifications for operations the committer guarded with
|
|
109
|
+
* `onStale: 'notify'`. Non-empty only when a guarded write collided with a
|
|
110
|
+
* concurrent change; the committer heals from these instead of receiving an
|
|
111
|
+
* `AbloStaleContextError`. See {@link StaleNotification}.
|
|
115
112
|
*/
|
|
116
113
|
notifications?: StaleNotification[];
|
|
117
114
|
/**
|
|
118
|
-
* Ids of
|
|
119
|
-
*
|
|
120
|
-
*
|
|
121
|
-
*
|
|
122
|
-
*
|
|
123
|
-
* its own target id against this set without ambiguity.
|
|
115
|
+
* Ids of update or delete targets that matched no rows — the row does not exist, or
|
|
116
|
+
* lies outside the caller's organization. Surfacing them here lets a client turn a
|
|
117
|
+
* silent no-op into an `AbloNotFoundError`. Non-empty only when at least one
|
|
118
|
+
* operation missed. The ids are globally unique, so a caller can match its own
|
|
119
|
+
* target id against this set without ambiguity.
|
|
124
120
|
*/
|
|
125
121
|
missingIds?: string[];
|
|
126
122
|
}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* stay in the host — only the portable, driver-free pieces live here.
|
|
2
|
+
* The server-side entry point of the sync engine. It re-exports the contract types
|
|
3
|
+
* you implement a storage backend against: the {@link DataAdapter} and its
|
|
4
|
+
* vocabulary ({@link Row}, {@link ReadRequest}, {@link ChangeSet}, and the rest),
|
|
5
|
+
* the {@link CommitContext} and {@link CommitResult} commit types, the
|
|
6
|
+
* {@link StorageMode} enumeration, and the per-model read configuration
|
|
7
|
+
* ({@link BootstrapModel}, {@link ColumnOverride}). These are plain, driver-free
|
|
8
|
+
* types; you supply the database code that fulfills them.
|
|
10
9
|
*/
|
|
11
10
|
export type { Row, ReadResult, SyncCursor, DataAdapterCapabilities, ProposalResult, ReadRequest, ChangeSet, SyncResult, DataAdapter, ProposableDataAdapter, AdapterResolver, } from './adapter.js';
|
|
12
11
|
export type { CommitContext, CommitResult } from './commit.js';
|
|
13
|
-
export { storageModeSchema, type StorageMode } from './
|
|
14
|
-
export type { ColumnOverride, BootstrapModel } from './
|
|
12
|
+
export { storageModeSchema, type StorageMode } from './storageMode.js';
|
|
13
|
+
export type { ColumnOverride, BootstrapModel } from './readConfig.js';
|
package/dist/server/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { storageModeSchema } from './
|
|
1
|
+
export { storageModeSchema } from './storageMode.js';
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-model read configuration consumed when a client bootstraps. Each
|
|
3
|
+
* {@link BootstrapModel} maps a model to its physical table, its tenancy column, and
|
|
4
|
+
* any parent scoping — plain data with no database driver. It feeds the read side of
|
|
5
|
+
* the data adapter contract; your query builder reads it to load a model's initial
|
|
6
|
+
* rows.
|
|
7
|
+
*/
|
|
8
|
+
/** A mapping from a declared field to a physical column, with the alias to apply after a `SELECT *`. */
|
|
9
|
+
export interface ColumnOverride {
|
|
10
|
+
readonly field: string;
|
|
11
|
+
readonly column: string;
|
|
12
|
+
readonly alias: string;
|
|
13
|
+
}
|
|
14
|
+
/** Read configuration for one model: how to locate its rows and scope them to a tenant. */
|
|
15
|
+
export interface BootstrapModel {
|
|
16
|
+
name: string;
|
|
17
|
+
/**
|
|
18
|
+
* Extra names accepted when a request looks up or filters this model. When the
|
|
19
|
+
* physical table name is canonical, `name` stays that table name and the aliases
|
|
20
|
+
* cover generated compatibility names such as `WeatherReports` or `weatherReports`.
|
|
21
|
+
*/
|
|
22
|
+
aliases?: readonly string[];
|
|
23
|
+
/**
|
|
24
|
+
* The schema key used by source endpoints. `name` stays the wire and result model
|
|
25
|
+
* name (usually the typename), while source handlers are keyed by the developer's
|
|
26
|
+
* schema key, such as `files` or `slideLayers`.
|
|
27
|
+
*/
|
|
28
|
+
sourceModel?: string;
|
|
29
|
+
table: string;
|
|
30
|
+
syncGroups?: string[];
|
|
31
|
+
enabled?: boolean;
|
|
32
|
+
/** Max rows to return. Omit for unlimited. Maps to schema's bootstrapLimit. */
|
|
33
|
+
limit?: number;
|
|
34
|
+
/** SQL ORDER BY clause. Default: 'id'. Maps to schema's bootstrapOrderBy. */
|
|
35
|
+
orderBy?: string;
|
|
36
|
+
/** Whether the table has organization_id. Default: true. */
|
|
37
|
+
orgScoped?: boolean;
|
|
38
|
+
/** Physical tenancy column (default `organization_id`, configurable per model). */
|
|
39
|
+
orgColumn?: string;
|
|
40
|
+
/**
|
|
41
|
+
* Parent-table scoping for rows that have no `organization_id` column, mirroring
|
|
42
|
+
* the schema's `scopedVia` option. When set, the bootstrap query adds:
|
|
43
|
+
*
|
|
44
|
+
* WHERE <table>.<localKey> IN
|
|
45
|
+
* (SELECT <parentKey> FROM <parentTable> WHERE <parentOrgColumn> = $1)
|
|
46
|
+
*
|
|
47
|
+
* This applies on top of whatever `orgScoped` dictates, so a table can carry its
|
|
48
|
+
* own `organization_id` and still narrow through a parent. The common case,
|
|
49
|
+
* though, is `orgScoped: false` together with `scopedVia` on a table that lacks the
|
|
50
|
+
* column.
|
|
51
|
+
*/
|
|
52
|
+
scopedVia?: {
|
|
53
|
+
localKey: string;
|
|
54
|
+
parentTable: string;
|
|
55
|
+
parentKey?: string;
|
|
56
|
+
parentOrgColumn?: string;
|
|
57
|
+
};
|
|
58
|
+
/** Client-facing field name → physical DB column for declared fields. */
|
|
59
|
+
fieldColumns?: Record<string, string>;
|
|
60
|
+
/** Physical-column aliases needed after SELECT * for `.from(...)` fields. */
|
|
61
|
+
columnOverrides?: readonly ColumnOverride[];
|
|
62
|
+
/**
|
|
63
|
+
* Physical columns the schema declares as JSON (via `field.json()`). A JSON field
|
|
64
|
+
* stored in a text column comes back from `row_to_json` as a serialized string, so
|
|
65
|
+
* the bootstrap reparses these columns to make the wire value the canonical object
|
|
66
|
+
* regardless of the physical column type. A `jsonb` column already returns an
|
|
67
|
+
* object, so reparsing it is a no-op.
|
|
68
|
+
*/
|
|
69
|
+
jsonColumns?: readonly string[];
|
|
70
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-model read configuration consumed when a client bootstraps. Each
|
|
3
|
+
* {@link BootstrapModel} maps a model to its physical table, its tenancy column, and
|
|
4
|
+
* any parent scoping — plain data with no database driver. It feeds the read side of
|
|
5
|
+
* the data adapter contract; your query builder reads it to load a model's initial
|
|
6
|
+
* rows.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The set of storage modes a `DataAdapter` can run in. An adapter carries one of
|
|
3
|
+
* these as a label for diagnostics; it does not decide routing, which the adapter
|
|
4
|
+
* resolver handles separately. The package defines the enum so that the contract
|
|
5
|
+
* and every adapter agree on the same closed set of values:
|
|
6
|
+
*
|
|
7
|
+
* - `hosted` — a database this engine operates on the caller's behalf.
|
|
8
|
+
* - `selfHosted` — the caller's own database, reached through the same execution
|
|
9
|
+
* path as `hosted`.
|
|
10
|
+
* - `source` — a caller-owned endpoint that accepts changes over HTTP without
|
|
11
|
+
* database credentials.
|
|
12
|
+
*
|
|
13
|
+
* These names describe where the data lives, not anything an end user sees.
|
|
14
|
+
*/
|
|
15
|
+
import { z } from 'zod';
|
|
16
|
+
/** Runtime validator for the storage-mode values; {@link StorageMode} is its inferred type. */
|
|
17
|
+
export declare const storageModeSchema: z.ZodEnum<{
|
|
18
|
+
source: "source";
|
|
19
|
+
hosted: "hosted";
|
|
20
|
+
selfHosted: "selfHosted";
|
|
21
|
+
}>;
|
|
22
|
+
/** The storage mode an adapter runs in — one of the values described in the module overview. */
|
|
23
|
+
export type StorageMode = z.infer<typeof storageModeSchema>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The set of storage modes a `DataAdapter` can run in. An adapter carries one of
|
|
3
|
+
* these as a label for diagnostics; it does not decide routing, which the adapter
|
|
4
|
+
* resolver handles separately. The package defines the enum so that the contract
|
|
5
|
+
* and every adapter agree on the same closed set of values:
|
|
6
|
+
*
|
|
7
|
+
* - `hosted` — a database this engine operates on the caller's behalf.
|
|
8
|
+
* - `selfHosted` — the caller's own database, reached through the same execution
|
|
9
|
+
* path as `hosted`.
|
|
10
|
+
* - `source` — a caller-owned endpoint that accepts changes over HTTP without
|
|
11
|
+
* database credentials.
|
|
12
|
+
*
|
|
13
|
+
* These names describe where the data lives, not anything an end user sees.
|
|
14
|
+
*/
|
|
15
|
+
import { z } from 'zod';
|
|
16
|
+
/** Runtime validator for the storage-mode values; {@link StorageMode} is its inferred type. */
|
|
17
|
+
export const storageModeSchema = z.enum(['hosted', 'source', 'selfHosted']);
|
package/dist/source/adapter.d.ts
CHANGED
|
@@ -1,32 +1,33 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The
|
|
3
|
-
*
|
|
2
|
+
* The interface every data-source backend implements, together with the bridge
|
|
3
|
+
* that wires an implementation into the `dataSource()` HTTP handler. This package
|
|
4
|
+
* defines the contract and ships adapters for three object-relational mappers —
|
|
5
|
+
* {@link prismaDataSource}, {@link drizzleDataSource}, and {@link kyselyDataSource} —
|
|
6
|
+
* each verified by the shared conformance suite. You can also write your own.
|
|
4
7
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* correct via the shared conformance suite. The adapter owns reading and writing
|
|
8
|
-
* the database, plus the transactional outbox and idempotency, so a customer never
|
|
9
|
-
* hand-writes them:
|
|
8
|
+
* An adapter reads and writes your database, and it owns the transactional outbox
|
|
9
|
+
* and idempotency bookkeeping as well, so you never write those by hand:
|
|
10
10
|
*
|
|
11
11
|
* export const POST = dataSource({
|
|
12
12
|
* schema, apiKey: process.env.ABLO_API_KEY!,
|
|
13
13
|
* ...sourceHandlersFromAdapter(prismaDataSource(prisma, schema), schema),
|
|
14
14
|
* });
|
|
15
15
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
16
|
+
* `sourceHandlersFromAdapter` is the bridge: it turns a single adapter into the
|
|
17
|
+
* handler's `commit`, `events`, and per-model `load` and `list` operations, so no
|
|
18
|
+
* code above the adapter needs to know which mapper you chose.
|
|
19
19
|
*/
|
|
20
20
|
import type { SourceListQuery, SourceRequestContext } from './types.js';
|
|
21
21
|
import type { AdapterCapabilities, ChangeSet, EventsPage, Migration } from './contract.js';
|
|
22
22
|
/**
|
|
23
|
-
* A
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
23
|
+
* A single row keyed by the schema's field names (for example `operatorId`), not
|
|
24
|
+
* by physical column names. Each adapter is the boundary that translates between
|
|
25
|
+
* the two, mapping a field name to whatever the underlying database column is
|
|
26
|
+
* called. Values are typed as `unknown`, so a caller must narrow a value before
|
|
27
|
+
* using it.
|
|
27
28
|
*/
|
|
28
29
|
export type Row = Record<string, unknown>;
|
|
29
|
-
/** A read
|
|
30
|
+
/** A read request handed to an adapter: either a single-row load by id, or a filtered list. */
|
|
30
31
|
export type AdapterReadRequest = {
|
|
31
32
|
readonly kind: 'load';
|
|
32
33
|
readonly model: string;
|
|
@@ -38,28 +39,32 @@ export type AdapterReadRequest = {
|
|
|
38
39
|
readonly query?: SourceListQuery;
|
|
39
40
|
readonly scope?: SourceRequestContext;
|
|
40
41
|
};
|
|
42
|
+
/** What {@link DataSourceAdapter.commit} returns: the rows as they stand after the write. */
|
|
41
43
|
export interface AdapterCommitResult {
|
|
42
|
-
/**
|
|
44
|
+
/** The affected rows after the write. The change log is derived from these. */
|
|
43
45
|
readonly rows: readonly Row[];
|
|
44
46
|
}
|
|
45
47
|
/**
|
|
46
|
-
* The
|
|
47
|
-
* read and write
|
|
48
|
-
* `
|
|
48
|
+
* The interface an adapter implements to serve one data source. `read` and
|
|
49
|
+
* `commit` read from and write to your database, `events` reads the outbox that
|
|
50
|
+
* `commit` appends to, and `migrations` supplies the SQL that creates the adapter's
|
|
51
|
+
* own two tables. `capabilities` advertises which optional features the adapter
|
|
52
|
+
* supports.
|
|
49
53
|
*/
|
|
50
54
|
export interface DataSourceAdapter {
|
|
51
55
|
readonly capabilities: AdapterCapabilities;
|
|
52
|
-
/** The table-creation SQL the adapter
|
|
56
|
+
/** The table-creation SQL the adapter needs for its own tables, `ablo_idempotency` and `ablo_outbox`. */
|
|
53
57
|
migrations(): readonly Migration[];
|
|
54
|
-
/**
|
|
58
|
+
/** The rows matching a load or list request. */
|
|
55
59
|
read(req: AdapterReadRequest): Promise<readonly Row[]>;
|
|
56
60
|
/**
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
61
|
+
* Applies a change set in one transaction, keyed for idempotency by `clientTxId`.
|
|
62
|
+
* Replaying the same `clientTxId` returns the original rows without applying the
|
|
63
|
+
* change again. The matching `ablo_outbox` rows are written in the same
|
|
64
|
+
* transaction as the data rows, so the outbox can never drift from the data.
|
|
60
65
|
*/
|
|
61
66
|
commit(change: ChangeSet): Promise<AdapterCommitResult>;
|
|
62
|
-
/**
|
|
67
|
+
/** Reads outbox events after `cursor` (`null` starts from the beginning), up to `limit` events. */
|
|
63
68
|
events(cursor: string | null, limit: number): Promise<EventsPage>;
|
|
64
69
|
}
|
|
65
70
|
export type { AdapterCapabilities, ChangeSet, Migration, OutboxEvent, EventsPage } from './contract.js';
|
package/dist/source/adapter.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The
|
|
3
|
-
*
|
|
2
|
+
* The interface every data-source backend implements, together with the bridge
|
|
3
|
+
* that wires an implementation into the `dataSource()` HTTP handler. This package
|
|
4
|
+
* defines the contract and ships adapters for three object-relational mappers —
|
|
5
|
+
* {@link prismaDataSource}, {@link drizzleDataSource}, and {@link kyselyDataSource} —
|
|
6
|
+
* each verified by the shared conformance suite. You can also write your own.
|
|
4
7
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* correct via the shared conformance suite. The adapter owns reading and writing
|
|
8
|
-
* the database, plus the transactional outbox and idempotency, so a customer never
|
|
9
|
-
* hand-writes them:
|
|
8
|
+
* An adapter reads and writes your database, and it owns the transactional outbox
|
|
9
|
+
* and idempotency bookkeeping as well, so you never write those by hand:
|
|
10
10
|
*
|
|
11
11
|
* export const POST = dataSource({
|
|
12
12
|
* schema, apiKey: process.env.ABLO_API_KEY!,
|
|
13
13
|
* ...sourceHandlersFromAdapter(prismaDataSource(prisma, schema), schema),
|
|
14
14
|
* });
|
|
15
15
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
16
|
+
* `sourceHandlersFromAdapter` is the bridge: it turns a single adapter into the
|
|
17
|
+
* handler's `commit`, `events`, and per-model `load` and `list` operations, so no
|
|
18
|
+
* code above the adapter needs to know which mapper you chose.
|
|
19
19
|
*/
|
|
20
20
|
export {};
|
|
@@ -1,32 +1,37 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Drizzle
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* - `db.
|
|
6
|
-
*
|
|
2
|
+
* The Drizzle adapter for the data-source interface. It implements the same
|
|
3
|
+
* {@link DataSourceAdapter} contract as {@link prismaDataSource} and passes the
|
|
4
|
+
* same conformance suite, built against Drizzle's query API:
|
|
5
|
+
* - `db.transaction(async (tx) => …)` runs an interactive transaction that
|
|
6
|
+
* commits or rolls back as a unit.
|
|
7
|
+
* - `db.execute(sql`…`)` runs parameterized raw SQL; `sql.identifier()` safely
|
|
8
|
+
* quotes dynamic table and column names, and `sql`${value}`` parameterizes
|
|
9
|
+
* values.
|
|
7
10
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* field
|
|
11
|
-
*
|
|
11
|
+
* Table and column names come from your schema, not from a hand-written Drizzle
|
|
12
|
+
* table. Because this adapter issues raw SQL, it would otherwise bypass any
|
|
13
|
+
* field-to-column translation, so it derives every name from the same rule the
|
|
14
|
+
* table provisioner uses:
|
|
12
15
|
* table = `model.tableName ?? key`
|
|
13
|
-
* column = `fieldMeta.column ?? camelToSnake(field)` (
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* the physical columns it
|
|
16
|
+
* column = `fieldMeta.column ?? camelToSnake(field)` (plus the tenancy column)
|
|
17
|
+
* This keeps the tables `ablo migrate` creates (for example `operator_id`) and the
|
|
18
|
+
* columns this adapter reads and writes in agreement. You define the schema once
|
|
19
|
+
* and point the engine at your Postgres database. The adapter is the translation
|
|
20
|
+
* boundary: the rows it accepts and returns, and the outbox `data` it writes, are
|
|
21
|
+
* keyed by field name, while the physical columns it touches are snake_case.
|
|
19
22
|
*
|
|
20
|
-
*
|
|
21
|
-
* 1. Interactive `db.transaction`
|
|
22
|
-
* `neon-http` driver
|
|
23
|
-
* (WebSocket) or `pg
|
|
24
|
-
*
|
|
25
|
-
*
|
|
23
|
+
* Two things to know about drivers:
|
|
24
|
+
* 1. Interactive `db.transaction` needs a driver that supports it. Neon's
|
|
25
|
+
* `neon-http` driver is single-shot and does not, so use `neon-serverless`
|
|
26
|
+
* (over WebSocket) or `pg`; under `neon-http` the commit path throws at
|
|
27
|
+
* runtime.
|
|
28
|
+
* 2. The `db.execute` result shape is driver-specific — `postgres-js` returns an
|
|
29
|
+
* array-like row list, while `node-postgres` returns `{ rows }`. `rowsOf`
|
|
26
30
|
* normalizes both.
|
|
27
31
|
*
|
|
28
|
-
*
|
|
29
|
-
* adapter
|
|
32
|
+
* Every write goes through `sql` and `db.execute` rather than the fluent builder,
|
|
33
|
+
* which keeps the adapter one small, fully typed unit with no per-driver builder
|
|
34
|
+
* generics.
|
|
30
35
|
*/
|
|
31
36
|
import { type SQL } from 'drizzle-orm';
|
|
32
37
|
import type { DataSourceAdapter, Row } from '../adapter.js';
|