@abloatai/ablo 0.26.0 → 0.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +42 -2
- package/README.md +102 -86
- package/dist/BaseSyncedStore.d.ts +85 -88
- package/dist/BaseSyncedStore.js +134 -151
- package/dist/Database.d.ts +68 -69
- package/dist/Database.js +316 -135
- package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
- package/dist/{ObjectPool.js → InstanceCache.js} +85 -83
- package/dist/LazyReferenceCollection.d.ts +11 -15
- package/dist/LazyReferenceCollection.js +12 -16
- package/dist/Model.d.ts +54 -52
- package/dist/Model.js +78 -62
- package/dist/ModelRegistry.d.ts +21 -19
- package/dist/ModelRegistry.js +23 -27
- package/dist/NetworkMonitor.d.ts +5 -6
- package/dist/NetworkMonitor.js +5 -6
- package/dist/SyncClient.d.ts +122 -118
- package/dist/SyncClient.js +541 -245
- package/dist/adapters/alwaysOnline.d.ts +6 -8
- package/dist/adapters/alwaysOnline.js +6 -8
- package/dist/adapters/inMemoryStorage.d.ts +10 -9
- package/dist/adapters/inMemoryStorage.js +21 -9
- package/dist/agent/Agent.d.ts +27 -32
- package/dist/agent/Agent.js +18 -19
- package/dist/agent/index.d.ts +4 -4
- package/dist/agent/index.js +5 -5
- package/dist/agent/session.d.ts +47 -44
- package/dist/agent/session.js +37 -48
- package/dist/agent/types.d.ts +26 -31
- package/dist/agent/types.js +6 -7
- package/dist/ai-sdk/coordinatedTool.d.ts +108 -0
- package/dist/ai-sdk/{coordinated-tool.js → coordinatedTool.js} +44 -38
- package/dist/ai-sdk/coordinationContext.d.ts +46 -0
- package/dist/ai-sdk/{coordination-context.js → coordinationContext.js} +26 -33
- package/dist/ai-sdk/index.d.ts +25 -22
- package/dist/ai-sdk/index.js +25 -22
- package/dist/ai-sdk/wrap.d.ts +6 -7
- package/dist/ai-sdk/wrap.js +1 -1
- package/dist/auth/credentialPolicy.d.ts +69 -74
- package/dist/auth/credentialPolicy.js +51 -56
- package/dist/auth/credentialSource.d.ts +6 -5
- package/dist/auth/credentialSource.js +9 -10
- package/dist/auth/index.d.ts +59 -58
- package/dist/auth/index.js +31 -37
- package/dist/auth/schemas.d.ts +5 -4
- package/dist/auth/schemas.js +5 -4
- package/dist/batching/index.d.ts +19 -21
- package/dist/batching/index.js +14 -17
- package/dist/cli.cjs +173 -121
- package/dist/client/Ablo.d.ts +97 -74
- package/dist/client/Ablo.js +129 -163
- package/dist/client/ApiClient.d.ts +30 -19
- package/dist/client/ApiClient.js +442 -81
- package/dist/client/auth.d.ts +47 -47
- package/dist/client/auth.js +108 -117
- package/dist/client/claimHeartbeatLoop.d.ts +50 -0
- package/dist/client/claimHeartbeatLoop.js +88 -0
- package/dist/client/consoleLogger.d.ts +5 -6
- package/dist/client/consoleLogger.js +5 -6
- package/dist/client/createInternalComponents.d.ts +16 -17
- package/dist/client/createInternalComponents.js +26 -31
- package/dist/client/createModelProxy.d.ts +130 -120
- package/dist/client/createModelProxy.js +152 -122
- package/dist/client/credentialEndpoint.d.ts +40 -42
- package/dist/client/credentialEndpoint.js +35 -36
- package/dist/client/functionalUpdate.d.ts +29 -27
- package/dist/client/functionalUpdate.js +21 -21
- package/dist/client/hostedEndpoints.d.ts +9 -12
- package/dist/client/hostedEndpoints.js +9 -12
- package/dist/client/httpClient.d.ts +59 -53
- package/dist/client/httpClient.js +29 -31
- package/dist/client/identity.d.ts +15 -20
- package/dist/client/identity.js +47 -58
- package/dist/client/modelRegistration.d.ts +5 -9
- package/dist/client/modelRegistration.js +78 -87
- package/dist/client/options.d.ts +157 -157
- package/dist/client/options.js +3 -7
- package/dist/client/registerDataSource.d.ts +9 -9
- package/dist/client/registerDataSource.js +15 -16
- package/dist/client/resourceTypes.d.ts +64 -75
- package/dist/client/resourceTypes.js +4 -10
- package/dist/client/schemaConfig.d.ts +31 -43
- package/dist/client/schemaConfig.js +38 -50
- package/dist/client/sessionMint.d.ts +16 -12
- package/dist/client/sessionMint.js +26 -31
- package/dist/client/validateAbloOptions.d.ts +12 -14
- package/dist/client/validateAbloOptions.js +8 -9
- package/dist/client/writeOptionsSchema.d.ts +18 -16
- package/dist/client/writeOptionsSchema.js +23 -20
- package/dist/client/wsMutationExecutor.d.ts +16 -20
- package/dist/client/wsMutationExecutor.js +18 -23
- package/dist/commit/contract.d.ts +493 -0
- package/dist/commit/contract.js +187 -0
- package/dist/commit/index.d.ts +6 -0
- package/dist/commit/index.js +5 -0
- package/dist/context.d.ts +6 -4
- package/dist/context.js +6 -4
- package/dist/coordination/index.d.ts +10 -8
- package/dist/coordination/index.js +14 -12
- package/dist/coordination/schema.d.ts +176 -128
- package/dist/coordination/schema.js +197 -133
- package/dist/coordination/trace.d.ts +9 -10
- package/dist/coordination/trace.js +13 -14
- package/dist/core/DatabaseManager.d.ts +5 -7
- package/dist/core/DatabaseManager.js +15 -19
- package/dist/core/QueryProcessor.d.ts +7 -9
- package/dist/core/QueryProcessor.js +22 -28
- package/dist/core/QueryView.d.ts +8 -8
- package/dist/core/QueryView.js +2 -2
- package/dist/core/StoreManager.d.ts +14 -14
- package/dist/core/StoreManager.js +33 -24
- package/dist/core/ViewRegistry.d.ts +5 -5
- package/dist/core/ViewRegistry.js +4 -4
- package/dist/core/index.d.ts +17 -12
- package/dist/core/index.js +32 -26
- package/dist/core/openIDBWithTimeout.d.ts +38 -36
- package/dist/core/openIDBWithTimeout.js +42 -43
- package/dist/core/queryUtils.d.ts +45 -0
- package/dist/core/queryUtils.js +69 -0
- package/dist/core/storeContract.d.ts +63 -61
- package/dist/core/storeContract.js +8 -12
- package/dist/environment.d.ts +28 -0
- package/dist/environment.js +21 -0
- package/dist/errorCodes.d.ts +107 -99
- package/dist/errorCodes.js +137 -134
- package/dist/errors.d.ts +160 -166
- package/dist/errors.js +155 -158
- package/dist/index.d.ts +36 -27
- package/dist/index.js +91 -86
- package/dist/interfaces/index.d.ts +102 -113
- package/dist/interfaces/index.js +5 -4
- package/dist/keys/index.d.ts +27 -29
- package/dist/keys/index.js +41 -40
- package/dist/mutators/RecordingTransaction.d.ts +16 -16
- package/dist/mutators/RecordingTransaction.js +31 -37
- package/dist/mutators/Transaction.d.ts +18 -26
- package/dist/mutators/Transaction.js +14 -20
- package/dist/mutators/UndoManager.d.ts +124 -131
- package/dist/mutators/UndoManager.js +177 -156
- package/dist/mutators/defineMutators.d.ts +23 -34
- package/dist/mutators/defineMutators.js +14 -20
- package/dist/mutators/inverseOp.d.ts +12 -15
- package/dist/mutators/inverseOp.js +12 -15
- package/dist/mutators/mutateActions.d.ts +10 -9
- package/dist/mutators/mutateActions.js +1 -1
- package/dist/mutators/readerActions.d.ts +9 -8
- package/dist/mutators/readerActions.js +2 -2
- package/dist/mutators/undoApply.d.ts +31 -27
- package/dist/mutators/undoApply.js +26 -24
- package/dist/policy/index.d.ts +5 -3
- package/dist/policy/index.js +5 -3
- package/dist/policy/types.d.ts +104 -100
- package/dist/policy/types.js +67 -66
- package/dist/query/client.d.ts +28 -23
- package/dist/query/client.js +45 -43
- package/dist/query/types.d.ts +37 -60
- package/dist/query/types.js +13 -33
- package/dist/react/AbloProvider.d.ts +1 -1
- package/dist/react/AbloProvider.js +2 -2
- package/dist/react/context.d.ts +25 -28
- package/dist/react/context.js +9 -10
- package/dist/react/index.d.ts +41 -42
- package/dist/react/index.js +37 -38
- package/dist/react/internalContext.d.ts +17 -19
- package/dist/react/useAblo.d.ts +28 -25
- package/dist/react/useAblo.js +41 -17
- package/dist/react/useCurrentUserId.d.ts +8 -7
- package/dist/react/useCurrentUserId.js +8 -7
- package/dist/react/useErrorListener.d.ts +7 -7
- package/dist/react/useErrorListener.js +10 -11
- package/dist/react/useMutationFailureListener.d.ts +8 -8
- package/dist/react/useMutationFailureListener.js +8 -8
- package/dist/react/useMutators.d.ts +11 -11
- package/dist/react/useMutators.js +3 -3
- package/dist/react/useReactive.js +2 -2
- package/dist/react/useSyncStatus.d.ts +4 -6
- package/dist/react/useUndoScope.d.ts +7 -9
- package/dist/react/useUndoScope.js +1 -1
- package/dist/schema/coordination.d.ts +21 -25
- package/dist/schema/coordination.js +21 -25
- package/dist/schema/ddl.d.ts +43 -39
- package/dist/schema/ddl.js +75 -68
- package/dist/schema/ddlLock.d.ts +20 -24
- package/dist/schema/ddlLock.js +18 -23
- package/dist/schema/diff.d.ts +99 -61
- package/dist/schema/diff.js +43 -34
- package/dist/schema/field.d.ts +37 -42
- package/dist/schema/field.js +35 -48
- package/dist/schema/generate.d.ts +12 -12
- package/dist/schema/generate.js +12 -12
- package/dist/schema/index.d.ts +3 -3
- package/dist/schema/index.js +21 -23
- package/dist/schema/model.d.ts +118 -143
- package/dist/schema/model.js +22 -33
- package/dist/schema/openapi.d.ts +10 -9
- package/dist/schema/openapi.js +5 -3
- package/dist/schema/queries.d.ts +29 -31
- package/dist/schema/queries.js +23 -25
- package/dist/schema/relation.d.ts +89 -99
- package/dist/schema/relation.js +13 -13
- package/dist/schema/residency.d.ts +16 -13
- package/dist/schema/residency.js +16 -13
- package/dist/schema/roles.d.ts +36 -43
- package/dist/schema/roles.js +31 -37
- package/dist/schema/schema.d.ts +64 -43
- package/dist/schema/schema.js +31 -32
- package/dist/schema/select.d.ts +13 -13
- package/dist/schema/select.js +13 -13
- package/dist/schema/serialize.d.ts +28 -31
- package/dist/schema/serialize.js +27 -31
- package/dist/schema/sugar.d.ts +17 -32
- package/dist/schema/sugar.js +14 -29
- package/dist/schema/{sync-delta-row.d.ts → syncDeltaRow.d.ts} +26 -49
- package/dist/schema/syncDeltaRow.js +89 -0
- package/dist/schema/tenancy.d.ts +44 -46
- package/dist/schema/tenancy.js +46 -48
- package/dist/server/adapter.d.ts +58 -58
- package/dist/server/adapter.js +13 -14
- package/dist/server/commit.d.ts +60 -64
- package/dist/server/index.d.ts +9 -10
- package/dist/server/index.js +1 -1
- package/dist/server/readConfig.d.ts +70 -0
- package/dist/server/readConfig.js +8 -0
- package/dist/server/storageMode.d.ts +23 -0
- package/dist/server/storageMode.js +17 -0
- package/dist/source/adapter.d.ts +30 -25
- package/dist/source/adapter.js +10 -10
- package/dist/source/adapters/drizzle.d.ts +28 -23
- package/dist/source/adapters/drizzle.js +30 -25
- package/dist/source/adapters/kysely.d.ts +27 -25
- package/dist/source/adapters/kysely.js +24 -23
- package/dist/source/adapters/memory.d.ts +8 -7
- package/dist/source/adapters/memory.js +9 -8
- package/dist/source/adapters/prisma.d.ts +13 -12
- package/dist/source/adapters/prisma.js +22 -25
- package/dist/source/conformance.d.ts +18 -11
- package/dist/source/conformance.js +17 -11
- package/dist/source/connector.d.ts +31 -32
- package/dist/source/connector.js +28 -28
- package/dist/source/connectorProtocol.d.ts +160 -0
- package/dist/source/connectorProtocol.js +162 -0
- package/dist/source/contract.d.ts +26 -27
- package/dist/source/contract.js +28 -29
- package/dist/source/factory.d.ts +46 -58
- package/dist/source/factory.js +22 -27
- package/dist/source/index.d.ts +7 -9
- package/dist/source/index.js +12 -14
- package/dist/source/migrations.d.ts +9 -9
- package/dist/source/migrations.js +9 -9
- package/dist/source/next.d.ts +9 -10
- package/dist/source/next.js +6 -7
- package/dist/source/pushQueue.d.ts +69 -47
- package/dist/source/pushQueue.js +32 -28
- package/dist/source/signing.d.ts +46 -17
- package/dist/source/signing.js +28 -11
- package/dist/source/types.d.ts +121 -104
- package/dist/source/types.js +13 -14
- package/dist/stores/ObjectStore.d.ts +24 -12
- package/dist/stores/ObjectStore.js +38 -16
- package/dist/stores/ObjectStoreContract.d.ts +14 -15
- package/dist/stores/SyncActionStore.d.ts +7 -11
- package/dist/stores/SyncActionStore.js +13 -17
- package/dist/surface.d.ts +28 -21
- package/dist/surface.js +29 -20
- package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +36 -42
- package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +76 -76
- package/dist/sync/ConnectionManager.d.ts +39 -50
- package/dist/sync/ConnectionManager.js +55 -66
- package/dist/sync/NetworkProbe.d.ts +24 -29
- package/dist/sync/NetworkProbe.js +63 -69
- package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +42 -41
- package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +59 -54
- package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +43 -57
- package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +43 -51
- package/dist/sync/SyncWebSocket.d.ts +141 -166
- package/dist/sync/SyncWebSocket.js +191 -223
- package/dist/sync/awaitClaimGrant.d.ts +18 -18
- package/dist/sync/awaitClaimGrant.js +11 -11
- package/dist/sync/bootstrapApply.d.ts +34 -24
- package/dist/sync/bootstrapApply.js +27 -19
- package/dist/sync/commitFrames.d.ts +21 -20
- package/dist/sync/commitFrames.js +18 -18
- package/dist/sync/createClaimStream.d.ts +23 -22
- package/dist/sync/createClaimStream.js +105 -23
- package/dist/sync/createPresenceStream.d.ts +19 -18
- package/dist/sync/createPresenceStream.js +25 -26
- package/dist/sync/createSnapshot.d.ts +12 -14
- package/dist/sync/createSnapshot.js +20 -26
- package/dist/sync/credentialLifecycle.d.ts +104 -104
- package/dist/sync/credentialLifecycle.js +140 -147
- package/dist/sync/deltaPipeline.d.ts +36 -34
- package/dist/sync/deltaPipeline.js +64 -65
- package/dist/sync/groupChange.d.ts +63 -61
- package/dist/sync/groupChange.js +74 -78
- package/dist/sync/heartbeat.d.ts +34 -33
- package/dist/sync/heartbeat.js +31 -31
- package/dist/sync/participants.d.ts +19 -19
- package/dist/sync/persistedPrefix.d.ts +12 -0
- package/dist/sync/persistedPrefix.js +22 -0
- package/dist/sync/schemas.d.ts +3 -2
- package/dist/sync/schemas.js +14 -10
- package/dist/sync/syncCursor.d.ts +17 -21
- package/dist/sync/syncCursor.js +17 -21
- package/dist/sync/syncPlan.d.ts +28 -36
- package/dist/sync/syncPlan.js +18 -19
- package/dist/sync/syncPosition.d.ts +54 -49
- package/dist/sync/syncPosition.js +57 -52
- package/dist/sync/wsFrameHandlers.d.ts +35 -36
- package/dist/sync/wsFrameHandlers.js +63 -67
- package/dist/testing/fixtures/bootstrap.d.ts +12 -6
- package/dist/testing/fixtures/bootstrap.js +12 -6
- package/dist/testing/fixtures/deltas.d.ts +30 -33
- package/dist/testing/fixtures/deltas.js +30 -33
- package/dist/testing/fixtures/models.d.ts +11 -10
- package/dist/testing/fixtures/models.js +11 -10
- package/dist/testing/helpers/{react-wrapper.d.ts → reactWrapper.d.ts} +13 -10
- package/dist/testing/helpers/{react-wrapper.js → reactWrapper.js} +15 -12
- package/dist/testing/helpers/{sync-engine-harness.d.ts → syncEngineHarness.d.ts} +17 -15
- package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +12 -10
- package/dist/testing/helpers/wait.d.ts +13 -8
- package/dist/testing/helpers/wait.js +13 -8
- package/dist/testing/index.d.ts +5 -3
- package/dist/testing/index.js +3 -2
- package/dist/testing/mocks/FakeDatabase.d.ts +18 -0
- package/dist/testing/mocks/FakeDatabase.js +10 -0
- package/dist/testing/mocks/MockMutationExecutor.d.ts +18 -17
- package/dist/testing/mocks/MockMutationExecutor.js +15 -14
- package/dist/testing/mocks/MockNetworkMonitor.d.ts +8 -8
- package/dist/testing/mocks/MockNetworkMonitor.js +8 -8
- package/dist/testing/mocks/MockSyncContext.d.ts +20 -17
- package/dist/testing/mocks/MockSyncContext.js +15 -13
- package/dist/testing/mocks/MockSyncStore.d.ts +10 -10
- package/dist/testing/mocks/MockSyncStore.js +11 -11
- package/dist/testing/mocks/MockWebSocket.d.ts +28 -23
- package/dist/testing/mocks/MockWebSocket.js +22 -21
- package/dist/transactions/TransactionQueue.d.ts +244 -181
- package/dist/transactions/TransactionQueue.js +929 -423
- package/dist/transactions/TransactionStore.d.ts +6 -4
- package/dist/transactions/TransactionStore.js +6 -4
- package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
- package/dist/transactions/UnconfirmedWrites.js +104 -0
- package/dist/transactions/coalesceRules.d.ts +41 -17
- package/dist/transactions/coalesceRules.js +40 -17
- package/dist/transactions/commitEnvelope.d.ts +132 -0
- package/dist/transactions/commitEnvelope.js +139 -0
- package/dist/transactions/commitOutboxStore.d.ts +32 -0
- package/dist/transactions/commitOutboxStore.js +26 -0
- package/dist/transactions/commitPayload.d.ts +63 -52
- package/dist/transactions/commitPayload.js +54 -57
- package/dist/transactions/deltaConfirmation.d.ts +20 -22
- package/dist/transactions/deltaConfirmation.js +37 -45
- package/dist/transactions/httpCommitEnvelope.d.ts +43 -0
- package/dist/transactions/httpCommitEnvelope.js +179 -0
- package/dist/transactions/optimisticApply.d.ts +49 -0
- package/dist/transactions/optimisticApply.js +65 -0
- package/dist/transactions/replayValidation.d.ts +182 -0
- package/dist/transactions/replayValidation.js +156 -0
- package/dist/types/global.d.ts +46 -41
- package/dist/types/global.js +20 -19
- package/dist/types/index.d.ts +71 -77
- package/dist/types/index.js +22 -22
- package/dist/types/modelData.d.ts +6 -8
- package/dist/types/modelData.js +5 -7
- package/dist/types/participant.d.ts +10 -11
- package/dist/types/participant.js +6 -8
- package/dist/types/streams.d.ts +208 -195
- package/dist/types/streams.js +7 -7
- package/dist/utils/asyncIterator.d.ts +25 -32
- package/dist/utils/asyncIterator.js +25 -32
- package/dist/utils/duration.d.ts +12 -15
- package/dist/utils/duration.js +12 -15
- package/dist/utils/mobxSetup.d.ts +53 -0
- package/dist/utils/{mobx-setup.js → mobxSetup.js} +42 -98
- package/dist/webhooks/events.d.ts +21 -16
- package/dist/webhooks/events.js +10 -8
- package/dist/webhooks/index.d.ts +5 -7
- package/dist/webhooks/index.js +5 -7
- package/dist/wire/bootstrapReason.d.ts +9 -0
- package/dist/wire/bootstrapReason.js +8 -0
- package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
- package/dist/wire/delta.js +114 -0
- package/dist/wire/errorEnvelope.d.ts +30 -31
- package/dist/wire/errorEnvelope.js +34 -40
- package/dist/wire/frames.d.ts +315 -86
- package/dist/wire/frames.js +47 -33
- package/dist/wire/index.d.ts +18 -14
- package/dist/wire/index.js +32 -27
- package/dist/wire/listEnvelope.d.ts +16 -23
- package/dist/wire/listEnvelope.js +7 -6
- package/dist/wire/protocol.d.ts +25 -32
- package/dist/wire/protocol.js +25 -32
- package/dist/wire/protocolVersion.d.ts +44 -40
- package/dist/wire/protocolVersion.js +44 -40
- package/docs/api.md +10 -10
- package/docs/coordination.md +59 -0
- package/docs/mcp.md +1 -1
- package/package.json +17 -11
- package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
- package/dist/ai-sdk/coordination-context.d.ts +0 -52
- package/dist/core/query-utils.d.ts +0 -34
- package/dist/core/query-utils.js +0 -59
- package/dist/schema/sync-delta-row.js +0 -103
- package/dist/schema/sync-delta-wire.js +0 -102
- package/dist/server/read-config.d.ts +0 -67
- package/dist/server/read-config.js +0 -8
- package/dist/server/storage-mode.d.ts +0 -8
- package/dist/server/storage-mode.js +0 -28
- package/dist/source/connector-protocol.d.ts +0 -159
- package/dist/source/connector-protocol.js +0 -161
- package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
- package/dist/transactions/OptimisticEchoTracker.js +0 -104
- package/dist/transactions/mutation-error-handler.d.ts +0 -5
- package/dist/transactions/mutation-error-handler.js +0 -39
- package/dist/transactions/optimistic.d.ts +0 -24
- package/dist/transactions/optimistic.js +0 -45
- package/dist/transactions/persistedReplay.d.ts +0 -93
- package/dist/transactions/persistedReplay.js +0 -105
- package/dist/utils/mobx-setup.d.ts +0 -42
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* Follows Ablo's architecture for database management.
|
|
2
|
+
* Manages the client-side IndexedDB databases the sync engine keeps in the
|
|
3
|
+
* browser. There are two tiers. A single registry database, `ablo_databases`,
|
|
4
|
+
* records metadata about every workspace database. Each user-and-workspace pair
|
|
5
|
+
* then gets its own data database, named `ablo_<hash>`, that holds the synced
|
|
6
|
+
* rows. {@link DatabaseManager} creates, versions, and deletes both tiers.
|
|
9
7
|
*/
|
|
10
8
|
import { getContext } from '../context.js';
|
|
11
9
|
import { openIDBWithTimeout, deleteIDBWithTimeout, IDBOpenTimeoutError, } from './openIDBWithTimeout.js';
|
|
@@ -90,7 +88,7 @@ export class DatabaseManager {
|
|
|
90
88
|
else if (existingInfo) {
|
|
91
89
|
schemaVersion = existingInfo.schemaVersion || 1;
|
|
92
90
|
}
|
|
93
|
-
//
|
|
91
|
+
// Record the existing databases for this user so duplicates can be detected.
|
|
94
92
|
const allUserDatabases = await this.getDatabasesForUser(userId);
|
|
95
93
|
const allIndexedDBs = (await indexedDB.databases?.()) || [];
|
|
96
94
|
const abloDatabases = allIndexedDBs.filter((db) => db.name?.startsWith('ablo_'));
|
|
@@ -117,7 +115,7 @@ export class DatabaseManager {
|
|
|
117
115
|
generateDatabaseName(userId, workspaceId, userVersion = 1) {
|
|
118
116
|
// Combine userId, workspaceId, and userVersion for unique database
|
|
119
117
|
const combined = `${userId}:${workspaceId}:${userVersion}`;
|
|
120
|
-
//
|
|
118
|
+
// Hash the combined key into a compact, deterministic identifier.
|
|
121
119
|
let hash = 0;
|
|
122
120
|
for (let i = 0; i < combined.length; i++) {
|
|
123
121
|
hash = (hash << 5) - hash + combined.charCodeAt(i);
|
|
@@ -185,13 +183,12 @@ export class DatabaseManager {
|
|
|
185
183
|
onUpgrade: (request, event) => {
|
|
186
184
|
const db = request.result;
|
|
187
185
|
const tx = event.target.transaction;
|
|
188
|
-
//
|
|
189
|
-
//
|
|
190
|
-
//
|
|
191
|
-
//
|
|
192
|
-
//
|
|
193
|
-
//
|
|
194
|
-
// without awaiting is safe and matches the VCS-slot semantics.
|
|
186
|
+
// IndexedDB rule: only awaits on IndexedDB requests keep an upgrade
|
|
187
|
+
// transaction alive. Any other await — a fetch, a timer — commits the
|
|
188
|
+
// transaction early, and later operations then throw
|
|
189
|
+
// `TransactionInactiveError`. StoreManager.createStores runs only
|
|
190
|
+
// synchronous createObjectStore / createIndex calls under an `async`
|
|
191
|
+
// keyword, so calling it without awaiting is safe here.
|
|
195
192
|
if (createStoresFn && tx) {
|
|
196
193
|
try {
|
|
197
194
|
void createStoresFn(db, tx).catch((err) => {
|
|
@@ -238,9 +235,8 @@ export class DatabaseManager {
|
|
|
238
235
|
updatedAt: data.updatedAt ? new Date(data.updatedAt) : new Date(),
|
|
239
236
|
schemaHash: data.schemaHash,
|
|
240
237
|
syncGroups: data.syncGroups,
|
|
241
|
-
//
|
|
242
|
-
//
|
|
243
|
-
// not picking it here.
|
|
238
|
+
// Older persisted records may still carry an extra `versions` key
|
|
239
|
+
// that is no longer used; it is tolerated by simply not reading it here.
|
|
244
240
|
};
|
|
245
241
|
resolve(meta);
|
|
246
242
|
};
|
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* -
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* This extracts query processing logic from SyncedStore for proper separation of concerns
|
|
2
|
+
* Runs in-memory queries over a set of models — filtering by predicate,
|
|
3
|
+
* sorting, paginating, and caching the results. A caller hands
|
|
4
|
+
* {@link QueryProcessor} the candidate models and the query options, and it
|
|
5
|
+
* returns a {@link QueryResult}. It keeps two caches: a string-keyed cache for
|
|
6
|
+
* plain queries, and a structural-identity cache for predicate queries, whose
|
|
7
|
+
* closures cannot be turned into a stable string key.
|
|
10
8
|
*/
|
|
11
9
|
import type { Model } from '../Model.js';
|
|
12
|
-
import type { ModelScope } from '../
|
|
10
|
+
import type { ModelScope } from '../InstanceCache.js';
|
|
13
11
|
export interface QueryOptions<T extends Model> {
|
|
14
12
|
predicate?: (model: T) => boolean;
|
|
15
13
|
/** Stable key to distinguish different predicates for the same model type.
|
|
@@ -1,20 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* -
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* This extracts query processing logic from SyncedStore for proper separation of concerns
|
|
2
|
+
* Runs in-memory queries over a set of models — filtering by predicate,
|
|
3
|
+
* sorting, paginating, and caching the results. A caller hands
|
|
4
|
+
* {@link QueryProcessor} the candidate models and the query options, and it
|
|
5
|
+
* returns a {@link QueryResult}. It keeps two caches: a string-keyed cache for
|
|
6
|
+
* plain queries, and a structural-identity cache for predicate queries, whose
|
|
7
|
+
* closures cannot be turned into a stable string key.
|
|
10
8
|
*/
|
|
11
9
|
/**
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* - No regex compilation or full cache iteration needed
|
|
10
|
+
* The default in-memory cache. It keeps a reverse index from model type to the
|
|
11
|
+
* cache keys for that type, so invalidating one model type costs work
|
|
12
|
+
* proportional to that type's keys rather than a scan of the whole cache. A
|
|
13
|
+
* regex fallback still covers the rare pattern that is not a plain model-type
|
|
14
|
+
* match.
|
|
18
15
|
*/
|
|
19
16
|
class BasicQueryCache {
|
|
20
17
|
cache = new Map();
|
|
@@ -87,21 +84,19 @@ class BasicQueryCache {
|
|
|
87
84
|
* Cache key format: "operation:ModelType:options"
|
|
88
85
|
*/
|
|
89
86
|
extractModelType(key) {
|
|
90
|
-
//
|
|
91
|
-
// segment reads as undefined, and split never yields undefined otherwise.
|
|
87
|
+
// A missing second segment reads as undefined, so `?? null` yields null.
|
|
92
88
|
return key.split(':')[1] ?? null;
|
|
93
89
|
}
|
|
94
90
|
}
|
|
95
91
|
export class QueryProcessor {
|
|
96
92
|
cache;
|
|
97
93
|
enableCache;
|
|
98
|
-
// Stable-reference cache for predicate queries.
|
|
99
|
-
//
|
|
100
|
-
//
|
|
101
|
-
//
|
|
102
|
-
// when the
|
|
103
|
-
//
|
|
104
|
-
// Value: previous result + its ID fingerprint
|
|
94
|
+
// Stable-reference cache for predicate queries. A string cache key cannot
|
|
95
|
+
// capture a closure, so predicate queries use a separate identity-based
|
|
96
|
+
// cache keyed on the deterministic part of the query (model name plus
|
|
97
|
+
// serializable options). Each entry stores the previous result and a
|
|
98
|
+
// fingerprint of its model ids; when the ids are unchanged, the processor
|
|
99
|
+
// returns the previous array reference so observers do not re-render.
|
|
105
100
|
predicateResultCache = new Map();
|
|
106
101
|
constructor(config = {}) {
|
|
107
102
|
this.enableCache = config.enableCache ?? true;
|
|
@@ -137,10 +132,9 @@ export class QueryProcessor {
|
|
|
137
132
|
hasMore: offset + limit < total,
|
|
138
133
|
fromCache: false,
|
|
139
134
|
};
|
|
140
|
-
// For predicate queries:
|
|
141
|
-
//
|
|
142
|
-
//
|
|
143
|
-
// observers won't re-render when the result is structurally identical.
|
|
135
|
+
// For predicate queries: compare by structural identity. Return the
|
|
136
|
+
// previous array reference when the model ids are unchanged, so observers
|
|
137
|
+
// don't re-render on a structurally identical result.
|
|
144
138
|
if (options.predicate && this.enableCache) {
|
|
145
139
|
const ids = data.map((m) => m.id).join(',');
|
|
146
140
|
const cached = this.predicateResultCache.get(cacheKey);
|
|
@@ -151,7 +145,7 @@ export class QueryProcessor {
|
|
|
151
145
|
// New result — store for future comparison
|
|
152
146
|
this.predicateResultCache.set(cacheKey, { ids, result });
|
|
153
147
|
}
|
|
154
|
-
// For non-predicate queries: use string-based cache
|
|
148
|
+
// For non-predicate queries: use the string-based cache.
|
|
155
149
|
if (!options.predicate && this.enableCache) {
|
|
156
150
|
this.cache.set(cacheKey, result);
|
|
157
151
|
}
|
package/dist/core/QueryView.d.ts
CHANGED
|
@@ -12,13 +12,13 @@ import { type IObservableArray } from 'mobx';
|
|
|
12
12
|
import { type Model } from '../Model.js';
|
|
13
13
|
import { ModelScope } from '../types/index.js';
|
|
14
14
|
import type { ViewRegistry } from './ViewRegistry.js';
|
|
15
|
-
import type { IncrementalView } from './
|
|
15
|
+
import type { IncrementalView } from './queryUtils.js';
|
|
16
16
|
/**
|
|
17
|
-
* The slice of
|
|
18
|
-
* interface
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
17
|
+
* The slice of the object pool that a {@link QueryView} reads. It is a minimal
|
|
18
|
+
* structural interface rather than the concrete pool class, which lets a query
|
|
19
|
+
* view avoid importing the pool and so breaks what would otherwise be an import
|
|
20
|
+
* cycle — the pool imports {@link QueryView} to construct one. The concrete
|
|
21
|
+
* pool satisfies this interface structurally.
|
|
22
22
|
*/
|
|
23
23
|
export interface QueryViewPool {
|
|
24
24
|
hasForeignKeyIndex(typename: string, fieldName: string): boolean;
|
|
@@ -32,8 +32,8 @@ export interface QueryViewOptions<T> {
|
|
|
32
32
|
order?: 'asc' | 'desc';
|
|
33
33
|
limit?: number;
|
|
34
34
|
offset?: number;
|
|
35
|
-
/** Lifecycle filter — `live` (default), `archived`, or `all`.
|
|
36
|
-
*
|
|
35
|
+
/** Lifecycle filter — `live` (the default), `archived`, or `all`. It is
|
|
36
|
+
* named `state` rather than `scope` so it does not collide with the
|
|
37
37
|
* sync-group `scope`. */
|
|
38
38
|
state?: ModelScope;
|
|
39
39
|
}
|
package/dist/core/QueryView.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
import { observable, runInAction } from 'mobx';
|
|
12
12
|
import { modelAsRow } from '../Model.js';
|
|
13
13
|
import { ModelScope } from '../types/index.js';
|
|
14
|
-
import { compareValues, binaryInsertionIndex, findIndexById, } from './
|
|
14
|
+
import { compareValues, binaryInsertionIndex, findIndexById, } from './queryUtils.js';
|
|
15
15
|
// ---------------------------------------------------------------------------
|
|
16
16
|
// QueryView
|
|
17
17
|
// ---------------------------------------------------------------------------
|
|
@@ -168,7 +168,7 @@ export class QueryView {
|
|
|
168
168
|
// -----------------------------------------------------------------------
|
|
169
169
|
/** Check whether an entity passes both `where` and `filter`. */
|
|
170
170
|
matchesFilter(entity) {
|
|
171
|
-
// Note: scope is tracked per-entry in the
|
|
171
|
+
// Note: scope is tracked per-entry in the InstanceCache, not on the model.
|
|
172
172
|
// The initial scan handles scope via getByTypeName(typename, scope).
|
|
173
173
|
// Incremental notifications from the pool are scope-appropriate since
|
|
174
174
|
// add/upsert/remove reflect the pool's authoritative scope tracking.
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
2
|
+
* Manages the {@link ObjectStore} instances the sync engine keeps in the
|
|
3
|
+
* browser — one per registered model — alongside the single
|
|
4
|
+
* {@link SyncActionStore} for pending changes. It creates each store from the
|
|
5
|
+
* model's metadata, tracks readiness, and provisions the underlying IndexedDB
|
|
6
|
+
* object stores. A model's load strategy (instant, lazy, or partial) decides
|
|
7
|
+
* how and when its data is loaded.
|
|
7
8
|
*/
|
|
8
9
|
import { ModelRegistry } from '../ModelRegistry.js';
|
|
9
10
|
import { ObjectStore } from '../stores/ObjectStore.js';
|
|
@@ -20,6 +21,8 @@ import { LoadStrategy } from '../types/index.js';
|
|
|
20
21
|
*/
|
|
21
22
|
export declare class StoreManager {
|
|
22
23
|
private stores;
|
|
24
|
+
/** Strict-durability wrapper for the client write journal and commit outbox. */
|
|
25
|
+
private transactionStore;
|
|
23
26
|
private syncactionStore;
|
|
24
27
|
private db;
|
|
25
28
|
private isInitialized;
|
|
@@ -63,15 +66,12 @@ export declare class StoreManager {
|
|
|
63
66
|
totalStores: number;
|
|
64
67
|
}>;
|
|
65
68
|
/**
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* the
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
* Samples up to 3 stores to avoid a full scan. If any store has records,
|
|
74
|
-
* returns true (we have cached data worth preserving).
|
|
69
|
+
* Reports whether any data store holds at least one record. This is a
|
|
70
|
+
* cache-validity check: if the stores are empty, the sync cursor
|
|
71
|
+
* (`lastSyncId`) is meaningless no matter what the metadata says, because the
|
|
72
|
+
* cursor and the data must travel together — no data means no cursor, which
|
|
73
|
+
* forces a full bootstrap. To stay cheap it samples up to three stores rather
|
|
74
|
+
* than scanning them all, and returns true as soon as one has records.
|
|
75
75
|
*/
|
|
76
76
|
hasAnyData(): Promise<boolean>;
|
|
77
77
|
/**
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
2
|
+
* Manages the {@link ObjectStore} instances the sync engine keeps in the
|
|
3
|
+
* browser — one per registered model — alongside the single
|
|
4
|
+
* {@link SyncActionStore} for pending changes. It creates each store from the
|
|
5
|
+
* model's metadata, tracks readiness, and provisions the underlying IndexedDB
|
|
6
|
+
* object stores. A model's load strategy (instant, lazy, or partial) decides
|
|
7
|
+
* how and when its data is loaded.
|
|
7
8
|
*/
|
|
8
9
|
import { ModelRegistry } from '../ModelRegistry.js';
|
|
9
10
|
import { ObjectStore } from '../stores/ObjectStore.js';
|
|
@@ -21,6 +22,8 @@ import { AbloValidationError } from '../errors.js';
|
|
|
21
22
|
*/
|
|
22
23
|
export class StoreManager {
|
|
23
24
|
stores = new Map();
|
|
25
|
+
/** Strict-durability wrapper for the client write journal and commit outbox. */
|
|
26
|
+
transactionStore = null;
|
|
24
27
|
syncactionStore = null;
|
|
25
28
|
db = null;
|
|
26
29
|
isInitialized = false;
|
|
@@ -45,6 +48,12 @@ export class StoreManager {
|
|
|
45
48
|
for (const modelName of allModels) {
|
|
46
49
|
await this.createStoreForModel(modelName);
|
|
47
50
|
}
|
|
51
|
+
// Special stores are created during the IDB upgrade, but unlike model
|
|
52
|
+
// stores they have no registry metadata and therefore need an explicit
|
|
53
|
+
// runtime wrapper. Outbox acknowledgement must mean disk-backed, so this
|
|
54
|
+
// store opts into strict durability rather than the cache stores' relaxed
|
|
55
|
+
// mode.
|
|
56
|
+
this.transactionStore = new ObjectStore(this.db, '__transactions', '__transactions', { loadStrategy: LoadStrategy.instant }, 'strict');
|
|
48
57
|
// Initialize SyncactionStore
|
|
49
58
|
this.syncactionStore = new SyncActionStore(this.db);
|
|
50
59
|
await this.syncactionStore.initialize();
|
|
@@ -70,7 +79,7 @@ export class StoreManager {
|
|
|
70
79
|
}
|
|
71
80
|
// Use model name directly as store name
|
|
72
81
|
const storeName = modelName;
|
|
73
|
-
// Create ObjectStore
|
|
82
|
+
// Create the ObjectStore. One store type currently serves every load strategy.
|
|
74
83
|
const store = new ObjectStore(this.db, modelName, storeName, metadata);
|
|
75
84
|
this.stores.set(modelName, store);
|
|
76
85
|
}
|
|
@@ -122,7 +131,7 @@ export class StoreManager {
|
|
|
122
131
|
}
|
|
123
132
|
// Create __meta table for model persistence state and database metadata
|
|
124
133
|
if (!db.objectStoreNames.contains('__meta')) {
|
|
125
|
-
|
|
134
|
+
db.createObjectStore('__meta');
|
|
126
135
|
getContext().logger.debug('Created __meta table');
|
|
127
136
|
}
|
|
128
137
|
// Create __transactions table for unsent transactions
|
|
@@ -141,6 +150,9 @@ export class StoreManager {
|
|
|
141
150
|
* Get ObjectStore for a model
|
|
142
151
|
*/
|
|
143
152
|
getStore(modelName) {
|
|
153
|
+
if (modelName === '__transactions') {
|
|
154
|
+
return this.transactionStore ?? undefined;
|
|
155
|
+
}
|
|
144
156
|
return this.stores.get(modelName);
|
|
145
157
|
}
|
|
146
158
|
/**
|
|
@@ -184,15 +196,12 @@ export class StoreManager {
|
|
|
184
196
|
};
|
|
185
197
|
}
|
|
186
198
|
/**
|
|
187
|
-
*
|
|
188
|
-
*
|
|
189
|
-
*
|
|
190
|
-
* the
|
|
191
|
-
*
|
|
192
|
-
*
|
|
193
|
-
*
|
|
194
|
-
* Samples up to 3 stores to avoid a full scan. If any store has records,
|
|
195
|
-
* returns true (we have cached data worth preserving).
|
|
199
|
+
* Reports whether any data store holds at least one record. This is a
|
|
200
|
+
* cache-validity check: if the stores are empty, the sync cursor
|
|
201
|
+
* (`lastSyncId`) is meaningless no matter what the metadata says, because the
|
|
202
|
+
* cursor and the data must travel together — no data means no cursor, which
|
|
203
|
+
* forces a full bootstrap. To stay cheap it samples up to three stores rather
|
|
204
|
+
* than scanning them all, and returns true as soon as one has records.
|
|
196
205
|
*/
|
|
197
206
|
async hasAnyData() {
|
|
198
207
|
const storeEntries = Array.from(this.stores);
|
|
@@ -281,8 +290,8 @@ export class StoreManager {
|
|
|
281
290
|
* Clear all stores
|
|
282
291
|
*/
|
|
283
292
|
async clearAllStores() {
|
|
284
|
-
// Lifecycle chatter (logout / identity switch / reset)
|
|
285
|
-
// `debug` so it
|
|
293
|
+
// Lifecycle chatter (logout / identity switch / reset), not a warning.
|
|
294
|
+
// Logged at `debug` so it stays silent under the default `warn` threshold.
|
|
286
295
|
getContext().logger.debug('Clearing all stores');
|
|
287
296
|
const promises = Array.from(this.stores.values()).map((store) => store.clear());
|
|
288
297
|
await Promise.all(promises);
|
|
@@ -297,12 +306,12 @@ export class StoreManager {
|
|
|
297
306
|
for (const store of this.stores.values()) {
|
|
298
307
|
store.markAsClosing();
|
|
299
308
|
}
|
|
300
|
-
|
|
301
|
-
//
|
|
302
|
-
//
|
|
303
|
-
//
|
|
304
|
-
//
|
|
305
|
-
//
|
|
309
|
+
this.transactionStore?.markAsClosing();
|
|
310
|
+
// SyncActionStore is a standalone store that does not extend ObjectStore
|
|
311
|
+
// and has no markAsClosing equivalent, so it is intentionally skipped here.
|
|
312
|
+
// If closing-state coordination is ever needed for sync actions, add it
|
|
313
|
+
// explicitly to SyncActionStore rather than casting to reach a method that
|
|
314
|
+
// may not exist.
|
|
306
315
|
getContext().logger.debug('All stores marked as closing');
|
|
307
316
|
}
|
|
308
317
|
/**
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ViewRegistry — tracks active QueryViews per typename.
|
|
3
3
|
*
|
|
4
|
-
* When the
|
|
4
|
+
* When the InstanceCache mutates a model, it calls notifyAdded / notifyUpdated /
|
|
5
5
|
* notifyRemoved on the registry, which fans the event out to every active
|
|
6
6
|
* QueryView subscribed to that typename.
|
|
7
7
|
*/
|
|
8
8
|
import { type Model } from '../Model.js';
|
|
9
|
-
import type { IncrementalView } from './
|
|
9
|
+
import type { IncrementalView } from './queryUtils.js';
|
|
10
10
|
export declare class ViewRegistry {
|
|
11
11
|
private views;
|
|
12
12
|
register(typename: string, view: IncrementalView): void;
|
|
13
13
|
unregister(typename: string, view: IncrementalView): void;
|
|
14
|
-
/** Called by
|
|
14
|
+
/** Called by InstanceCache after a model is added to the pool. */
|
|
15
15
|
notifyAdded(typename: string, model: Model): void;
|
|
16
|
-
/** Called by
|
|
16
|
+
/** Called by InstanceCache after a model is updated in the pool. */
|
|
17
17
|
notifyUpdated(typename: string, model: Model): void;
|
|
18
|
-
/** Called by
|
|
18
|
+
/** Called by InstanceCache after a model is removed from the pool. */
|
|
19
19
|
notifyRemoved(typename: string, modelId: string): void;
|
|
20
20
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ViewRegistry — tracks active QueryViews per typename.
|
|
3
3
|
*
|
|
4
|
-
* When the
|
|
4
|
+
* When the InstanceCache mutates a model, it calls notifyAdded / notifyUpdated /
|
|
5
5
|
* notifyRemoved on the registry, which fans the event out to every active
|
|
6
6
|
* QueryView subscribed to that typename.
|
|
7
7
|
*/
|
|
@@ -25,7 +25,7 @@ export class ViewRegistry {
|
|
|
25
25
|
this.views.delete(typename);
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
|
-
/** Called by
|
|
28
|
+
/** Called by InstanceCache after a model is added to the pool. */
|
|
29
29
|
notifyAdded(typename, model) {
|
|
30
30
|
const set = this.views.get(typename);
|
|
31
31
|
if (!set)
|
|
@@ -34,7 +34,7 @@ export class ViewRegistry {
|
|
|
34
34
|
view.handleAdded(modelAsRow(model));
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
|
-
/** Called by
|
|
37
|
+
/** Called by InstanceCache after a model is updated in the pool. */
|
|
38
38
|
notifyUpdated(typename, model) {
|
|
39
39
|
const set = this.views.get(typename);
|
|
40
40
|
if (!set)
|
|
@@ -43,7 +43,7 @@ export class ViewRegistry {
|
|
|
43
43
|
view.handleUpdated(modelAsRow(model));
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
|
-
/** Called by
|
|
46
|
+
/** Called by InstanceCache after a model is removed from the pool. */
|
|
47
47
|
notifyRemoved(typename, modelId) {
|
|
48
48
|
const set = this.views.get(typename);
|
|
49
49
|
if (!set)
|
package/dist/core/index.d.ts
CHANGED
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* The framework-extension entry point of this package. Import from here only
|
|
3
|
+
* when you are building on top of the sync engine — wiring your own store and
|
|
4
|
+
* provider stack, writing a sync adapter, or driving a test harness. Everyday
|
|
5
|
+
* application code should use the `Ablo({ schema })` client from the package
|
|
6
|
+
* root instead; the primitives exported here are lower-level building blocks.
|
|
3
7
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* here — the consumer surface is `Ablo({ schema })` on the root.
|
|
8
|
-
*
|
|
9
|
-
* TRIMMED to what framework-level consumers actually import (verified by
|
|
10
|
-
* a monorepo-wide import scan). Everything else the engine defines stays
|
|
11
|
-
* module-private: if a new framework concern genuinely needs another
|
|
12
|
-
* primitive, add the export deliberately — don't re-widen the barrel.
|
|
8
|
+
* The surface is deliberately narrow: it exposes only the types and classes an
|
|
9
|
+
* extension actually needs. Anything the engine does not export here is
|
|
10
|
+
* internal and may change.
|
|
13
11
|
*/
|
|
14
12
|
export { BaseSyncedStore, type ModelConstructor, type ConcreteModelConstructor, } from '../BaseSyncedStore.js';
|
|
15
13
|
export { SyncClient } from '../SyncClient.js';
|
|
16
14
|
export { Database } from '../Database.js';
|
|
17
|
-
export {
|
|
15
|
+
export { InstanceCache, ModelScope } from '../InstanceCache.js';
|
|
16
|
+
/** @deprecated `ObjectPool` was renamed to {@link InstanceCache} — the class is an
|
|
17
|
+
* identity-map cache of live model instances, not a reuse pool. This alias keeps existing
|
|
18
|
+
* imports working and will be removed in a future major version. */
|
|
19
|
+
export { InstanceCache as ObjectPool } from '../InstanceCache.js';
|
|
18
20
|
export { Model } from '../Model.js';
|
|
19
21
|
export { LazyReferenceCollection, type LazyCollectionOptions, } from '../LazyReferenceCollection.js';
|
|
20
22
|
export { ModelRegistry, getActiveRegistry, } from '../ModelRegistry.js';
|
|
@@ -22,7 +24,10 @@ export { postQuery, type PostQueryOptions } from '../query/client.js';
|
|
|
22
24
|
export { computeFKDepthPriority, type InternalAbloOptions } from '../client/Ablo.js';
|
|
23
25
|
export type { SyncLogger, SyncObservabilityProvider, MutationExecutor, SessionErrorDetector, OnlineStatusProvider, CommitResult, MutationOperation, } from '../interfaces/index.js';
|
|
24
26
|
export { SyncWebSocket, type SyncDelta, type SyncWebSocketOptions, } from '../sync/SyncWebSocket.js';
|
|
25
|
-
export {
|
|
27
|
+
export { BootstrapFetcher } from '../sync/BootstrapFetcher.js';
|
|
28
|
+
/** @deprecated `BootstrapHelper` was renamed to {@link BootstrapFetcher}. This alias keeps
|
|
29
|
+
* existing imports working and will be removed in a future major version. */
|
|
30
|
+
export { BootstrapFetcher as BootstrapHelper } from '../sync/BootstrapFetcher.js';
|
|
26
31
|
export { createClaimStream, type AttachableClaimStream, type ClaimStreamConfig, } from '../sync/createClaimStream.js';
|
|
27
32
|
export { awaitClaimGrant, type GrantTransport, } from '../sync/awaitClaimGrant.js';
|
|
28
33
|
export { LoadStrategy } from '../types/index.js';
|
package/dist/core/index.js
CHANGED
|
@@ -1,42 +1,48 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* The framework-extension entry point of this package. Import from here only
|
|
3
|
+
* when you are building on top of the sync engine — wiring your own store and
|
|
4
|
+
* provider stack, writing a sync adapter, or driving a test harness. Everyday
|
|
5
|
+
* application code should use the `Ablo({ schema })` client from the package
|
|
6
|
+
* root instead; the primitives exported here are lower-level building blocks.
|
|
3
7
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* here — the consumer surface is `Ablo({ schema })` on the root.
|
|
8
|
-
*
|
|
9
|
-
* TRIMMED to what framework-level consumers actually import (verified by
|
|
10
|
-
* a monorepo-wide import scan). Everything else the engine defines stays
|
|
11
|
-
* module-private: if a new framework concern genuinely needs another
|
|
12
|
-
* primitive, add the export deliberately — don't re-widen the barrel.
|
|
8
|
+
* The surface is deliberately narrow: it exposes only the types and classes an
|
|
9
|
+
* extension actually needs. Anything the engine does not export here is
|
|
10
|
+
* internal and may change.
|
|
13
11
|
*/
|
|
14
|
-
//
|
|
12
|
+
// The base store class, plus the constructor shapes that subclasses reference.
|
|
15
13
|
export { BaseSyncedStore, } from '../BaseSyncedStore.js';
|
|
16
14
|
// Core infrastructure classes
|
|
17
15
|
export { SyncClient } from '../SyncClient.js';
|
|
18
16
|
export { Database } from '../Database.js';
|
|
19
|
-
export {
|
|
17
|
+
export { InstanceCache, ModelScope } from '../InstanceCache.js';
|
|
18
|
+
/** @deprecated `ObjectPool` was renamed to {@link InstanceCache} — the class is an
|
|
19
|
+
* identity-map cache of live model instances, not a reuse pool. This alias keeps existing
|
|
20
|
+
* imports working and will be removed in a future major version. */
|
|
21
|
+
export { InstanceCache as ObjectPool } from '../InstanceCache.js';
|
|
20
22
|
export { Model } from '../Model.js';
|
|
21
23
|
export { LazyReferenceCollection, } from '../LazyReferenceCollection.js';
|
|
22
24
|
export { ModelRegistry, getActiveRegistry, } from '../ModelRegistry.js';
|
|
23
|
-
//
|
|
24
|
-
//
|
|
25
|
+
// A lower-level network read primitive. Prefer `ablo.<model>.list(...)` for
|
|
26
|
+
// ordinary reads; reach for this only when writing a custom on-demand loader.
|
|
25
27
|
export { postQuery } from '../query/client.js';
|
|
26
|
-
//
|
|
27
|
-
//
|
|
28
|
+
// Computes a dependency-safe ordering for a set of models by walking their
|
|
29
|
+
// foreign-key relationships, so writes commit parents before children. Used by
|
|
30
|
+
// schema-aware test fixtures and scaffolding tools.
|
|
28
31
|
export { computeFKDepthPriority } from '../client/Ablo.js';
|
|
29
|
-
//
|
|
30
|
-
// multi-
|
|
32
|
+
// The sync layer: the WebSocket wrapper and the delta shape it carries. Needed
|
|
33
|
+
// when writing a sync adapter or a multi-participant test harness.
|
|
31
34
|
export { SyncWebSocket, } from '../sync/SyncWebSocket.js';
|
|
32
|
-
export {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
//
|
|
37
|
-
//
|
|
35
|
+
export { BootstrapFetcher } from '../sync/BootstrapFetcher.js';
|
|
36
|
+
/** @deprecated `BootstrapHelper` was renamed to {@link BootstrapFetcher}. This alias keeps
|
|
37
|
+
* existing imports working and will be removed in a future major version. */
|
|
38
|
+
export { BootstrapFetcher as BootstrapHelper } from '../sync/BootstrapFetcher.js';
|
|
39
|
+
// The lower-level claim-coordination primitives behind the `ablo.<model>.claim`
|
|
40
|
+
// API. `createClaimStream` builds the announce-and-await machinery on top of a
|
|
41
|
+
// `SyncWebSocket`; `awaitClaimGrant` coordinates fair, first-in-first-out
|
|
42
|
+
// grants. These are for extension code and test harnesses; ordinary
|
|
43
|
+
// application code should use `ablo.<model>.claim`.
|
|
38
44
|
export { createClaimStream, } from '../sync/createClaimStream.js';
|
|
39
45
|
export { awaitClaimGrant, } from '../sync/awaitClaimGrant.js';
|
|
40
|
-
//
|
|
41
|
-
//
|
|
46
|
+
// An enum naming the strategies for loading a model's data. Referenced when
|
|
47
|
+
// registering models in extension code.
|
|
42
48
|
export { LoadStrategy } from '../types/index.js';
|