@abloatai/ablo 0.26.0 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/README.md +101 -85
- package/dist/BaseSyncedStore.d.ts +85 -88
- package/dist/BaseSyncedStore.js +131 -147
- package/dist/Database.d.ts +54 -68
- package/dist/Database.js +97 -113
- package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
- package/dist/{ObjectPool.js → InstanceCache.js} +85 -83
- package/dist/LazyReferenceCollection.d.ts +11 -15
- package/dist/LazyReferenceCollection.js +12 -16
- package/dist/Model.d.ts +37 -52
- package/dist/Model.js +46 -61
- package/dist/ModelRegistry.d.ts +21 -19
- package/dist/ModelRegistry.js +23 -27
- package/dist/NetworkMonitor.d.ts +5 -6
- package/dist/NetworkMonitor.js +5 -6
- package/dist/SyncClient.d.ts +112 -112
- package/dist/SyncClient.js +165 -172
- package/dist/adapters/alwaysOnline.d.ts +6 -8
- package/dist/adapters/alwaysOnline.js +6 -8
- package/dist/adapters/inMemoryStorage.d.ts +9 -9
- package/dist/adapters/inMemoryStorage.js +9 -9
- package/dist/agent/Agent.d.ts +27 -32
- package/dist/agent/Agent.js +18 -19
- package/dist/agent/index.d.ts +4 -4
- package/dist/agent/index.js +5 -5
- package/dist/agent/session.d.ts +47 -44
- package/dist/agent/session.js +37 -48
- package/dist/agent/types.d.ts +26 -31
- package/dist/agent/types.js +6 -7
- package/dist/ai-sdk/coordinatedTool.d.ts +108 -0
- package/dist/ai-sdk/{coordinated-tool.js → coordinatedTool.js} +44 -38
- package/dist/ai-sdk/coordinationContext.d.ts +46 -0
- package/dist/ai-sdk/{coordination-context.js → coordinationContext.js} +26 -33
- package/dist/ai-sdk/index.d.ts +25 -22
- package/dist/ai-sdk/index.js +25 -22
- package/dist/ai-sdk/wrap.d.ts +6 -7
- package/dist/ai-sdk/wrap.js +1 -1
- package/dist/auth/credentialPolicy.d.ts +69 -74
- package/dist/auth/credentialPolicy.js +51 -56
- package/dist/auth/credentialSource.d.ts +6 -5
- package/dist/auth/credentialSource.js +9 -10
- package/dist/auth/index.d.ts +59 -58
- package/dist/auth/index.js +31 -37
- package/dist/auth/schemas.d.ts +5 -4
- package/dist/auth/schemas.js +5 -4
- package/dist/batching/index.d.ts +19 -21
- package/dist/batching/index.js +14 -17
- package/dist/cli.cjs +167 -119
- package/dist/client/Ablo.d.ts +73 -73
- package/dist/client/Ablo.js +125 -160
- package/dist/client/ApiClient.d.ts +30 -19
- package/dist/client/ApiClient.js +133 -38
- package/dist/client/auth.d.ts +47 -47
- package/dist/client/auth.js +108 -117
- package/dist/client/claimHeartbeatLoop.d.ts +50 -0
- package/dist/client/claimHeartbeatLoop.js +88 -0
- package/dist/client/consoleLogger.d.ts +5 -6
- package/dist/client/consoleLogger.js +5 -6
- package/dist/client/createInternalComponents.d.ts +14 -17
- package/dist/client/createInternalComponents.js +25 -30
- package/dist/client/createModelProxy.d.ts +130 -120
- package/dist/client/createModelProxy.js +152 -122
- package/dist/client/credentialEndpoint.d.ts +40 -42
- package/dist/client/credentialEndpoint.js +35 -36
- package/dist/client/functionalUpdate.d.ts +29 -27
- package/dist/client/functionalUpdate.js +21 -21
- package/dist/client/hostedEndpoints.d.ts +9 -12
- package/dist/client/hostedEndpoints.js +9 -12
- package/dist/client/httpClient.d.ts +57 -53
- package/dist/client/httpClient.js +29 -31
- package/dist/client/identity.d.ts +15 -20
- package/dist/client/identity.js +47 -58
- package/dist/client/modelRegistration.d.ts +5 -9
- package/dist/client/modelRegistration.js +67 -87
- package/dist/client/options.d.ts +134 -157
- package/dist/client/options.js +3 -7
- package/dist/client/registerDataSource.d.ts +9 -9
- package/dist/client/registerDataSource.js +15 -16
- package/dist/client/resourceTypes.d.ts +64 -75
- package/dist/client/resourceTypes.js +4 -10
- package/dist/client/schemaConfig.d.ts +31 -43
- package/dist/client/schemaConfig.js +38 -50
- package/dist/client/sessionMint.d.ts +16 -12
- package/dist/client/sessionMint.js +26 -31
- package/dist/client/validateAbloOptions.d.ts +12 -14
- package/dist/client/validateAbloOptions.js +8 -9
- package/dist/client/writeOptionsSchema.d.ts +18 -16
- package/dist/client/writeOptionsSchema.js +23 -20
- package/dist/client/wsMutationExecutor.d.ts +15 -20
- package/dist/client/wsMutationExecutor.js +17 -23
- package/dist/context.d.ts +6 -4
- package/dist/context.js +6 -4
- package/dist/coordination/index.d.ts +10 -8
- package/dist/coordination/index.js +14 -12
- package/dist/coordination/schema.d.ts +176 -128
- package/dist/coordination/schema.js +197 -133
- package/dist/coordination/trace.d.ts +9 -10
- package/dist/coordination/trace.js +13 -14
- package/dist/core/DatabaseManager.d.ts +5 -7
- package/dist/core/DatabaseManager.js +15 -19
- package/dist/core/QueryProcessor.d.ts +7 -9
- package/dist/core/QueryProcessor.js +22 -28
- package/dist/core/QueryView.d.ts +8 -8
- package/dist/core/QueryView.js +2 -2
- package/dist/core/StoreManager.d.ts +12 -14
- package/dist/core/StoreManager.js +21 -24
- package/dist/core/ViewRegistry.d.ts +5 -5
- package/dist/core/ViewRegistry.js +4 -4
- package/dist/core/index.d.ts +17 -12
- package/dist/core/index.js +32 -26
- package/dist/core/openIDBWithTimeout.d.ts +38 -36
- package/dist/core/openIDBWithTimeout.js +42 -43
- package/dist/core/queryUtils.d.ts +45 -0
- package/dist/core/queryUtils.js +69 -0
- package/dist/core/storeContract.d.ts +63 -61
- package/dist/core/storeContract.js +8 -12
- package/dist/environment.d.ts +28 -0
- package/dist/environment.js +21 -0
- package/dist/errorCodes.d.ts +107 -99
- package/dist/errorCodes.js +131 -132
- package/dist/errors.d.ts +160 -166
- package/dist/errors.js +155 -158
- package/dist/index.d.ts +30 -27
- package/dist/index.js +89 -86
- package/dist/interfaces/index.d.ts +102 -113
- package/dist/interfaces/index.js +5 -4
- package/dist/keys/index.d.ts +27 -29
- package/dist/keys/index.js +41 -40
- package/dist/mutators/RecordingTransaction.d.ts +16 -16
- package/dist/mutators/RecordingTransaction.js +31 -37
- package/dist/mutators/Transaction.d.ts +18 -26
- package/dist/mutators/Transaction.js +14 -20
- package/dist/mutators/UndoManager.d.ts +122 -131
- package/dist/mutators/UndoManager.js +145 -156
- package/dist/mutators/defineMutators.d.ts +23 -34
- package/dist/mutators/defineMutators.js +14 -20
- package/dist/mutators/inverseOp.d.ts +12 -15
- package/dist/mutators/inverseOp.js +12 -15
- package/dist/mutators/mutateActions.d.ts +10 -9
- package/dist/mutators/mutateActions.js +1 -1
- package/dist/mutators/readerActions.d.ts +9 -8
- package/dist/mutators/readerActions.js +2 -2
- package/dist/mutators/undoApply.d.ts +31 -27
- package/dist/mutators/undoApply.js +26 -24
- package/dist/policy/index.d.ts +5 -3
- package/dist/policy/index.js +5 -3
- package/dist/policy/types.d.ts +104 -100
- package/dist/policy/types.js +67 -66
- package/dist/query/client.d.ts +28 -23
- package/dist/query/client.js +45 -43
- package/dist/query/types.d.ts +37 -60
- package/dist/query/types.js +13 -33
- package/dist/react/AbloProvider.d.ts +1 -1
- package/dist/react/AbloProvider.js +2 -2
- package/dist/react/context.d.ts +25 -28
- package/dist/react/context.js +9 -10
- package/dist/react/index.d.ts +41 -42
- package/dist/react/index.js +37 -38
- package/dist/react/internalContext.d.ts +17 -19
- package/dist/react/useAblo.d.ts +23 -22
- package/dist/react/useAblo.js +16 -14
- package/dist/react/useCurrentUserId.d.ts +8 -7
- package/dist/react/useCurrentUserId.js +8 -7
- package/dist/react/useErrorListener.d.ts +7 -7
- package/dist/react/useErrorListener.js +10 -11
- package/dist/react/useMutationFailureListener.d.ts +8 -8
- package/dist/react/useMutationFailureListener.js +8 -8
- package/dist/react/useMutators.d.ts +11 -11
- package/dist/react/useMutators.js +3 -3
- package/dist/react/useReactive.js +2 -2
- package/dist/react/useSyncStatus.d.ts +4 -6
- package/dist/react/useUndoScope.d.ts +7 -9
- package/dist/react/useUndoScope.js +1 -1
- package/dist/schema/coordination.d.ts +21 -25
- package/dist/schema/coordination.js +21 -25
- package/dist/schema/ddl.d.ts +43 -39
- package/dist/schema/ddl.js +75 -68
- package/dist/schema/ddlLock.d.ts +20 -24
- package/dist/schema/ddlLock.js +18 -23
- package/dist/schema/diff.d.ts +99 -61
- package/dist/schema/diff.js +43 -34
- package/dist/schema/field.d.ts +37 -42
- package/dist/schema/field.js +35 -48
- package/dist/schema/generate.d.ts +12 -12
- package/dist/schema/generate.js +12 -12
- package/dist/schema/index.d.ts +2 -2
- package/dist/schema/index.js +21 -23
- package/dist/schema/model.d.ts +118 -143
- package/dist/schema/model.js +22 -33
- package/dist/schema/openapi.d.ts +10 -9
- package/dist/schema/openapi.js +5 -3
- package/dist/schema/queries.d.ts +29 -31
- package/dist/schema/queries.js +23 -25
- package/dist/schema/relation.d.ts +89 -99
- package/dist/schema/relation.js +13 -13
- package/dist/schema/residency.d.ts +16 -13
- package/dist/schema/residency.js +16 -13
- package/dist/schema/roles.d.ts +36 -43
- package/dist/schema/roles.js +31 -37
- package/dist/schema/schema.d.ts +33 -42
- package/dist/schema/schema.js +31 -32
- package/dist/schema/select.d.ts +13 -13
- package/dist/schema/select.js +13 -13
- package/dist/schema/serialize.d.ts +28 -31
- package/dist/schema/serialize.js +27 -31
- package/dist/schema/sugar.d.ts +17 -32
- package/dist/schema/sugar.js +14 -29
- package/dist/schema/{sync-delta-row.d.ts → syncDeltaRow.d.ts} +26 -49
- package/dist/schema/syncDeltaRow.js +89 -0
- package/dist/schema/tenancy.d.ts +44 -46
- package/dist/schema/tenancy.js +46 -48
- package/dist/server/adapter.d.ts +58 -58
- package/dist/server/adapter.js +13 -14
- package/dist/server/commit.d.ts +60 -64
- package/dist/server/index.d.ts +9 -10
- package/dist/server/index.js +1 -1
- package/dist/server/readConfig.d.ts +70 -0
- package/dist/server/readConfig.js +8 -0
- package/dist/server/storageMode.d.ts +23 -0
- package/dist/server/storageMode.js +17 -0
- package/dist/source/adapter.d.ts +30 -25
- package/dist/source/adapter.js +10 -10
- package/dist/source/adapters/drizzle.d.ts +28 -23
- package/dist/source/adapters/drizzle.js +30 -25
- package/dist/source/adapters/kysely.d.ts +27 -25
- package/dist/source/adapters/kysely.js +24 -23
- package/dist/source/adapters/memory.d.ts +8 -7
- package/dist/source/adapters/memory.js +9 -8
- package/dist/source/adapters/prisma.d.ts +13 -12
- package/dist/source/adapters/prisma.js +22 -25
- package/dist/source/conformance.d.ts +18 -11
- package/dist/source/conformance.js +17 -11
- package/dist/source/connector.d.ts +31 -32
- package/dist/source/connector.js +28 -28
- package/dist/source/connectorProtocol.d.ts +160 -0
- package/dist/source/connectorProtocol.js +162 -0
- package/dist/source/contract.d.ts +26 -27
- package/dist/source/contract.js +28 -29
- package/dist/source/factory.d.ts +46 -58
- package/dist/source/factory.js +22 -27
- package/dist/source/index.d.ts +7 -9
- package/dist/source/index.js +12 -14
- package/dist/source/migrations.d.ts +9 -9
- package/dist/source/migrations.js +9 -9
- package/dist/source/next.d.ts +9 -10
- package/dist/source/next.js +6 -7
- package/dist/source/pushQueue.d.ts +69 -47
- package/dist/source/pushQueue.js +32 -28
- package/dist/source/signing.d.ts +46 -17
- package/dist/source/signing.js +28 -11
- package/dist/source/types.d.ts +121 -104
- package/dist/source/types.js +13 -14
- package/dist/stores/ObjectStore.d.ts +10 -11
- package/dist/stores/ObjectStore.js +11 -12
- package/dist/stores/ObjectStoreContract.d.ts +12 -15
- package/dist/stores/SyncActionStore.d.ts +7 -11
- package/dist/stores/SyncActionStore.js +13 -17
- package/dist/surface.d.ts +27 -20
- package/dist/surface.js +27 -20
- package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +36 -42
- package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +76 -76
- package/dist/sync/ConnectionManager.d.ts +39 -50
- package/dist/sync/ConnectionManager.js +55 -66
- package/dist/sync/NetworkProbe.d.ts +24 -29
- package/dist/sync/NetworkProbe.js +63 -69
- package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +42 -41
- package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +59 -54
- package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +43 -57
- package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +43 -51
- package/dist/sync/SyncWebSocket.d.ts +139 -165
- package/dist/sync/SyncWebSocket.js +191 -223
- package/dist/sync/awaitClaimGrant.d.ts +18 -18
- package/dist/sync/awaitClaimGrant.js +11 -11
- package/dist/sync/bootstrapApply.d.ts +34 -24
- package/dist/sync/bootstrapApply.js +27 -19
- package/dist/sync/commitFrames.d.ts +21 -20
- package/dist/sync/commitFrames.js +18 -18
- package/dist/sync/createClaimStream.d.ts +23 -22
- package/dist/sync/createClaimStream.js +105 -23
- package/dist/sync/createPresenceStream.d.ts +19 -18
- package/dist/sync/createPresenceStream.js +25 -26
- package/dist/sync/createSnapshot.d.ts +12 -14
- package/dist/sync/createSnapshot.js +20 -26
- package/dist/sync/credentialLifecycle.d.ts +104 -104
- package/dist/sync/credentialLifecycle.js +140 -147
- package/dist/sync/deltaPipeline.d.ts +36 -34
- package/dist/sync/deltaPipeline.js +64 -65
- package/dist/sync/groupChange.d.ts +63 -61
- package/dist/sync/groupChange.js +74 -78
- package/dist/sync/heartbeat.d.ts +34 -33
- package/dist/sync/heartbeat.js +31 -31
- package/dist/sync/participants.d.ts +19 -19
- package/dist/sync/schemas.d.ts +3 -2
- package/dist/sync/schemas.js +14 -10
- package/dist/sync/syncCursor.d.ts +17 -21
- package/dist/sync/syncCursor.js +17 -21
- package/dist/sync/syncPlan.d.ts +28 -36
- package/dist/sync/syncPlan.js +18 -19
- package/dist/sync/syncPosition.d.ts +54 -49
- package/dist/sync/syncPosition.js +57 -52
- package/dist/sync/wsFrameHandlers.d.ts +35 -36
- package/dist/sync/wsFrameHandlers.js +63 -67
- package/dist/testing/fixtures/bootstrap.d.ts +12 -6
- package/dist/testing/fixtures/bootstrap.js +12 -6
- package/dist/testing/fixtures/deltas.d.ts +30 -33
- package/dist/testing/fixtures/deltas.js +30 -33
- package/dist/testing/fixtures/models.d.ts +11 -10
- package/dist/testing/fixtures/models.js +11 -10
- package/dist/testing/helpers/{react-wrapper.d.ts → reactWrapper.d.ts} +13 -10
- package/dist/testing/helpers/{react-wrapper.js → reactWrapper.js} +15 -12
- package/dist/testing/helpers/{sync-engine-harness.d.ts → syncEngineHarness.d.ts} +17 -15
- package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +12 -10
- package/dist/testing/helpers/wait.d.ts +13 -8
- package/dist/testing/helpers/wait.js +13 -8
- package/dist/testing/index.d.ts +3 -3
- package/dist/testing/index.js +2 -2
- package/dist/testing/mocks/MockMutationExecutor.d.ts +18 -17
- package/dist/testing/mocks/MockMutationExecutor.js +15 -14
- package/dist/testing/mocks/MockNetworkMonitor.d.ts +8 -8
- package/dist/testing/mocks/MockNetworkMonitor.js +8 -8
- package/dist/testing/mocks/MockSyncContext.d.ts +20 -17
- package/dist/testing/mocks/MockSyncContext.js +15 -13
- package/dist/testing/mocks/MockSyncStore.d.ts +10 -10
- package/dist/testing/mocks/MockSyncStore.js +11 -11
- package/dist/testing/mocks/MockWebSocket.d.ts +26 -22
- package/dist/testing/mocks/MockWebSocket.js +22 -21
- package/dist/transactions/TransactionQueue.d.ts +181 -176
- package/dist/transactions/TransactionQueue.js +338 -350
- package/dist/transactions/TransactionStore.d.ts +6 -4
- package/dist/transactions/TransactionStore.js +6 -4
- package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
- package/dist/transactions/UnconfirmedWrites.js +104 -0
- package/dist/transactions/coalesceRules.d.ts +41 -17
- package/dist/transactions/coalesceRules.js +40 -17
- package/dist/transactions/commitPayload.d.ts +48 -52
- package/dist/transactions/commitPayload.js +48 -57
- package/dist/transactions/deltaConfirmation.d.ts +20 -22
- package/dist/transactions/deltaConfirmation.js +37 -45
- package/dist/transactions/optimisticApply.d.ts +49 -0
- package/dist/transactions/optimisticApply.js +65 -0
- package/dist/transactions/{persistedReplay.d.ts → replayValidation.d.ts} +28 -22
- package/dist/transactions/{persistedReplay.js → replayValidation.js} +33 -27
- package/dist/types/global.d.ts +46 -41
- package/dist/types/global.js +20 -19
- package/dist/types/index.d.ts +71 -77
- package/dist/types/index.js +22 -22
- package/dist/types/modelData.d.ts +6 -8
- package/dist/types/modelData.js +5 -7
- package/dist/types/participant.d.ts +10 -11
- package/dist/types/participant.js +6 -8
- package/dist/types/streams.d.ts +208 -195
- package/dist/types/streams.js +7 -7
- package/dist/utils/asyncIterator.d.ts +25 -32
- package/dist/utils/asyncIterator.js +25 -32
- package/dist/utils/duration.d.ts +12 -15
- package/dist/utils/duration.js +12 -15
- package/dist/utils/mobxSetup.d.ts +53 -0
- package/dist/utils/{mobx-setup.js → mobxSetup.js} +42 -98
- package/dist/webhooks/events.d.ts +21 -16
- package/dist/webhooks/events.js +10 -8
- package/dist/webhooks/index.d.ts +5 -7
- package/dist/webhooks/index.js +5 -7
- package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
- package/dist/wire/delta.js +114 -0
- package/dist/wire/errorEnvelope.d.ts +30 -31
- package/dist/wire/errorEnvelope.js +34 -40
- package/dist/wire/frames.d.ts +79 -86
- package/dist/wire/frames.js +26 -33
- package/dist/wire/index.d.ts +14 -12
- package/dist/wire/index.js +30 -26
- package/dist/wire/listEnvelope.d.ts +16 -23
- package/dist/wire/listEnvelope.js +7 -6
- package/dist/wire/protocol.d.ts +25 -32
- package/dist/wire/protocol.js +25 -32
- package/dist/wire/protocolVersion.d.ts +44 -40
- package/dist/wire/protocolVersion.js +44 -40
- package/docs/coordination.md +59 -0
- package/package.json +11 -10
- package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
- package/dist/ai-sdk/coordination-context.d.ts +0 -52
- package/dist/core/query-utils.d.ts +0 -34
- package/dist/core/query-utils.js +0 -59
- package/dist/schema/sync-delta-row.js +0 -103
- package/dist/schema/sync-delta-wire.js +0 -102
- package/dist/server/read-config.d.ts +0 -67
- package/dist/server/read-config.js +0 -8
- package/dist/server/storage-mode.d.ts +0 -8
- package/dist/server/storage-mode.js +0 -28
- package/dist/source/connector-protocol.d.ts +0 -159
- package/dist/source/connector-protocol.js +0 -161
- package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
- package/dist/transactions/OptimisticEchoTracker.js +0 -104
- package/dist/transactions/mutation-error-handler.d.ts +0 -5
- package/dist/transactions/mutation-error-handler.js +0 -39
- package/dist/transactions/optimistic.d.ts +0 -24
- package/dist/transactions/optimistic.js +0 -45
- package/dist/utils/mobx-setup.d.ts +0 -42
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* import cycle). The host's `onmessage` stays responsible for JSON
|
|
9
|
-
* parsing, heartbeat proof-of-life, and the outer try/catch; everything
|
|
10
|
-
* after that funnels through {@link dispatchWsFrame}.
|
|
2
|
+
* Routes each inbound frame from the sync WebSocket to the handler for its
|
|
3
|
+
* type. Handlers work against a minimal {@link WsSession} interface — only
|
|
4
|
+
* the members they actually touch, rather than the transport object itself,
|
|
5
|
+
* which keeps this module free of an import cycle. Reading a message off the
|
|
6
|
+
* socket, parsing its JSON, and tracking heartbeats all happen before this
|
|
7
|
+
* point; every parsed frame then passes through {@link dispatchWsFrame}.
|
|
11
8
|
*/
|
|
12
9
|
import { type CommitAck } from './commitFrames.js';
|
|
13
10
|
/**
|
|
@@ -33,9 +30,10 @@ export interface PendingClaim {
|
|
|
33
30
|
timeout: ReturnType<typeof setTimeout>;
|
|
34
31
|
}
|
|
35
32
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
33
|
+
* An in-flight `update_subscription` request awaiting its
|
|
34
|
+
* `subscription_ack`. The wire carries no correlation id, so requests are
|
|
35
|
+
* matched to their acknowledgements in first-in, first-out order, the same
|
|
36
|
+
* order the server applies them.
|
|
39
37
|
*/
|
|
40
38
|
export interface PendingSubscription {
|
|
41
39
|
resolve: (value: {
|
|
@@ -45,14 +43,14 @@ export interface PendingSubscription {
|
|
|
45
43
|
timeout: ReturnType<typeof setTimeout>;
|
|
46
44
|
}
|
|
47
45
|
/**
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
46
|
+
* A parsed inbound wire frame, straight from `JSON.parse`. The data is
|
|
47
|
+
* untrusted: every payload is loosely typed, and each handler narrows it
|
|
48
|
+
* defensively before use.
|
|
51
49
|
*/
|
|
52
50
|
export interface WsInboundFrame {
|
|
53
51
|
type?: string;
|
|
54
52
|
payload?: unknown;
|
|
55
|
-
/**
|
|
53
|
+
/** Some delta frames carry their delta fields at the top level rather than under `payload`. */
|
|
56
54
|
actionType?: unknown;
|
|
57
55
|
modelName?: unknown;
|
|
58
56
|
[key: string]: unknown;
|
|
@@ -60,17 +58,18 @@ export interface WsInboundFrame {
|
|
|
60
58
|
/** Narrow arbitrary wire data to a plain string-keyed record. */
|
|
61
59
|
export declare function isRecord(value: unknown): value is Record<string, unknown>;
|
|
62
60
|
/**
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
* payload
|
|
66
|
-
* canonical
|
|
61
|
+
* A type guard for the parsed result of an inbound message. A frame is any
|
|
62
|
+
* plain object whose `type`, when present, is a string. Validating the
|
|
63
|
+
* payload itself is left to each handler; delta payloads, for example, are
|
|
64
|
+
* checked against the canonical delta schema before they are applied.
|
|
67
65
|
*/
|
|
68
66
|
export declare function isWsInboundFrame(value: unknown): value is WsInboundFrame;
|
|
69
67
|
/**
|
|
70
|
-
* The
|
|
71
|
-
* builds
|
|
72
|
-
*
|
|
73
|
-
*
|
|
68
|
+
* The subset of the sync WebSocket that the frame handlers need. The
|
|
69
|
+
* transport builds a single object exposing these members over its own
|
|
70
|
+
* private state. Handlers read the fields live rather than capturing them,
|
|
71
|
+
* so resetting a field elsewhere — such as clearing pending subscriptions
|
|
72
|
+
* on close — never leaves a handler holding a stale value.
|
|
74
73
|
*/
|
|
75
74
|
export interface WsSession {
|
|
76
75
|
/** EventEmitter surface — handlers emit the typed transport events. */
|
|
@@ -79,7 +78,7 @@ export interface WsSession {
|
|
|
79
78
|
pendingMutations: Map<string, PendingCommit>;
|
|
80
79
|
/** In-flight claim acks keyed by claimId. */
|
|
81
80
|
pendingClaims: Map<string, PendingClaim>;
|
|
82
|
-
/**
|
|
81
|
+
/** Removes and returns the oldest in-flight `update_subscription` request. */
|
|
83
82
|
shiftPendingSubscription(): PendingSubscription | undefined;
|
|
84
83
|
/** Connection options subset the handlers write back (acked sync groups). */
|
|
85
84
|
options: {
|
|
@@ -88,10 +87,9 @@ export interface WsSession {
|
|
|
88
87
|
/** Registered collaboration event keys (colon format). */
|
|
89
88
|
collaborationEventTypes: ReadonlySet<string>;
|
|
90
89
|
/**
|
|
91
|
-
*
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
* handlers here never need to cast.
|
|
90
|
+
* Processes one inbound delta. The argument is untrusted wire data; the
|
|
91
|
+
* transport validates it against the canonical delta schema and drops
|
|
92
|
+
* anything malformed, so handlers here never cast.
|
|
95
93
|
*/
|
|
96
94
|
handleDelta(delta: unknown): void;
|
|
97
95
|
handleSyncResponse(payload: unknown): void;
|
|
@@ -103,15 +101,16 @@ export interface WsSession {
|
|
|
103
101
|
}
|
|
104
102
|
export type WsFrameHandler = (session: WsSession, message: WsInboundFrame) => void;
|
|
105
103
|
/**
|
|
106
|
-
*
|
|
107
|
-
* understands
|
|
108
|
-
* collaboration-event
|
|
104
|
+
* Maps each frame type to its handler. Every named server frame this
|
|
105
|
+
* package understands is dispatched from this table; anything else falls
|
|
106
|
+
* through to the collaboration-event and unknown-type path in
|
|
107
|
+
* {@link dispatchWsFrame}.
|
|
109
108
|
*/
|
|
110
109
|
export declare const wsFrameHandlers: Record<string, WsFrameHandler>;
|
|
111
110
|
/**
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
* the
|
|
115
|
-
*
|
|
111
|
+
* Routes one parsed inbound frame to its handler. Keepalive frames are
|
|
112
|
+
* ignored, a missing `type` is treated as a bare delta, and any unknown
|
|
113
|
+
* type falls through to the collaboration-event map, whose wire names use
|
|
114
|
+
* underscores and whose event keys use colons.
|
|
116
115
|
*/
|
|
117
116
|
export declare function dispatchWsFrame(session: WsSession, message: WsInboundFrame): void;
|
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* import cycle). The host's `onmessage` stays responsible for JSON
|
|
9
|
-
* parsing, heartbeat proof-of-life, and the outer try/catch; everything
|
|
10
|
-
* after that funnels through {@link dispatchWsFrame}.
|
|
2
|
+
* Routes each inbound frame from the sync WebSocket to the handler for its
|
|
3
|
+
* type. Handlers work against a minimal {@link WsSession} interface — only
|
|
4
|
+
* the members they actually touch, rather than the transport object itself,
|
|
5
|
+
* which keeps this module free of an import cycle. Reading a message off the
|
|
6
|
+
* socket, parsing its JSON, and tracking heartbeats all happen before this
|
|
7
|
+
* point; every parsed frame then passes through {@link dispatchWsFrame}.
|
|
11
8
|
*/
|
|
12
9
|
import { getContext } from '../context.js';
|
|
13
10
|
import { CapabilityError, errorFromWire, } from '../errors.js';
|
|
@@ -19,10 +16,10 @@ export function isRecord(value) {
|
|
|
19
16
|
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
20
17
|
}
|
|
21
18
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* payload
|
|
25
|
-
* canonical
|
|
19
|
+
* A type guard for the parsed result of an inbound message. A frame is any
|
|
20
|
+
* plain object whose `type`, when present, is a string. Validating the
|
|
21
|
+
* payload itself is left to each handler; delta payloads, for example, are
|
|
22
|
+
* checked against the canonical delta schema before they are applied.
|
|
26
23
|
*/
|
|
27
24
|
export function isWsInboundFrame(value) {
|
|
28
25
|
if (!isRecord(value))
|
|
@@ -31,10 +28,10 @@ export function isWsInboundFrame(value) {
|
|
|
31
28
|
return type === undefined || typeof type === 'string';
|
|
32
29
|
}
|
|
33
30
|
/**
|
|
34
|
-
*
|
|
35
|
-
* `MutationResultMessage
|
|
36
|
-
*
|
|
37
|
-
*
|
|
31
|
+
* Handles the acknowledgement of a `commit` request. The canonical wire
|
|
32
|
+
* shape is `MutationResultMessage`. The payload is parsed defensively
|
|
33
|
+
* rather than cast, since it is untrusted and may be malformed or sent by
|
|
34
|
+
* an older server.
|
|
38
35
|
*/
|
|
39
36
|
const handleMutationResult = (session, message) => {
|
|
40
37
|
const p = (message.payload ?? message);
|
|
@@ -54,9 +51,9 @@ const handleMutationResult = (session, message) => {
|
|
|
54
51
|
// Coerce defensively — bigint columns serialize as strings
|
|
55
52
|
// from older servers (see normalizeWireDelta).
|
|
56
53
|
const ackedSyncId = Number(lastSyncId);
|
|
57
|
-
//
|
|
58
|
-
// the advisory signal so
|
|
59
|
-
// the receipt
|
|
54
|
+
// The write succeeded, but a guarded premise shifted underneath it.
|
|
55
|
+
// Emit the advisory signal so a caller can react, and still resolve
|
|
56
|
+
// the receipt, since the commit itself went through.
|
|
60
57
|
if (notifications && notifications.length > 0) {
|
|
61
58
|
const txId = typeof clientTxId === 'string' ? clientTxId : '';
|
|
62
59
|
const event = {
|
|
@@ -86,13 +83,10 @@ const handleMutationResult = (session, message) => {
|
|
|
86
83
|
});
|
|
87
84
|
}
|
|
88
85
|
else {
|
|
89
|
-
// Capture the
|
|
90
|
-
//
|
|
91
|
-
//
|
|
92
|
-
//
|
|
93
|
-
// tank 40+ ops at once. We stringify object errors so
|
|
94
|
-
// structured server payloads (e.g., Zod issues, schema
|
|
95
|
-
// violations) survive the trip through `new Error(...)`.
|
|
86
|
+
// Capture the full server error so the caller can see what actually
|
|
87
|
+
// rejected the mutation, rather than a generic "mutation failed on
|
|
88
|
+
// server". Object errors are stringified so structured server payloads,
|
|
89
|
+
// such as validation issues, survive being wrapped in an Error.
|
|
96
90
|
let errorMessage;
|
|
97
91
|
let errorCode;
|
|
98
92
|
let requiredCapability;
|
|
@@ -123,14 +117,12 @@ const handleMutationResult = (session, message) => {
|
|
|
123
117
|
else {
|
|
124
118
|
errorMessage = 'mutation failed on server';
|
|
125
119
|
}
|
|
126
|
-
//
|
|
127
|
-
//
|
|
128
|
-
//
|
|
129
|
-
//
|
|
130
|
-
//
|
|
131
|
-
//
|
|
132
|
-
// along on the typed error's `conflicts` detail (see
|
|
133
|
-
// AbloStaleContextError.toJSON / errorEnvelope).
|
|
120
|
+
// A stale-context rejection (the write read state that has since
|
|
121
|
+
// changed) or a foreign-claim conflict is a coordination collision.
|
|
122
|
+
// The success-with-notifications path above records the conflict, and a
|
|
123
|
+
// hard rejection must record it too, or the collision count would miss
|
|
124
|
+
// every rejected write. The conflicting rows ride along on the typed
|
|
125
|
+
// error's `conflicts` detail.
|
|
134
126
|
if (errorCode === 'stale_context' ||
|
|
135
127
|
errorCode === 'claim_conflict' ||
|
|
136
128
|
errorCode === 'entity_claimed' ||
|
|
@@ -169,11 +161,9 @@ const handleMutationResult = (session, message) => {
|
|
|
169
161
|
}
|
|
170
162
|
};
|
|
171
163
|
/**
|
|
172
|
-
*
|
|
173
|
-
*
|
|
174
|
-
*
|
|
175
|
-
* payload: { claimId, success, syncGroups?,
|
|
176
|
-
* ttlSeconds?, error? } }
|
|
164
|
+
* Handles the acknowledgement of a `claim` request. The frame has the shape
|
|
165
|
+
* `{ type: 'claim_ack', payload: { claimId, success, syncGroups?,
|
|
166
|
+
* ttlSeconds?, error? } }`.
|
|
177
167
|
*/
|
|
178
168
|
const handleClaimAck = (session, message) => {
|
|
179
169
|
const p = (message.payload ?? {});
|
|
@@ -223,11 +213,11 @@ const handleClaimAck = (session, message) => {
|
|
|
223
213
|
}
|
|
224
214
|
};
|
|
225
215
|
/**
|
|
226
|
-
*
|
|
227
|
-
* correlation id, so
|
|
228
|
-
* request
|
|
229
|
-
* in
|
|
230
|
-
*
|
|
216
|
+
* Handles the acknowledgement of an `update_subscription` request. The wire
|
|
217
|
+
* carries no correlation id, so the ack is matched to the oldest pending
|
|
218
|
+
* request in first-in, first-out order, since the server applies and
|
|
219
|
+
* acknowledges subscription updates in the order it receives them. The
|
|
220
|
+
* payload is validated against its canonical schema before use.
|
|
231
221
|
*/
|
|
232
222
|
const handleSubscriptionAck = (session, message) => {
|
|
233
223
|
const pending = session.shiftPendingSubscription();
|
|
@@ -255,10 +245,10 @@ const handleSubscriptionAck = (session, message) => {
|
|
|
255
245
|
}
|
|
256
246
|
};
|
|
257
247
|
/**
|
|
258
|
-
* `delta`
|
|
259
|
-
*
|
|
260
|
-
*
|
|
261
|
-
*
|
|
248
|
+
* Handles a `delta` frame, which carries either a single delta or a
|
|
249
|
+
* `{ deltas: [...] }` batch. This only tells the two shapes apart; each
|
|
250
|
+
* delta is validated once downstream, so batch elements are passed along
|
|
251
|
+
* raw rather than parsed here.
|
|
262
252
|
*/
|
|
263
253
|
const handleDeltaFrame = (session, message) => {
|
|
264
254
|
const p = message.payload;
|
|
@@ -271,14 +261,15 @@ const handleDeltaFrame = (session, message) => {
|
|
|
271
261
|
for (const d of p.deltas) {
|
|
272
262
|
session.handleDelta(d);
|
|
273
263
|
}
|
|
274
|
-
// `p.newVersions` from
|
|
275
|
-
//
|
|
264
|
+
// `p.newVersions` from older servers is ignored; `sync_id` is the
|
|
265
|
+
// causality token.
|
|
276
266
|
}
|
|
277
267
|
};
|
|
278
268
|
/**
|
|
279
|
-
*
|
|
280
|
-
* understands
|
|
281
|
-
* collaboration-event
|
|
269
|
+
* Maps each frame type to its handler. Every named server frame this
|
|
270
|
+
* package understands is dispatched from this table; anything else falls
|
|
271
|
+
* through to the collaboration-event and unknown-type path in
|
|
272
|
+
* {@link dispatchWsFrame}.
|
|
282
273
|
*/
|
|
283
274
|
export const wsFrameHandlers = {
|
|
284
275
|
sync_response: (session, message) => { session.handleSyncResponse(message.payload); },
|
|
@@ -299,10 +290,9 @@ export const wsFrameHandlers = {
|
|
|
299
290
|
}
|
|
300
291
|
},
|
|
301
292
|
claim_rejected: (session, message) => {
|
|
302
|
-
//
|
|
303
|
-
//
|
|
304
|
-
//
|
|
305
|
-
// the conflict shape (peerId, target, etc.).
|
|
293
|
+
// The server denied a claim because the target is already held by
|
|
294
|
+
// another participant. The payload is forwarded as-is for the claim
|
|
295
|
+
// stream consumer to interpret (peerId, target, and so on).
|
|
306
296
|
recordClaim('rejected', (message.payload ?? {}));
|
|
307
297
|
session.emit('claim_rejected', message.payload ?? {});
|
|
308
298
|
},
|
|
@@ -334,13 +324,20 @@ export const wsFrameHandlers = {
|
|
|
334
324
|
recordClaim('lost', (message.payload ?? {}));
|
|
335
325
|
session.emit('claim_lost', message.payload ?? {});
|
|
336
326
|
},
|
|
327
|
+
claim_heartbeat_ack: (session, message) => {
|
|
328
|
+
// Reply to our `claim_heartbeat` — the claim stream correlates it back
|
|
329
|
+
// to the awaiting caller by claimId. Not logged per-frame: heartbeats
|
|
330
|
+
// are a cadence, and the interesting transitions (lost) surface through
|
|
331
|
+
// the caller's error path.
|
|
332
|
+
session.emit('claim_heartbeat_ack', message.payload ?? {});
|
|
333
|
+
},
|
|
337
334
|
delta: handleDeltaFrame,
|
|
338
335
|
};
|
|
339
336
|
/**
|
|
340
|
-
*
|
|
341
|
-
*
|
|
342
|
-
* the
|
|
343
|
-
*
|
|
337
|
+
* Routes one parsed inbound frame to its handler. Keepalive frames are
|
|
338
|
+
* ignored, a missing `type` is treated as a bare delta, and any unknown
|
|
339
|
+
* type falls through to the collaboration-event map, whose wire names use
|
|
340
|
+
* underscores and whose event keys use colons.
|
|
344
341
|
*/
|
|
345
342
|
export function dispatchWsFrame(session, message) {
|
|
346
343
|
if (message.type === 'pong' || message.type === 'ping') {
|
|
@@ -349,16 +346,15 @@ export function dispatchWsFrame(session, message) {
|
|
|
349
346
|
return;
|
|
350
347
|
}
|
|
351
348
|
if (message.type === undefined) {
|
|
352
|
-
//
|
|
353
|
-
// normalizeWireDelta seam like every other delta).
|
|
349
|
+
// A bare delta, validated downstream like every other delta.
|
|
354
350
|
if (message.actionType || message.modelName) {
|
|
355
351
|
session.handleDelta(message);
|
|
356
352
|
}
|
|
357
353
|
return;
|
|
358
354
|
}
|
|
359
|
-
//
|
|
360
|
-
// Object.prototype
|
|
361
|
-
// path
|
|
355
|
+
// Look up own properties only, so a wire type like 'toString' can't match
|
|
356
|
+
// an inherited Object.prototype member; such types fall through to the
|
|
357
|
+
// unknown-type path.
|
|
362
358
|
const handler = Object.prototype.hasOwnProperty.call(wsFrameHandlers, message.type)
|
|
363
359
|
? wsFrameHandlers[message.type]
|
|
364
360
|
: undefined;
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* Factories that build well-formed bootstrap responses for tests. A
|
|
3
|
+
* bootstrap response is what the server returns when a client first syncs:
|
|
4
|
+
* either a full snapshot of the models or a partial batch of deltas since a
|
|
5
|
+
* known point. These helpers produce the same shapes, so tests can exercise
|
|
6
|
+
* client sync logic without a live server.
|
|
5
7
|
*/
|
|
6
8
|
import type { BootstrapType } from '../../types/index.js';
|
|
7
9
|
export type BootstrapModelData = Record<string, Record<string, unknown>[]>;
|
|
@@ -21,15 +23,19 @@ export interface BootstrapResponse {
|
|
|
21
23
|
timestamp: number;
|
|
22
24
|
}
|
|
23
25
|
/**
|
|
24
|
-
*
|
|
26
|
+
* Builds a full bootstrap response — a fresh snapshot of the given models,
|
|
27
|
+
* as the server sends on a client's first sync.
|
|
25
28
|
*/
|
|
26
29
|
export declare function createFullBootstrapResponse(models: BootstrapModelData, lastSyncId?: number): BootstrapResponse;
|
|
27
30
|
/**
|
|
28
|
-
*
|
|
31
|
+
* Builds a partial bootstrap response — a batch of deltas applied on top of
|
|
32
|
+
* the client's last known sync point, given by `lastSyncId`.
|
|
29
33
|
*/
|
|
30
34
|
export declare function createPartialBootstrapResponse(deltas: BootstrapResponse['deltas'], lastSyncId: number): BootstrapResponse;
|
|
31
35
|
/**
|
|
32
|
-
*
|
|
36
|
+
* Builds a full bootstrap response with the common test models
|
|
37
|
+
* pre-populated. Pass any of the named model arrays to include them in the
|
|
38
|
+
* snapshot.
|
|
33
39
|
*/
|
|
34
40
|
export declare function createTestBootstrapResponse(options?: {
|
|
35
41
|
tasks?: Record<string, unknown>[];
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* Factories that build well-formed bootstrap responses for tests. A
|
|
3
|
+
* bootstrap response is what the server returns when a client first syncs:
|
|
4
|
+
* either a full snapshot of the models or a partial batch of deltas since a
|
|
5
|
+
* known point. These helpers produce the same shapes, so tests can exercise
|
|
6
|
+
* client sync logic without a live server.
|
|
5
7
|
*/
|
|
6
8
|
/**
|
|
7
|
-
*
|
|
9
|
+
* Builds a full bootstrap response — a fresh snapshot of the given models,
|
|
10
|
+
* as the server sends on a client's first sync.
|
|
8
11
|
*/
|
|
9
12
|
export function createFullBootstrapResponse(models, lastSyncId = 100) {
|
|
10
13
|
return {
|
|
@@ -15,7 +18,8 @@ export function createFullBootstrapResponse(models, lastSyncId = 100) {
|
|
|
15
18
|
};
|
|
16
19
|
}
|
|
17
20
|
/**
|
|
18
|
-
*
|
|
21
|
+
* Builds a partial bootstrap response — a batch of deltas applied on top of
|
|
22
|
+
* the client's last known sync point, given by `lastSyncId`.
|
|
19
23
|
*/
|
|
20
24
|
export function createPartialBootstrapResponse(deltas, lastSyncId) {
|
|
21
25
|
return {
|
|
@@ -27,7 +31,9 @@ export function createPartialBootstrapResponse(deltas, lastSyncId) {
|
|
|
27
31
|
};
|
|
28
32
|
}
|
|
29
33
|
/**
|
|
30
|
-
*
|
|
34
|
+
* Builds a full bootstrap response with the common test models
|
|
35
|
+
* pre-populated. Pass any of the named model arrays to include them in the
|
|
36
|
+
* snapshot.
|
|
31
37
|
*/
|
|
32
38
|
export function createTestBootstrapResponse(options = {}) {
|
|
33
39
|
const models = {};
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* Factories that build well-formed delta objects for tests. A delta, a
|
|
3
|
+
* {@link SyncAction}, is a single change to one model instance in the wire
|
|
4
|
+
* format the server sends: an insert, update, delete, archive, and so on.
|
|
5
|
+
* These helpers let tests construct deltas without a live server.
|
|
5
6
|
*/
|
|
6
7
|
import type { SyncActionType, SyncAction } from '../../types/index.js';
|
|
7
8
|
/** Reset the delta counter (call in beforeEach for deterministic IDs) */
|
|
@@ -19,68 +20,64 @@ export interface CreateDeltaOptions {
|
|
|
19
20
|
data?: Record<string, unknown>;
|
|
20
21
|
}
|
|
21
22
|
/**
|
|
22
|
-
*
|
|
23
|
+
* Builds a single delta ({@link SyncAction}) in the server's wire format.
|
|
23
24
|
*/
|
|
24
25
|
export declare function createDelta(options: CreateDeltaOptions): SyncAction;
|
|
25
26
|
/**
|
|
26
|
-
*
|
|
27
|
+
* Builds an insert delta for a new entity.
|
|
27
28
|
*/
|
|
28
29
|
export declare function createInsertDelta(modelName: string, modelId: string, data: Record<string, unknown>, syncId?: number): SyncAction;
|
|
29
30
|
/**
|
|
30
|
-
*
|
|
31
|
+
* Builds an update delta for an existing entity.
|
|
31
32
|
*/
|
|
32
33
|
export declare function createUpdateDelta(modelName: string, modelId: string, data: Record<string, unknown>, syncId?: number): SyncAction;
|
|
33
34
|
/**
|
|
34
|
-
*
|
|
35
|
+
* Builds a delete delta.
|
|
35
36
|
*/
|
|
36
37
|
export declare function createDeleteDelta(modelName: string, modelId: string, syncId?: number): SyncAction;
|
|
37
38
|
/**
|
|
38
|
-
*
|
|
39
|
+
* Builds an archive delta, stamping `archivedAt` with the current time.
|
|
39
40
|
*/
|
|
40
41
|
export declare function createArchiveDelta(modelName: string, modelId: string, syncId?: number): SyncAction;
|
|
41
42
|
/**
|
|
42
|
-
*
|
|
43
|
+
* Builds an unarchive delta, clearing `archivedAt`.
|
|
43
44
|
*/
|
|
44
45
|
export declare function createUnarchiveDelta(modelName: string, modelId: string, syncId?: number): SyncAction;
|
|
45
46
|
/**
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
* store as if newly created. Typically follows a GroupAdded delta.
|
|
47
|
+
* Builds a covering ('C') delta. It signals that the client has gained
|
|
48
|
+
* permission to see an entity that already exists. The client treats it
|
|
49
|
+
* like an insert, adding the entity to its local store as if newly created.
|
|
50
|
+
* A covering delta typically follows a group-added delta.
|
|
51
51
|
*/
|
|
52
52
|
export declare function createCoveringDelta(modelName: string, modelId: string, data: Record<string, unknown>, syncId?: number): SyncAction;
|
|
53
53
|
/**
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
* (addedGroups/removedGroups), this does not trigger a re-bootstrap.
|
|
54
|
+
* Builds a group-added ('G') delta in the incremental payload shape. It
|
|
55
|
+
* signals that the recipient was added to a single sync group. The client
|
|
56
|
+
* updates its subscription state and waits for covering deltas to deliver
|
|
57
|
+
* the newly visible entities. Unlike the older payload that carries both
|
|
58
|
+
* added and removed groups, this shape does not trigger a re-bootstrap.
|
|
60
59
|
*/
|
|
61
60
|
export declare function createGroupAddedDelta(userId: string, group: string, syncId?: number): SyncAction;
|
|
62
61
|
/**
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
* the deprecated EmitGroupChange path.
|
|
62
|
+
* Builds a group-change ('G') delta in the older payload shape, which
|
|
63
|
+
* carries both added and removed groups in one delta and forces a full
|
|
64
|
+
* re-bootstrap on the client. Useful for testing backward compatibility
|
|
65
|
+
* with that older shape.
|
|
68
66
|
*/
|
|
69
67
|
export declare function createLegacyGroupChangeDelta(userId: string, added: string[], removed: string[], syncId?: number): SyncAction;
|
|
70
68
|
/**
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
* purges affected local state and triggers a re-bootstrap with the
|
|
75
|
-
* updated group list.
|
|
69
|
+
* Builds a group-removed ('S') delta. It signals that the recipient lost
|
|
70
|
+
* access to a sync group. The client purges the affected local state and
|
|
71
|
+
* re-bootstraps with the updated group list.
|
|
76
72
|
*/
|
|
77
73
|
export declare function createGroupRemovedDelta(userId: string, group: string, syncId?: number): SyncAction;
|
|
78
74
|
/**
|
|
79
|
-
*
|
|
75
|
+
* Builds a batch of deltas with sequential sync IDs.
|
|
80
76
|
*/
|
|
81
77
|
export declare function createDeltaBatch(deltas: Omit<CreateDeltaOptions, 'id'>[], startingSyncId?: number): SyncAction[];
|
|
82
78
|
/**
|
|
83
|
-
*
|
|
84
|
-
*
|
|
79
|
+
* Builds a confirmation delta, which signals that a mutation was persisted
|
|
80
|
+
* by the server. The client's transaction queue watches for these to
|
|
81
|
+
* confirm its in-flight writes.
|
|
85
82
|
*/
|
|
86
83
|
export declare function createConfirmationDelta(modelName: string, modelId: string, syncId: number, action?: SyncActionType, data?: Record<string, unknown>): SyncAction;
|