@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
|
@@ -1,17 +1,43 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Stores and manages sync actions received from the server.
|
|
5
|
-
* Critical for delta sync and maintaining sync state consistency.
|
|
2
|
+
* A local, IndexedDB-backed store for the sync actions (change deltas) the
|
|
3
|
+
* server sends. See {@link SyncActionStore}.
|
|
6
4
|
*/
|
|
5
|
+
// Uses native IndexedDB for maximum performance
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { getContext } from '../context.js';
|
|
7
8
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
|
|
9
|
+
* The validation boundary for rows read back from the store. A row may have
|
|
10
|
+
* been written by an earlier session, so this build cannot assume its shape.
|
|
11
|
+
* Parsing in strip mode also drops the storage bookkeeping fields
|
|
12
|
+
* (`storedAt`, `applied`, `appliedAt`) that are not part of a
|
|
13
|
+
* {@link SyncAction}. A row that fails to parse is dropped and logged rather
|
|
14
|
+
* than replayed as a malformed delta.
|
|
15
|
+
*/
|
|
16
|
+
const storedSyncActionSchema = z.object({
|
|
17
|
+
id: z.number(),
|
|
18
|
+
modelName: z.string(),
|
|
19
|
+
modelId: z.string(),
|
|
20
|
+
action: z.enum(['I', 'U', 'A', 'D', 'C', 'G', 'S', 'V']),
|
|
21
|
+
data: z.unknown(),
|
|
22
|
+
__class: z.literal('SyncAction').default('SyncAction'),
|
|
23
|
+
});
|
|
24
|
+
/** Parse one stored row into a SyncAction, or `null` (dropped + logged). */
|
|
25
|
+
function toSyncAction(row) {
|
|
26
|
+
const parsed = storedSyncActionSchema.safeParse(row);
|
|
27
|
+
if (!parsed.success) {
|
|
28
|
+
getContext().logger.debug('[SyncActionStore] Dropping malformed stored sync action', {
|
|
29
|
+
issues: parsed.error.issues.map((i) => i.path.join('.')).join(', '),
|
|
30
|
+
});
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
return parsed.data;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Stores the sync actions (the change deltas) the server sends, keyed by
|
|
37
|
+
* their sync id, and tracks which ones have been applied. It keeps a
|
|
38
|
+
* watermark of the last applied id, holds not-yet-applied actions as
|
|
39
|
+
* pending, and can rewind a range of actions back to pending so they can be
|
|
40
|
+
* replayed while resolving a conflict.
|
|
15
41
|
*/
|
|
16
42
|
export class SyncActionStore {
|
|
17
43
|
db;
|
|
@@ -51,8 +77,8 @@ export class SyncActionStore {
|
|
|
51
77
|
}
|
|
52
78
|
resolve();
|
|
53
79
|
};
|
|
54
|
-
tx.onerror = () => reject(tx.error);
|
|
55
|
-
request.onerror = () => reject(request.error);
|
|
80
|
+
tx.onerror = () => { reject(tx.error); };
|
|
81
|
+
request.onerror = () => { reject(request.error); };
|
|
56
82
|
});
|
|
57
83
|
}
|
|
58
84
|
/**
|
|
@@ -83,10 +109,10 @@ export class SyncActionStore {
|
|
|
83
109
|
}
|
|
84
110
|
}
|
|
85
111
|
};
|
|
86
|
-
request.onerror = () => reject(request.error);
|
|
112
|
+
request.onerror = () => { reject(request.error); };
|
|
87
113
|
}
|
|
88
|
-
tx.oncomplete = () => resolve();
|
|
89
|
-
tx.onerror = () => reject(tx.error);
|
|
114
|
+
tx.oncomplete = () => { resolve(); };
|
|
115
|
+
tx.onerror = () => { reject(tx.error); };
|
|
90
116
|
});
|
|
91
117
|
}
|
|
92
118
|
/**
|
|
@@ -103,10 +129,9 @@ export class SyncActionStore {
|
|
|
103
129
|
resolve(undefined);
|
|
104
130
|
return;
|
|
105
131
|
}
|
|
106
|
-
|
|
107
|
-
resolve(action);
|
|
132
|
+
resolve(toSyncAction(data) ?? undefined);
|
|
108
133
|
};
|
|
109
|
-
request.onerror = () => reject(request.error);
|
|
134
|
+
request.onerror = () => { reject(request.error); };
|
|
110
135
|
});
|
|
111
136
|
}
|
|
112
137
|
/**
|
|
@@ -121,10 +146,12 @@ export class SyncActionStore {
|
|
|
121
146
|
const request = index.getAll(range);
|
|
122
147
|
request.onsuccess = () => {
|
|
123
148
|
const allData = request.result;
|
|
124
|
-
const actions = allData
|
|
149
|
+
const actions = allData
|
|
150
|
+
.map(toSyncAction)
|
|
151
|
+
.filter((action) => action !== null);
|
|
125
152
|
resolve(actions);
|
|
126
153
|
};
|
|
127
|
-
request.onerror = () => reject(request.error);
|
|
154
|
+
request.onerror = () => { reject(request.error); };
|
|
128
155
|
});
|
|
129
156
|
}
|
|
130
157
|
/**
|
|
@@ -142,7 +169,9 @@ export class SyncActionStore {
|
|
|
142
169
|
* Mark sync action as applied
|
|
143
170
|
*/
|
|
144
171
|
async markAsApplied(syncId) {
|
|
145
|
-
|
|
172
|
+
// Plain (non-async) executor: a sync throw (e.g. transaction() on a
|
|
173
|
+
// closing DB) must reject this promise, not vanish into an ignored one.
|
|
174
|
+
return new Promise((resolve, reject) => {
|
|
146
175
|
const tx = this.db.transaction([this.storeName], 'readwrite');
|
|
147
176
|
const store = tx.objectStore(this.storeName);
|
|
148
177
|
const getRequest = store.get(syncId);
|
|
@@ -152,10 +181,10 @@ export class SyncActionStore {
|
|
|
152
181
|
existing.applied = true;
|
|
153
182
|
existing.appliedAt = Date.now();
|
|
154
183
|
const putRequest = store.put(existing);
|
|
155
|
-
putRequest.onerror = () => reject(putRequest.error);
|
|
184
|
+
putRequest.onerror = () => { reject(putRequest.error); };
|
|
156
185
|
}
|
|
157
186
|
};
|
|
158
|
-
getRequest.onerror = () => reject(getRequest.error);
|
|
187
|
+
getRequest.onerror = () => { reject(getRequest.error); };
|
|
159
188
|
tx.oncomplete = async () => {
|
|
160
189
|
// Update tracking
|
|
161
190
|
if (syncId > this.lastAppliedSyncId) {
|
|
@@ -172,7 +201,7 @@ export class SyncActionStore {
|
|
|
172
201
|
reject(error);
|
|
173
202
|
}
|
|
174
203
|
};
|
|
175
|
-
tx.onerror = () => reject(tx.error);
|
|
204
|
+
tx.onerror = () => { reject(tx.error); };
|
|
176
205
|
});
|
|
177
206
|
}
|
|
178
207
|
/**
|
|
@@ -181,7 +210,7 @@ export class SyncActionStore {
|
|
|
181
210
|
async markManyAsApplied(syncIds) {
|
|
182
211
|
if (syncIds.length === 0)
|
|
183
212
|
return;
|
|
184
|
-
return new Promise(
|
|
213
|
+
return new Promise((resolve, reject) => {
|
|
185
214
|
const tx = this.db.transaction([this.storeName], 'readwrite');
|
|
186
215
|
const store = tx.objectStore(this.storeName);
|
|
187
216
|
let processed = 0;
|
|
@@ -206,14 +235,14 @@ export class SyncActionStore {
|
|
|
206
235
|
}
|
|
207
236
|
}
|
|
208
237
|
};
|
|
209
|
-
putRequest.onerror = () => reject(putRequest.error);
|
|
238
|
+
putRequest.onerror = () => { reject(putRequest.error); };
|
|
210
239
|
}
|
|
211
240
|
else {
|
|
212
241
|
processed++;
|
|
213
242
|
this.pendingActions.delete(syncId);
|
|
214
243
|
}
|
|
215
244
|
};
|
|
216
|
-
getRequest.onerror = () => reject(getRequest.error);
|
|
245
|
+
getRequest.onerror = () => { reject(getRequest.error); };
|
|
217
246
|
}
|
|
218
247
|
tx.oncomplete = async () => {
|
|
219
248
|
// Update metadata with the highest sync ID
|
|
@@ -231,7 +260,7 @@ export class SyncActionStore {
|
|
|
231
260
|
resolve();
|
|
232
261
|
}
|
|
233
262
|
};
|
|
234
|
-
tx.onerror = () => reject(tx.error);
|
|
263
|
+
tx.onerror = () => { reject(tx.error); };
|
|
235
264
|
});
|
|
236
265
|
}
|
|
237
266
|
/**
|
|
@@ -265,7 +294,7 @@ export class SyncActionStore {
|
|
|
265
294
|
currentId++;
|
|
266
295
|
checkNext();
|
|
267
296
|
};
|
|
268
|
-
request.onerror = () => reject(request.error);
|
|
297
|
+
request.onerror = () => { reject(request.error); };
|
|
269
298
|
};
|
|
270
299
|
checkNext();
|
|
271
300
|
});
|
|
@@ -293,7 +322,7 @@ export class SyncActionStore {
|
|
|
293
322
|
currentId++;
|
|
294
323
|
checkNext();
|
|
295
324
|
};
|
|
296
|
-
request.onerror = () => reject(request.error);
|
|
325
|
+
request.onerror = () => { reject(request.error); };
|
|
297
326
|
};
|
|
298
327
|
checkNext();
|
|
299
328
|
});
|
|
@@ -317,7 +346,7 @@ export class SyncActionStore {
|
|
|
317
346
|
cleaned++;
|
|
318
347
|
cursor.continue();
|
|
319
348
|
};
|
|
320
|
-
deleteRequest.onerror = () => reject(deleteRequest.error);
|
|
349
|
+
deleteRequest.onerror = () => { reject(deleteRequest.error); };
|
|
321
350
|
}
|
|
322
351
|
else {
|
|
323
352
|
cursor.continue();
|
|
@@ -328,7 +357,7 @@ export class SyncActionStore {
|
|
|
328
357
|
resolve(cleaned);
|
|
329
358
|
}
|
|
330
359
|
};
|
|
331
|
-
request.onerror = () => reject(request.error);
|
|
360
|
+
request.onerror = () => { reject(request.error); };
|
|
332
361
|
});
|
|
333
362
|
}
|
|
334
363
|
/**
|
|
@@ -344,8 +373,8 @@ export class SyncActionStore {
|
|
|
344
373
|
this.lastAppliedSyncId = 0;
|
|
345
374
|
resolve();
|
|
346
375
|
};
|
|
347
|
-
tx.onerror = () => reject(tx.error);
|
|
348
|
-
request.onerror = () => reject(request.error);
|
|
376
|
+
tx.onerror = () => { reject(tx.error); };
|
|
377
|
+
request.onerror = () => { reject(request.error); };
|
|
349
378
|
});
|
|
350
379
|
}
|
|
351
380
|
/**
|
|
@@ -373,7 +402,7 @@ export class SyncActionStore {
|
|
|
373
402
|
newestAction: timestamps.length > 0 ? new Date(timestamps[timestamps.length - 1]) : null,
|
|
374
403
|
});
|
|
375
404
|
};
|
|
376
|
-
request.onerror = () => reject(request.error);
|
|
405
|
+
request.onerror = () => { reject(request.error); };
|
|
377
406
|
});
|
|
378
407
|
}
|
|
379
408
|
/**
|
|
@@ -389,11 +418,11 @@ export class SyncActionStore {
|
|
|
389
418
|
metadata.lastSyncId = syncId;
|
|
390
419
|
metadata.updatedAt = new Date();
|
|
391
420
|
const putRequest = store.put(metadata, 'metadata');
|
|
392
|
-
putRequest.onerror = () => reject(putRequest.error);
|
|
421
|
+
putRequest.onerror = () => { reject(putRequest.error); };
|
|
393
422
|
};
|
|
394
|
-
getRequest.onerror = () => reject(getRequest.error);
|
|
395
|
-
tx.oncomplete = () => resolve();
|
|
396
|
-
tx.onerror = () => reject(tx.error);
|
|
423
|
+
getRequest.onerror = () => { reject(getRequest.error); };
|
|
424
|
+
tx.oncomplete = () => { resolve(); };
|
|
425
|
+
tx.onerror = () => { reject(tx.error); };
|
|
397
426
|
});
|
|
398
427
|
}
|
|
399
428
|
/**
|
|
@@ -416,14 +445,14 @@ export class SyncActionStore {
|
|
|
416
445
|
resolve(undefined);
|
|
417
446
|
}
|
|
418
447
|
};
|
|
419
|
-
request.onerror = () => reject(request.error);
|
|
448
|
+
request.onerror = () => { reject(request.error); };
|
|
420
449
|
});
|
|
421
450
|
}
|
|
422
451
|
/**
|
|
423
452
|
* Rewind to a specific sync ID (for conflict resolution)
|
|
424
453
|
*/
|
|
425
454
|
async rewindTo(syncId) {
|
|
426
|
-
return new Promise(
|
|
455
|
+
return new Promise((resolve, reject) => {
|
|
427
456
|
// Get all actions after this sync ID
|
|
428
457
|
const tx = this.db.transaction([this.storeName], 'readonly');
|
|
429
458
|
const store = tx.objectStore(this.storeName);
|
|
@@ -461,21 +490,23 @@ export class SyncActionStore {
|
|
|
461
490
|
this.lastAppliedSyncId = syncId - 1;
|
|
462
491
|
}
|
|
463
492
|
};
|
|
464
|
-
putRequest.onerror = () => reject(putRequest.error);
|
|
493
|
+
putRequest.onerror = () => { reject(putRequest.error); };
|
|
465
494
|
}
|
|
466
495
|
writeTx.oncomplete = async () => {
|
|
467
496
|
try {
|
|
468
497
|
await this.updateLastSyncId(this.lastAppliedSyncId);
|
|
469
|
-
const result = actionsToRewind
|
|
498
|
+
const result = actionsToRewind
|
|
499
|
+
.map(toSyncAction)
|
|
500
|
+
.filter((action) => action !== null);
|
|
470
501
|
resolve(result);
|
|
471
502
|
}
|
|
472
503
|
catch (error) {
|
|
473
504
|
reject(error);
|
|
474
505
|
}
|
|
475
506
|
};
|
|
476
|
-
writeTx.onerror = () => reject(writeTx.error);
|
|
507
|
+
writeTx.onerror = () => { reject(writeTx.error); };
|
|
477
508
|
};
|
|
478
|
-
request.onerror = () => reject(request.error);
|
|
509
|
+
request.onerror = () => { reject(request.error); };
|
|
479
510
|
});
|
|
480
511
|
}
|
|
481
512
|
}
|
package/dist/surface.d.ts
CHANGED
|
@@ -1,29 +1,36 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* A machine-checked manifest of this package's public API surface. It lists,
|
|
3
|
+
* as string tuples, the method names on `ablo.<model>`, the keys accepted by
|
|
4
|
+
* the list-style read options, and the keys of the client constructor
|
|
5
|
+
* options. Each tuple is proven equal to the keys of its source interface at
|
|
6
|
+
* compile time, so the lists cannot drift from the real types: add or remove
|
|
7
|
+
* a name on either side without updating the matching tuple and this file
|
|
8
|
+
* fails to compile, in both directions — no name the interface lacks, and no
|
|
9
|
+
* interface key the tuple omits.
|
|
5
10
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* NAMES are guaranteed; descriptions stay hand-written (prose can't be type-checked).
|
|
11
|
+
* Documentation tooling reads these tuples to describe the surface, which
|
|
12
|
+
* guarantees a generated summary never names a method or option that does
|
|
13
|
+
* not exist. The names are verified here; their prose descriptions are
|
|
14
|
+
* written by hand, since prose cannot be type-checked.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* The names of every method available on `ablo.<model>`, matching the keys of
|
|
18
|
+
* the {@link ModelOperations} interface. Documentation tooling reads this
|
|
19
|
+
* tuple, so it is the one list of model-verb names a generated summary can
|
|
20
|
+
* describe.
|
|
17
21
|
*/
|
|
18
|
-
/** Every method on `ablo.<model>` (the stateful `ModelOperations`). The single
|
|
19
|
-
* source of truth for the model-verb names the docs/MCP may describe. */
|
|
20
22
|
export declare const PUBLIC_MODEL_VERBS: readonly ["retrieve", "list", "get", "getAll", "getCount", "create", "update", "delete", "claim", "watch", "onChange"];
|
|
21
|
-
/**
|
|
22
|
-
*
|
|
23
|
+
/**
|
|
24
|
+
* The option keys accepted by `list`, `getAll`, and `onChange`, matching the
|
|
25
|
+
* keys of {@link LocalReadOptions}. Note that the lifecycle filter is named
|
|
26
|
+
* `state`, not `scope`.
|
|
27
|
+
*/
|
|
23
28
|
export declare const PUBLIC_LIST_OPTION_KEYS: readonly ["where", "filter", "orderBy", "limit", "offset", "state"];
|
|
24
|
-
/**
|
|
25
|
-
*
|
|
26
|
-
|
|
29
|
+
/**
|
|
30
|
+
* The keys of the client constructor options, {@link AbloOptions}. Only
|
|
31
|
+
* `schema` is required; every other key is optional.
|
|
32
|
+
*/
|
|
33
|
+
export declare const PUBLIC_ABLO_OPTION_KEYS: readonly ["schema", "apiKey", "authEndpoint", "databaseUrl", "persistence", "transport", "debug", "logLevel", "authToken", "baseURL", "fetch", "defaultHeaders", "defaultQuery", "dangerouslyAllowBrowser"];
|
|
27
34
|
export type ModelVerb = (typeof PUBLIC_MODEL_VERBS)[number];
|
|
28
35
|
export type ListOptionKey = (typeof PUBLIC_LIST_OPTION_KEYS)[number];
|
|
29
36
|
export type AbloOptionKey = (typeof PUBLIC_ABLO_OPTION_KEYS)[number];
|
package/dist/surface.js
CHANGED
|
@@ -1,23 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* A machine-checked manifest of this package's public API surface. It lists,
|
|
3
|
+
* as string tuples, the method names on `ablo.<model>`, the keys accepted by
|
|
4
|
+
* the list-style read options, and the keys of the client constructor
|
|
5
|
+
* options. Each tuple is proven equal to the keys of its source interface at
|
|
6
|
+
* compile time, so the lists cannot drift from the real types: add or remove
|
|
7
|
+
* a name on either side without updating the matching tuple and this file
|
|
8
|
+
* fails to compile, in both directions — no name the interface lacks, and no
|
|
9
|
+
* interface key the tuple omits.
|
|
5
10
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* `Expect<Equal<…>>`. Add or remove a verb/option without updating the matching
|
|
11
|
-
* tuple and THIS FILE FAILS TO COMPILE (the `Equal` constraint is checked eagerly
|
|
12
|
-
* at the alias declaration — both directions: no phantom name, no missing name).
|
|
13
|
-
*
|
|
14
|
-
* Consumers (the MCP `get_api_surface`) import these NAME tuples and build their
|
|
15
|
-
* prose from them, so a summary can never reference a verb that doesn't exist.
|
|
16
|
-
* NAMES are guaranteed; descriptions stay hand-written (prose can't be type-checked).
|
|
11
|
+
* Documentation tooling reads these tuples to describe the surface, which
|
|
12
|
+
* guarantees a generated summary never names a method or option that does
|
|
13
|
+
* not exist. The names are verified here; their prose descriptions are
|
|
14
|
+
* written by hand, since prose cannot be type-checked.
|
|
17
15
|
*/
|
|
18
16
|
// ── the per-`ablo.<model>` verb surface ────────────────────────────────────
|
|
19
|
-
/**
|
|
20
|
-
*
|
|
17
|
+
/**
|
|
18
|
+
* The names of every method available on `ablo.<model>`, matching the keys of
|
|
19
|
+
* the {@link ModelOperations} interface. Documentation tooling reads this
|
|
20
|
+
* tuple, so it is the one list of model-verb names a generated summary can
|
|
21
|
+
* describe.
|
|
22
|
+
*/
|
|
21
23
|
export const PUBLIC_MODEL_VERBS = [
|
|
22
24
|
'retrieve',
|
|
23
25
|
'list',
|
|
@@ -32,8 +34,11 @@ export const PUBLIC_MODEL_VERBS = [
|
|
|
32
34
|
'onChange',
|
|
33
35
|
];
|
|
34
36
|
// ── the read/list query option surface ─────────────────────────────────────
|
|
35
|
-
/**
|
|
36
|
-
*
|
|
37
|
+
/**
|
|
38
|
+
* The option keys accepted by `list`, `getAll`, and `onChange`, matching the
|
|
39
|
+
* keys of {@link LocalReadOptions}. Note that the lifecycle filter is named
|
|
40
|
+
* `state`, not `scope`.
|
|
41
|
+
*/
|
|
37
42
|
export const PUBLIC_LIST_OPTION_KEYS = [
|
|
38
43
|
'where',
|
|
39
44
|
'filter',
|
|
@@ -43,11 +48,14 @@ export const PUBLIC_LIST_OPTION_KEYS = [
|
|
|
43
48
|
'state',
|
|
44
49
|
];
|
|
45
50
|
// ── the `Ablo({ … })` constructor option surface ───────────────────────────
|
|
46
|
-
/**
|
|
47
|
-
*
|
|
51
|
+
/**
|
|
52
|
+
* The keys of the client constructor options, {@link AbloOptions}. Only
|
|
53
|
+
* `schema` is required; every other key is optional.
|
|
54
|
+
*/
|
|
48
55
|
export const PUBLIC_ABLO_OPTION_KEYS = [
|
|
49
56
|
'schema',
|
|
50
57
|
'apiKey',
|
|
58
|
+
'authEndpoint',
|
|
51
59
|
'databaseUrl',
|
|
52
60
|
'persistence',
|
|
53
61
|
'transport',
|
|
@@ -1,27 +1,30 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* Fetches the initial snapshot the sync engine needs before it can go live: the
|
|
3
|
+
* current rows for the requested models plus the sync position from which to
|
|
4
|
+
* resume live updates. It calls the sync server's `/sync/bootstrap` HTTP
|
|
5
|
+
* endpoint, retries transient failures with backoff, and can fall back to a
|
|
6
|
+
* cached snapshot when the device is offline. {@link BootstrapData} is the
|
|
7
|
+
* shape it returns; {@link BootstrapOptions} configures it.
|
|
4
8
|
*/
|
|
5
9
|
export interface BootstrapData {
|
|
6
10
|
type: 'full' | 'partial';
|
|
7
11
|
lastSyncId: number;
|
|
8
12
|
/**
|
|
9
|
-
* Model rows keyed by
|
|
10
|
-
*
|
|
11
|
-
*
|
|
13
|
+
* Model rows keyed by type name. Each row is opaque at this boundary; the
|
|
14
|
+
* engine asserts the per-model shape against the registered schema when it
|
|
15
|
+
* reduces the rows and writes them to local storage.
|
|
12
16
|
*/
|
|
13
|
-
models?:
|
|
14
|
-
[typename: string]: unknown[];
|
|
15
|
-
};
|
|
17
|
+
models?: Record<string, unknown[]>;
|
|
16
18
|
deltas?: ValidatedServerDelta[];
|
|
17
19
|
deltaCount?: number;
|
|
18
|
-
/** Model types whose server-side query failed (timeout, RLS error,
|
|
20
|
+
/** Model types whose server-side query failed (timeout, RLS error, and the like). */
|
|
19
21
|
failedModels?: string[];
|
|
20
22
|
timestamp: number;
|
|
21
23
|
/**
|
|
22
|
-
* The
|
|
23
|
-
* the
|
|
24
|
-
* client compares it
|
|
24
|
+
* The content hash of the schema the server currently has active for this
|
|
25
|
+
* tenant — the same hash `ablo push` computes. Present once a schema has been
|
|
26
|
+
* pushed. The client compares it against its own `expectedSchemaHash` to warn
|
|
27
|
+
* when the app's schema and the deployed schema have drifted apart.
|
|
25
28
|
*/
|
|
26
29
|
schemaHash?: string;
|
|
27
30
|
}
|
|
@@ -42,40 +45,38 @@ export interface BootstrapOptions {
|
|
|
42
45
|
*/
|
|
43
46
|
baseUrl?: string;
|
|
44
47
|
/**
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
* account
|
|
48
|
+
* Namespace for the offline bootstrap cache. Most callers leave this unset;
|
|
49
|
+
* the SDK fills it in once authentication has resolved the account scope, so
|
|
50
|
+
* the fallback cache is partitioned per account.
|
|
48
51
|
*/
|
|
49
52
|
cacheScope?: string | null;
|
|
50
53
|
/**
|
|
51
|
-
* @deprecated Use `cacheScope`.
|
|
52
|
-
*
|
|
54
|
+
* @deprecated Use `cacheScope`. Retained so code that constructs
|
|
55
|
+
* {@link BootstrapFetcher} directly keeps its cache namespace.
|
|
53
56
|
*/
|
|
54
57
|
organizationId?: string;
|
|
55
58
|
syncGroups?: string[];
|
|
56
59
|
maxRetries?: number;
|
|
57
60
|
retryDelay?: number;
|
|
58
|
-
/**
|
|
61
|
+
/** How long to wait for a single fetch before timing out, in milliseconds. Default 10000 (10 seconds). */
|
|
59
62
|
fetchTimeout?: number;
|
|
60
63
|
/**
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
* When absent, the server returns all models (backward compatible with
|
|
67
|
-
* old clients that don't send a models param).
|
|
64
|
+
* The model names to request. When set, the server returns only these models
|
|
65
|
+
* and skips the rest. This is derived from each model's `load` strategy: only
|
|
66
|
+
* models loaded instantly (the default) are included. When unset, the server
|
|
67
|
+
* returns every model.
|
|
68
68
|
*/
|
|
69
69
|
instantModels?: string[];
|
|
70
70
|
/**
|
|
71
|
-
*
|
|
72
|
-
*
|
|
71
|
+
* Getter for the current credential, read at request time so a refreshed
|
|
72
|
+
* token takes effect without recreating the helper. Preferred over
|
|
73
|
+
* {@link BootstrapFetcher.setAuthToken}.
|
|
73
74
|
*/
|
|
74
75
|
getAuthToken?: AuthTokenGetter;
|
|
75
76
|
}
|
|
76
77
|
import { type AuthTokenGetter } from '../auth/credentialSource.js';
|
|
77
78
|
import { type ValidatedServerDelta } from './schemas.js';
|
|
78
|
-
export declare class
|
|
79
|
+
export declare class BootstrapFetcher {
|
|
79
80
|
private options;
|
|
80
81
|
private abortController;
|
|
81
82
|
/** Warn about schema drift at most once per helper. */
|
|
@@ -97,20 +98,10 @@ export declare class BootstrapHelper {
|
|
|
97
98
|
setCacheScope(cacheScope: string): void;
|
|
98
99
|
setSyncGroups(syncGroups: readonly string[] | undefined): void;
|
|
99
100
|
/**
|
|
100
|
-
*
|
|
101
|
-
*
|
|
101
|
+
* Sets a fixed credential for callers that construct the helper directly.
|
|
102
|
+
* The SDK instead supplies `getAuthToken` and never calls this.
|
|
102
103
|
*/
|
|
103
104
|
setAuthToken(authToken: string | undefined): void;
|
|
104
|
-
/**
|
|
105
|
-
* Create a promise that rejects after a timeout
|
|
106
|
-
* Used to race against fetch requests that may hang indefinitely
|
|
107
|
-
*/
|
|
108
|
-
private createTimeoutPromise;
|
|
109
|
-
/**
|
|
110
|
-
* Wrap a promise with a timeout - if the promise doesn't resolve within
|
|
111
|
-
* the timeout period, the AbortController is triggered and an error is thrown
|
|
112
|
-
*/
|
|
113
|
-
private withTimeout;
|
|
114
105
|
/**
|
|
115
106
|
* Fetch bootstrap data from sync engine with partial bootstrap support
|
|
116
107
|
* @param lastSyncId - Optional: client's current lastSyncId for partial bootstrap
|
|
@@ -118,11 +109,12 @@ export declare class BootstrapHelper {
|
|
|
118
109
|
*/
|
|
119
110
|
fetchBootstrap(lastSyncId?: number,
|
|
120
111
|
/**
|
|
121
|
-
*
|
|
122
|
-
* the request uses
|
|
123
|
-
*
|
|
124
|
-
* unaffected
|
|
125
|
-
* holds the
|
|
112
|
+
* A per-call set of sync groups for a scoped hydrate-on-enter. When given,
|
|
113
|
+
* the request uses these groups instead of the configured `syncGroups`, and
|
|
114
|
+
* does so without mutating the shared options, so a concurrent full
|
|
115
|
+
* bootstrap is unaffected. It also bypasses the offline snapshot cache,
|
|
116
|
+
* which holds the full bootstrap and would be a wrong answer to a subset
|
|
117
|
+
* request.
|
|
126
118
|
*/
|
|
127
119
|
syncGroupsOverride?: readonly string[]): Promise<BootstrapData>;
|
|
128
120
|
/**
|