@abloatai/ablo 0.35.0 → 0.37.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/AGENTS.md +2 -2
- package/CHANGELOG.md +71 -1929
- package/NOTICE +2 -2
- package/README.md +23 -532
- package/assets/banner.png +0 -0
- package/dist/auth.d.ts +2 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +2 -0
- package/dist/auth.js.map +1 -0
- package/dist/client.d.ts +3 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +3 -0
- package/dist/client.js.map +1 -0
- package/dist/coordination.d.ts +2 -0
- package/dist/coordination.d.ts.map +1 -0
- package/dist/coordination.js +2 -0
- package/dist/coordination.js.map +1 -0
- package/dist/index.d.ts +3 -112
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -161
- package/dist/index.js.map +1 -0
- package/dist/react.d.ts +4 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +3 -0
- package/dist/react.js.map +1 -0
- package/dist/schema.d.ts +2 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +2 -0
- package/dist/schema.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -0
- package/dist/source-conformance.d.ts +2 -0
- package/dist/source-conformance.d.ts.map +1 -0
- package/dist/source-conformance.js +2 -0
- package/dist/source-conformance.js.map +1 -0
- package/dist/source-drizzle.d.ts +2 -0
- package/dist/source-drizzle.d.ts.map +1 -0
- package/dist/source-drizzle.js +2 -0
- package/dist/source-drizzle.js.map +1 -0
- package/dist/source-kysely.d.ts +2 -0
- package/dist/source-kysely.d.ts.map +1 -0
- package/dist/source-kysely.js +2 -0
- package/dist/source-kysely.js.map +1 -0
- package/dist/source-next.d.ts +2 -0
- package/dist/source-next.d.ts.map +1 -0
- package/dist/source-next.js +2 -0
- package/dist/source-next.js.map +1 -0
- package/dist/source.d.ts +2 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +2 -0
- package/dist/source.js.map +1 -0
- package/dist/wire.d.ts +2 -0
- package/dist/wire.d.ts.map +1 -0
- package/dist/wire.js +2 -0
- package/dist/wire.js.map +1 -0
- package/docs/agents.md +2 -2
- package/docs/api-keys.md +13 -12
- package/docs/api.md +15 -53
- package/docs/audit.md +4 -3
- package/docs/cli.md +11 -11
- package/docs/client-behavior.md +9 -9
- package/docs/concurrency-convention.md +28 -42
- package/docs/coordination.md +228 -86
- package/docs/data-sources.md +5 -5
- package/docs/debugging.md +34 -12
- package/docs/deployment.md +8 -8
- package/docs/examples/agent-human.md +4 -4
- package/docs/examples/ai-sdk-tool.md +1 -1
- package/docs/examples/existing-python-backend.md +15 -4
- package/docs/examples/nextjs.md +27 -6
- package/docs/examples/scoped-agent.md +3 -3
- package/docs/examples/server-agent.md +2 -2
- package/docs/groups.md +57 -3
- package/docs/guarantees.md +37 -10
- package/docs/how-it-works.md +32 -8
- package/docs/idempotency.md +6 -6
- package/docs/identity.md +24 -24
- package/docs/index.md +8 -8
- package/docs/integration-guide.md +38 -16
- package/docs/internal/README.md +18 -0
- package/docs/internal/agent-fleet-coordination-design.md +171 -0
- package/docs/internal/agent-orchestration.md +58 -0
- package/docs/internal/commit-identifiers.md +91 -0
- package/docs/internal/concurrency-open-decisions.md +37 -0
- package/docs/internal/data-source-reverse-channel.md +150 -0
- package/docs/internal/per-field-conflict-detection.md +165 -0
- package/docs/internal/postgres-replication.md +64 -0
- package/docs/internal/serializable-schema.md +119 -0
- package/docs/internal/structure.md +32 -0
- package/docs/mcp.md +9 -9
- package/docs/migration.md +37 -18
- package/docs/projects.md +1 -1
- package/docs/quickstart.md +2 -2
- package/docs/react.md +24 -13
- package/docs/schema-contract.md +3 -3
- package/docs/sessions.md +91 -37
- package/docs/webhooks.md +9 -9
- package/examples/README.md +2 -2
- package/examples/data-source/README.md +1 -1
- package/examples/data-source/ablo-driver.ts +1 -1
- package/examples/data-source/customer-server.ts +1 -1
- package/examples/data-source/run.ts +1 -1
- package/examples/data-source/schema.ts +1 -1
- package/examples/quickstart.ts +2 -2
- package/llms.txt +12 -12
- package/package.json +64 -174
- package/dist/BaseSyncedStore.d.ts +0 -823
- package/dist/BaseSyncedStore.js +0 -1955
- package/dist/Database.d.ts +0 -335
- package/dist/Database.js +0 -1500
- package/dist/InstanceCache.d.ts +0 -233
- package/dist/InstanceCache.js +0 -1164
- package/dist/LazyReferenceCollection.d.ts +0 -177
- package/dist/LazyReferenceCollection.js +0 -461
- package/dist/Model.d.ts +0 -444
- package/dist/Model.js +0 -909
- package/dist/ModelRegistry.d.ts +0 -221
- package/dist/ModelRegistry.js +0 -537
- package/dist/NetworkMonitor.d.ts +0 -26
- package/dist/NetworkMonitor.js +0 -77
- package/dist/RuntimeContext.d.ts +0 -52
- package/dist/RuntimeContext.js +0 -80
- package/dist/SyncClient.d.ts +0 -551
- package/dist/SyncClient.js +0 -2199
- package/dist/adapters/alwaysOnline.d.ts +0 -14
- package/dist/adapters/alwaysOnline.js +0 -17
- package/dist/adapters/inMemoryStorage.d.ts +0 -31
- package/dist/adapters/inMemoryStorage.js +0 -110
- package/dist/ai-sdk/coordinatedTool.d.ts +0 -120
- package/dist/ai-sdk/coordinatedTool.js +0 -134
- package/dist/ai-sdk/coordinationContext.d.ts +0 -46
- package/dist/ai-sdk/coordinationContext.js +0 -106
- package/dist/ai-sdk/index.d.ts +0 -121
- package/dist/ai-sdk/index.js +0 -121
- package/dist/ai-sdk/wrap.d.ts +0 -65
- package/dist/ai-sdk/wrap.js +0 -39
- package/dist/auth/index.d.ts +0 -1
- package/dist/auth/index.js +0 -8
- package/dist/batching/index.d.ts +0 -55
- package/dist/batching/index.js +0 -147
- package/dist/cli.cjs +0 -288600
- package/dist/client/Ablo.d.ts +0 -231
- package/dist/client/Ablo.js +0 -149
- package/dist/client/abloClient.d.ts +0 -309
- package/dist/client/abloClient.js +0 -13
- package/dist/client/clientPrelude.d.ts +0 -52
- package/dist/client/clientPrelude.js +0 -60
- package/dist/client/consoleLogger.d.ts +0 -35
- package/dist/client/consoleLogger.js +0 -44
- package/dist/client/coreClient.d.ts +0 -60
- package/dist/client/coreClient.js +0 -118
- package/dist/client/createInternalComponents.d.ts +0 -46
- package/dist/client/createInternalComponents.js +0 -92
- package/dist/client/createModelProxy.d.ts +0 -228
- package/dist/client/createModelProxy.js +0 -818
- package/dist/client/humans.d.ts +0 -48
- package/dist/client/humans.js +0 -52
- package/dist/client/modelRegistration.d.ts +0 -10
- package/dist/client/modelRegistration.js +0 -312
- package/dist/client/options.d.ts +0 -461
- package/dist/client/options.js +0 -7
- package/dist/client/reactiveEngine.d.ts +0 -48
- package/dist/client/reactiveEngine.js +0 -910
- package/dist/client/resourceTypes.d.ts +0 -12
- package/dist/client/resourceTypes.js +0 -10
- package/dist/client/schemaConfig.d.ts +0 -44
- package/dist/client/schemaConfig.js +0 -185
- package/dist/client/validateAbloOptions.d.ts +0 -42
- package/dist/client/validateAbloOptions.js +0 -43
- package/dist/client/wsMutationExecutor.d.ts +0 -27
- package/dist/client/wsMutationExecutor.js +0 -72
- package/dist/context.d.ts +0 -29
- package/dist/context.js +0 -58
- package/dist/coordination/ClaimLog.d.ts +0 -26
- package/dist/coordination/ClaimLog.js +0 -32
- package/dist/coordination/index.d.ts +0 -1
- package/dist/coordination/index.js +0 -8
- package/dist/core/DatabaseManager.d.ts +0 -105
- package/dist/core/DatabaseManager.js +0 -387
- package/dist/core/QueryProcessor.d.ts +0 -75
- package/dist/core/QueryProcessor.js +0 -255
- package/dist/core/QueryView.d.ts +0 -79
- package/dist/core/QueryView.js +0 -218
- package/dist/core/StoreManager.d.ts +0 -112
- package/dist/core/StoreManager.js +0 -302
- package/dist/core/ViewRegistry.d.ts +0 -20
- package/dist/core/ViewRegistry.js +0 -55
- package/dist/core/index.d.ts +0 -33
- package/dist/core/index.js +0 -48
- package/dist/core/openIDBWithTimeout.d.ts +0 -65
- package/dist/core/openIDBWithTimeout.js +0 -153
- package/dist/core/queryUtils.d.ts +0 -45
- package/dist/core/queryUtils.js +0 -69
- package/dist/core/storeContract.d.ts +0 -145
- package/dist/core/storeContract.js +0 -12
- package/dist/docs/catalog.d.ts +0 -72
- package/dist/docs/catalog.js +0 -227
- package/dist/docs/index.d.ts +0 -10
- package/dist/docs/index.js +0 -10
- package/dist/environment.d.ts +0 -1
- package/dist/environment.js +0 -8
- package/dist/interfaces/index.d.ts +0 -311
- package/dist/interfaces/index.js +0 -9
- package/dist/keys/index.d.ts +0 -1
- package/dist/keys/index.js +0 -8
- package/dist/mutators/RecordingMutation.d.ts +0 -36
- package/dist/mutators/RecordingMutation.js +0 -182
- package/dist/mutators/Transaction.d.ts +0 -40
- package/dist/mutators/Transaction.js +0 -58
- package/dist/mutators/UndoManager.d.ts +0 -258
- package/dist/mutators/UndoManager.js +0 -658
- package/dist/mutators/defineMutators.d.ts +0 -60
- package/dist/mutators/defineMutators.js +0 -18
- package/dist/mutators/inverseOp.d.ts +0 -126
- package/dist/mutators/inverseOp.js +0 -71
- package/dist/mutators/mutateActions.d.ts +0 -45
- package/dist/mutators/mutateActions.js +0 -105
- package/dist/mutators/readerActions.d.ts +0 -33
- package/dist/mutators/readerActions.js +0 -57
- package/dist/mutators/undoApply.d.ts +0 -51
- package/dist/mutators/undoApply.js +0 -117
- package/dist/policy/index.d.ts +0 -21
- package/dist/policy/index.js +0 -20
- package/dist/query/client.d.ts +0 -61
- package/dist/query/client.js +0 -137
- package/dist/query/types.d.ts +0 -85
- package/dist/query/types.js +0 -16
- package/dist/react/AbloProvider.d.ts +0 -230
- package/dist/react/AbloProvider.js +0 -455
- package/dist/react/ClientSideSuspense.d.ts +0 -36
- package/dist/react/ClientSideSuspense.js +0 -17
- package/dist/react/DefaultFallback.d.ts +0 -24
- package/dist/react/DefaultFallback.js +0 -43
- package/dist/react/context.d.ts +0 -55
- package/dist/react/context.js +0 -29
- package/dist/react/index.d.ts +0 -61
- package/dist/react/index.js +0 -66
- package/dist/react/internalContext.d.ts +0 -33
- package/dist/react/internalContext.js +0 -3
- package/dist/react/useAblo.d.ts +0 -75
- package/dist/react/useAblo.js +0 -102
- package/dist/react/useCurrentUserId.d.ts +0 -22
- package/dist/react/useCurrentUserId.js +0 -34
- package/dist/react/useErrorListener.d.ts +0 -20
- package/dist/react/useErrorListener.js +0 -38
- package/dist/react/useMutationFailureListener.d.ts +0 -26
- package/dist/react/useMutationFailureListener.js +0 -38
- package/dist/react/useMutators.d.ts +0 -56
- package/dist/react/useMutators.js +0 -84
- package/dist/react/useReactive.d.ts +0 -35
- package/dist/react/useReactive.js +0 -123
- package/dist/react/useSyncStatus.d.ts +0 -59
- package/dist/react/useSyncStatus.js +0 -76
- package/dist/react/useUndoScope.d.ts +0 -34
- package/dist/react/useUndoScope.js +0 -81
- package/dist/schema/coordination.d.ts +0 -112
- package/dist/schema/coordination.js +0 -129
- package/dist/schema/ddl.d.ts +0 -97
- package/dist/schema/ddl.js +0 -491
- package/dist/schema/ddlLock.d.ts +0 -35
- package/dist/schema/ddlLock.js +0 -46
- package/dist/schema/diff.d.ts +0 -225
- package/dist/schema/diff.js +0 -289
- package/dist/schema/generate.d.ts +0 -19
- package/dist/schema/generate.js +0 -86
- package/dist/schema/index.d.ts +0 -41
- package/dist/schema/index.js +0 -76
- package/dist/schema/queries.d.ts +0 -201
- package/dist/schema/queries.js +0 -144
- package/dist/schema/select.d.ts +0 -40
- package/dist/schema/select.js +0 -87
- package/dist/schema/serialize.d.ts +0 -115
- package/dist/schema/serialize.js +0 -262
- package/dist/schema/sugar.d.ts +0 -109
- package/dist/schema/sugar.js +0 -83
- package/dist/schema/syncDeltaRow.d.ts +0 -6
- package/dist/schema/syncDeltaRow.js +0 -6
- package/dist/server/adapter.d.ts +0 -173
- package/dist/server/adapter.js +0 -18
- package/dist/server/commit.d.ts +0 -107
- package/dist/server/commit.js +0 -1
- package/dist/server/index.d.ts +0 -14
- package/dist/server/index.js +0 -2
- package/dist/server/readConfig.d.ts +0 -80
- package/dist/server/readConfig.js +0 -8
- package/dist/server/storageMode.d.ts +0 -23
- package/dist/server/storageMode.js +0 -17
- package/dist/source/adapter.d.ts +0 -81
- package/dist/source/adapter.js +0 -22
- package/dist/source/adapters/drizzle.d.ts +0 -48
- package/dist/source/adapters/drizzle.js +0 -219
- package/dist/source/adapters/kysely.d.ts +0 -42
- package/dist/source/adapters/kysely.js +0 -205
- package/dist/source/adapters/kyselyMutationCore.d.ts +0 -76
- package/dist/source/adapters/kyselyMutationCore.js +0 -125
- package/dist/source/adapters/memory.d.ts +0 -13
- package/dist/source/adapters/memory.js +0 -130
- package/dist/source/adapters/prisma.d.ts +0 -63
- package/dist/source/adapters/prisma.js +0 -202
- package/dist/source/conformance.d.ts +0 -37
- package/dist/source/conformance.js +0 -215
- package/dist/source/connector.d.ts +0 -95
- package/dist/source/connector.js +0 -266
- package/dist/source/connectorProtocol.d.ts +0 -154
- package/dist/source/connectorProtocol.js +0 -163
- package/dist/source/contract.d.ts +0 -195
- package/dist/source/contract.js +0 -164
- package/dist/source/factory.d.ts +0 -92
- package/dist/source/factory.js +0 -286
- package/dist/source/footprint.d.ts +0 -111
- package/dist/source/footprint.js +0 -0
- package/dist/source/idempotency.d.ts +0 -61
- package/dist/source/idempotency.js +0 -144
- package/dist/source/index.d.ts +0 -23
- package/dist/source/index.js +0 -30
- package/dist/source/migrations.d.ts +0 -21
- package/dist/source/migrations.js +0 -103
- package/dist/source/next.d.ts +0 -32
- package/dist/source/next.js +0 -25
- package/dist/source/pushQueue.d.ts +0 -134
- package/dist/source/pushQueue.js +0 -256
- package/dist/source/signing.d.ts +0 -92
- package/dist/source/signing.js +0 -162
- package/dist/source/types.d.ts +0 -401
- package/dist/source/types.js +0 -59
- package/dist/stores/ObjectStore.d.ts +0 -115
- package/dist/stores/ObjectStore.js +0 -393
- package/dist/stores/ObjectStoreContract.d.ts +0 -38
- package/dist/stores/ObjectStoreContract.js +0 -1
- package/dist/stores/SyncActionStore.d.ts +0 -97
- package/dist/stores/SyncActionStore.js +0 -504
- package/dist/stores/syncAction.d.ts +0 -26
- package/dist/stores/syncAction.js +0 -16
- package/dist/surface.d.ts +0 -36
- package/dist/surface.js +0 -75
- package/dist/sync/BootstrapFetcher.d.ts +0 -280
- package/dist/sync/BootstrapFetcher.js +0 -962
- package/dist/sync/ConnectionManager.d.ts +0 -8
- package/dist/sync/ConnectionManager.js +0 -8
- package/dist/sync/OnDemandLoader.d.ts +0 -228
- package/dist/sync/OnDemandLoader.js +0 -742
- package/dist/sync/SubscriptionManager.d.ts +0 -159
- package/dist/sync/SubscriptionManager.js +0 -243
- package/dist/sync/SyncWebSocket.d.ts +0 -173
- package/dist/sync/SyncWebSocket.js +0 -438
- package/dist/sync/awaitClaimGrant.d.ts +0 -6
- package/dist/sync/awaitClaimGrant.js +0 -6
- package/dist/sync/bootstrapApply.d.ts +0 -70
- package/dist/sync/bootstrapApply.js +0 -73
- package/dist/sync/commitFrames.d.ts +0 -8
- package/dist/sync/commitFrames.js +0 -8
- package/dist/sync/contextPorts.d.ts +0 -18
- package/dist/sync/contextPorts.js +0 -31
- package/dist/sync/createClaimStream.d.ts +0 -7
- package/dist/sync/createClaimStream.js +0 -7
- package/dist/sync/createPresenceStream.d.ts +0 -69
- package/dist/sync/createPresenceStream.js +0 -200
- package/dist/sync/createSnapshot.d.ts +0 -29
- package/dist/sync/createSnapshot.js +0 -118
- package/dist/sync/credentialLifecycle.d.ts +0 -7
- package/dist/sync/credentialLifecycle.js +0 -7
- package/dist/sync/deltaPipeline.d.ts +0 -113
- package/dist/sync/deltaPipeline.js +0 -261
- package/dist/sync/groupChange.d.ts +0 -113
- package/dist/sync/groupChange.js +0 -242
- package/dist/sync/participants.d.ts +0 -115
- package/dist/sync/participants.js +0 -344
- package/dist/sync/persistedPrefix.d.ts +0 -12
- package/dist/sync/persistedPrefix.js +0 -22
- package/dist/sync/schemaDrift.d.ts +0 -55
- package/dist/sync/schemaDrift.js +0 -53
- package/dist/sync/schemas.d.ts +0 -70
- package/dist/sync/schemas.js +0 -94
- package/dist/sync/syncCursor.d.ts +0 -40
- package/dist/sync/syncCursor.js +0 -55
- package/dist/sync/syncPlan.d.ts +0 -54
- package/dist/sync/syncPlan.js +0 -50
- package/dist/sync/wsFrameHandlers.d.ts +0 -8
- package/dist/sync/wsFrameHandlers.js +0 -8
- package/dist/testing/fixtures/bootstrap.d.ts +0 -49
- package/dist/testing/fixtures/bootstrap.js +0 -59
- package/dist/testing/fixtures/deltas.d.ts +0 -83
- package/dist/testing/fixtures/deltas.js +0 -136
- package/dist/testing/fixtures/httpResponses.d.ts +0 -70
- package/dist/testing/fixtures/httpResponses.js +0 -90
- package/dist/testing/fixtures/models.d.ts +0 -83
- package/dist/testing/fixtures/models.js +0 -272
- package/dist/testing/helpers/reactWrapper.d.ts +0 -69
- package/dist/testing/helpers/reactWrapper.js +0 -67
- package/dist/testing/helpers/syncEngineHarness.d.ts +0 -54
- package/dist/testing/helpers/syncEngineHarness.js +0 -73
- package/dist/testing/helpers/wait.d.ts +0 -30
- package/dist/testing/helpers/wait.js +0 -49
- package/dist/testing/index.d.ts +0 -23
- package/dist/testing/index.js +0 -33
- package/dist/testing/mocks/FakeDatabase.d.ts +0 -18
- package/dist/testing/mocks/FakeDatabase.js +0 -10
- package/dist/testing/mocks/MockMutationExecutor.d.ts +0 -87
- package/dist/testing/mocks/MockMutationExecutor.js +0 -186
- package/dist/testing/mocks/MockNetworkMonitor.d.ts +0 -20
- package/dist/testing/mocks/MockNetworkMonitor.js +0 -46
- package/dist/testing/mocks/MockSyncContext.d.ts +0 -51
- package/dist/testing/mocks/MockSyncContext.js +0 -72
- package/dist/testing/mocks/MockSyncStore.d.ts +0 -88
- package/dist/testing/mocks/MockSyncStore.js +0 -171
- package/dist/testing/mocks/MockWebSocket.d.ts +0 -71
- package/dist/testing/mocks/MockWebSocket.js +0 -118
- package/dist/transaction/ablo.d.ts +0 -88
- package/dist/transaction/ablo.js +0 -33
- package/dist/transaction/auth/apiKey.d.ts +0 -152
- package/dist/transaction/auth/apiKey.js +0 -419
- package/dist/transaction/auth/bootstrapScope.d.ts +0 -15
- package/dist/transaction/auth/bootstrapScope.js +0 -1
- package/dist/transaction/auth/capability.d.ts +0 -177
- package/dist/transaction/auth/capability.js +0 -199
- package/dist/transaction/auth/credentialEndpoint.d.ts +0 -61
- package/dist/transaction/auth/credentialEndpoint.js +0 -86
- package/dist/transaction/auth/credentialPolicy.d.ts +0 -148
- package/dist/transaction/auth/credentialPolicy.js +0 -125
- package/dist/transaction/auth/credentialSource.d.ts +0 -30
- package/dist/transaction/auth/credentialSource.js +0 -55
- package/dist/transaction/auth/hostedEndpoints.d.ts +0 -21
- package/dist/transaction/auth/hostedEndpoints.js +0 -21
- package/dist/transaction/auth/identity.d.ts +0 -55
- package/dist/transaction/auth/identity.js +0 -210
- package/dist/transaction/auth/index.d.ts +0 -162
- package/dist/transaction/auth/index.js +0 -304
- package/dist/transaction/auth/schemas.d.ts +0 -59
- package/dist/transaction/auth/schemas.js +0 -85
- package/dist/transaction/auth/sessionMint.d.ts +0 -28
- package/dist/transaction/auth/sessionMint.js +0 -85
- package/dist/transaction/coordination/awaitClaimGrant.d.ts +0 -49
- package/dist/transaction/coordination/awaitClaimGrant.js +0 -112
- package/dist/transaction/coordination/claimHeartbeatLoop.d.ts +0 -50
- package/dist/transaction/coordination/claimHeartbeatLoop.js +0 -88
- package/dist/transaction/coordination/claimMeta.d.ts +0 -49
- package/dist/transaction/coordination/claimMeta.js +0 -52
- package/dist/transaction/coordination/createClaimStream.d.ts +0 -64
- package/dist/transaction/coordination/createClaimStream.js +0 -475
- package/dist/transaction/coordination/events.d.ts +0 -74
- package/dist/transaction/coordination/events.js +0 -7
- package/dist/transaction/coordination/index.d.ts +0 -19
- package/dist/transaction/coordination/index.js +0 -44
- package/dist/transaction/coordination/locator.d.ts +0 -83
- package/dist/transaction/coordination/locator.js +0 -82
- package/dist/transaction/coordination/schema.d.ts +0 -1473
- package/dist/transaction/coordination/schema.js +0 -1013
- package/dist/transaction/coordination/targetConflict.d.ts +0 -2
- package/dist/transaction/coordination/targetConflict.js +0 -103
- package/dist/transaction/coordination/trace.d.ts +0 -78
- package/dist/transaction/coordination/trace.js +0 -138
- package/dist/transaction/durableWrites.d.ts +0 -62
- package/dist/transaction/durableWrites.js +0 -71
- package/dist/transaction/environment.d.ts +0 -105
- package/dist/transaction/environment.js +0 -108
- package/dist/transaction/errorCodes.d.ts +0 -403
- package/dist/transaction/errorCodes.js +0 -480
- package/dist/transaction/errors.d.ts +0 -428
- package/dist/transaction/errors.js +0 -686
- package/dist/transaction/index.d.ts +0 -20
- package/dist/transaction/index.js +0 -20
- package/dist/transaction/keys/index.d.ts +0 -87
- package/dist/transaction/keys/index.js +0 -207
- package/dist/transaction/log/syncDeltaRow.d.ts +0 -158
- package/dist/transaction/log/syncDeltaRow.js +0 -95
- package/dist/transaction/logPosition.d.ts +0 -97
- package/dist/transaction/logPosition.js +0 -125
- package/dist/transaction/logger.d.ts +0 -16
- package/dist/transaction/logger.js +0 -7
- package/dist/transaction/observability.d.ts +0 -53
- package/dist/transaction/observability.js +0 -19
- package/dist/transaction/persistence.d.ts +0 -12
- package/dist/transaction/persistence.js +0 -11
- package/dist/transaction/plugin.d.ts +0 -192
- package/dist/transaction/plugin.js +0 -87
- package/dist/transaction/policy/types.d.ts +0 -217
- package/dist/transaction/policy/types.js +0 -126
- package/dist/transaction/resources/functionalUpdate.d.ts +0 -79
- package/dist/transaction/resources/functionalUpdate.js +0 -87
- package/dist/transaction/resources/httpResources.d.ts +0 -266
- package/dist/transaction/resources/httpResources.js +0 -7
- package/dist/transaction/resources/modelOperations.d.ts +0 -319
- package/dist/transaction/resources/modelOperations.js +0 -12
- package/dist/transaction/resources/mutationOptions.d.ts +0 -66
- package/dist/transaction/resources/mutationOptions.js +0 -9
- package/dist/transaction/resources/where.d.ts +0 -85
- package/dist/transaction/resources/where.js +0 -70
- package/dist/transaction/resources/writeOptionsSchema.d.ts +0 -47
- package/dist/transaction/resources/writeOptionsSchema.js +0 -73
- package/dist/transaction/schema/field.d.ts +0 -126
- package/dist/transaction/schema/field.js +0 -265
- package/dist/transaction/schema/loadStrategy.d.ts +0 -45
- package/dist/transaction/schema/loadStrategy.js +0 -46
- package/dist/transaction/schema/model.d.ts +0 -379
- package/dist/transaction/schema/model.js +0 -123
- package/dist/transaction/schema/openapi.d.ts +0 -57
- package/dist/transaction/schema/openapi.js +0 -340
- package/dist/transaction/schema/relation.d.ts +0 -199
- package/dist/transaction/schema/relation.js +0 -104
- package/dist/transaction/schema/residency.d.ts +0 -29
- package/dist/transaction/schema/residency.js +0 -25
- package/dist/transaction/schema/roles.d.ts +0 -249
- package/dist/transaction/schema/roles.js +0 -230
- package/dist/transaction/schema/schema.d.ts +0 -324
- package/dist/transaction/schema/schema.js +0 -305
- package/dist/transaction/schema/tenancy.d.ts +0 -139
- package/dist/transaction/schema/tenancy.js +0 -190
- package/dist/transaction/transactionLayer.d.ts +0 -82
- package/dist/transaction/transactionLayer.js +0 -24
- package/dist/transaction/transactions/settlement/commitEnvelope.d.ts +0 -143
- package/dist/transaction/transactions/settlement/commitEnvelope.js +0 -161
- package/dist/transaction/transactions/settlement/httpCommitEnvelope.d.ts +0 -53
- package/dist/transaction/transactions/settlement/httpCommitEnvelope.js +0 -207
- package/dist/transaction/transactions/settlement/idempotencyKey.d.ts +0 -10
- package/dist/transaction/transactions/settlement/idempotencyKey.js +0 -9
- package/dist/transaction/transactions/settlement/pendingWrite.d.ts +0 -112
- package/dist/transaction/transactions/settlement/pendingWrite.js +0 -20
- package/dist/transaction/transport/commitFrames.d.ts +0 -90
- package/dist/transaction/transport/commitFrames.js +0 -134
- package/dist/transaction/transport/connectionManager.d.ts +0 -215
- package/dist/transaction/transport/connectionManager.js +0 -673
- package/dist/transaction/transport/credentialLifecycle.d.ts +0 -177
- package/dist/transaction/transport/credentialLifecycle.js +0 -324
- package/dist/transaction/transport/heartbeat.d.ts +0 -65
- package/dist/transaction/transport/heartbeat.js +0 -93
- package/dist/transaction/transport/httpClient.d.ts +0 -123
- package/dist/transaction/transport/httpClient.js +0 -145
- package/dist/transaction/transport/httpOptions.d.ts +0 -33
- package/dist/transaction/transport/httpOptions.js +0 -12
- package/dist/transaction/transport/httpTransport.d.ts +0 -8
- package/dist/transaction/transport/httpTransport.js +0 -1276
- package/dist/transaction/transport/networkProbe.d.ts +0 -84
- package/dist/transaction/transport/networkProbe.js +0 -207
- package/dist/transaction/transport/wsFrameHandlers.d.ts +0 -128
- package/dist/transaction/transport/wsFrameHandlers.js +0 -429
- package/dist/transaction/transport/wsTransport.d.ts +0 -576
- package/dist/transaction/transport/wsTransport.js +0 -1017
- package/dist/transaction/types/assertExact.d.ts +0 -17
- package/dist/transaction/types/assertExact.js +0 -1
- package/dist/transaction/types/global.d.ts +0 -107
- package/dist/transaction/types/global.js +0 -40
- package/dist/transaction/types/index.d.ts +0 -205
- package/dist/transaction/types/index.js +0 -56
- package/dist/transaction/types/modelData.d.ts +0 -10
- package/dist/transaction/types/modelData.js +0 -9
- package/dist/transaction/types/participant.d.ts +0 -20
- package/dist/transaction/types/participant.js +0 -10
- package/dist/transaction/types/streams.d.ts +0 -540
- package/dist/transaction/types/streams.js +0 -11
- package/dist/transaction/utils/asyncIterator.d.ts +0 -34
- package/dist/transaction/utils/asyncIterator.js +0 -135
- package/dist/transaction/utils/duration.d.ts +0 -25
- package/dist/transaction/utils/duration.js +0 -45
- package/dist/transaction/utils/json.d.ts +0 -57
- package/dist/transaction/utils/json.js +0 -276
- package/dist/transaction/wire/accountResponses.d.ts +0 -351
- package/dist/transaction/wire/accountResponses.js +0 -255
- package/dist/transaction/wire/auth.d.ts +0 -49
- package/dist/transaction/wire/auth.js +0 -57
- package/dist/transaction/wire/bootstrapReason.d.ts +0 -9
- package/dist/transaction/wire/bootstrapReason.js +0 -8
- package/dist/transaction/wire/claimEvent.d.ts +0 -76
- package/dist/transaction/wire/claimEvent.js +0 -73
- package/dist/transaction/wire/claims.d.ts +0 -463
- package/dist/transaction/wire/claims.js +0 -229
- package/dist/transaction/wire/commit.d.ts +0 -603
- package/dist/transaction/wire/commit.js +0 -321
- package/dist/transaction/wire/delta.d.ts +0 -250
- package/dist/transaction/wire/delta.js +0 -147
- package/dist/transaction/wire/errorEnvelope.d.ts +0 -72
- package/dist/transaction/wire/errorEnvelope.js +0 -123
- package/dist/transaction/wire/feedCursor.d.ts +0 -60
- package/dist/transaction/wire/feedCursor.js +0 -82
- package/dist/transaction/wire/feedEvent.d.ts +0 -177
- package/dist/transaction/wire/feedEvent.js +0 -39
- package/dist/transaction/wire/frames.d.ts +0 -194
- package/dist/transaction/wire/frames.js +0 -50
- package/dist/transaction/wire/inboundFrames.d.ts +0 -552
- package/dist/transaction/wire/inboundFrames.js +0 -116
- package/dist/transaction/wire/index.d.ts +0 -50
- package/dist/transaction/wire/index.js +0 -74
- package/dist/transaction/wire/listEnvelope.d.ts +0 -37
- package/dist/transaction/wire/listEnvelope.js +0 -42
- package/dist/transaction/wire/modelResponses.d.ts +0 -85
- package/dist/transaction/wire/modelResponses.js +0 -43
- package/dist/transaction/wire/protocol.d.ts +0 -38
- package/dist/transaction/wire/protocol.js +0 -38
- package/dist/transaction/wire/protocolVersion.d.ts +0 -73
- package/dist/transaction/wire/protocolVersion.js +0 -83
- package/dist/transactions/mutations/MutationQueue.d.ts +0 -655
- package/dist/transactions/mutations/MutationQueue.js +0 -2797
- package/dist/transactions/mutations/MutationStore.d.ts +0 -20
- package/dist/transactions/mutations/MutationStore.js +0 -53
- package/dist/transactions/mutations/UnconfirmedWrites.d.ts +0 -82
- package/dist/transactions/mutations/UnconfirmedWrites.js +0 -104
- package/dist/transactions/mutations/coalesceRules.d.ts +0 -58
- package/dist/transactions/mutations/coalesceRules.js +0 -140
- package/dist/transactions/mutations/commitLatency.d.ts +0 -52
- package/dist/transactions/mutations/commitLatency.js +0 -130
- package/dist/transactions/mutations/commitOutboxStore.d.ts +0 -28
- package/dist/transactions/mutations/commitOutboxStore.js +0 -26
- package/dist/transactions/mutations/commitPayload.d.ts +0 -164
- package/dist/transactions/mutations/commitPayload.js +0 -152
- package/dist/transactions/mutations/deltaConfirmation.d.ts +0 -59
- package/dist/transactions/mutations/deltaConfirmation.js +0 -233
- package/dist/transactions/mutations/durableWriteStore.d.ts +0 -14
- package/dist/transactions/mutations/durableWriteStore.js +0 -12
- package/dist/transactions/mutations/optimisticApply.d.ts +0 -49
- package/dist/transactions/mutations/optimisticApply.js +0 -65
- package/dist/transactions/mutations/replayValidation.d.ts +0 -186
- package/dist/transactions/mutations/replayValidation.js +0 -163
- package/dist/utils/mobxSetup.d.ts +0 -53
- package/dist/utils/mobxSetup.js +0 -330
- package/dist/webhooks/events.d.ts +0 -43
- package/dist/webhooks/events.js +0 -42
- package/dist/webhooks/index.d.ts +0 -8
- package/dist/webhooks/index.js +0 -8
- package/dist/wire/index.d.ts +0 -1
- package/dist/wire/index.js +0 -8
- package/docs/interaction-model.md +0 -99
package/dist/server/commit.d.ts
DELETED
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The commit contract types for the sync engine's server surface.
|
|
3
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*/
|
|
16
|
-
import type { ParticipantKind, ConfirmationState } from '../schema/syncDeltaRow.js';
|
|
17
|
-
import type { ParticipantRef } from '../transaction/wire/delta.js';
|
|
18
|
-
import type { CommitExecutionResultInput } from '../transaction/wire/commit.js';
|
|
19
|
-
import type { Environment } from '../transaction/environment.js';
|
|
20
|
-
import type { ReadDependency, TrackDependency } from '../transaction/coordination/schema.js';
|
|
21
|
-
export interface CommitContext {
|
|
22
|
-
participantId: string;
|
|
23
|
-
/**
|
|
24
|
-
* The kind of participant making the commit. Required, so that every delta carries
|
|
25
|
-
* structured attribution rather than a string-prefix convention.
|
|
26
|
-
*/
|
|
27
|
-
participantKind: ParticipantKind;
|
|
28
|
-
organizationId: string;
|
|
29
|
-
/**
|
|
30
|
-
* Project scope used to route source-mode storage. When omitted, the commit
|
|
31
|
-
* targets the organization's default project.
|
|
32
|
-
*/
|
|
33
|
-
projectId?: string;
|
|
34
|
-
/** Exact sandbox plane derived from the authenticated key, when present. */
|
|
35
|
-
sandboxId?: string;
|
|
36
|
-
/** Optional external account scope forwarded to storage resolvers. */
|
|
37
|
-
accountScope?: string;
|
|
38
|
-
/**
|
|
39
|
-
* The environment this commit runs in. Source-mode adapters forward it to the
|
|
40
|
-
* customer's handlers so that sandbox and production traffic can reach distinct
|
|
41
|
-
* customer-owned stores.
|
|
42
|
-
*/
|
|
43
|
-
environment?: Environment;
|
|
44
|
-
/**
|
|
45
|
-
* The sync groups this participant subscribes to, taken from the connection
|
|
46
|
-
* upgrade or the capability token. Each is appended to every delta's `sync_groups`
|
|
47
|
-
* so that writes fan out to subscribers of entity-level groups (such as
|
|
48
|
-
* `report:abc`), not only the default `org:X` and `user:Y` groups. When omitted, the
|
|
49
|
-
* commit fans out to just the organization and user groups.
|
|
50
|
-
*/
|
|
51
|
-
syncGroups?: readonly string[];
|
|
52
|
-
/**
|
|
53
|
-
* When true, the commit does not add `org:<organizationId>` to a delta's sync
|
|
54
|
-
* groups. Set this for sandbox writes, so that live organization subscribers do
|
|
55
|
-
* not receive test-environment changes.
|
|
56
|
-
*/
|
|
57
|
-
omitOrgSyncGroup?: boolean;
|
|
58
|
-
/**
|
|
59
|
-
* The participant on whose authority the actor acted. For a direct human commit
|
|
60
|
-
* this equals the actor; for an agent commit it is the human at the root of the
|
|
61
|
-
* capability's delegation chain. Null for `system` principals.
|
|
62
|
-
*/
|
|
63
|
-
onBehalfOf?: ParticipantRef | null;
|
|
64
|
-
/**
|
|
65
|
-
* The id of the scoped credential that authorized the commit. Non-null for agent
|
|
66
|
-
* and system commits when that credential is known; null for direct human commits.
|
|
67
|
-
*/
|
|
68
|
-
capabilityId?: string | null;
|
|
69
|
-
/**
|
|
70
|
-
* The id of the human user at the root of the delegated-authority chain. Stored
|
|
71
|
-
* directly on `sync_deltas` so that audit triggers appending the hash chain never
|
|
72
|
-
* need to join mutable credential tables.
|
|
73
|
-
*/
|
|
74
|
-
delegationChainRootUserId?: string | null;
|
|
75
|
-
/**
|
|
76
|
-
* The id of the API key row when the caller authenticated with an API key. Used by
|
|
77
|
-
* the idempotency cache and for usage attribution. Null for session and capability
|
|
78
|
-
* callers.
|
|
79
|
-
*/
|
|
80
|
-
apiKeyId?: string | null;
|
|
81
|
-
/**
|
|
82
|
-
* Whether a human explicitly approved the change. Defaults to `auto` when the
|
|
83
|
-
* caller does not specify an approval state.
|
|
84
|
-
*/
|
|
85
|
-
confirmationState?: ConfirmationState;
|
|
86
|
-
/**
|
|
87
|
-
* The premise for the whole batch. The committer declares the rows or groups
|
|
88
|
-
* it read to form this batch; the engine checks that none of them changed since
|
|
89
|
-
* each entry's `readAt` timestamp and applies that entry's `onStale` disposition
|
|
90
|
-
* across the batch. This differs from the per-operation `readAt` guard, which
|
|
91
|
-
* validates only the rows being written. Omit it to check the write targets alone.
|
|
92
|
-
*/
|
|
93
|
-
reads?: ReadDependency[] | null;
|
|
94
|
-
/**
|
|
95
|
-
* Durable premises to persist for this commit's participant. Each entry is
|
|
96
|
-
* kept in `track_dependencies` and re-checked against every future delta; a
|
|
97
|
-
* later match opens a `StaleNotification` delivered out of band. Distinct
|
|
98
|
-
* from `reads`, which is checked once here and discarded.
|
|
99
|
-
*/
|
|
100
|
-
track?: TrackDependency[] | null;
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* The server execution receipt persisted in `mutation_log`. Its runtime schema
|
|
104
|
-
* lives with the HTTP/WS settlement contract so queued correlation cannot drift
|
|
105
|
-
* between cache, transport, and client.
|
|
106
|
-
*/
|
|
107
|
-
export type CommitResult = CommitExecutionResultInput;
|
package/dist/server/commit.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/dist/server/index.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
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.
|
|
9
|
-
*/
|
|
10
|
-
export type { Row, ReadResult, SyncCursor, DataAdapterCapabilities, ProposalResult, ReadRequest, ChangeSet, SyncResult, DataAdapter, ProposableDataAdapter, AdapterResolver, } from './adapter.js';
|
|
11
|
-
export type { CommitContext, CommitResult } from './commit.js';
|
|
12
|
-
export { commitExecutionResultSchema } from '../transaction/wire/commit.js';
|
|
13
|
-
export { storageModeSchema, type StorageMode } from './storageMode.js';
|
|
14
|
-
export type { ColumnOverride, BootstrapModel } from './readConfig.js';
|
package/dist/server/index.js
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
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 `blocks`.
|
|
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
|
-
/**
|
|
39
|
-
* The model derives its tenant from the connected data source (`policy:
|
|
40
|
-
* { by: 'source' }`) rather than a row column. It carries no tenant predicate on a
|
|
41
|
-
* log plane, so it is excluded from the bootstrap set entirely until the
|
|
42
|
-
* write-through connect path can resolve the org from the source registration —
|
|
43
|
-
* serving it now would return every row to every tenant. Kept on the type as a
|
|
44
|
-
* defense-in-depth marker so a source-scoped model that reaches `getBootstrapData`
|
|
45
|
-
* fails closed rather than bootstrapping unscoped.
|
|
46
|
-
*/
|
|
47
|
-
sourceScoped?: boolean;
|
|
48
|
-
/** Physical tenancy column (default `organization_id`, configurable per model). */
|
|
49
|
-
orgColumn?: string;
|
|
50
|
-
/**
|
|
51
|
-
* Parent-table scoping for rows that have no `organization_id` column, mirroring
|
|
52
|
-
* the schema's `scopedVia` option. When set, the bootstrap query adds:
|
|
53
|
-
*
|
|
54
|
-
* WHERE <table>.<localKey> IN
|
|
55
|
-
* (SELECT <parentKey> FROM <parentTable> WHERE <parentOrgColumn> = $1)
|
|
56
|
-
*
|
|
57
|
-
* This applies on top of whatever `orgScoped` dictates, so a table can carry its
|
|
58
|
-
* own `organization_id` and still narrow through a parent. The common case,
|
|
59
|
-
* though, is `orgScoped: false` together with `scopedVia` on a table that lacks the
|
|
60
|
-
* column.
|
|
61
|
-
*/
|
|
62
|
-
scopedVia?: {
|
|
63
|
-
localKey: string;
|
|
64
|
-
parentTable: string;
|
|
65
|
-
parentKey?: string;
|
|
66
|
-
parentOrgColumn?: string;
|
|
67
|
-
};
|
|
68
|
-
/** Client-facing field name → physical DB column for declared fields. */
|
|
69
|
-
fieldColumns?: Record<string, string>;
|
|
70
|
-
/** Physical-column aliases needed after SELECT * for `.from(...)` fields. */
|
|
71
|
-
columnOverrides?: readonly ColumnOverride[];
|
|
72
|
-
/**
|
|
73
|
-
* Physical columns the schema declares as JSON (via `field.json()`). A JSON field
|
|
74
|
-
* stored in a text column comes back from `row_to_json` as a serialized string, so
|
|
75
|
-
* the bootstrap reparses these columns to make the wire value the canonical object
|
|
76
|
-
* regardless of the physical column type. A `jsonb` column already returns an
|
|
77
|
-
* object, so reparsing it is a no-op.
|
|
78
|
-
*/
|
|
79
|
-
jsonColumns?: readonly string[];
|
|
80
|
-
}
|
|
@@ -1,8 +0,0 @@
|
|
|
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 {};
|
|
@@ -1,23 +0,0 @@
|
|
|
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>;
|
|
@@ -1,17 +0,0 @@
|
|
|
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
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
/**
|
|
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 shared mutation checks plus endpoint-only outbox checks. The
|
|
7
|
-
* direct Kysely wrapper runs only the shared mutation contract. You can also
|
|
8
|
-
* write your own.
|
|
9
|
-
*
|
|
10
|
-
* An endpoint adapter reads and writes your database, and it owns the transactional
|
|
11
|
-
* outbox and idempotency bookkeeping as well, so you never write those by hand:
|
|
12
|
-
*
|
|
13
|
-
* export const POST = dataSource({
|
|
14
|
-
* schema, apiKey: process.env.ABLO_API_KEY!,
|
|
15
|
-
* ...sourceHandlersFromAdapter(prismaDataSource(prisma, schema), schema),
|
|
16
|
-
* });
|
|
17
|
-
*
|
|
18
|
-
* `sourceHandlersFromAdapter` is the bridge: it turns a single adapter into the
|
|
19
|
-
* handler's `commit`, `events`, and per-model `load` and `list` operations, so no
|
|
20
|
-
* code above the adapter needs to know which mapper you chose.
|
|
21
|
-
*/
|
|
22
|
-
import type { SourceListQuery, SourceRequestContext } from './types.js';
|
|
23
|
-
import type { AdapterCapabilities, ChangeSet, EventsPage, Migration } from './contract.js';
|
|
24
|
-
/**
|
|
25
|
-
* A single row keyed by the schema's field names (for example `operatorId`), not
|
|
26
|
-
* by physical column names. Each adapter is the boundary that translates between
|
|
27
|
-
* the two, mapping a field name to whatever the underlying database column is
|
|
28
|
-
* called. Values are typed as `unknown`, so a caller must narrow a value before
|
|
29
|
-
* using it.
|
|
30
|
-
*/
|
|
31
|
-
export type Row = Record<string, unknown>;
|
|
32
|
-
/** A read request handed to an adapter: either a single-row load by id, or a filtered list. */
|
|
33
|
-
export type AdapterReadRequest = {
|
|
34
|
-
readonly kind: 'load';
|
|
35
|
-
readonly model: string;
|
|
36
|
-
readonly id: string;
|
|
37
|
-
readonly scope?: SourceRequestContext;
|
|
38
|
-
} | {
|
|
39
|
-
readonly kind: 'list';
|
|
40
|
-
readonly model: string;
|
|
41
|
-
readonly query?: SourceListQuery;
|
|
42
|
-
readonly scope?: SourceRequestContext;
|
|
43
|
-
};
|
|
44
|
-
/** What {@link MutationAdapter.commit} returns: the rows as they stand after the write. */
|
|
45
|
-
export interface AdapterCommitResult {
|
|
46
|
-
/** The affected rows after the write. The change log is derived from these. */
|
|
47
|
-
readonly rows: readonly Row[];
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Guarantees shared by direct and endpoint mutation wrappers. Both apply row DML
|
|
51
|
-
* and write the permanent idempotency ledger in one transaction. The scoped,
|
|
52
|
-
* server-authored `correlationId` is the ledger key; a caller-authored operation
|
|
53
|
-
* transaction id is never used as that namespace.
|
|
54
|
-
*/
|
|
55
|
-
export interface MutationAdapter {
|
|
56
|
-
readonly capabilities: AdapterCapabilities;
|
|
57
|
-
/** Infrastructure migrations required by this wrapper's advertised capabilities. */
|
|
58
|
-
migrations(): readonly Migration[];
|
|
59
|
-
/** The rows matching a load or list request. */
|
|
60
|
-
read(req: AdapterReadRequest): Promise<readonly Row[]>;
|
|
61
|
-
/**
|
|
62
|
-
* Applies a change set in one transaction, keyed by its scoped `correlationId`.
|
|
63
|
-
* Replaying the same correlation and canonical request hash returns the original
|
|
64
|
-
* rows without applying DML again; a different hash fails closed.
|
|
65
|
-
*/
|
|
66
|
-
commit(change: ChangeSet): Promise<AdapterCommitResult>;
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Endpoint-only extension of {@link MutationAdapter}. Its commit writes one
|
|
70
|
-
* correlated outbox event per operation in the same transaction as the DML and
|
|
71
|
-
* ledger. Direct wrappers deliberately do not implement this interface: WAL is
|
|
72
|
-
* their authoritative source feed and they must never write `ablo_outbox`.
|
|
73
|
-
*/
|
|
74
|
-
export interface DataSourceAdapter extends MutationAdapter {
|
|
75
|
-
readonly capabilities: AdapterCapabilities & {
|
|
76
|
-
readonly outboxEvents: true;
|
|
77
|
-
};
|
|
78
|
-
/** Reads outbox events after `cursor` (`null` starts from the beginning), up to `limit` events. */
|
|
79
|
-
events(cursor: string | null, limit: number): Promise<EventsPage>;
|
|
80
|
-
}
|
|
81
|
-
export type { AdapterCapabilities, ChangeSet, Migration, OutboxEvent, EventsPage } from './contract.js';
|
package/dist/source/adapter.js
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
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 shared mutation checks plus endpoint-only outbox checks. The
|
|
7
|
-
* direct Kysely wrapper runs only the shared mutation contract. You can also
|
|
8
|
-
* write your own.
|
|
9
|
-
*
|
|
10
|
-
* An endpoint adapter reads and writes your database, and it owns the transactional
|
|
11
|
-
* outbox and idempotency bookkeeping as well, so you never write those by hand:
|
|
12
|
-
*
|
|
13
|
-
* export const POST = dataSource({
|
|
14
|
-
* schema, apiKey: process.env.ABLO_API_KEY!,
|
|
15
|
-
* ...sourceHandlersFromAdapter(prismaDataSource(prisma, schema), schema),
|
|
16
|
-
* });
|
|
17
|
-
*
|
|
18
|
-
* `sourceHandlersFromAdapter` is the bridge: it turns a single adapter into the
|
|
19
|
-
* handler's `commit`, `events`, and per-model `load` and `list` operations, so no
|
|
20
|
-
* code above the adapter needs to know which mapper you chose.
|
|
21
|
-
*/
|
|
22
|
-
export {};
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
/**
|
|
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.
|
|
10
|
-
*
|
|
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:
|
|
15
|
-
* table = `model.tableName ?? key`
|
|
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.
|
|
22
|
-
*
|
|
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`
|
|
30
|
-
* normalizes both.
|
|
31
|
-
*
|
|
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.
|
|
35
|
-
*/
|
|
36
|
-
import { type SQL } from 'drizzle-orm';
|
|
37
|
-
import type { DataSourceAdapter, Row } from '../adapter.js';
|
|
38
|
-
import type { Schema, SchemaRecord } from '../../transaction/schema/schema.js';
|
|
39
|
-
/** The subset of a Drizzle database/transaction handle the adapter calls. */
|
|
40
|
-
export interface DrizzleLike {
|
|
41
|
-
execute(query: SQL): Promise<DrizzleExecuteResult>;
|
|
42
|
-
transaction<T>(fn: (tx: DrizzleLike) => Promise<T>): Promise<T>;
|
|
43
|
-
}
|
|
44
|
-
/** `db.execute` is array-like (postgres-js) or `{ rows }` (node-postgres). */
|
|
45
|
-
export type DrizzleExecuteResult = readonly Row[] | {
|
|
46
|
-
readonly rows: readonly Row[];
|
|
47
|
-
};
|
|
48
|
-
export declare function drizzleDataSource<S extends SchemaRecord>(db: DrizzleLike, schema: Schema<S>): DataSourceAdapter;
|
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
/**
|
|
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.
|
|
10
|
-
*
|
|
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:
|
|
15
|
-
* table = `model.tableName ?? key`
|
|
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.
|
|
22
|
-
*
|
|
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`
|
|
30
|
-
* normalizes both.
|
|
31
|
-
*
|
|
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.
|
|
35
|
-
*/
|
|
36
|
-
import { AbloValidationError } from '../../transaction/errors.js';
|
|
37
|
-
import { sql } from 'drizzle-orm';
|
|
38
|
-
import { outboxEventSchema } from '../contract.js';
|
|
39
|
-
import { adapterTableMigrations } from '../migrations.js';
|
|
40
|
-
import { assertSourceIdempotencyIntent, assertSourceIdempotencyRetention, SOURCE_IDEMPOTENCY_RETENTION, sourceChangeIntentHash, } from '../idempotency.js';
|
|
41
|
-
import { toSchemaJSON } from '../../schema/serialize.js';
|
|
42
|
-
import { camelToSnake, snakeToCamel } from '../../schema/ddl.js';
|
|
43
|
-
import { tenancyColumn } from '../../transaction/schema/tenancy.js';
|
|
44
|
-
import { ABLO_POSTGRES_COMMIT_ECHO_PREFIX } from '../types.js';
|
|
45
|
-
function rowsOf(result) {
|
|
46
|
-
return Array.isArray(result) ? result : result.rows;
|
|
47
|
-
}
|
|
48
|
-
function rowId(op) {
|
|
49
|
-
const id = op.id ?? op.input?.id;
|
|
50
|
-
if (typeof id !== 'string' || id.length === 0) {
|
|
51
|
-
throw new AbloValidationError(`operation on "${op.model}" requires an id`, { code: 'source_operation_id_required' });
|
|
52
|
-
}
|
|
53
|
-
return id;
|
|
54
|
-
}
|
|
55
|
-
/** `col1, col2` as a safely-quoted identifier list. */
|
|
56
|
-
const identList = (cols) => sql.join(cols.map((c) => sql.identifier(c)), sql `, `);
|
|
57
|
-
function buildColumnMaps(schema) {
|
|
58
|
-
const json = toSchemaJSON(schema);
|
|
59
|
-
const out = new Map();
|
|
60
|
-
for (const [key, model] of Object.entries(json.models)) {
|
|
61
|
-
const fieldToColumn = new Map();
|
|
62
|
-
const columnToField = new Map();
|
|
63
|
-
const register = (field, column) => {
|
|
64
|
-
// The default rule already covers `camelToSnake(field)`; only record real
|
|
65
|
-
// divergences so the reverse map never shadows a clean round-trip.
|
|
66
|
-
if (column === camelToSnake(field))
|
|
67
|
-
return;
|
|
68
|
-
fieldToColumn.set(field, column);
|
|
69
|
-
columnToField.set(column, field);
|
|
70
|
-
};
|
|
71
|
-
for (const [field, meta] of Object.entries(model.fields)) {
|
|
72
|
-
if (meta.column)
|
|
73
|
-
register(field, meta.column);
|
|
74
|
-
}
|
|
75
|
-
const orgColumn = tenancyColumn(model.tenancy);
|
|
76
|
-
if (orgColumn)
|
|
77
|
-
register('organizationId', orgColumn);
|
|
78
|
-
out.set(key, { table: model.tableName ?? key, fieldToColumn, columnToField });
|
|
79
|
-
}
|
|
80
|
-
return out;
|
|
81
|
-
}
|
|
82
|
-
export function drizzleDataSource(db, schema) {
|
|
83
|
-
const maps = buildColumnMaps(schema);
|
|
84
|
-
const modelColumns = (model) => {
|
|
85
|
-
const mc = maps.get(model);
|
|
86
|
-
if (!mc)
|
|
87
|
-
throw new AbloValidationError(`drizzleDataSource: no model "${model}" in schema`, { code: 'source_adapter_misconfigured' });
|
|
88
|
-
return mc;
|
|
89
|
-
};
|
|
90
|
-
const columnFor = (mc, field) => mc.fieldToColumn.get(field) ?? camelToSnake(field);
|
|
91
|
-
const fieldFor = (mc, column) => mc.columnToField.get(column) ?? snakeToCamel(column);
|
|
92
|
-
/** Field-keyed row to column-keyed row, for INSERT and UPDATE values. */
|
|
93
|
-
const toColumns = (mc, row) => {
|
|
94
|
-
const out = {};
|
|
95
|
-
for (const k of Object.keys(row))
|
|
96
|
-
out[columnFor(mc, k)] = row[k];
|
|
97
|
-
return out;
|
|
98
|
-
};
|
|
99
|
-
/** Column-keyed row (from `RETURNING *` or `SELECT *`) back to a field-keyed row, for reads and results. */
|
|
100
|
-
const toFields = (mc, row) => {
|
|
101
|
-
const out = {};
|
|
102
|
-
for (const k of Object.keys(row))
|
|
103
|
-
out[fieldFor(mc, k)] = row[k];
|
|
104
|
-
return out;
|
|
105
|
-
};
|
|
106
|
-
const applyOperation = async (tx, op) => {
|
|
107
|
-
const mc = modelColumns(op.model);
|
|
108
|
-
const table = sql.identifier(mc.table);
|
|
109
|
-
const id = rowId(op);
|
|
110
|
-
const input = op.input ?? {};
|
|
111
|
-
if (op.type === 'DELETE') {
|
|
112
|
-
const deleted = rowsOf(await tx.execute(sql `DELETE FROM ${table} WHERE id = ${id} RETURNING *`));
|
|
113
|
-
return deleted[0] ? toFields(mc, deleted[0]) : { id };
|
|
114
|
-
}
|
|
115
|
-
if (op.type === 'CREATE') {
|
|
116
|
-
const data = toColumns(mc, { id, ...input });
|
|
117
|
-
const cols = Object.keys(data);
|
|
118
|
-
const values = sql.join(cols.map((c) => sql `${data[c]}`), sql `, `);
|
|
119
|
-
const inserted = rowsOf(await tx.execute(sql `INSERT INTO ${table} (${identList(cols)}) VALUES (${values}) RETURNING *`));
|
|
120
|
-
return inserted[0] ? toFields(mc, inserted[0]) : { id, ...input };
|
|
121
|
-
}
|
|
122
|
-
// UPDATE / ARCHIVE / UNARCHIVE — a SET clause + the lifecycle field. The
|
|
123
|
-
// lifecycle field is `archivedAt` (camelCase) and goes through `toColumns`
|
|
124
|
-
// like any other, so it lands in `archived_at` — same column the provisioner
|
|
125
|
-
// emits and the Prisma adapter writes (no per-adapter casing divergence).
|
|
126
|
-
const patch = toColumns(mc, {
|
|
127
|
-
...input,
|
|
128
|
-
...(op.type === 'ARCHIVE' ? { archivedAt: new Date() } : {}),
|
|
129
|
-
...(op.type === 'UNARCHIVE' ? { archivedAt: null } : {}),
|
|
130
|
-
});
|
|
131
|
-
const assignments = sql.join(Object.keys(patch).map((c) => sql `${sql.identifier(c)} = ${patch[c]}`), sql `, `);
|
|
132
|
-
const updated = rowsOf(await tx.execute(sql `UPDATE ${table} SET ${assignments} WHERE id = ${id} RETURNING *`));
|
|
133
|
-
return updated[0] ? toFields(mc, updated[0]) : { id, ...input };
|
|
134
|
-
};
|
|
135
|
-
return {
|
|
136
|
-
capabilities: {
|
|
137
|
-
transactions: true,
|
|
138
|
-
propose: false,
|
|
139
|
-
schemaIntrospection: true,
|
|
140
|
-
postgresWalEcho: true,
|
|
141
|
-
outboxEvents: true,
|
|
142
|
-
},
|
|
143
|
-
migrations() {
|
|
144
|
-
return adapterTableMigrations();
|
|
145
|
-
},
|
|
146
|
-
async read(req) {
|
|
147
|
-
const mc = modelColumns(req.model);
|
|
148
|
-
const table = sql.identifier(mc.table);
|
|
149
|
-
if (req.kind === 'load') {
|
|
150
|
-
const rows = rowsOf(await db.execute(sql `SELECT * FROM ${table} WHERE id = ${req.id} LIMIT 1`));
|
|
151
|
-
return rows.map((r) => toFields(mc, r));
|
|
152
|
-
}
|
|
153
|
-
const limit = req.query?.limit ?? 1000;
|
|
154
|
-
const rows = rowsOf(await db.execute(sql `SELECT * FROM ${table} LIMIT ${limit}`));
|
|
155
|
-
return rows.map((r) => toFields(mc, r));
|
|
156
|
-
},
|
|
157
|
-
async commit(change) {
|
|
158
|
-
const requestHash = sourceChangeIntentHash(change);
|
|
159
|
-
return db.transaction(async (tx) => {
|
|
160
|
-
const cached = rowsOf(await tx.execute(sql `SELECT response, request_hash AS "requestHash", expires_at AS "expiresAt"
|
|
161
|
-
FROM ablo_idempotency
|
|
162
|
-
WHERE client_tx_id = ${change.correlationId} LIMIT 1`));
|
|
163
|
-
const cachedRow = cached[0];
|
|
164
|
-
if (cachedRow) {
|
|
165
|
-
assertSourceIdempotencyIntent(cachedRow.requestHash, requestHash);
|
|
166
|
-
assertSourceIdempotencyRetention(cachedRow.expiresAt);
|
|
167
|
-
return { rows: cachedRow.response };
|
|
168
|
-
}
|
|
169
|
-
const rows = [];
|
|
170
|
-
for (const [index, op] of change.operations.entries()) {
|
|
171
|
-
const row = await applyOperation(tx, op);
|
|
172
|
-
rows.push(row);
|
|
173
|
-
const entityId = String(row.id ?? rowId(op));
|
|
174
|
-
await tx.execute(sql `
|
|
175
|
-
INSERT INTO ablo_outbox (
|
|
176
|
-
id, model, entity_id, type, data,
|
|
177
|
-
correlation_id, transaction_id, occurred_at
|
|
178
|
-
)
|
|
179
|
-
VALUES (
|
|
180
|
-
${`${change.correlationId}:${index}`}, ${op.model}, ${entityId}, ${op.type},
|
|
181
|
-
${op.type === 'DELETE' ? null : JSON.stringify(row)}::jsonb,
|
|
182
|
-
${change.correlationId}, ${op.transactionId ?? null}, ${Date.now()}
|
|
183
|
-
)`);
|
|
184
|
-
}
|
|
185
|
-
await tx.execute(sql `
|
|
186
|
-
INSERT INTO ablo_idempotency (client_tx_id, response, request_hash, expires_at)
|
|
187
|
-
VALUES (
|
|
188
|
-
${change.correlationId}, ${JSON.stringify(rows)}::jsonb, ${requestHash},
|
|
189
|
-
now() + ${SOURCE_IDEMPOTENCY_RETENTION}::interval
|
|
190
|
-
)`);
|
|
191
|
-
if (change.echo?.kind === 'postgres-wal') {
|
|
192
|
-
await tx.execute(sql `SELECT pg_logical_emit_message(true, ${ABLO_POSTGRES_COMMIT_ECHO_PREFIX}, ${change.echo.payload})`);
|
|
193
|
-
}
|
|
194
|
-
return { rows };
|
|
195
|
-
});
|
|
196
|
-
},
|
|
197
|
-
async events(cursor, limit) {
|
|
198
|
-
const after = cursor ?? '0';
|
|
199
|
-
const rows = rowsOf(await db.execute(sql `
|
|
200
|
-
SELECT cursor, id, model, entity_id, type, data, organization_id,
|
|
201
|
-
client_tx_id, correlation_id, transaction_id, occurred_at
|
|
202
|
-
FROM ablo_outbox WHERE cursor > ${after} ORDER BY cursor ASC LIMIT ${limit}`));
|
|
203
|
-
const events = rows.map((r) => outboxEventSchema.parse({
|
|
204
|
-
id: r.id,
|
|
205
|
-
model: r.model,
|
|
206
|
-
entityId: r.entity_id,
|
|
207
|
-
type: r.type,
|
|
208
|
-
data: r.data ?? null,
|
|
209
|
-
organizationId: r.organization_id ?? null,
|
|
210
|
-
clientTxId: r.client_tx_id ?? null,
|
|
211
|
-
correlationId: r.correlation_id ?? null,
|
|
212
|
-
transactionId: r.transaction_id ?? null,
|
|
213
|
-
occurredAt: r.occurred_at != null ? Number(r.occurred_at) : null,
|
|
214
|
-
cursor: String(r.cursor),
|
|
215
|
-
}));
|
|
216
|
-
return { events, nextCursor: events.at(-1)?.cursor ?? null };
|
|
217
|
-
},
|
|
218
|
-
};
|
|
219
|
-
}
|