@abloatai/ablo 0.25.0 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +5 -3
- package/CHANGELOG.md +34 -0
- package/README.md +104 -88
- package/dist/BaseSyncedStore.d.ts +140 -266
- package/dist/BaseSyncedStore.js +338 -739
- package/dist/Database.d.ts +62 -77
- package/dist/Database.js +106 -127
- package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
- package/dist/{ObjectPool.js → InstanceCache.js} +91 -83
- package/dist/LazyReferenceCollection.d.ts +11 -15
- package/dist/LazyReferenceCollection.js +16 -15
- package/dist/Model.d.ts +37 -52
- package/dist/Model.js +52 -69
- package/dist/ModelRegistry.d.ts +46 -25
- package/dist/ModelRegistry.js +32 -30
- package/dist/NetworkMonitor.d.ts +5 -6
- package/dist/NetworkMonitor.js +6 -7
- package/dist/SyncClient.d.ts +119 -109
- package/dist/SyncClient.js +303 -224
- package/dist/SyncEngineContext.d.ts +1 -3
- package/dist/SyncEngineContext.js +1 -2
- package/dist/adapters/alwaysOnline.d.ts +6 -8
- package/dist/adapters/alwaysOnline.js +6 -8
- package/dist/adapters/inMemoryStorage.d.ts +9 -9
- package/dist/adapters/inMemoryStorage.js +9 -9
- package/dist/agent/Agent.d.ts +39 -31
- package/dist/agent/Agent.js +35 -23
- 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} +30 -31
- package/dist/ai-sdk/index.d.ts +25 -22
- package/dist/ai-sdk/index.js +25 -22
- package/dist/ai-sdk/wrap.d.ts +7 -8
- package/dist/ai-sdk/wrap.js +2 -2
- package/dist/auth/credentialPolicy.d.ts +74 -71
- package/dist/auth/credentialPolicy.js +51 -56
- package/dist/auth/credentialSource.d.ts +7 -18
- package/dist/auth/credentialSource.js +10 -18
- package/dist/auth/index.d.ts +59 -58
- package/dist/auth/index.js +34 -40
- 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 +483 -369
- package/dist/client/Ablo.d.ts +107 -836
- package/dist/client/Ablo.js +174 -833
- package/dist/client/ApiClient.d.ts +44 -20
- package/dist/client/ApiClient.js +193 -44
- package/dist/client/auth.d.ts +51 -60
- package/dist/client/auth.js +137 -110
- package/dist/client/claimHeartbeatLoop.d.ts +50 -0
- package/dist/client/claimHeartbeatLoop.js +88 -0
- package/dist/client/consoleLogger.d.ts +35 -0
- package/dist/client/consoleLogger.js +44 -0
- package/dist/client/createInternalComponents.d.ts +14 -17
- package/dist/client/createInternalComponents.js +26 -31
- package/dist/client/createModelProxy.d.ts +130 -120
- package/dist/client/createModelProxy.js +158 -124
- package/dist/client/credentialEndpoint.d.ts +61 -0
- package/dist/client/credentialEndpoint.js +86 -0
- package/dist/client/functionalUpdate.d.ts +29 -27
- package/dist/client/functionalUpdate.js +21 -21
- package/dist/client/hostedEndpoints.d.ts +21 -0
- package/dist/client/hostedEndpoints.js +21 -0
- package/dist/client/httpClient.d.ts +58 -54
- package/dist/client/httpClient.js +29 -31
- package/dist/client/identity.d.ts +15 -20
- package/dist/client/identity.js +49 -59
- package/dist/client/modelRegistration.d.ts +10 -0
- package/dist/client/modelRegistration.js +301 -0
- package/dist/client/options.d.ts +373 -0
- package/dist/client/options.js +6 -0
- package/dist/client/registerDataSource.d.ts +9 -9
- package/dist/client/registerDataSource.js +15 -16
- package/dist/client/resourceTypes.d.ts +333 -0
- package/dist/client/resourceTypes.js +7 -0
- package/dist/client/schemaConfig.d.ts +44 -0
- package/dist/client/schemaConfig.js +176 -0
- package/dist/client/sessionMint.d.ts +17 -13
- package/dist/client/sessionMint.js +26 -31
- package/dist/client/validateAbloOptions.d.ts +12 -14
- package/dist/client/validateAbloOptions.js +9 -10
- package/dist/client/writeOptionsSchema.d.ts +18 -16
- package/dist/client/writeOptionsSchema.js +23 -20
- package/dist/client/wsMutationExecutor.d.ts +28 -0
- package/dist/client/wsMutationExecutor.js +71 -0
- package/dist/context.d.ts +6 -4
- package/dist/context.js +6 -7
- package/dist/coordination/index.d.ts +13 -4
- package/dist/coordination/index.js +29 -4
- package/dist/coordination/schema.d.ts +176 -128
- package/dist/coordination/schema.js +197 -133
- package/dist/coordination/trace.d.ts +9 -11
- package/dist/coordination/trace.js +13 -15
- package/dist/core/DatabaseManager.d.ts +5 -8
- package/dist/core/DatabaseManager.js +38 -40
- package/dist/core/QueryProcessor.d.ts +7 -9
- package/dist/core/QueryProcessor.js +27 -34
- package/dist/core/QueryView.d.ts +17 -5
- package/dist/core/QueryView.js +6 -7
- package/dist/core/StoreManager.d.ts +14 -16
- package/dist/core/StoreManager.js +26 -25
- package/dist/core/ViewRegistry.d.ts +5 -5
- package/dist/core/ViewRegistry.js +4 -4
- package/dist/core/index.d.ts +18 -13
- package/dist/core/index.js +32 -26
- package/dist/core/openIDBWithTimeout.d.ts +38 -36
- package/dist/core/openIDBWithTimeout.js +57 -54
- package/dist/core/queryUtils.d.ts +45 -0
- package/dist/core/queryUtils.js +69 -0
- package/dist/core/storeContract.d.ts +145 -0
- package/dist/core/storeContract.js +12 -0
- package/dist/environment.d.ts +28 -0
- package/dist/environment.js +21 -0
- package/dist/errorCodes.d.ts +118 -101
- package/dist/errorCodes.js +277 -260
- package/dist/errors.d.ts +170 -165
- package/dist/errors.js +161 -151
- package/dist/index.d.ts +30 -27
- package/dist/index.js +90 -82
- package/dist/interfaces/index.d.ts +108 -133
- package/dist/interfaces/index.js +5 -4
- package/dist/keys/index.d.ts +27 -29
- package/dist/keys/index.js +59 -49
- package/dist/mutators/RecordingTransaction.d.ts +16 -16
- package/dist/mutators/RecordingTransaction.js +31 -37
- package/dist/mutators/Transaction.d.ts +18 -26
- package/dist/mutators/Transaction.js +14 -20
- package/dist/mutators/UndoManager.d.ts +122 -131
- package/dist/mutators/UndoManager.js +149 -155
- package/dist/mutators/defineMutators.d.ts +24 -37
- 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 +105 -101
- package/dist/policy/types.js +67 -66
- package/dist/query/client.d.ts +32 -16
- package/dist/query/client.js +103 -72
- package/dist/query/types.d.ts +37 -60
- package/dist/query/types.js +13 -33
- package/dist/react/AbloProvider.d.ts +7 -11
- package/dist/react/AbloProvider.js +24 -17
- package/dist/react/context.d.ts +27 -146
- package/dist/react/context.js +9 -10
- package/dist/react/index.d.ts +41 -42
- package/dist/react/index.js +37 -38
- package/dist/react/internalContext.d.ts +17 -19
- package/dist/react/useAblo.d.ts +23 -22
- package/dist/react/useAblo.js +17 -15
- 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 +11 -12
- package/dist/react/useMutationFailureListener.d.ts +8 -8
- package/dist/react/useMutationFailureListener.js +9 -9
- package/dist/react/useMutators.d.ts +11 -11
- package/dist/react/useMutators.js +10 -4
- package/dist/react/useReactive.js +2 -3
- package/dist/react/useSyncStatus.d.ts +4 -6
- package/dist/react/useUndoScope.d.ts +7 -9
- package/dist/react/useUndoScope.js +3 -3
- 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 +35 -0
- package/dist/schema/ddlLock.js +46 -0
- 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 +36 -49
- package/dist/schema/generate.d.ts +12 -12
- package/dist/schema/generate.js +12 -12
- package/dist/schema/index.d.ts +5 -4
- package/dist/schema/index.js +29 -21
- package/dist/schema/model.d.ts +121 -146
- package/dist/schema/model.js +24 -35
- package/dist/schema/openapi.d.ts +10 -9
- package/dist/schema/openapi.js +7 -1
- package/dist/schema/queries.d.ts +30 -32
- package/dist/schema/queries.js +24 -25
- package/dist/schema/relation.d.ts +89 -99
- package/dist/schema/relation.js +13 -13
- package/dist/schema/residency.d.ts +38 -0
- package/dist/schema/residency.js +30 -0
- package/dist/schema/roles.d.ts +45 -27
- package/dist/schema/roles.js +52 -21
- package/dist/schema/schema.d.ts +36 -45
- package/dist/schema/schema.js +42 -39
- package/dist/schema/select.d.ts +13 -13
- package/dist/schema/select.js +13 -13
- package/dist/schema/serialize.d.ts +36 -39
- 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} +27 -50
- 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 +31 -26
- package/dist/source/adapter.js +10 -10
- package/dist/source/adapters/drizzle.d.ts +28 -23
- package/dist/source/adapters/drizzle.js +34 -28
- package/dist/source/adapters/kysely.d.ts +27 -25
- package/dist/source/adapters/kysely.js +28 -26
- package/dist/source/adapters/memory.d.ts +8 -7
- package/dist/source/adapters/memory.js +10 -9
- package/dist/source/adapters/prisma.d.ts +13 -12
- package/dist/source/adapters/prisma.js +27 -29
- package/dist/source/conformance.d.ts +18 -11
- package/dist/source/conformance.js +27 -19
- package/dist/source/connector.d.ts +31 -32
- package/dist/source/connector.js +30 -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 +94 -0
- package/dist/source/factory.js +268 -0
- package/dist/source/index.d.ts +10 -462
- package/dist/source/index.js +17 -421
- package/dist/source/migrations.d.ts +9 -9
- package/dist/source/migrations.js +9 -9
- package/dist/source/next.d.ts +10 -11
- package/dist/source/next.js +7 -8
- package/dist/source/pushQueue.d.ts +70 -48
- package/dist/source/pushQueue.js +36 -29
- package/dist/source/signing.d.ts +88 -0
- package/dist/source/signing.js +159 -0
- package/dist/source/types.d.ts +351 -0
- package/dist/source/types.js +43 -0
- package/dist/stores/ObjectStore.d.ts +11 -12
- package/dist/stores/ObjectStore.js +34 -35
- package/dist/stores/ObjectStoreContract.d.ts +12 -15
- package/dist/stores/SyncActionStore.d.ts +8 -12
- package/dist/stores/SyncActionStore.js +77 -46
- package/dist/surface.d.ts +28 -21
- package/dist/surface.js +28 -20
- package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +37 -45
- package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +101 -80
- package/dist/sync/ConnectionManager.d.ts +47 -50
- package/dist/sync/ConnectionManager.js +74 -70
- package/dist/sync/NetworkProbe.d.ts +27 -31
- package/dist/sync/NetworkProbe.js +67 -72
- package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +49 -36
- package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +79 -54
- package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +45 -59
- package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +44 -52
- package/dist/sync/SyncWebSocket.d.ts +175 -250
- package/dist/sync/SyncWebSocket.js +431 -769
- package/dist/sync/awaitClaimGrant.d.ts +18 -18
- package/dist/sync/awaitClaimGrant.js +38 -30
- package/dist/sync/bootstrapApply.d.ts +70 -0
- package/dist/sync/bootstrapApply.js +73 -0
- package/dist/sync/commitFrames.d.ts +44 -0
- package/dist/sync/commitFrames.js +94 -0
- package/dist/sync/createClaimStream.d.ts +23 -22
- package/dist/sync/createClaimStream.js +108 -25
- package/dist/sync/createPresenceStream.d.ts +19 -18
- package/dist/sync/createPresenceStream.js +25 -26
- package/dist/sync/createSnapshot.d.ts +13 -17
- package/dist/sync/createSnapshot.js +20 -26
- package/dist/sync/credentialLifecycle.d.ts +175 -0
- package/dist/sync/credentialLifecycle.js +322 -0
- package/dist/sync/deltaPipeline.d.ts +113 -0
- package/dist/sync/deltaPipeline.js +261 -0
- package/dist/sync/groupChange.d.ts +113 -0
- package/dist/sync/groupChange.js +242 -0
- package/dist/sync/heartbeat.d.ts +63 -0
- package/dist/sync/heartbeat.js +91 -0
- package/dist/sync/participants.d.ts +27 -27
- package/dist/sync/schemas.d.ts +3 -2
- package/dist/sync/schemas.js +14 -10
- package/dist/sync/syncCursor.d.ts +40 -0
- package/dist/sync/syncCursor.js +55 -0
- package/dist/sync/syncPlan.d.ts +54 -0
- package/dist/sync/syncPlan.js +50 -0
- package/dist/sync/syncPosition.d.ts +54 -49
- package/dist/sync/syncPosition.js +57 -52
- package/dist/sync/wsFrameHandlers.d.ts +116 -0
- package/dist/sync/wsFrameHandlers.js +374 -0
- package/dist/testing/fixtures/bootstrap.d.ts +21 -17
- package/dist/testing/fixtures/bootstrap.js +12 -6
- package/dist/testing/fixtures/deltas.d.ts +31 -34
- package/dist/testing/fixtures/deltas.js +30 -33
- package/dist/testing/fixtures/models.d.ts +11 -10
- package/dist/testing/fixtures/models.js +12 -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 -18
- package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +14 -11
- package/dist/testing/helpers/wait.d.ts +13 -8
- package/dist/testing/helpers/wait.js +13 -8
- package/dist/testing/index.d.ts +4 -4
- package/dist/testing/index.js +3 -3
- 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 +21 -34
- package/dist/testing/mocks/MockSyncContext.js +16 -45
- package/dist/testing/mocks/MockSyncStore.d.ts +14 -14
- package/dist/testing/mocks/MockSyncStore.js +11 -11
- package/dist/testing/mocks/MockWebSocket.d.ts +28 -24
- package/dist/testing/mocks/MockWebSocket.js +22 -21
- package/dist/transactions/TransactionQueue.d.ts +190 -221
- package/dist/transactions/TransactionQueue.js +424 -822
- package/dist/transactions/TransactionStore.d.ts +20 -0
- package/dist/transactions/TransactionStore.js +53 -0
- package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
- package/dist/transactions/UnconfirmedWrites.js +104 -0
- package/dist/transactions/coalesceRules.d.ts +58 -0
- package/dist/transactions/coalesceRules.js +140 -0
- package/dist/transactions/commitPayload.d.ts +130 -0
- package/dist/transactions/commitPayload.js +143 -0
- package/dist/transactions/deltaConfirmation.d.ts +58 -0
- package/dist/transactions/deltaConfirmation.js +215 -0
- package/dist/transactions/optimisticApply.d.ts +49 -0
- package/dist/transactions/optimisticApply.js +65 -0
- package/dist/transactions/replayValidation.d.ts +99 -0
- package/dist/transactions/replayValidation.js +111 -0
- package/dist/types/global.d.ts +46 -41
- package/dist/types/global.js +20 -19
- package/dist/types/index.d.ts +74 -80
- package/dist/types/index.js +22 -27
- package/dist/types/modelData.d.ts +10 -0
- package/dist/types/modelData.js +9 -0
- package/dist/types/participant.d.ts +20 -0
- package/dist/types/participant.js +10 -0
- package/dist/types/streams.d.ts +216 -209
- 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} +44 -100
- package/dist/webhooks/events.d.ts +21 -16
- package/dist/webhooks/events.js +10 -8
- package/dist/webhooks/index.d.ts +5 -7
- package/dist/webhooks/index.js +5 -7
- package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
- package/dist/wire/delta.js +114 -0
- package/dist/wire/errorEnvelope.d.ts +35 -27
- package/dist/wire/errorEnvelope.js +38 -32
- package/dist/wire/frames.d.ts +150 -67
- package/dist/wire/frames.js +48 -1
- package/dist/wire/index.d.ts +18 -13
- package/dist/wire/index.js +36 -13
- package/dist/wire/listEnvelope.d.ts +16 -23
- package/dist/wire/listEnvelope.js +7 -6
- package/dist/wire/protocol.d.ts +38 -0
- package/dist/wire/protocol.js +38 -0
- package/dist/wire/protocolVersion.d.ts +60 -0
- package/dist/wire/protocolVersion.js +67 -0
- package/docs/api-keys.md +4 -3
- package/docs/coordination.md +59 -0
- package/docs/examples/existing-python-backend.md +3 -3
- package/docs/identity.md +4 -4
- package/docs/integration-guide.md +1 -1
- package/docs/react.md +1 -1
- package/docs/sessions.md +5 -7
- package/package.json +24 -21
- package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
- package/dist/ai-sdk/coordination-context.d.ts +0 -52
- package/dist/client/index.d.ts +0 -36
- package/dist/client/index.js +0 -33
- package/dist/config/index.d.ts +0 -10
- package/dist/config/index.js +0 -12
- package/dist/core/query-utils.d.ts +0 -34
- package/dist/core/query-utils.js +0 -59
- package/dist/interfaces/headless.d.ts +0 -95
- package/dist/interfaces/headless.js +0 -41
- package/dist/query/index.d.ts +0 -6
- package/dist/query/index.js +0 -5
- package/dist/realtime/index.d.ts +0 -10
- package/dist/realtime/index.js +0 -9
- package/dist/schema/plane.d.ts +0 -23
- package/dist/schema/plane.js +0 -19
- package/dist/schema/sync-delta-row.js +0 -103
- package/dist/schema/sync-delta-wire.js +0 -102
- package/dist/server/next.d.ts +0 -51
- package/dist/server/next.js +0 -47
- 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 -1
- package/dist/server/storage-mode.js +0 -18
- package/dist/source/connector-protocol.d.ts +0 -159
- package/dist/source/connector-protocol.js +0 -161
- package/dist/sync/OfflineFlush.d.ts +0 -9
- package/dist/sync/OfflineFlush.js +0 -22
- package/dist/sync/OfflineTransactionStore.d.ts +0 -37
- package/dist/sync/OfflineTransactionStore.js +0 -263
- package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
- package/dist/transactions/OptimisticEchoTracker.js +0 -104
- package/dist/transactions/index.d.ts +0 -16
- package/dist/transactions/index.js +0 -7
- package/dist/transactions/mutation-error-handler.d.ts +0 -5
- package/dist/transactions/mutation-error-handler.js +0 -39
- package/dist/utils/mobx-setup.d.ts +0 -42
package/dist/wire/frames.d.ts
CHANGED
|
@@ -1,29 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* The write-path message shapes for the sync protocol. These cover the frames
|
|
3
|
+
* a client sends to commit work — {@link CommitMessage} (a batch of raw
|
|
4
|
+
* operations) and {@link MutationMessage} (a single named mutation) — and the
|
|
5
|
+
* server's {@link MutationResultMessage} acknowledgement. The same frames flow
|
|
6
|
+
* over a WebSocket connection and over the HTTP commit endpoint.
|
|
3
7
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* any
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* Scope note: the delta/sync frames (`sync_response`, `delta`) are NOT
|
|
12
|
-
* here yet — they reference `SyncDelta`, which currently has two
|
|
13
|
-
* definitions (server `db/deltas` vs package `core`) pending unification.
|
|
14
|
-
* They stay server-local until that lands. Everything in this file
|
|
15
|
-
* depends only on package-canonical types (`OnStaleMode`, `ErrorCode`,
|
|
16
|
-
* `RequiredCapability`), so it is safe to share today.
|
|
17
|
-
*
|
|
18
|
-
* Changing any shape here is a wire-contract change — it requires
|
|
19
|
-
* coordinated client + server updates.
|
|
8
|
+
* Both the client and the server import these definitions from here, so the two
|
|
9
|
+
* sides cannot drift. Each interface is paired with a Zod validator
|
|
10
|
+
* ({@link commitOperationSchema}, {@link commitPayloadSchema}) pinned to it at
|
|
11
|
+
* compile time, so the runtime check and the type stay in lockstep. Changing
|
|
12
|
+
* any shape in this file changes the wire contract and requires the client and
|
|
13
|
+
* server to update together.
|
|
20
14
|
*/
|
|
15
|
+
import { z } from 'zod';
|
|
21
16
|
import type { OnStaleMode, StaleNotification, ReadDependency } from '../coordination/index.js';
|
|
22
17
|
import type { ErrorCode, RequiredCapability } from '../errors.js';
|
|
23
18
|
/**
|
|
24
|
-
* A single operation within a {@link CommitMessage} batch.
|
|
25
|
-
* the
|
|
26
|
-
*
|
|
19
|
+
* A single operation within a {@link CommitMessage} batch. Each operation is
|
|
20
|
+
* the smallest unit the server applies atomically — one create, update,
|
|
21
|
+
* delete, archive, or unarchive against one model row.
|
|
27
22
|
*/
|
|
28
23
|
export interface CommitOperation {
|
|
29
24
|
type: 'CREATE' | 'UPDATE' | 'DELETE' | 'ARCHIVE' | 'UNARCHIVE';
|
|
@@ -31,31 +26,70 @@ export interface CommitOperation {
|
|
|
31
26
|
id?: string | null;
|
|
32
27
|
input?: Record<string, unknown> | null;
|
|
33
28
|
/**
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
29
|
+
* A client-generated transaction id for this one operation. The server
|
|
30
|
+
* stamps it onto the `sync_deltas.transaction_id` column so the originating
|
|
31
|
+
* client can recognize the resulting broadcast as an echo of its own
|
|
32
|
+
* optimistic write. This is distinct from the batch-level `clientTxId` on
|
|
33
|
+
* {@link CommitMessage}, which the server uses to deduplicate retried batches.
|
|
38
34
|
*/
|
|
39
35
|
transactionId?: string | null;
|
|
40
36
|
/**
|
|
41
|
-
*
|
|
42
|
-
* has
|
|
43
|
-
*
|
|
37
|
+
* A read watermark captured when the client last read this row. The server
|
|
38
|
+
* checks whether the target has changed since this point; if it has, the
|
|
39
|
+
* operation's {@link CommitOperation.onStale} mode decides what happens.
|
|
44
40
|
*/
|
|
45
41
|
readAt?: number | null;
|
|
46
42
|
/**
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
43
|
+
* What to do when the server detects the row changed since
|
|
44
|
+
* {@link CommitOperation.readAt}. `'reject'` (the default) fails the
|
|
45
|
+
* operation with a stale-context error; `'overwrite'` applies the write
|
|
46
|
+
* regardless; `'notify'` holds the write and returns a
|
|
47
|
+
* {@link StaleNotification} for the caller to resolve.
|
|
51
48
|
*/
|
|
52
49
|
onStale?: OnStaleMode | null;
|
|
50
|
+
/**
|
|
51
|
+
* Write even when another participant holds a claim on this row. The default
|
|
52
|
+
* (`false`) rejects the operation with a claimed-entity error while a claim
|
|
53
|
+
* is held. Setting `bypass` overrides that, and the override is recorded. It
|
|
54
|
+
* is honored only for participants the claim guard trusts, such as human and
|
|
55
|
+
* framework identities; a bypass requested by an agent is ignored.
|
|
56
|
+
*/
|
|
57
|
+
bypass?: boolean | null;
|
|
53
58
|
}
|
|
54
59
|
/**
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
60
|
+
* Runtime validator for {@link CommitOperation}. Both commit transports — the
|
|
61
|
+
* WebSocket `commit` frame and the HTTP `/v1/commits` endpoint — run this check
|
|
62
|
+
* on every operation before it is applied, so a malformed operation is rejected
|
|
63
|
+
* at the edge. It builds on the shared coordination schema, widening `bypass`
|
|
64
|
+
* to also accept `null` so the validator and the interface match exactly. Note
|
|
65
|
+
* that `readAt` must be a number: it feeds the server's stale-check comparison,
|
|
66
|
+
* so a non-numeric watermark is refused here.
|
|
67
|
+
*/
|
|
68
|
+
export declare const commitOperationSchema: z.ZodObject<{
|
|
69
|
+
readAt: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
70
|
+
onStale: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
|
|
71
|
+
reject: "reject";
|
|
72
|
+
overwrite: "overwrite";
|
|
73
|
+
notify: "notify";
|
|
74
|
+
}>>>;
|
|
75
|
+
type: z.ZodEnum<{
|
|
76
|
+
CREATE: "CREATE";
|
|
77
|
+
UPDATE: "UPDATE";
|
|
78
|
+
DELETE: "DELETE";
|
|
79
|
+
ARCHIVE: "ARCHIVE";
|
|
80
|
+
UNARCHIVE: "UNARCHIVE";
|
|
81
|
+
}>;
|
|
82
|
+
model: z.ZodString;
|
|
83
|
+
id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
84
|
+
input: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
85
|
+
transactionId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
86
|
+
bypass: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
87
|
+
}, z.core.$strip>;
|
|
88
|
+
/**
|
|
89
|
+
* A client-to-server frame that invokes a single named mutation by name and
|
|
90
|
+
* arguments, as opposed to the raw operation batch in {@link CommitMessage}.
|
|
91
|
+
* The server resolves `mutatorName` against the set of mutations registered on
|
|
92
|
+
* it and runs the matching one.
|
|
59
93
|
*/
|
|
60
94
|
export interface MutationMessage {
|
|
61
95
|
type: 'mutation';
|
|
@@ -66,10 +100,10 @@ export interface MutationMessage {
|
|
|
66
100
|
};
|
|
67
101
|
}
|
|
68
102
|
/**
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
103
|
+
* A client-to-server frame that asks the server to commit a batch of operations
|
|
104
|
+
* atomically. This is the raw-operation counterpart to {@link MutationMessage};
|
|
105
|
+
* it carries a list of {@link CommitOperation} entries plus the batch metadata
|
|
106
|
+
* below.
|
|
73
107
|
*/
|
|
74
108
|
export interface CommitMessage {
|
|
75
109
|
type: 'commit';
|
|
@@ -77,33 +111,80 @@ export interface CommitMessage {
|
|
|
77
111
|
operations: CommitOperation[];
|
|
78
112
|
clientTxId: string;
|
|
79
113
|
/**
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
* threads it onto `caused_by_task_id`, but client writes leave it
|
|
85
|
-
* `null` (the audit pane treats null as "no prompt-side context").
|
|
114
|
+
* Optional lineage id linking this batch to the task that caused it. When
|
|
115
|
+
* present, the server validates it and records it on the delta's
|
|
116
|
+
* `caused_by_task_id` column for audit trails; when omitted or `null`, the
|
|
117
|
+
* batch simply carries no task attribution.
|
|
86
118
|
*/
|
|
87
119
|
causedByTaskId?: string | null;
|
|
88
120
|
/**
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
* checked
|
|
121
|
+
* The reads this batch's writes were premised on. Each entry names either a
|
|
122
|
+
* specific row (`{ model, id, readAt, fields? }`) or a sync group
|
|
123
|
+
* (`{ group, readAt }`) that must not have changed since its `readAt`
|
|
124
|
+
* watermark. The server checks every entry and applies its `onStale`
|
|
125
|
+
* disposition to the whole batch if one moved. When omitted, only the rows
|
|
126
|
+
* being written are checked for staleness.
|
|
95
127
|
*/
|
|
96
128
|
reads?: ReadDependency[] | null;
|
|
97
129
|
};
|
|
98
130
|
}
|
|
99
131
|
/**
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
* `
|
|
132
|
+
* Runtime validator for the payload of {@link CommitMessage}. It checks every
|
|
133
|
+
* field the server acts on — `operations`, `clientTxId`, `causedByTaskId`, and
|
|
134
|
+
* `reads` — validating each operation with {@link commitOperationSchema} and
|
|
135
|
+
* each read dependency with the shared read-dependency schema.
|
|
136
|
+
*/
|
|
137
|
+
export declare const commitPayloadSchema: z.ZodObject<{
|
|
138
|
+
operations: z.ZodArray<z.ZodObject<{
|
|
139
|
+
readAt: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
140
|
+
onStale: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
|
|
141
|
+
reject: "reject";
|
|
142
|
+
overwrite: "overwrite";
|
|
143
|
+
notify: "notify";
|
|
144
|
+
}>>>;
|
|
145
|
+
type: z.ZodEnum<{
|
|
146
|
+
CREATE: "CREATE";
|
|
147
|
+
UPDATE: "UPDATE";
|
|
148
|
+
DELETE: "DELETE";
|
|
149
|
+
ARCHIVE: "ARCHIVE";
|
|
150
|
+
UNARCHIVE: "UNARCHIVE";
|
|
151
|
+
}>;
|
|
152
|
+
model: z.ZodString;
|
|
153
|
+
id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
154
|
+
input: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
155
|
+
transactionId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
156
|
+
bypass: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
157
|
+
}, z.core.$strip>>;
|
|
158
|
+
clientTxId: z.ZodString;
|
|
159
|
+
causedByTaskId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
160
|
+
reads: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
|
|
161
|
+
model: z.ZodString;
|
|
162
|
+
id: z.ZodString;
|
|
163
|
+
readAt: z.ZodNumber;
|
|
164
|
+
fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
165
|
+
onStale: z.ZodOptional<z.ZodEnum<{
|
|
166
|
+
reject: "reject";
|
|
167
|
+
overwrite: "overwrite";
|
|
168
|
+
notify: "notify";
|
|
169
|
+
}>>;
|
|
170
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
171
|
+
group: z.ZodString;
|
|
172
|
+
readAt: z.ZodNumber;
|
|
173
|
+
onStale: z.ZodOptional<z.ZodEnum<{
|
|
174
|
+
reject: "reject";
|
|
175
|
+
overwrite: "overwrite";
|
|
176
|
+
notify: "notify";
|
|
177
|
+
}>>;
|
|
178
|
+
}, z.core.$strip>]>>>>;
|
|
179
|
+
}, z.core.$strip>;
|
|
180
|
+
/**
|
|
181
|
+
* The server's acknowledgement of a {@link CommitMessage}. Its payload mirrors
|
|
182
|
+
* the commit-receipt shape, so a commit acknowledged over a WebSocket, over the
|
|
183
|
+
* HTTP `/v1/commits` endpoint, or read back from a persisted job result all
|
|
184
|
+
* carry the same fields.
|
|
103
185
|
*
|
|
104
|
-
* `object`, `status`, and `ops` are
|
|
105
|
-
*
|
|
106
|
-
* New clients can rely on them.
|
|
186
|
+
* `object`, `status`, and `ops` are optional in the type but the server always
|
|
187
|
+
* populates them, so a current client can rely on them being present.
|
|
107
188
|
*/
|
|
108
189
|
export interface MutationResultMessage {
|
|
109
190
|
type: 'mutation_result';
|
|
@@ -116,25 +197,27 @@ export interface MutationResultMessage {
|
|
|
116
197
|
lastSyncId?: number;
|
|
117
198
|
ops?: number;
|
|
118
199
|
/**
|
|
119
|
-
*
|
|
120
|
-
* premise
|
|
121
|
-
*
|
|
122
|
-
* `conflict:notified` event and the commit
|
|
200
|
+
* Notifications for operations that used `onStale: 'notify'` and whose
|
|
201
|
+
* premise changed while the batch was being applied. Present only on a
|
|
202
|
+
* successful acknowledgement that resolved such a conflict; the client
|
|
203
|
+
* surfaces each one through its `conflict:notified` event and the commit
|
|
204
|
+
* receipt rather than failing the write.
|
|
123
205
|
*/
|
|
124
206
|
notifications?: StaleNotification[];
|
|
125
207
|
/**
|
|
126
|
-
* Ids of
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
* caller
|
|
208
|
+
* Ids of update or delete targets that matched no rows — because they do
|
|
209
|
+
* not exist or fall outside the caller's organization. Present and
|
|
210
|
+
* non-empty only when a write missed. The client raises a not-found error
|
|
211
|
+
* for the affected caller rather than treating the no-op as a success.
|
|
130
212
|
*/
|
|
131
213
|
missingIds?: string[];
|
|
132
214
|
error?: {
|
|
133
215
|
code: ErrorCode;
|
|
134
216
|
message: string;
|
|
135
217
|
field?: string;
|
|
136
|
-
/**
|
|
137
|
-
*
|
|
218
|
+
/** The capability the commit required but the caller lacked. Present when
|
|
219
|
+
* the commit was denied for want of a capability, so the client can tell
|
|
220
|
+
* the caller exactly what to obtain. */
|
|
138
221
|
requiredCapability?: RequiredCapability;
|
|
139
222
|
};
|
|
140
223
|
};
|
package/dist/wire/frames.js
CHANGED
|
@@ -1 +1,48 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* The write-path message shapes for the sync protocol. These cover the frames
|
|
3
|
+
* a client sends to commit work — {@link CommitMessage} (a batch of raw
|
|
4
|
+
* operations) and {@link MutationMessage} (a single named mutation) — and the
|
|
5
|
+
* server's {@link MutationResultMessage} acknowledgement. The same frames flow
|
|
6
|
+
* over a WebSocket connection and over the HTTP commit endpoint.
|
|
7
|
+
*
|
|
8
|
+
* Both the client and the server import these definitions from here, so the two
|
|
9
|
+
* sides cannot drift. Each interface is paired with a Zod validator
|
|
10
|
+
* ({@link commitOperationSchema}, {@link commitPayloadSchema}) pinned to it at
|
|
11
|
+
* compile time, so the runtime check and the type stay in lockstep. Changing
|
|
12
|
+
* any shape in this file changes the wire contract and requires the client and
|
|
13
|
+
* server to update together.
|
|
14
|
+
*/
|
|
15
|
+
import { z } from 'zod';
|
|
16
|
+
// The runtime schema primitives are imported straight from the coordination
|
|
17
|
+
// schema module to keep this file's runtime dependencies limited to Zod.
|
|
18
|
+
import { commitOperationSchema as coordinationCommitOperationSchema, readDependencySchema, } from '../coordination/schema.js';
|
|
19
|
+
/**
|
|
20
|
+
* Runtime validator for {@link CommitOperation}. Both commit transports — the
|
|
21
|
+
* WebSocket `commit` frame and the HTTP `/v1/commits` endpoint — run this check
|
|
22
|
+
* on every operation before it is applied, so a malformed operation is rejected
|
|
23
|
+
* at the edge. It builds on the shared coordination schema, widening `bypass`
|
|
24
|
+
* to also accept `null` so the validator and the interface match exactly. Note
|
|
25
|
+
* that `readAt` must be a number: it feeds the server's stale-check comparison,
|
|
26
|
+
* so a non-numeric watermark is refused here.
|
|
27
|
+
*/
|
|
28
|
+
export const commitOperationSchema = coordinationCommitOperationSchema.extend({
|
|
29
|
+
bypass: z.boolean().nullish(),
|
|
30
|
+
});
|
|
31
|
+
// Pins the schema to the interface: this fails to compile if either side drifts.
|
|
32
|
+
const _commitOperationContract = true;
|
|
33
|
+
void _commitOperationContract;
|
|
34
|
+
/**
|
|
35
|
+
* Runtime validator for the payload of {@link CommitMessage}. It checks every
|
|
36
|
+
* field the server acts on — `operations`, `clientTxId`, `causedByTaskId`, and
|
|
37
|
+
* `reads` — validating each operation with {@link commitOperationSchema} and
|
|
38
|
+
* each read dependency with the shared read-dependency schema.
|
|
39
|
+
*/
|
|
40
|
+
export const commitPayloadSchema = z.object({
|
|
41
|
+
operations: z.array(commitOperationSchema),
|
|
42
|
+
clientTxId: z.string(),
|
|
43
|
+
causedByTaskId: z.string().nullish(),
|
|
44
|
+
reads: z.array(readDependencySchema).nullish(),
|
|
45
|
+
});
|
|
46
|
+
// Pins the schema to the payload type: fails to compile if either side drifts.
|
|
47
|
+
const _commitPayloadContract = true;
|
|
48
|
+
void _commitPayloadContract;
|
package/dist/wire/index.d.ts
CHANGED
|
@@ -1,24 +1,29 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
2
|
+
* The wire contract for the sync protocol: the HTTP envelope shapes and the
|
|
3
|
+
* write-path frames, with no dependency on the client runtime. A server — a
|
|
4
|
+
* route handler, an edge function — can import the envelope producers here
|
|
5
|
+
* without pulling in the full sync client.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
* -
|
|
9
|
-
* {@link statusForType} turn any thrown value into
|
|
10
|
-
* `{ type, code, param, message, doc_url, request_id }
|
|
11
|
-
* -
|
|
7
|
+
* It has two halves, used across every endpoint:
|
|
8
|
+
* - Error responses — {@link errorEnvelope}, {@link ErrorEnvelope}, and
|
|
9
|
+
* {@link statusForType} turn any thrown value into the uniform
|
|
10
|
+
* `{ type, code, param, message, doc_url, request_id }` body.
|
|
11
|
+
* - List responses — {@link listEnvelope} and {@link ListEnvelope} stamp the
|
|
12
12
|
* uniform `{ object: 'list', data, has_more, next_cursor }` collection.
|
|
13
13
|
*
|
|
14
|
-
* The {@link AbloError} hierarchy
|
|
15
|
-
* helpers are re-exported so a
|
|
16
|
-
*
|
|
14
|
+
* The {@link AbloError} hierarchy, {@link docUrlForCode}, and the wire-parsing
|
|
15
|
+
* helpers are re-exported too, so a single import lets a route throw the right
|
|
16
|
+
* typed error and serialize it back out.
|
|
17
17
|
*/
|
|
18
18
|
export { errorEnvelope, statusForType } from './errorEnvelope.js';
|
|
19
19
|
export type { ErrorEnvelope } from './errorEnvelope.js';
|
|
20
20
|
export { listEnvelope } from './listEnvelope.js';
|
|
21
21
|
export type { ListEnvelope } from './listEnvelope.js';
|
|
22
|
+
export { commitOperationSchema, commitPayloadSchema } from './frames.js';
|
|
23
|
+
export { PROTOCOL_VERSION, MIN_SUPPORTED_PROTOCOL_VERSION, WS_CLOSE_PROTOCOL_VERSION, PROTOCOL_VERSION_HEADER, protocolVersionProblem, } from './protocolVersion.js';
|
|
22
24
|
export type { CommitOperation, MutationMessage, CommitMessage, MutationResultMessage, } from './frames.js';
|
|
23
|
-
export {
|
|
25
|
+
export { participantKindSchema, confirmationStateSchema, syncDeltaActionSchema, wireDeltaDataSchema, participantRefSchema, syncDeltaWireCoreSchema, clientSyncDeltaSchema, serverSyncDeltaSchema, } from './delta.js';
|
|
26
|
+
export type { ParticipantKind, ConfirmationState, SyncDeltaAction, WireDeltaData, ParticipantRef, SyncDeltaWireCore, ClientSyncDelta, ServerSyncDelta, } from './delta.js';
|
|
27
|
+
export { AbloError, AbloAuthenticationError, AbloPermissionError, AbloValidationError, AbloRateLimitError, AbloIdempotencyError, AbloConnectionError, AbloServerError, AbloStaleContextError, AbloClaimedError, CapabilityError, SyncSessionError, docUrlForCode, translateHttpError, errorFromWire, toAbloError, ERROR_CONTRACT_VERSION, errorCodeSpec, } from '../errors.js';
|
|
24
28
|
export type { ErrorCode, WireErrorCode } from '../errors.js';
|
|
29
|
+
export { PING_INTERVAL_MS, LEASE_TTL_MS, WS_BEARER_SUBPROTOCOL_PREFIX, WS_SYNC_SUBPROTOCOL, } from './protocol.js';
|
package/dist/wire/index.js
CHANGED
|
@@ -1,21 +1,44 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
2
|
+
* The wire contract for the sync protocol: the HTTP envelope shapes and the
|
|
3
|
+
* write-path frames, with no dependency on the client runtime. A server — a
|
|
4
|
+
* route handler, an edge function — can import the envelope producers here
|
|
5
|
+
* without pulling in the full sync client.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
* -
|
|
9
|
-
* {@link statusForType} turn any thrown value into
|
|
10
|
-
* `{ type, code, param, message, doc_url, request_id }
|
|
11
|
-
* -
|
|
7
|
+
* It has two halves, used across every endpoint:
|
|
8
|
+
* - Error responses — {@link errorEnvelope}, {@link ErrorEnvelope}, and
|
|
9
|
+
* {@link statusForType} turn any thrown value into the uniform
|
|
10
|
+
* `{ type, code, param, message, doc_url, request_id }` body.
|
|
11
|
+
* - List responses — {@link listEnvelope} and {@link ListEnvelope} stamp the
|
|
12
12
|
* uniform `{ object: 'list', data, has_more, next_cursor }` collection.
|
|
13
13
|
*
|
|
14
|
-
* The {@link AbloError} hierarchy
|
|
15
|
-
* helpers are re-exported so a
|
|
16
|
-
*
|
|
14
|
+
* The {@link AbloError} hierarchy, {@link docUrlForCode}, and the wire-parsing
|
|
15
|
+
* helpers are re-exported too, so a single import lets a route throw the right
|
|
16
|
+
* typed error and serialize it back out.
|
|
17
17
|
*/
|
|
18
18
|
export { errorEnvelope, statusForType } from './errorEnvelope.js';
|
|
19
19
|
export { listEnvelope } from './listEnvelope.js';
|
|
20
|
+
// The write-path frame contract: the message shapes shared by the client and
|
|
21
|
+
// the server. The runtime Zod validators sit beside the interfaces and are
|
|
22
|
+
// pinned to them, and they gate every operation and payload on both commit
|
|
23
|
+
// transports.
|
|
24
|
+
export { commitOperationSchema, commitPayloadSchema } from './frames.js';
|
|
25
|
+
// Protocol versioning: the single integer the client and server compare to
|
|
26
|
+
// confirm they can speak to each other, plus the WebSocket close code used to
|
|
27
|
+
// reject a mismatch. See protocolVersion.ts for the changelog and deploy rules.
|
|
28
|
+
export { PROTOCOL_VERSION, MIN_SUPPORTED_PROTOCOL_VERSION, WS_CLOSE_PROTOCOL_VERSION, PROTOCOL_VERSION_HEADER, protocolVersionProblem, } from './protocolVersion.js';
|
|
29
|
+
// The read-path delta contract: the shape the server broadcasts to clients as the
|
|
30
|
+
// payload of a `delta` or `sync_response` frame, together with the shared
|
|
31
|
+
// participant vocabulary it carries. Both ends derive their delta type from these
|
|
32
|
+
// schemas, so the client and server cannot drift apart.
|
|
33
|
+
export { participantKindSchema, confirmationStateSchema, syncDeltaActionSchema, wireDeltaDataSchema, participantRefSchema, syncDeltaWireCoreSchema, clientSyncDeltaSchema, serverSyncDeltaSchema, } from './delta.js';
|
|
20
34
|
// The error surface a wire consumer needs to throw, classify, and serialize.
|
|
21
|
-
export { AbloError, AbloAuthenticationError, AbloPermissionError, AbloValidationError, AbloRateLimitError, AbloIdempotencyError, AbloConnectionError, AbloServerError, AbloStaleContextError, AbloClaimedError, CapabilityError, SyncSessionError, docUrlForCode, translateHttpError, errorFromWire, toAbloError, ERROR_CONTRACT_VERSION,
|
|
35
|
+
export { AbloError, AbloAuthenticationError, AbloPermissionError, AbloValidationError, AbloRateLimitError, AbloIdempotencyError, AbloConnectionError, AbloServerError, AbloStaleContextError, AbloClaimedError, CapabilityError, SyncSessionError, docUrlForCode, translateHttpError, errorFromWire, toAbloError, ERROR_CONTRACT_VERSION,
|
|
36
|
+
// The table mapping each error code to its HTTP status and retryable flag —
|
|
37
|
+
// plain data a server can use to resolve a code's canonical status the same
|
|
38
|
+
// way the client's error serializer does.
|
|
39
|
+
errorCodeSpec, } from '../errors.js';
|
|
40
|
+
// Protocol timing constants — the 30-second ping cadence and the lease window
|
|
41
|
+
// derived from it, shared by the client heartbeat and the server keepalive,
|
|
42
|
+
// claim leasing, and presence expiry (see protocol.ts) — plus the WebSocket
|
|
43
|
+
// subprotocols used during the authenticated handshake.
|
|
44
|
+
export { PING_INTERVAL_MS, LEASE_TTL_MS, WS_BEARER_SUBPROTOCOL_PREFIX, WS_SYNC_SUBPROTOCOL, } from './protocol.js';
|
|
@@ -1,24 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
2
|
+
* The envelope every endpoint that returns a collection wraps its results in.
|
|
3
|
+
* Because the shape is always the same — `{ object: 'list', data, has_more,
|
|
4
|
+
* next_cursor }` — a consumer can detect and paginate any list the same way,
|
|
5
|
+
* instead of learning a different payload key for each endpoint.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* sync-web's dashboard lists, the SDK, and any future surface produce the
|
|
11
|
-
* identical envelope from one definition.
|
|
12
|
-
*
|
|
13
|
-
* The field NAMES are Stripe's (`object`/`has_more`/`next_cursor`), not
|
|
14
|
-
* PlanetScale's (`type`/`cursor_start`/`has_next`): the rest of the Ablo API is
|
|
15
|
-
* Stripe-modeled, so this keeps one vocabulary across the surface. The
|
|
16
|
-
* PlanetScale discipline we deliberately borrow is *"every list is the same
|
|
17
|
-
* envelope"* — not the concrete key names.
|
|
7
|
+
* The list endpoints emit this shape and the {@link listEnvelope} helper
|
|
8
|
+
* produces it, so every list across the API reads from one definition. The
|
|
9
|
+
* generic type parameter carries the row type of `data`.
|
|
18
10
|
*/
|
|
19
11
|
export interface ListEnvelope<T> {
|
|
20
|
-
/**
|
|
21
|
-
*
|
|
12
|
+
/** Always the literal `'list'`. Lets a generic client recognize a collection
|
|
13
|
+
* response without special-casing each endpoint. */
|
|
22
14
|
readonly object: 'list';
|
|
23
15
|
/** The page of results. Always present (an empty array when there are none),
|
|
24
16
|
* never omitted, so `body.data` is a stable access path. */
|
|
@@ -31,13 +23,14 @@ export interface ListEnvelope<T> {
|
|
|
31
23
|
readonly next_cursor: string | null;
|
|
32
24
|
}
|
|
33
25
|
/**
|
|
34
|
-
*
|
|
26
|
+
* Wraps an already-fetched page of rows in the uniform {@link ListEnvelope}.
|
|
35
27
|
*
|
|
36
|
-
* Pagination stays the caller's
|
|
37
|
-
* `hasMore`, derive the cursor from the last row's
|
|
38
|
-
* applies the envelope so no endpoint
|
|
39
|
-
*
|
|
40
|
-
* `next_cursor: null`); a paginated endpoint passes both
|
|
28
|
+
* Pagination stays the caller's job — fetch one more row than the limit to
|
|
29
|
+
* decide `hasMore`, and derive the cursor from the last row's sort key. This
|
|
30
|
+
* helper only applies the envelope so no endpoint has to build the shape by
|
|
31
|
+
* hand. The defaults describe a small, unpaginated collection
|
|
32
|
+
* (`has_more: false`, `next_cursor: null`); a paginated endpoint passes both
|
|
33
|
+
* explicitly.
|
|
41
34
|
*/
|
|
42
35
|
export declare function listEnvelope<T>(data: readonly T[], opts?: {
|
|
43
36
|
hasMore?: boolean;
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Wraps an already-fetched page of rows in the uniform {@link ListEnvelope}.
|
|
3
3
|
*
|
|
4
|
-
* Pagination stays the caller's
|
|
5
|
-
* `hasMore`, derive the cursor from the last row's
|
|
6
|
-
* applies the envelope so no endpoint
|
|
7
|
-
*
|
|
8
|
-
* `next_cursor: null`); a paginated endpoint passes both
|
|
4
|
+
* Pagination stays the caller's job — fetch one more row than the limit to
|
|
5
|
+
* decide `hasMore`, and derive the cursor from the last row's sort key. This
|
|
6
|
+
* helper only applies the envelope so no endpoint has to build the shape by
|
|
7
|
+
* hand. The defaults describe a small, unpaginated collection
|
|
8
|
+
* (`has_more: false`, `next_cursor: null`); a paginated endpoint passes both
|
|
9
|
+
* explicitly.
|
|
9
10
|
*/
|
|
10
11
|
export function listEnvelope(data, opts = {}) {
|
|
11
12
|
return {
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The timing constants both sides of the protocol must agree on: the ping
|
|
3
|
+
* cadence and the lease window derived from it. Defining them here once keeps
|
|
4
|
+
* the client and the server from skewing apart — a change to the ping interval
|
|
5
|
+
* that did not also move the lease window would make claim expiry and presence
|
|
6
|
+
* timeouts disagree between the two.
|
|
7
|
+
*
|
|
8
|
+
* {@link PING_INTERVAL_MS} is how often the connection pings to prove it is
|
|
9
|
+
* alive. {@link LEASE_TTL_MS} is how long a claim or presence entry stays valid
|
|
10
|
+
* without a renewing ping. On the client, these set the heartbeat cadence and
|
|
11
|
+
* the fallback expiry for a claim taken without an explicit lease. On the
|
|
12
|
+
* server, they set the keepalive interval, the lease granted per keepalive, and
|
|
13
|
+
* the presence-entry lifetime, so a silently disconnected client drops off the
|
|
14
|
+
* roster within one lease window.
|
|
15
|
+
*
|
|
16
|
+
* The lease is three ping intervals long and is renewed on every ping, so a
|
|
17
|
+
* live holder always has at least two intervals of runway and a silent one
|
|
18
|
+
* lapses about two missed pings after it stops renewing. The window measures
|
|
19
|
+
* liveness, not how long a task may run: widening the lease without also
|
|
20
|
+
* widening the ping makes holders flap, and neither value should be redefined
|
|
21
|
+
* anywhere else.
|
|
22
|
+
*/
|
|
23
|
+
export declare const PING_INTERVAL_MS = 30000;
|
|
24
|
+
export declare const LEASE_TTL_MS: number;
|
|
25
|
+
/**
|
|
26
|
+
* The WebSocket subprotocols that carry the bearer credential out of the URL.
|
|
27
|
+
*
|
|
28
|
+
* A browser cannot set an `Authorization` header on a WebSocket, so the client
|
|
29
|
+
* offers the token as a `Sec-WebSocket-Protocol` value — `ablo.bearer.<token>` —
|
|
30
|
+
* alongside the real `ablo.sync.v1` protocol the server selects. This keeps the
|
|
31
|
+
* credential out of the query string, which access logs, proxies, and browser
|
|
32
|
+
* history would otherwise capture. The server reads the token from the
|
|
33
|
+
* subprotocol and echoes back only `ablo.sync.v1`, never the token-bearing
|
|
34
|
+
* value. Both the client and the server import these constants, so the
|
|
35
|
+
* handshake format cannot drift.
|
|
36
|
+
*/
|
|
37
|
+
export declare const WS_BEARER_SUBPROTOCOL_PREFIX = "ablo.bearer.";
|
|
38
|
+
export declare const WS_SYNC_SUBPROTOCOL = "ablo.sync.v1";
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The timing constants both sides of the protocol must agree on: the ping
|
|
3
|
+
* cadence and the lease window derived from it. Defining them here once keeps
|
|
4
|
+
* the client and the server from skewing apart — a change to the ping interval
|
|
5
|
+
* that did not also move the lease window would make claim expiry and presence
|
|
6
|
+
* timeouts disagree between the two.
|
|
7
|
+
*
|
|
8
|
+
* {@link PING_INTERVAL_MS} is how often the connection pings to prove it is
|
|
9
|
+
* alive. {@link LEASE_TTL_MS} is how long a claim or presence entry stays valid
|
|
10
|
+
* without a renewing ping. On the client, these set the heartbeat cadence and
|
|
11
|
+
* the fallback expiry for a claim taken without an explicit lease. On the
|
|
12
|
+
* server, they set the keepalive interval, the lease granted per keepalive, and
|
|
13
|
+
* the presence-entry lifetime, so a silently disconnected client drops off the
|
|
14
|
+
* roster within one lease window.
|
|
15
|
+
*
|
|
16
|
+
* The lease is three ping intervals long and is renewed on every ping, so a
|
|
17
|
+
* live holder always has at least two intervals of runway and a silent one
|
|
18
|
+
* lapses about two missed pings after it stops renewing. The window measures
|
|
19
|
+
* liveness, not how long a task may run: widening the lease without also
|
|
20
|
+
* widening the ping makes holders flap, and neither value should be redefined
|
|
21
|
+
* anywhere else.
|
|
22
|
+
*/
|
|
23
|
+
export const PING_INTERVAL_MS = 30_000;
|
|
24
|
+
export const LEASE_TTL_MS = 3 * PING_INTERVAL_MS;
|
|
25
|
+
/**
|
|
26
|
+
* The WebSocket subprotocols that carry the bearer credential out of the URL.
|
|
27
|
+
*
|
|
28
|
+
* A browser cannot set an `Authorization` header on a WebSocket, so the client
|
|
29
|
+
* offers the token as a `Sec-WebSocket-Protocol` value — `ablo.bearer.<token>` —
|
|
30
|
+
* alongside the real `ablo.sync.v1` protocol the server selects. This keeps the
|
|
31
|
+
* credential out of the query string, which access logs, proxies, and browser
|
|
32
|
+
* history would otherwise capture. The server reads the token from the
|
|
33
|
+
* subprotocol and echoes back only `ablo.sync.v1`, never the token-bearing
|
|
34
|
+
* value. Both the client and the server import these constants, so the
|
|
35
|
+
* handshake format cannot drift.
|
|
36
|
+
*/
|
|
37
|
+
export const WS_BEARER_SUBPROTOCOL_PREFIX = 'ablo.bearer.';
|
|
38
|
+
export const WS_SYNC_SUBPROTOCOL = 'ablo.sync.v1';
|