@abloatai/ablo 0.26.0 → 0.28.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 +42 -2
- package/README.md +102 -86
- package/dist/BaseSyncedStore.d.ts +85 -88
- package/dist/BaseSyncedStore.js +134 -151
- package/dist/Database.d.ts +68 -69
- package/dist/Database.js +316 -135
- 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 +54 -52
- package/dist/Model.js +78 -62
- 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 +122 -118
- package/dist/SyncClient.js +541 -245
- package/dist/adapters/alwaysOnline.d.ts +6 -8
- package/dist/adapters/alwaysOnline.js +6 -8
- package/dist/adapters/inMemoryStorage.d.ts +10 -9
- package/dist/adapters/inMemoryStorage.js +21 -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 +173 -121
- package/dist/client/Ablo.d.ts +97 -74
- package/dist/client/Ablo.js +129 -163
- package/dist/client/ApiClient.d.ts +30 -19
- package/dist/client/ApiClient.js +442 -81
- 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 +16 -17
- package/dist/client/createInternalComponents.js +26 -31
- 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 +59 -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 +78 -87
- package/dist/client/options.d.ts +157 -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 +16 -20
- package/dist/client/wsMutationExecutor.js +18 -23
- package/dist/commit/contract.d.ts +493 -0
- package/dist/commit/contract.js +187 -0
- package/dist/commit/index.d.ts +6 -0
- package/dist/commit/index.js +5 -0
- 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 +14 -14
- package/dist/core/StoreManager.js +33 -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 +137 -134
- package/dist/errors.d.ts +160 -166
- package/dist/errors.js +155 -158
- package/dist/index.d.ts +36 -27
- package/dist/index.js +91 -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 +124 -131
- package/dist/mutators/UndoManager.js +177 -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 +28 -25
- package/dist/react/useAblo.js +41 -17
- 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 +3 -3
- 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 +64 -43
- 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 +24 -12
- package/dist/stores/ObjectStore.js +38 -16
- package/dist/stores/ObjectStoreContract.d.ts +14 -15
- package/dist/stores/SyncActionStore.d.ts +7 -11
- package/dist/stores/SyncActionStore.js +13 -17
- package/dist/surface.d.ts +28 -21
- package/dist/surface.js +29 -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 +141 -166
- 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/persistedPrefix.d.ts +12 -0
- package/dist/sync/persistedPrefix.js +22 -0
- 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 +5 -3
- package/dist/testing/index.js +3 -2
- package/dist/testing/mocks/FakeDatabase.d.ts +18 -0
- package/dist/testing/mocks/FakeDatabase.js +10 -0
- 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 +28 -23
- package/dist/testing/mocks/MockWebSocket.js +22 -21
- package/dist/transactions/TransactionQueue.d.ts +244 -181
- package/dist/transactions/TransactionQueue.js +929 -423
- 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/commitEnvelope.d.ts +132 -0
- package/dist/transactions/commitEnvelope.js +139 -0
- package/dist/transactions/commitOutboxStore.d.ts +32 -0
- package/dist/transactions/commitOutboxStore.js +26 -0
- package/dist/transactions/commitPayload.d.ts +63 -52
- package/dist/transactions/commitPayload.js +54 -57
- package/dist/transactions/deltaConfirmation.d.ts +20 -22
- package/dist/transactions/deltaConfirmation.js +37 -45
- package/dist/transactions/httpCommitEnvelope.d.ts +43 -0
- package/dist/transactions/httpCommitEnvelope.js +179 -0
- package/dist/transactions/optimisticApply.d.ts +49 -0
- package/dist/transactions/optimisticApply.js +65 -0
- package/dist/transactions/replayValidation.d.ts +182 -0
- package/dist/transactions/replayValidation.js +156 -0
- 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/wire/bootstrapReason.d.ts +9 -0
- package/dist/wire/bootstrapReason.js +8 -0
- 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 +315 -86
- package/dist/wire/frames.js +47 -33
- package/dist/wire/index.d.ts +18 -14
- package/dist/wire/index.js +32 -27
- 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/api.md +10 -10
- package/docs/coordination.md +59 -0
- package/docs/mcp.md +1 -1
- package/package.json +17 -11
- 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/transactions/persistedReplay.d.ts +0 -93
- package/dist/transactions/persistedReplay.js +0 -105
- package/dist/utils/mobx-setup.d.ts +0 -42
package/dist/source/factory.d.ts
CHANGED
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* adapter
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* `AbloSourceOptions` lives here (not `types.ts`) because it references the
|
|
9
|
-
* ORM `DataSourceAdapter` — keeping it with the factory keeps `types.ts` a
|
|
10
|
-
* dependency-free leaf for `adapter.ts`/`contract.ts` to import from.
|
|
2
|
+
* Builds the Data Source request handler returned by `abloSource()` and its alias
|
|
3
|
+
* `dataSource()`. Given your options — the schema, the API key, and either
|
|
4
|
+
* per-model handlers or an ORM adapter — the handler verifies each signed request,
|
|
5
|
+
* enforces the per-key scopes, and routes the four wire operations (`load`,
|
|
6
|
+
* `list`, `commit`, and `events`) to whichever handlers you configured.
|
|
11
7
|
*/
|
|
12
8
|
import type { Schema, SchemaRecord, InferCreate } from '../schema/schema.js';
|
|
13
9
|
import type { DataSourceAdapter } from './adapter.js';
|
|
@@ -20,39 +16,33 @@ type SourceModels<S extends SchemaRecord, TAuth> = Partial<{
|
|
|
20
16
|
export type AbloSourceOptions<S extends SchemaRecord, TAuth = unknown> = {
|
|
21
17
|
readonly schema: Schema<S>;
|
|
22
18
|
/**
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* verification before any handler runs.
|
|
19
|
+
* Your Ablo project credential. Ablo signs each Data Source call with the same
|
|
20
|
+
* project API key your server-side SDK already uses, so your environment holds a
|
|
21
|
+
* single Ablo credential and every request is signature-verified before any
|
|
22
|
+
* handler runs.
|
|
28
23
|
*/
|
|
29
24
|
readonly apiKey: SourceApiKey;
|
|
30
25
|
/**
|
|
31
|
-
*
|
|
26
|
+
* How much clock skew to tolerate when verifying a request's signed timestamp.
|
|
27
|
+
* Defaults to five minutes.
|
|
32
28
|
*/
|
|
33
29
|
readonly signatureToleranceMs?: number;
|
|
34
30
|
/**
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* credentials
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* runs. `authorize` should only attach business context.
|
|
31
|
+
* Attaches your own context to a verified request and returns it — for example a
|
|
32
|
+
* database handle, an account scope, or the current actor. Keep database
|
|
33
|
+
* credentials inside this function's environment and never send them to Ablo. The
|
|
34
|
+
* signature has already been checked against `apiKey` by the time this runs, so
|
|
35
|
+
* `authorize` only needs to supply business context, not re-verify the caller.
|
|
41
36
|
*/
|
|
42
37
|
readonly authorize?: (context: SourceAuthorizeContext) => Promise<TAuth> | TAuth;
|
|
43
38
|
/**
|
|
44
|
-
*
|
|
45
|
-
* the
|
|
46
|
-
*
|
|
47
|
-
* `source_forbidden` if not allowed
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
* `webhook-id` prefix, a custom header, or the API key itself) and
|
|
52
|
-
* look up the scopes for that key in their store.
|
|
53
|
-
*
|
|
54
|
-
* When omitted, all operations are allowed. Returning an empty set
|
|
55
|
-
* denies all operations.
|
|
39
|
+
* Resolves the set of operations a request's key may perform. When you provide
|
|
40
|
+
* it, the handler checks the operation the request is asking for (`load`, `list`,
|
|
41
|
+
* `commit`, or `events`) against the returned set and responds 403
|
|
42
|
+
* `source_forbidden` if it is not allowed, before any model handler runs. A
|
|
43
|
+
* typical implementation reads a key id from the request — a `webhook-id` prefix,
|
|
44
|
+
* a custom header, or the API key itself — and looks that key's scopes up in your
|
|
45
|
+
* store. Omit it to allow every operation; return an empty set to deny them all.
|
|
56
46
|
*/
|
|
57
47
|
readonly resolveScopes?: (params: {
|
|
58
48
|
readonly auth: TAuth;
|
|
@@ -60,45 +50,43 @@ export type AbloSourceOptions<S extends SchemaRecord, TAuth = unknown> = {
|
|
|
60
50
|
readonly body: SourceRequest;
|
|
61
51
|
}) => Promise<ReadonlySet<SourceScope> | readonly SourceScope[]> | ReadonlySet<SourceScope> | readonly SourceScope[];
|
|
62
52
|
/**
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
* one
|
|
53
|
+
* Handles a commit atomically across every model it touches. Prefer this in real
|
|
54
|
+
* applications: a single user action can change several models at once and should
|
|
55
|
+
* run inside one transaction you control.
|
|
66
56
|
*/
|
|
67
57
|
readonly commit?: SourceCommitHandler<TAuth>;
|
|
68
58
|
/**
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
* `event.id` values and filters SDK-origin echoes when rows carry
|
|
76
|
-
* the originating `clientTxId`; customers should persist both fields
|
|
77
|
-
* in their outbox table.
|
|
59
|
+
* Reports changes that happened outside the SDK — cron jobs, dashboard edits,
|
|
60
|
+
* batch imports — which Ablo polls for. Each event you return becomes a delta and
|
|
61
|
+
* fans out to connected clients. You can return your outbox rows directly: Ablo
|
|
62
|
+
* dedupes on the stable `event.id` and drops echoes of the SDK's own writes when a
|
|
63
|
+
* row carries the originating `clientTxId`, so store both fields in your outbox
|
|
64
|
+
* table.
|
|
78
65
|
*/
|
|
79
66
|
readonly events?: SourceEventsHandler<TAuth>;
|
|
80
67
|
/**
|
|
81
|
-
*
|
|
82
|
-
* `abloSource({ schema, files: { load, list, commit } })
|
|
68
|
+
* Groups per-model handlers under a `models` key. The spread form below is
|
|
69
|
+
* usually shorter — `abloSource({ schema, files: { load, list, commit } })` —
|
|
70
|
+
* but this explicit form is available when you prefer it.
|
|
83
71
|
*/
|
|
84
72
|
readonly models?: SourceModels<S, TAuth>;
|
|
85
73
|
/**
|
|
86
|
-
* An ORM adapter
|
|
87
|
-
*
|
|
88
|
-
* events — so
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
74
|
+
* An ORM adapter, such as `prismaDataSource(prisma, schema)`. When set, it serves
|
|
75
|
+
* all four operations on its own — reads for `load` and `list`, an idempotent
|
|
76
|
+
* `commit` backed by the outbox, and `events` — so you write no handlers by hand.
|
|
77
|
+
* Because rows travel as JSON, the adapter is applied at a single generic
|
|
78
|
+
* dispatch point and needs no per-model types. Use either an adapter or
|
|
79
|
+
* hand-written handlers, not both.
|
|
92
80
|
*/
|
|
93
81
|
readonly adapter?: DataSourceAdapter;
|
|
94
82
|
} & SourceModels<S, TAuth>;
|
|
95
83
|
/**
|
|
96
|
-
*
|
|
84
|
+
* Creates a Data Source endpoint you host in front of your own database.
|
|
97
85
|
*
|
|
98
|
-
*
|
|
99
|
-
* This helper is
|
|
100
|
-
*
|
|
101
|
-
*
|
|
86
|
+
* Your application code still reads and writes through Ablo, as in
|
|
87
|
+
* `ablo.files.load`, `.list`, and `.update`. This helper is for keeping the
|
|
88
|
+
* canonical rows in your database: Ablo calls a narrow, signed endpoint you
|
|
89
|
+
* control rather than holding your database credentials.
|
|
102
90
|
*/
|
|
103
91
|
export declare function abloSource<const S extends SchemaRecord, TAuth = unknown>(options: AbloSourceOptions<S, TAuth>): (request: Request) => Promise<Response>;
|
|
104
92
|
export type DataSourceOptions<S extends SchemaRecord, TAuth = unknown> = AbloSourceOptions<S, TAuth>;
|
package/dist/source/factory.js
CHANGED
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* adapter
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* `AbloSourceOptions` lives here (not `types.ts`) because it references the
|
|
9
|
-
* ORM `DataSourceAdapter` — keeping it with the factory keeps `types.ts` a
|
|
10
|
-
* dependency-free leaf for `adapter.ts`/`contract.ts` to import from.
|
|
2
|
+
* Builds the Data Source request handler returned by `abloSource()` and its alias
|
|
3
|
+
* `dataSource()`. Given your options — the schema, the API key, and either
|
|
4
|
+
* per-model handlers or an ORM adapter — the handler verifies each signed request,
|
|
5
|
+
* enforces the per-key scopes, and routes the four wire operations (`load`,
|
|
6
|
+
* `list`, `commit`, and `events`) to whichever handlers you configured.
|
|
11
7
|
*/
|
|
12
8
|
import { changeSetSchema } from './contract.js';
|
|
13
9
|
import { SourceSignatureError, verifyAbloSourceRequest, } from './signing.js';
|
|
@@ -18,9 +14,9 @@ function json(data, status = 200) {
|
|
|
18
14
|
});
|
|
19
15
|
}
|
|
20
16
|
/**
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
17
|
+
* Serves one request from an ORM `adapter`, mapping each of the four operations to
|
|
18
|
+
* the adapter's `read`, `commit`, or `events` method and shaping the wire response.
|
|
19
|
+
* The adapter is the only dispatch point, so there is no per-model branching here.
|
|
24
20
|
*/
|
|
25
21
|
async function handleViaAdapter(adapter, body, scope) {
|
|
26
22
|
if (body.type === 'load') {
|
|
@@ -89,10 +85,9 @@ async function resolveApiKey(apiKey, context) {
|
|
|
89
85
|
return typeof apiKey === 'function' ? apiKey(context) : apiKey;
|
|
90
86
|
}
|
|
91
87
|
/**
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
* pressure for keeping the scope vocabulary in sync with the wire.
|
|
88
|
+
* Maps a wire request to the single scope it requires. The mapping is exhaustive,
|
|
89
|
+
* so a new request type must be given its own scope, keeping the scope vocabulary
|
|
90
|
+
* in step with the set of operations.
|
|
96
91
|
*/
|
|
97
92
|
function scopeFor(body) {
|
|
98
93
|
switch (body.type) {
|
|
@@ -129,12 +124,12 @@ function sameModel(operations) {
|
|
|
129
124
|
return operations.every((op) => op.model === first) ? first : null;
|
|
130
125
|
}
|
|
131
126
|
/**
|
|
132
|
-
*
|
|
127
|
+
* Creates a Data Source endpoint you host in front of your own database.
|
|
133
128
|
*
|
|
134
|
-
*
|
|
135
|
-
* This helper is
|
|
136
|
-
*
|
|
137
|
-
*
|
|
129
|
+
* Your application code still reads and writes through Ablo, as in
|
|
130
|
+
* `ablo.files.load`, `.list`, and `.update`. This helper is for keeping the
|
|
131
|
+
* canonical rows in your database: Ablo calls a narrow, signed endpoint you
|
|
132
|
+
* control rather than holding your database credentials.
|
|
138
133
|
*/
|
|
139
134
|
export function abloSource(options) {
|
|
140
135
|
return async function handleAbloSource(request) {
|
|
@@ -180,9 +175,9 @@ export function abloSource(options) {
|
|
|
180
175
|
const auth = options.authorize
|
|
181
176
|
? await options.authorize({ request, body, rawBody })
|
|
182
177
|
: undefined;
|
|
183
|
-
//
|
|
184
|
-
//
|
|
185
|
-
//
|
|
178
|
+
// Enforce the per-key scope. When `resolveScopes` is set, it returns the
|
|
179
|
+
// operations this key may invoke, and we check the request against that set
|
|
180
|
+
// before any model handler runs.
|
|
186
181
|
if (options.resolveScopes) {
|
|
187
182
|
const required = scopeFor(body);
|
|
188
183
|
const granted = await options.resolveScopes({ auth, request, body });
|
|
@@ -202,9 +197,9 @@ export function abloSource(options) {
|
|
|
202
197
|
signedAt: signature?.signedAt,
|
|
203
198
|
...(body.scope ? { scope: body.scope } : {}),
|
|
204
199
|
};
|
|
205
|
-
//
|
|
206
|
-
//
|
|
207
|
-
//
|
|
200
|
+
// When an ORM adapter is configured it serves every operation here, at the
|
|
201
|
+
// generic layer where rows are plain JSON, so there is no per-model handler
|
|
202
|
+
// lookup on this path.
|
|
208
203
|
if (options.adapter) {
|
|
209
204
|
return handleViaAdapter(options.adapter, body, context.scope);
|
|
210
205
|
}
|
package/dist/source/index.d.ts
CHANGED
|
@@ -1,21 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* The entry point for the Data Source API, re-exporting the pieces you need from
|
|
3
|
+
* their individual modules:
|
|
3
4
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* adapters) import the leaves directly instead of routing a runtime circular
|
|
7
|
-
* dependency through this barrel.
|
|
8
|
-
*
|
|
9
|
-
* - `types.ts` — shared wire/handler types + `sourceEventForOperation`
|
|
10
|
-
* - `signing.ts` — Standard Webhooks request signing/verification
|
|
5
|
+
* - `types.ts` — the shared wire and handler types, plus `sourceEventForOperation`
|
|
6
|
+
* - `signing.ts` — request signing and verification
|
|
11
7
|
* - `factory.ts` — the `abloSource()` / `dataSource()` endpoint factory
|
|
8
|
+
*
|
|
9
|
+
* Import from here; the sibling modules import one another directly.
|
|
12
10
|
*/
|
|
13
11
|
export { sourceEventForOperation, type SourcePrimitive, type SourceWhere, type SourceListQuery, type SourceListPage, type SourceListResult, type SourceRequestContext, type SourceOperation, type SourceDelta, type SourceEvent, type SourceEventForOperationOptions, type SourceCommitResult, type SourceCommitParams, type SourceScope, type SourceEventsResult, type SourceEventsHandler, type SourceAuthorizeContext, type SourceHandlerContext, type SourceModelHandlers, type SourceCommitHandler, type SourceApiKey, type SourceLoadRequest, type SourceListRequest, type SourceCommitRequest, type SourceEventsRequest, type SourceRequest, type SourceResponse, type DataSourcePrimitive, type DataSourceWhere, type DataSourceListQuery, type DataSourceListPage, type DataSourceListResult, type DataSourceRequestContext, type DataSourceOperation, type DataSourceDelta, type DataSourceEvent, type DataSourceEventForOperationOptions, type DataSourceCommitResult, type DataSourceCommitParams, type DataSourceScope, type DataSourceEventsResult, type DataSourceEventsHandler, type DataSourceAuthorizeContext, type DataSourceHandlerContext, type DataSourceModelHandlers, type DataSourceCommitHandler, type DataSourceApiKey, type DataSourceLoadRequest, type DataSourceListRequest, type DataSourceCommitRequest, type DataSourceEventsRequest, type DataSourceRequest, type DataSourceResponse, } from './types.js';
|
|
14
12
|
export { ABLO_SOURCE_HEADERS, SourceSignatureError, signAbloSourceRequest, verifyAbloSourceRequest, type SourceSignatureOptions, type SourceSignatureVerificationOptions, type SourceSignatureVerificationResult, type DataSourceSignatureOptions, type DataSourceSignatureVerificationOptions, type DataSourceSignatureVerificationResult, } from './signing.js';
|
|
15
13
|
export { abloSource, dataSource, type AbloSourceOptions, type DataSourceOptions, } from './factory.js';
|
|
16
14
|
export { createPushQueue, InMemoryPushQueueStorage, STANDARD_WEBHOOKS_RETRY_SCHEDULE, type PushQueue, type PushQueueItem, type PushQueueOptions, type PushQueueStorage, } from './pushQueue.js';
|
|
17
15
|
export { createSourceConnector, DEFAULT_RECONNECT_SCHEDULE, type SourceConnector, type SourceConnectorOptions, type ConnectorWebSocket, type ConnectorWebSocketFactory, type ConnectorStatus, } from './connector.js';
|
|
18
|
-
export { SOURCE_CONNECTOR_PROTOCOL_VERSION, SOURCE_CONNECTOR_WS_PATH, WS_SOURCE_SUBPROTOCOL, sourceConnectorSubprotocols, encodeFrame, decodeFrame, ConnectorProtocolError, connectorFrameSchema, type ConnectorFrame, type RegisterFrame, type ReadyFrame, type RequestFrame, type ResponseFrame, type ErrorFrame, } from './
|
|
16
|
+
export { SOURCE_CONNECTOR_PROTOCOL_VERSION, SOURCE_CONNECTOR_WS_PATH, WS_SOURCE_SUBPROTOCOL, sourceConnectorSubprotocols, encodeFrame, decodeFrame, ConnectorProtocolError, connectorFrameSchema, type ConnectorFrame, type RegisterFrame, type ReadyFrame, type RequestFrame, type ResponseFrame, type ErrorFrame, } from './connectorProtocol.js';
|
|
19
17
|
export { type DataSourceAdapter, type AdapterReadRequest, type AdapterCommitResult, type Row as AdapterRow, } from './adapter.js';
|
|
20
18
|
export { operationSchema, operationTypeSchema, changeSetSchema, outboxEventSchema, eventsPageSchema, migrationSchema, adapterCapabilitiesSchema, type Operation, type ChangeSet, type OutboxEvent, type EventsPage, type Migration, type AdapterCapabilities, } from './contract.js';
|
|
21
19
|
export { prismaDataSource, type PrismaLike, type PrismaDataSourceOptions } from './adapters/prisma.js';
|
package/dist/source/index.js
CHANGED
|
@@ -1,26 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* The entry point for the Data Source API, re-exporting the pieces you need from
|
|
3
|
+
* their individual modules:
|
|
3
4
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* adapters) import the leaves directly instead of routing a runtime circular
|
|
7
|
-
* dependency through this barrel.
|
|
8
|
-
*
|
|
9
|
-
* - `types.ts` — shared wire/handler types + `sourceEventForOperation`
|
|
10
|
-
* - `signing.ts` — Standard Webhooks request signing/verification
|
|
5
|
+
* - `types.ts` — the shared wire and handler types, plus `sourceEventForOperation`
|
|
6
|
+
* - `signing.ts` — request signing and verification
|
|
11
7
|
* - `factory.ts` — the `abloSource()` / `dataSource()` endpoint factory
|
|
8
|
+
*
|
|
9
|
+
* Import from here; the sibling modules import one another directly.
|
|
12
10
|
*/
|
|
13
11
|
export { sourceEventForOperation, } from './types.js';
|
|
14
12
|
export { ABLO_SOURCE_HEADERS, SourceSignatureError, signAbloSourceRequest, verifyAbloSourceRequest, } from './signing.js';
|
|
15
13
|
export { abloSource, dataSource, } from './factory.js';
|
|
16
14
|
export { createPushQueue, InMemoryPushQueueStorage, STANDARD_WEBHOOKS_RETRY_SCHEDULE, } from './pushQueue.js';
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
// Source
|
|
20
|
-
//
|
|
15
|
+
// The reverse-channel connector — an outbound transport for the load, list, and
|
|
16
|
+
// commit leg, and the dial-out counterpart to `createPushQueue`. It lets you serve
|
|
17
|
+
// a Data Source from localhost or a private network that has no public inbound
|
|
18
|
+
// URL. See `connectorProtocol.ts` for the frames it exchanges.
|
|
21
19
|
export { createSourceConnector, DEFAULT_RECONNECT_SCHEDULE, } from './connector.js';
|
|
22
|
-
export { SOURCE_CONNECTOR_PROTOCOL_VERSION, SOURCE_CONNECTOR_WS_PATH, WS_SOURCE_SUBPROTOCOL, sourceConnectorSubprotocols, encodeFrame, decodeFrame, ConnectorProtocolError, connectorFrameSchema, } from './
|
|
23
|
-
//
|
|
20
|
+
export { SOURCE_CONNECTOR_PROTOCOL_VERSION, SOURCE_CONNECTOR_WS_PATH, WS_SOURCE_SUBPROTOCOL, sourceConnectorSubprotocols, encodeFrame, decodeFrame, ConnectorProtocolError, connectorFrameSchema, } from './connectorProtocol.js';
|
|
21
|
+
// The Data Source adapter interface and its Zod contract, with per-ORM implementations.
|
|
24
22
|
export {} from './adapter.js';
|
|
25
23
|
export { operationSchema, operationTypeSchema, changeSetSchema, outboxEventSchema, eventsPageSchema, migrationSchema, adapterCapabilitiesSchema, } from './contract.js';
|
|
26
24
|
export { prismaDataSource } from './adapters/prisma.js';
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The table-creation SQL every ORM adapter ships for its
|
|
3
|
-
* `ablo_idempotency
|
|
4
|
-
* outbox the `events()` feed reads
|
|
5
|
-
* Drizzle adapter, and `ablo migrate`
|
|
6
|
-
*
|
|
2
|
+
* The table-creation SQL every ORM adapter ships for its own infrastructure
|
|
3
|
+
* tables: `ablo_idempotency`, which dedupes commits by `clientTxId`, and
|
|
4
|
+
* `ablo_outbox`, the transactional outbox the `events()` feed reads. Defining it in
|
|
5
|
+
* one place keeps the Prisma adapter, the Drizzle adapter, and `ablo migrate` in
|
|
6
|
+
* agreement on the exact shape.
|
|
7
7
|
*
|
|
8
|
-
* These are
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* These are infrastructure tables, not model tables, and they exist only on your
|
|
9
|
+
* own database when you run a Data Source. Ablo's hosted storage does not use them;
|
|
10
|
+
* it records changes in its own `sync_deltas` log instead.
|
|
11
11
|
*/
|
|
12
12
|
import type { Migration } from './contract.js';
|
|
13
|
-
/**
|
|
13
|
+
/** Returns the adapter's table-creation migrations. The SQL is idempotent, guarded by `IF NOT EXISTS`. */
|
|
14
14
|
export declare function adapterTableMigrations(): readonly Migration[];
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The table-creation SQL every ORM adapter ships for its
|
|
3
|
-
* `ablo_idempotency
|
|
4
|
-
* outbox the `events()` feed reads
|
|
5
|
-
* Drizzle adapter, and `ablo migrate`
|
|
6
|
-
*
|
|
2
|
+
* The table-creation SQL every ORM adapter ships for its own infrastructure
|
|
3
|
+
* tables: `ablo_idempotency`, which dedupes commits by `clientTxId`, and
|
|
4
|
+
* `ablo_outbox`, the transactional outbox the `events()` feed reads. Defining it in
|
|
5
|
+
* one place keeps the Prisma adapter, the Drizzle adapter, and `ablo migrate` in
|
|
6
|
+
* agreement on the exact shape.
|
|
7
7
|
*
|
|
8
|
-
* These are
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* These are infrastructure tables, not model tables, and they exist only on your
|
|
9
|
+
* own database when you run a Data Source. Ablo's hosted storage does not use them;
|
|
10
|
+
* it records changes in its own `sync_deltas` log instead.
|
|
11
11
|
*/
|
|
12
|
-
/**
|
|
12
|
+
/** Returns the adapter's table-creation migrations. The SQL is idempotent, guarded by `IF NOT EXISTS`. */
|
|
13
13
|
export function adapterTableMigrations() {
|
|
14
14
|
return [
|
|
15
15
|
{
|
package/dist/source/next.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Next.js App Router
|
|
3
|
-
* returns a
|
|
4
|
-
* accepts directly
|
|
5
|
-
*
|
|
2
|
+
* A thin Next.js App Router wrapper for a Data Source. The core `dataSource()`
|
|
3
|
+
* already returns a standard `(Request) => Promise<Response>`, which the App Router
|
|
4
|
+
* accepts directly, so this helper adds only convenience: it names the handler
|
|
5
|
+
* `POST` so your route file can export it in one line.
|
|
6
6
|
*
|
|
7
7
|
* // app/api/ablo/source/route.ts
|
|
8
8
|
* import { dataSourceNext } from '@abloatai/ablo/source/next';
|
|
@@ -16,16 +16,15 @@
|
|
|
16
16
|
* adapter: prismaDataSource(prisma, schema),
|
|
17
17
|
* });
|
|
18
18
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* — not pre-built.
|
|
19
|
+
* For hand-written handlers, or another framework, call the core `dataSource()`
|
|
20
|
+
* directly and export its result however that framework expects.
|
|
22
21
|
*/
|
|
23
22
|
import type { SchemaRecord } from '../schema/schema.js';
|
|
24
23
|
import { type DataSourceOptions } from './factory.js';
|
|
25
24
|
/**
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
25
|
+
* The options for `dataSourceNext`, which are exactly the core
|
|
26
|
+
* `DataSourceOptions`. Pass `{ schema, apiKey, adapter }`, the same shape
|
|
27
|
+
* `dataSource()` takes.
|
|
29
28
|
*/
|
|
30
29
|
export type DataSourceNextOptions<S extends SchemaRecord, TAuth = unknown> = DataSourceOptions<S, TAuth>;
|
|
31
30
|
export declare function dataSourceNext<const S extends SchemaRecord, TAuth = unknown>(options: DataSourceNextOptions<S, TAuth>): {
|
package/dist/source/next.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Next.js App Router
|
|
3
|
-
* returns a
|
|
4
|
-
* accepts directly
|
|
5
|
-
*
|
|
2
|
+
* A thin Next.js App Router wrapper for a Data Source. The core `dataSource()`
|
|
3
|
+
* already returns a standard `(Request) => Promise<Response>`, which the App Router
|
|
4
|
+
* accepts directly, so this helper adds only convenience: it names the handler
|
|
5
|
+
* `POST` so your route file can export it in one line.
|
|
6
6
|
*
|
|
7
7
|
* // app/api/ablo/source/route.ts
|
|
8
8
|
* import { dataSourceNext } from '@abloatai/ablo/source/next';
|
|
@@ -16,9 +16,8 @@
|
|
|
16
16
|
* adapter: prismaDataSource(prisma, schema),
|
|
17
17
|
* });
|
|
18
18
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* — not pre-built.
|
|
19
|
+
* For hand-written handlers, or another framework, call the core `dataSource()`
|
|
20
|
+
* directly and export its result however that framework expects.
|
|
22
21
|
*/
|
|
23
22
|
import { dataSource } from './factory.js';
|
|
24
23
|
export function dataSourceNext(options) {
|
|
@@ -1,100 +1,122 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* A durable retry queue for delivering source events to the server.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* drops, or
|
|
7
|
-
*
|
|
8
|
-
*
|
|
4
|
+
* When your application changes a row, it can push the resulting event to
|
|
5
|
+
* the server, which acknowledges delivery synchronously. If your process
|
|
6
|
+
* crashes mid-call, the network drops, or the server returns a 5xx, that
|
|
7
|
+
* event would be lost without a safety net. This queue is the safety net:
|
|
8
|
+
* it persists each event first, then delivers it from a background worker
|
|
9
|
+
* with automatic retries. (Polling the change feed is the slower fallback
|
|
10
|
+
* for anything the queue never manages to deliver.)
|
|
9
11
|
*
|
|
10
|
-
*
|
|
11
|
-
* queue+worker pattern matching Stripe / Svix semantics:
|
|
12
|
+
* The queue follows a familiar enqueue-and-worker shape:
|
|
12
13
|
*
|
|
13
|
-
* - `enqueue(events)` returns
|
|
14
|
-
* - background worker delivers and retries
|
|
15
|
-
* Webhooks schedule (0, 5s, 5m, 30m, 2h, 5h, 10h, 14h,
|
|
16
|
-
* —
|
|
17
|
-
* -
|
|
14
|
+
* - `enqueue(events)` returns as soon as the events are persisted.
|
|
15
|
+
* - A background worker delivers them and retries on failure, following
|
|
16
|
+
* the Standard Webhooks schedule (0, 5s, 5m, 30m, 2h, 5h, 10h, 14h,
|
|
17
|
+
* 20h, 24h — roughly three days in total).
|
|
18
|
+
* - Items that exhaust every retry move to a dead-letter queue you can
|
|
19
|
+
* monitor.
|
|
18
20
|
*
|
|
19
|
-
* Persistence is pluggable
|
|
20
|
-
*
|
|
21
|
-
* outbox table for production.
|
|
21
|
+
* Persistence is pluggable through {@link PushQueueStorage}. Use
|
|
22
|
+
* {@link InMemoryPushQueueStorage} for a single process, or implement that
|
|
23
|
+
* interface against your own outbox table for production durability.
|
|
22
24
|
*/
|
|
23
25
|
import type { SourceEvent } from './types.js';
|
|
26
|
+
/** One queued delivery: a batch of source events plus its retry bookkeeping. */
|
|
24
27
|
export interface PushQueueItem {
|
|
25
28
|
readonly id: string;
|
|
26
29
|
readonly events: readonly SourceEvent[];
|
|
27
30
|
readonly attempts: number;
|
|
28
|
-
/**
|
|
31
|
+
/** When the next attempt is due, in epoch milliseconds. The worker skips items due later. */
|
|
29
32
|
readonly nextAttemptAt: number;
|
|
30
|
-
/**
|
|
33
|
+
/** The most recent error message, set once an attempt has failed. */
|
|
31
34
|
readonly lastError?: string;
|
|
32
|
-
/** `dlq` once retries exhausted. */
|
|
35
|
+
/** `pending` while awaiting delivery, `delivered` on success, `dlq` once retries are exhausted. */
|
|
33
36
|
readonly status: 'pending' | 'delivered' | 'dlq';
|
|
34
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* The persistence behind a {@link PushQueue}. Implement it against your own
|
|
40
|
+
* durable table (or use {@link InMemoryPushQueueStorage}) so queued events
|
|
41
|
+
* survive a process restart. The queue calls these methods; you decide where
|
|
42
|
+
* the rows actually live.
|
|
43
|
+
*/
|
|
35
44
|
export interface PushQueueStorage {
|
|
36
45
|
/**
|
|
37
|
-
* Append a new item
|
|
38
|
-
*
|
|
39
|
-
* `nextAttemptAt
|
|
46
|
+
* Append a new item and return the persisted record. Generate a stable id
|
|
47
|
+
* — it doubles as the `webhook-id` on the delivered request — and set
|
|
48
|
+
* `nextAttemptAt` to the current time so the item is due immediately.
|
|
40
49
|
*/
|
|
41
50
|
enqueue(events: readonly SourceEvent[]): Promise<PushQueueItem>;
|
|
42
|
-
/**
|
|
51
|
+
/** Return pending items whose `nextAttemptAt` is at or before `now`, up to `limit`. */
|
|
43
52
|
due(now: number, limit: number): Promise<readonly PushQueueItem[]>;
|
|
44
|
-
/**
|
|
53
|
+
/** Increase the attempt count and set the next attempt time after a failed delivery. */
|
|
45
54
|
reschedule(id: string, nextAttemptAt: number, lastError: string): Promise<void>;
|
|
46
|
-
/** Mark the item delivered
|
|
55
|
+
/** Mark the item delivered so no further attempts are made. */
|
|
47
56
|
markDelivered(id: string): Promise<void>;
|
|
48
|
-
/**
|
|
57
|
+
/** Move the item to the dead-letter queue after its retries are exhausted. */
|
|
49
58
|
markDlq(id: string, lastError: string): Promise<void>;
|
|
50
|
-
/** Read
|
|
59
|
+
/** Read the dead-letter queue. Your monitoring reads this to surface deliveries that never succeeded. */
|
|
51
60
|
listDlq(): Promise<readonly PushQueueItem[]>;
|
|
52
61
|
}
|
|
53
62
|
/**
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
63
|
+
* The default retry schedule, taken from the Standard Webhooks
|
|
64
|
+
* specification. The index is the attempt number and the value is the delay
|
|
65
|
+
* in milliseconds after the previous attempt failed. Once an item runs off
|
|
66
|
+
* the end of this array, it moves to the dead-letter queue.
|
|
57
67
|
*
|
|
58
|
-
*
|
|
68
|
+
* See https://www.standardwebhooks.com/.
|
|
59
69
|
*/
|
|
60
70
|
export declare const STANDARD_WEBHOOKS_RETRY_SCHEDULE: readonly number[];
|
|
71
|
+
/** Configuration for {@link createPushQueue}. */
|
|
61
72
|
export interface PushQueueOptions {
|
|
73
|
+
/** The URL the worker delivers events to. */
|
|
62
74
|
readonly endpoint: string;
|
|
75
|
+
/** The API key used to sign each delivery. */
|
|
63
76
|
readonly apiKey: string;
|
|
77
|
+
/** Where queued items are persisted. */
|
|
64
78
|
readonly storage: PushQueueStorage;
|
|
65
79
|
/**
|
|
66
|
-
* Override the retry delays.
|
|
67
|
-
* The number of attempts equals the array length
|
|
68
|
-
*
|
|
80
|
+
* Override the retry delays. Defaults to {@link STANDARD_WEBHOOKS_RETRY_SCHEDULE}.
|
|
81
|
+
* The number of attempts equals the array length, and the i-th entry is the
|
|
82
|
+
* delay after attempt `i` failed.
|
|
69
83
|
*/
|
|
70
84
|
readonly retrySchedule?: readonly number[];
|
|
71
|
-
/**
|
|
85
|
+
/** How often the worker checks for due items, in milliseconds. Defaults to 1000. */
|
|
72
86
|
readonly tickIntervalMs?: number;
|
|
73
|
-
/**
|
|
87
|
+
/** The most items the worker delivers per tick. Defaults to 50. */
|
|
74
88
|
readonly batchSize?: number;
|
|
75
|
-
/**
|
|
89
|
+
/** A custom fetch implementation, for tests or runtimes without a global `fetch`. */
|
|
76
90
|
readonly fetch?: typeof fetch;
|
|
77
|
-
/**
|
|
91
|
+
/** A custom clock source, mainly for tests. Defaults to `Date.now`. */
|
|
78
92
|
readonly now?: () => number;
|
|
79
|
-
/** Random jitter
|
|
93
|
+
/** Random jitter applied to each retry delay, as a fraction. Defaults to ±10%; set 0 to disable. */
|
|
80
94
|
readonly jitter?: number;
|
|
95
|
+
/** Called when an item is dead-lettered or the worker loop hits an error. */
|
|
81
96
|
readonly onError?: (item: PushQueueItem, err: unknown) => void;
|
|
82
97
|
}
|
|
98
|
+
/** A running push queue: persist events, deliver them, and recover dead-lettered ones. */
|
|
83
99
|
export interface PushQueue {
|
|
100
|
+
/** Persist a batch of events for delivery and return the queued item. */
|
|
84
101
|
enqueue(events: readonly SourceEvent[]): Promise<PushQueueItem>;
|
|
85
|
-
/** Run the worker
|
|
102
|
+
/** Run the delivery worker until `signal` aborts. */
|
|
86
103
|
run(signal: AbortSignal): Promise<void>;
|
|
87
|
-
/**
|
|
104
|
+
/**
|
|
105
|
+
* Re-enqueue every dead-lettered item for another round of delivery. Call
|
|
106
|
+
* this yourself once you have fixed whatever caused the failures. Returns
|
|
107
|
+
* the number of items re-enqueued.
|
|
108
|
+
*/
|
|
88
109
|
redriveDlq(): Promise<number>;
|
|
89
110
|
}
|
|
111
|
+
/** Create a {@link PushQueue} from the given {@link PushQueueOptions}. */
|
|
90
112
|
export declare function createPushQueue(options: PushQueueOptions): PushQueue;
|
|
113
|
+
/**
|
|
114
|
+
* A {@link PushQueueStorage} that keeps items in memory. It is not durable —
|
|
115
|
+
* items are lost when the process restarts — so it suits development and
|
|
116
|
+
* low-volume use. For production, implement {@link PushQueueStorage} against
|
|
117
|
+
* your own table.
|
|
118
|
+
*/
|
|
91
119
|
export declare class InMemoryPushQueueStorage implements PushQueueStorage {
|
|
92
|
-
/**
|
|
93
|
-
* Real implementation, not a mock. Suitable for low-volume single-
|
|
94
|
-
* process customers; not durable across restarts (in-flight items
|
|
95
|
-
* are lost). Production customers should swap in a SQL-backed
|
|
96
|
-
* storage that writes to their existing outbox table.
|
|
97
|
-
*/
|
|
98
120
|
private items;
|
|
99
121
|
private nextId;
|
|
100
122
|
private readonly now;
|