@abloatai/ablo 0.35.0 → 0.37.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 +2 -2
- package/CHANGELOG.md +71 -1929
- package/NOTICE +2 -2
- package/README.md +23 -532
- package/assets/banner.png +0 -0
- package/dist/auth.d.ts +2 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +2 -0
- package/dist/auth.js.map +1 -0
- package/dist/client.d.ts +3 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +3 -0
- package/dist/client.js.map +1 -0
- package/dist/coordination.d.ts +2 -0
- package/dist/coordination.d.ts.map +1 -0
- package/dist/coordination.js +2 -0
- package/dist/coordination.js.map +1 -0
- package/dist/index.d.ts +3 -112
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -161
- package/dist/index.js.map +1 -0
- package/dist/react.d.ts +4 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +3 -0
- package/dist/react.js.map +1 -0
- package/dist/schema.d.ts +2 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +2 -0
- package/dist/schema.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -0
- package/dist/source-conformance.d.ts +2 -0
- package/dist/source-conformance.d.ts.map +1 -0
- package/dist/source-conformance.js +2 -0
- package/dist/source-conformance.js.map +1 -0
- package/dist/source-drizzle.d.ts +2 -0
- package/dist/source-drizzle.d.ts.map +1 -0
- package/dist/source-drizzle.js +2 -0
- package/dist/source-drizzle.js.map +1 -0
- package/dist/source-kysely.d.ts +2 -0
- package/dist/source-kysely.d.ts.map +1 -0
- package/dist/source-kysely.js +2 -0
- package/dist/source-kysely.js.map +1 -0
- package/dist/source-next.d.ts +2 -0
- package/dist/source-next.d.ts.map +1 -0
- package/dist/source-next.js +2 -0
- package/dist/source-next.js.map +1 -0
- package/dist/source.d.ts +2 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +2 -0
- package/dist/source.js.map +1 -0
- package/dist/wire.d.ts +2 -0
- package/dist/wire.d.ts.map +1 -0
- package/dist/wire.js +2 -0
- package/dist/wire.js.map +1 -0
- package/docs/agents.md +2 -2
- package/docs/api-keys.md +13 -12
- package/docs/api.md +15 -53
- package/docs/audit.md +4 -3
- package/docs/cli.md +11 -11
- package/docs/client-behavior.md +9 -9
- package/docs/concurrency-convention.md +28 -42
- package/docs/coordination.md +228 -86
- package/docs/data-sources.md +5 -5
- package/docs/debugging.md +34 -12
- package/docs/deployment.md +8 -8
- package/docs/examples/agent-human.md +4 -4
- package/docs/examples/ai-sdk-tool.md +1 -1
- package/docs/examples/existing-python-backend.md +15 -4
- package/docs/examples/nextjs.md +27 -6
- package/docs/examples/scoped-agent.md +3 -3
- package/docs/examples/server-agent.md +2 -2
- package/docs/groups.md +57 -3
- package/docs/guarantees.md +37 -10
- package/docs/how-it-works.md +32 -8
- package/docs/idempotency.md +6 -6
- package/docs/identity.md +24 -24
- package/docs/index.md +8 -8
- package/docs/integration-guide.md +38 -16
- package/docs/internal/README.md +18 -0
- package/docs/internal/agent-fleet-coordination-design.md +171 -0
- package/docs/internal/agent-orchestration.md +58 -0
- package/docs/internal/commit-identifiers.md +91 -0
- package/docs/internal/concurrency-open-decisions.md +37 -0
- package/docs/internal/data-source-reverse-channel.md +150 -0
- package/docs/internal/per-field-conflict-detection.md +165 -0
- package/docs/internal/postgres-replication.md +64 -0
- package/docs/internal/serializable-schema.md +119 -0
- package/docs/internal/structure.md +32 -0
- package/docs/mcp.md +9 -9
- package/docs/migration.md +37 -18
- package/docs/projects.md +1 -1
- package/docs/quickstart.md +2 -2
- package/docs/react.md +24 -13
- package/docs/schema-contract.md +3 -3
- package/docs/sessions.md +91 -37
- package/docs/webhooks.md +9 -9
- package/examples/README.md +2 -2
- package/examples/data-source/README.md +1 -1
- package/examples/data-source/ablo-driver.ts +1 -1
- package/examples/data-source/customer-server.ts +1 -1
- package/examples/data-source/run.ts +1 -1
- package/examples/data-source/schema.ts +1 -1
- package/examples/quickstart.ts +2 -2
- package/llms.txt +12 -12
- package/package.json +64 -174
- package/dist/BaseSyncedStore.d.ts +0 -823
- package/dist/BaseSyncedStore.js +0 -1955
- package/dist/Database.d.ts +0 -335
- package/dist/Database.js +0 -1500
- package/dist/InstanceCache.d.ts +0 -233
- package/dist/InstanceCache.js +0 -1164
- package/dist/LazyReferenceCollection.d.ts +0 -177
- package/dist/LazyReferenceCollection.js +0 -461
- package/dist/Model.d.ts +0 -444
- package/dist/Model.js +0 -909
- package/dist/ModelRegistry.d.ts +0 -221
- package/dist/ModelRegistry.js +0 -537
- package/dist/NetworkMonitor.d.ts +0 -26
- package/dist/NetworkMonitor.js +0 -77
- package/dist/RuntimeContext.d.ts +0 -52
- package/dist/RuntimeContext.js +0 -80
- package/dist/SyncClient.d.ts +0 -551
- package/dist/SyncClient.js +0 -2199
- package/dist/adapters/alwaysOnline.d.ts +0 -14
- package/dist/adapters/alwaysOnline.js +0 -17
- package/dist/adapters/inMemoryStorage.d.ts +0 -31
- package/dist/adapters/inMemoryStorage.js +0 -110
- package/dist/ai-sdk/coordinatedTool.d.ts +0 -120
- package/dist/ai-sdk/coordinatedTool.js +0 -134
- package/dist/ai-sdk/coordinationContext.d.ts +0 -46
- package/dist/ai-sdk/coordinationContext.js +0 -106
- package/dist/ai-sdk/index.d.ts +0 -121
- package/dist/ai-sdk/index.js +0 -121
- package/dist/ai-sdk/wrap.d.ts +0 -65
- package/dist/ai-sdk/wrap.js +0 -39
- package/dist/auth/index.d.ts +0 -1
- package/dist/auth/index.js +0 -8
- package/dist/batching/index.d.ts +0 -55
- package/dist/batching/index.js +0 -147
- package/dist/cli.cjs +0 -288600
- package/dist/client/Ablo.d.ts +0 -231
- package/dist/client/Ablo.js +0 -149
- package/dist/client/abloClient.d.ts +0 -309
- package/dist/client/abloClient.js +0 -13
- package/dist/client/clientPrelude.d.ts +0 -52
- package/dist/client/clientPrelude.js +0 -60
- package/dist/client/consoleLogger.d.ts +0 -35
- package/dist/client/consoleLogger.js +0 -44
- package/dist/client/coreClient.d.ts +0 -60
- package/dist/client/coreClient.js +0 -118
- package/dist/client/createInternalComponents.d.ts +0 -46
- package/dist/client/createInternalComponents.js +0 -92
- package/dist/client/createModelProxy.d.ts +0 -228
- package/dist/client/createModelProxy.js +0 -818
- package/dist/client/humans.d.ts +0 -48
- package/dist/client/humans.js +0 -52
- package/dist/client/modelRegistration.d.ts +0 -10
- package/dist/client/modelRegistration.js +0 -312
- package/dist/client/options.d.ts +0 -461
- package/dist/client/options.js +0 -7
- package/dist/client/reactiveEngine.d.ts +0 -48
- package/dist/client/reactiveEngine.js +0 -910
- package/dist/client/resourceTypes.d.ts +0 -12
- package/dist/client/resourceTypes.js +0 -10
- package/dist/client/schemaConfig.d.ts +0 -44
- package/dist/client/schemaConfig.js +0 -185
- package/dist/client/validateAbloOptions.d.ts +0 -42
- package/dist/client/validateAbloOptions.js +0 -43
- package/dist/client/wsMutationExecutor.d.ts +0 -27
- package/dist/client/wsMutationExecutor.js +0 -72
- package/dist/context.d.ts +0 -29
- package/dist/context.js +0 -58
- package/dist/coordination/ClaimLog.d.ts +0 -26
- package/dist/coordination/ClaimLog.js +0 -32
- package/dist/coordination/index.d.ts +0 -1
- package/dist/coordination/index.js +0 -8
- package/dist/core/DatabaseManager.d.ts +0 -105
- package/dist/core/DatabaseManager.js +0 -387
- package/dist/core/QueryProcessor.d.ts +0 -75
- package/dist/core/QueryProcessor.js +0 -255
- package/dist/core/QueryView.d.ts +0 -79
- package/dist/core/QueryView.js +0 -218
- package/dist/core/StoreManager.d.ts +0 -112
- package/dist/core/StoreManager.js +0 -302
- package/dist/core/ViewRegistry.d.ts +0 -20
- package/dist/core/ViewRegistry.js +0 -55
- package/dist/core/index.d.ts +0 -33
- package/dist/core/index.js +0 -48
- package/dist/core/openIDBWithTimeout.d.ts +0 -65
- package/dist/core/openIDBWithTimeout.js +0 -153
- package/dist/core/queryUtils.d.ts +0 -45
- package/dist/core/queryUtils.js +0 -69
- package/dist/core/storeContract.d.ts +0 -145
- package/dist/core/storeContract.js +0 -12
- package/dist/docs/catalog.d.ts +0 -72
- package/dist/docs/catalog.js +0 -227
- package/dist/docs/index.d.ts +0 -10
- package/dist/docs/index.js +0 -10
- package/dist/environment.d.ts +0 -1
- package/dist/environment.js +0 -8
- package/dist/interfaces/index.d.ts +0 -311
- package/dist/interfaces/index.js +0 -9
- package/dist/keys/index.d.ts +0 -1
- package/dist/keys/index.js +0 -8
- package/dist/mutators/RecordingMutation.d.ts +0 -36
- package/dist/mutators/RecordingMutation.js +0 -182
- package/dist/mutators/Transaction.d.ts +0 -40
- package/dist/mutators/Transaction.js +0 -58
- package/dist/mutators/UndoManager.d.ts +0 -258
- package/dist/mutators/UndoManager.js +0 -658
- package/dist/mutators/defineMutators.d.ts +0 -60
- package/dist/mutators/defineMutators.js +0 -18
- package/dist/mutators/inverseOp.d.ts +0 -126
- package/dist/mutators/inverseOp.js +0 -71
- package/dist/mutators/mutateActions.d.ts +0 -45
- package/dist/mutators/mutateActions.js +0 -105
- package/dist/mutators/readerActions.d.ts +0 -33
- package/dist/mutators/readerActions.js +0 -57
- package/dist/mutators/undoApply.d.ts +0 -51
- package/dist/mutators/undoApply.js +0 -117
- package/dist/policy/index.d.ts +0 -21
- package/dist/policy/index.js +0 -20
- package/dist/query/client.d.ts +0 -61
- package/dist/query/client.js +0 -137
- package/dist/query/types.d.ts +0 -85
- package/dist/query/types.js +0 -16
- package/dist/react/AbloProvider.d.ts +0 -230
- package/dist/react/AbloProvider.js +0 -455
- package/dist/react/ClientSideSuspense.d.ts +0 -36
- package/dist/react/ClientSideSuspense.js +0 -17
- package/dist/react/DefaultFallback.d.ts +0 -24
- package/dist/react/DefaultFallback.js +0 -43
- package/dist/react/context.d.ts +0 -55
- package/dist/react/context.js +0 -29
- package/dist/react/index.d.ts +0 -61
- package/dist/react/index.js +0 -66
- package/dist/react/internalContext.d.ts +0 -33
- package/dist/react/internalContext.js +0 -3
- package/dist/react/useAblo.d.ts +0 -75
- package/dist/react/useAblo.js +0 -102
- package/dist/react/useCurrentUserId.d.ts +0 -22
- package/dist/react/useCurrentUserId.js +0 -34
- package/dist/react/useErrorListener.d.ts +0 -20
- package/dist/react/useErrorListener.js +0 -38
- package/dist/react/useMutationFailureListener.d.ts +0 -26
- package/dist/react/useMutationFailureListener.js +0 -38
- package/dist/react/useMutators.d.ts +0 -56
- package/dist/react/useMutators.js +0 -84
- package/dist/react/useReactive.d.ts +0 -35
- package/dist/react/useReactive.js +0 -123
- package/dist/react/useSyncStatus.d.ts +0 -59
- package/dist/react/useSyncStatus.js +0 -76
- package/dist/react/useUndoScope.d.ts +0 -34
- package/dist/react/useUndoScope.js +0 -81
- package/dist/schema/coordination.d.ts +0 -112
- package/dist/schema/coordination.js +0 -129
- package/dist/schema/ddl.d.ts +0 -97
- package/dist/schema/ddl.js +0 -491
- package/dist/schema/ddlLock.d.ts +0 -35
- package/dist/schema/ddlLock.js +0 -46
- package/dist/schema/diff.d.ts +0 -225
- package/dist/schema/diff.js +0 -289
- package/dist/schema/generate.d.ts +0 -19
- package/dist/schema/generate.js +0 -86
- package/dist/schema/index.d.ts +0 -41
- package/dist/schema/index.js +0 -76
- package/dist/schema/queries.d.ts +0 -201
- package/dist/schema/queries.js +0 -144
- package/dist/schema/select.d.ts +0 -40
- package/dist/schema/select.js +0 -87
- package/dist/schema/serialize.d.ts +0 -115
- package/dist/schema/serialize.js +0 -262
- package/dist/schema/sugar.d.ts +0 -109
- package/dist/schema/sugar.js +0 -83
- package/dist/schema/syncDeltaRow.d.ts +0 -6
- package/dist/schema/syncDeltaRow.js +0 -6
- package/dist/server/adapter.d.ts +0 -173
- package/dist/server/adapter.js +0 -18
- package/dist/server/commit.d.ts +0 -107
- package/dist/server/commit.js +0 -1
- package/dist/server/index.d.ts +0 -14
- package/dist/server/index.js +0 -2
- package/dist/server/readConfig.d.ts +0 -80
- package/dist/server/readConfig.js +0 -8
- package/dist/server/storageMode.d.ts +0 -23
- package/dist/server/storageMode.js +0 -17
- package/dist/source/adapter.d.ts +0 -81
- package/dist/source/adapter.js +0 -22
- package/dist/source/adapters/drizzle.d.ts +0 -48
- package/dist/source/adapters/drizzle.js +0 -219
- package/dist/source/adapters/kysely.d.ts +0 -42
- package/dist/source/adapters/kysely.js +0 -205
- package/dist/source/adapters/kyselyMutationCore.d.ts +0 -76
- package/dist/source/adapters/kyselyMutationCore.js +0 -125
- package/dist/source/adapters/memory.d.ts +0 -13
- package/dist/source/adapters/memory.js +0 -130
- package/dist/source/adapters/prisma.d.ts +0 -63
- package/dist/source/adapters/prisma.js +0 -202
- package/dist/source/conformance.d.ts +0 -37
- package/dist/source/conformance.js +0 -215
- package/dist/source/connector.d.ts +0 -95
- package/dist/source/connector.js +0 -266
- package/dist/source/connectorProtocol.d.ts +0 -154
- package/dist/source/connectorProtocol.js +0 -163
- package/dist/source/contract.d.ts +0 -195
- package/dist/source/contract.js +0 -164
- package/dist/source/factory.d.ts +0 -92
- package/dist/source/factory.js +0 -286
- package/dist/source/footprint.d.ts +0 -111
- package/dist/source/footprint.js +0 -0
- package/dist/source/idempotency.d.ts +0 -61
- package/dist/source/idempotency.js +0 -144
- package/dist/source/index.d.ts +0 -23
- package/dist/source/index.js +0 -30
- package/dist/source/migrations.d.ts +0 -21
- package/dist/source/migrations.js +0 -103
- package/dist/source/next.d.ts +0 -32
- package/dist/source/next.js +0 -25
- package/dist/source/pushQueue.d.ts +0 -134
- package/dist/source/pushQueue.js +0 -256
- package/dist/source/signing.d.ts +0 -92
- package/dist/source/signing.js +0 -162
- package/dist/source/types.d.ts +0 -401
- package/dist/source/types.js +0 -59
- package/dist/stores/ObjectStore.d.ts +0 -115
- package/dist/stores/ObjectStore.js +0 -393
- package/dist/stores/ObjectStoreContract.d.ts +0 -38
- package/dist/stores/ObjectStoreContract.js +0 -1
- package/dist/stores/SyncActionStore.d.ts +0 -97
- package/dist/stores/SyncActionStore.js +0 -504
- package/dist/stores/syncAction.d.ts +0 -26
- package/dist/stores/syncAction.js +0 -16
- package/dist/surface.d.ts +0 -36
- package/dist/surface.js +0 -75
- package/dist/sync/BootstrapFetcher.d.ts +0 -280
- package/dist/sync/BootstrapFetcher.js +0 -962
- package/dist/sync/ConnectionManager.d.ts +0 -8
- package/dist/sync/ConnectionManager.js +0 -8
- package/dist/sync/OnDemandLoader.d.ts +0 -228
- package/dist/sync/OnDemandLoader.js +0 -742
- package/dist/sync/SubscriptionManager.d.ts +0 -159
- package/dist/sync/SubscriptionManager.js +0 -243
- package/dist/sync/SyncWebSocket.d.ts +0 -173
- package/dist/sync/SyncWebSocket.js +0 -438
- package/dist/sync/awaitClaimGrant.d.ts +0 -6
- package/dist/sync/awaitClaimGrant.js +0 -6
- package/dist/sync/bootstrapApply.d.ts +0 -70
- package/dist/sync/bootstrapApply.js +0 -73
- package/dist/sync/commitFrames.d.ts +0 -8
- package/dist/sync/commitFrames.js +0 -8
- package/dist/sync/contextPorts.d.ts +0 -18
- package/dist/sync/contextPorts.js +0 -31
- package/dist/sync/createClaimStream.d.ts +0 -7
- package/dist/sync/createClaimStream.js +0 -7
- package/dist/sync/createPresenceStream.d.ts +0 -69
- package/dist/sync/createPresenceStream.js +0 -200
- package/dist/sync/createSnapshot.d.ts +0 -29
- package/dist/sync/createSnapshot.js +0 -118
- package/dist/sync/credentialLifecycle.d.ts +0 -7
- package/dist/sync/credentialLifecycle.js +0 -7
- package/dist/sync/deltaPipeline.d.ts +0 -113
- package/dist/sync/deltaPipeline.js +0 -261
- package/dist/sync/groupChange.d.ts +0 -113
- package/dist/sync/groupChange.js +0 -242
- package/dist/sync/participants.d.ts +0 -115
- package/dist/sync/participants.js +0 -344
- package/dist/sync/persistedPrefix.d.ts +0 -12
- package/dist/sync/persistedPrefix.js +0 -22
- package/dist/sync/schemaDrift.d.ts +0 -55
- package/dist/sync/schemaDrift.js +0 -53
- package/dist/sync/schemas.d.ts +0 -70
- package/dist/sync/schemas.js +0 -94
- package/dist/sync/syncCursor.d.ts +0 -40
- package/dist/sync/syncCursor.js +0 -55
- package/dist/sync/syncPlan.d.ts +0 -54
- package/dist/sync/syncPlan.js +0 -50
- package/dist/sync/wsFrameHandlers.d.ts +0 -8
- package/dist/sync/wsFrameHandlers.js +0 -8
- package/dist/testing/fixtures/bootstrap.d.ts +0 -49
- package/dist/testing/fixtures/bootstrap.js +0 -59
- package/dist/testing/fixtures/deltas.d.ts +0 -83
- package/dist/testing/fixtures/deltas.js +0 -136
- package/dist/testing/fixtures/httpResponses.d.ts +0 -70
- package/dist/testing/fixtures/httpResponses.js +0 -90
- package/dist/testing/fixtures/models.d.ts +0 -83
- package/dist/testing/fixtures/models.js +0 -272
- package/dist/testing/helpers/reactWrapper.d.ts +0 -69
- package/dist/testing/helpers/reactWrapper.js +0 -67
- package/dist/testing/helpers/syncEngineHarness.d.ts +0 -54
- package/dist/testing/helpers/syncEngineHarness.js +0 -73
- package/dist/testing/helpers/wait.d.ts +0 -30
- package/dist/testing/helpers/wait.js +0 -49
- package/dist/testing/index.d.ts +0 -23
- package/dist/testing/index.js +0 -33
- package/dist/testing/mocks/FakeDatabase.d.ts +0 -18
- package/dist/testing/mocks/FakeDatabase.js +0 -10
- package/dist/testing/mocks/MockMutationExecutor.d.ts +0 -87
- package/dist/testing/mocks/MockMutationExecutor.js +0 -186
- package/dist/testing/mocks/MockNetworkMonitor.d.ts +0 -20
- package/dist/testing/mocks/MockNetworkMonitor.js +0 -46
- package/dist/testing/mocks/MockSyncContext.d.ts +0 -51
- package/dist/testing/mocks/MockSyncContext.js +0 -72
- package/dist/testing/mocks/MockSyncStore.d.ts +0 -88
- package/dist/testing/mocks/MockSyncStore.js +0 -171
- package/dist/testing/mocks/MockWebSocket.d.ts +0 -71
- package/dist/testing/mocks/MockWebSocket.js +0 -118
- package/dist/transaction/ablo.d.ts +0 -88
- package/dist/transaction/ablo.js +0 -33
- package/dist/transaction/auth/apiKey.d.ts +0 -152
- package/dist/transaction/auth/apiKey.js +0 -419
- package/dist/transaction/auth/bootstrapScope.d.ts +0 -15
- package/dist/transaction/auth/bootstrapScope.js +0 -1
- package/dist/transaction/auth/capability.d.ts +0 -177
- package/dist/transaction/auth/capability.js +0 -199
- package/dist/transaction/auth/credentialEndpoint.d.ts +0 -61
- package/dist/transaction/auth/credentialEndpoint.js +0 -86
- package/dist/transaction/auth/credentialPolicy.d.ts +0 -148
- package/dist/transaction/auth/credentialPolicy.js +0 -125
- package/dist/transaction/auth/credentialSource.d.ts +0 -30
- package/dist/transaction/auth/credentialSource.js +0 -55
- package/dist/transaction/auth/hostedEndpoints.d.ts +0 -21
- package/dist/transaction/auth/hostedEndpoints.js +0 -21
- package/dist/transaction/auth/identity.d.ts +0 -55
- package/dist/transaction/auth/identity.js +0 -210
- package/dist/transaction/auth/index.d.ts +0 -162
- package/dist/transaction/auth/index.js +0 -304
- package/dist/transaction/auth/schemas.d.ts +0 -59
- package/dist/transaction/auth/schemas.js +0 -85
- package/dist/transaction/auth/sessionMint.d.ts +0 -28
- package/dist/transaction/auth/sessionMint.js +0 -85
- package/dist/transaction/coordination/awaitClaimGrant.d.ts +0 -49
- package/dist/transaction/coordination/awaitClaimGrant.js +0 -112
- package/dist/transaction/coordination/claimHeartbeatLoop.d.ts +0 -50
- package/dist/transaction/coordination/claimHeartbeatLoop.js +0 -88
- package/dist/transaction/coordination/claimMeta.d.ts +0 -49
- package/dist/transaction/coordination/claimMeta.js +0 -52
- package/dist/transaction/coordination/createClaimStream.d.ts +0 -64
- package/dist/transaction/coordination/createClaimStream.js +0 -475
- package/dist/transaction/coordination/events.d.ts +0 -74
- package/dist/transaction/coordination/events.js +0 -7
- package/dist/transaction/coordination/index.d.ts +0 -19
- package/dist/transaction/coordination/index.js +0 -44
- package/dist/transaction/coordination/locator.d.ts +0 -83
- package/dist/transaction/coordination/locator.js +0 -82
- package/dist/transaction/coordination/schema.d.ts +0 -1473
- package/dist/transaction/coordination/schema.js +0 -1013
- package/dist/transaction/coordination/targetConflict.d.ts +0 -2
- package/dist/transaction/coordination/targetConflict.js +0 -103
- package/dist/transaction/coordination/trace.d.ts +0 -78
- package/dist/transaction/coordination/trace.js +0 -138
- package/dist/transaction/durableWrites.d.ts +0 -62
- package/dist/transaction/durableWrites.js +0 -71
- package/dist/transaction/environment.d.ts +0 -105
- package/dist/transaction/environment.js +0 -108
- package/dist/transaction/errorCodes.d.ts +0 -403
- package/dist/transaction/errorCodes.js +0 -480
- package/dist/transaction/errors.d.ts +0 -428
- package/dist/transaction/errors.js +0 -686
- package/dist/transaction/index.d.ts +0 -20
- package/dist/transaction/index.js +0 -20
- package/dist/transaction/keys/index.d.ts +0 -87
- package/dist/transaction/keys/index.js +0 -207
- package/dist/transaction/log/syncDeltaRow.d.ts +0 -158
- package/dist/transaction/log/syncDeltaRow.js +0 -95
- package/dist/transaction/logPosition.d.ts +0 -97
- package/dist/transaction/logPosition.js +0 -125
- package/dist/transaction/logger.d.ts +0 -16
- package/dist/transaction/logger.js +0 -7
- package/dist/transaction/observability.d.ts +0 -53
- package/dist/transaction/observability.js +0 -19
- package/dist/transaction/persistence.d.ts +0 -12
- package/dist/transaction/persistence.js +0 -11
- package/dist/transaction/plugin.d.ts +0 -192
- package/dist/transaction/plugin.js +0 -87
- package/dist/transaction/policy/types.d.ts +0 -217
- package/dist/transaction/policy/types.js +0 -126
- package/dist/transaction/resources/functionalUpdate.d.ts +0 -79
- package/dist/transaction/resources/functionalUpdate.js +0 -87
- package/dist/transaction/resources/httpResources.d.ts +0 -266
- package/dist/transaction/resources/httpResources.js +0 -7
- package/dist/transaction/resources/modelOperations.d.ts +0 -319
- package/dist/transaction/resources/modelOperations.js +0 -12
- package/dist/transaction/resources/mutationOptions.d.ts +0 -66
- package/dist/transaction/resources/mutationOptions.js +0 -9
- package/dist/transaction/resources/where.d.ts +0 -85
- package/dist/transaction/resources/where.js +0 -70
- package/dist/transaction/resources/writeOptionsSchema.d.ts +0 -47
- package/dist/transaction/resources/writeOptionsSchema.js +0 -73
- package/dist/transaction/schema/field.d.ts +0 -126
- package/dist/transaction/schema/field.js +0 -265
- package/dist/transaction/schema/loadStrategy.d.ts +0 -45
- package/dist/transaction/schema/loadStrategy.js +0 -46
- package/dist/transaction/schema/model.d.ts +0 -379
- package/dist/transaction/schema/model.js +0 -123
- package/dist/transaction/schema/openapi.d.ts +0 -57
- package/dist/transaction/schema/openapi.js +0 -340
- package/dist/transaction/schema/relation.d.ts +0 -199
- package/dist/transaction/schema/relation.js +0 -104
- package/dist/transaction/schema/residency.d.ts +0 -29
- package/dist/transaction/schema/residency.js +0 -25
- package/dist/transaction/schema/roles.d.ts +0 -249
- package/dist/transaction/schema/roles.js +0 -230
- package/dist/transaction/schema/schema.d.ts +0 -324
- package/dist/transaction/schema/schema.js +0 -305
- package/dist/transaction/schema/tenancy.d.ts +0 -139
- package/dist/transaction/schema/tenancy.js +0 -190
- package/dist/transaction/transactionLayer.d.ts +0 -82
- package/dist/transaction/transactionLayer.js +0 -24
- package/dist/transaction/transactions/settlement/commitEnvelope.d.ts +0 -143
- package/dist/transaction/transactions/settlement/commitEnvelope.js +0 -161
- package/dist/transaction/transactions/settlement/httpCommitEnvelope.d.ts +0 -53
- package/dist/transaction/transactions/settlement/httpCommitEnvelope.js +0 -207
- package/dist/transaction/transactions/settlement/idempotencyKey.d.ts +0 -10
- package/dist/transaction/transactions/settlement/idempotencyKey.js +0 -9
- package/dist/transaction/transactions/settlement/pendingWrite.d.ts +0 -112
- package/dist/transaction/transactions/settlement/pendingWrite.js +0 -20
- package/dist/transaction/transport/commitFrames.d.ts +0 -90
- package/dist/transaction/transport/commitFrames.js +0 -134
- package/dist/transaction/transport/connectionManager.d.ts +0 -215
- package/dist/transaction/transport/connectionManager.js +0 -673
- package/dist/transaction/transport/credentialLifecycle.d.ts +0 -177
- package/dist/transaction/transport/credentialLifecycle.js +0 -324
- package/dist/transaction/transport/heartbeat.d.ts +0 -65
- package/dist/transaction/transport/heartbeat.js +0 -93
- package/dist/transaction/transport/httpClient.d.ts +0 -123
- package/dist/transaction/transport/httpClient.js +0 -145
- package/dist/transaction/transport/httpOptions.d.ts +0 -33
- package/dist/transaction/transport/httpOptions.js +0 -12
- package/dist/transaction/transport/httpTransport.d.ts +0 -8
- package/dist/transaction/transport/httpTransport.js +0 -1276
- package/dist/transaction/transport/networkProbe.d.ts +0 -84
- package/dist/transaction/transport/networkProbe.js +0 -207
- package/dist/transaction/transport/wsFrameHandlers.d.ts +0 -128
- package/dist/transaction/transport/wsFrameHandlers.js +0 -429
- package/dist/transaction/transport/wsTransport.d.ts +0 -576
- package/dist/transaction/transport/wsTransport.js +0 -1017
- package/dist/transaction/types/assertExact.d.ts +0 -17
- package/dist/transaction/types/assertExact.js +0 -1
- package/dist/transaction/types/global.d.ts +0 -107
- package/dist/transaction/types/global.js +0 -40
- package/dist/transaction/types/index.d.ts +0 -205
- package/dist/transaction/types/index.js +0 -56
- package/dist/transaction/types/modelData.d.ts +0 -10
- package/dist/transaction/types/modelData.js +0 -9
- package/dist/transaction/types/participant.d.ts +0 -20
- package/dist/transaction/types/participant.js +0 -10
- package/dist/transaction/types/streams.d.ts +0 -540
- package/dist/transaction/types/streams.js +0 -11
- package/dist/transaction/utils/asyncIterator.d.ts +0 -34
- package/dist/transaction/utils/asyncIterator.js +0 -135
- package/dist/transaction/utils/duration.d.ts +0 -25
- package/dist/transaction/utils/duration.js +0 -45
- package/dist/transaction/utils/json.d.ts +0 -57
- package/dist/transaction/utils/json.js +0 -276
- package/dist/transaction/wire/accountResponses.d.ts +0 -351
- package/dist/transaction/wire/accountResponses.js +0 -255
- package/dist/transaction/wire/auth.d.ts +0 -49
- package/dist/transaction/wire/auth.js +0 -57
- package/dist/transaction/wire/bootstrapReason.d.ts +0 -9
- package/dist/transaction/wire/bootstrapReason.js +0 -8
- package/dist/transaction/wire/claimEvent.d.ts +0 -76
- package/dist/transaction/wire/claimEvent.js +0 -73
- package/dist/transaction/wire/claims.d.ts +0 -463
- package/dist/transaction/wire/claims.js +0 -229
- package/dist/transaction/wire/commit.d.ts +0 -603
- package/dist/transaction/wire/commit.js +0 -321
- package/dist/transaction/wire/delta.d.ts +0 -250
- package/dist/transaction/wire/delta.js +0 -147
- package/dist/transaction/wire/errorEnvelope.d.ts +0 -72
- package/dist/transaction/wire/errorEnvelope.js +0 -123
- package/dist/transaction/wire/feedCursor.d.ts +0 -60
- package/dist/transaction/wire/feedCursor.js +0 -82
- package/dist/transaction/wire/feedEvent.d.ts +0 -177
- package/dist/transaction/wire/feedEvent.js +0 -39
- package/dist/transaction/wire/frames.d.ts +0 -194
- package/dist/transaction/wire/frames.js +0 -50
- package/dist/transaction/wire/inboundFrames.d.ts +0 -552
- package/dist/transaction/wire/inboundFrames.js +0 -116
- package/dist/transaction/wire/index.d.ts +0 -50
- package/dist/transaction/wire/index.js +0 -74
- package/dist/transaction/wire/listEnvelope.d.ts +0 -37
- package/dist/transaction/wire/listEnvelope.js +0 -42
- package/dist/transaction/wire/modelResponses.d.ts +0 -85
- package/dist/transaction/wire/modelResponses.js +0 -43
- package/dist/transaction/wire/protocol.d.ts +0 -38
- package/dist/transaction/wire/protocol.js +0 -38
- package/dist/transaction/wire/protocolVersion.d.ts +0 -73
- package/dist/transaction/wire/protocolVersion.js +0 -83
- package/dist/transactions/mutations/MutationQueue.d.ts +0 -655
- package/dist/transactions/mutations/MutationQueue.js +0 -2797
- package/dist/transactions/mutations/MutationStore.d.ts +0 -20
- package/dist/transactions/mutations/MutationStore.js +0 -53
- package/dist/transactions/mutations/UnconfirmedWrites.d.ts +0 -82
- package/dist/transactions/mutations/UnconfirmedWrites.js +0 -104
- package/dist/transactions/mutations/coalesceRules.d.ts +0 -58
- package/dist/transactions/mutations/coalesceRules.js +0 -140
- package/dist/transactions/mutations/commitLatency.d.ts +0 -52
- package/dist/transactions/mutations/commitLatency.js +0 -130
- package/dist/transactions/mutations/commitOutboxStore.d.ts +0 -28
- package/dist/transactions/mutations/commitOutboxStore.js +0 -26
- package/dist/transactions/mutations/commitPayload.d.ts +0 -164
- package/dist/transactions/mutations/commitPayload.js +0 -152
- package/dist/transactions/mutations/deltaConfirmation.d.ts +0 -59
- package/dist/transactions/mutations/deltaConfirmation.js +0 -233
- package/dist/transactions/mutations/durableWriteStore.d.ts +0 -14
- package/dist/transactions/mutations/durableWriteStore.js +0 -12
- package/dist/transactions/mutations/optimisticApply.d.ts +0 -49
- package/dist/transactions/mutations/optimisticApply.js +0 -65
- package/dist/transactions/mutations/replayValidation.d.ts +0 -186
- package/dist/transactions/mutations/replayValidation.js +0 -163
- package/dist/utils/mobxSetup.d.ts +0 -53
- package/dist/utils/mobxSetup.js +0 -330
- package/dist/webhooks/events.d.ts +0 -43
- package/dist/webhooks/events.js +0 -42
- package/dist/webhooks/index.d.ts +0 -8
- package/dist/webhooks/index.js +0 -8
- package/dist/wire/index.d.ts +0 -1
- package/dist/wire/index.js +0 -8
- package/docs/interaction-model.md +0 -99
|
@@ -1,302 +0,0 @@
|
|
|
1
|
-
/**
|
|
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 or lazy — decides how and
|
|
7
|
-
* when its data is loaded.
|
|
8
|
-
*/
|
|
9
|
-
import { ModelRegistry } from '../ModelRegistry.js';
|
|
10
|
-
import { ObjectStore } from '../stores/ObjectStore.js';
|
|
11
|
-
import { SyncActionStore } from '../stores/SyncActionStore.js';
|
|
12
|
-
import { LoadStrategy } from '../transaction/types/index.js';
|
|
13
|
-
import { AbloValidationError } from '../transaction/errors.js';
|
|
14
|
-
/**
|
|
15
|
-
* StoreManager - Central manager for all ObjectStore instances
|
|
16
|
-
*
|
|
17
|
-
* Key responsibilities:
|
|
18
|
-
* - Creates ObjectStore instances for each registered model
|
|
19
|
-
* - Manages store lifecycle and readiness
|
|
20
|
-
* - Provides unified interface for database operations
|
|
21
|
-
* - Handles store-specific optimizations based on load strategies
|
|
22
|
-
*/
|
|
23
|
-
export class StoreManager {
|
|
24
|
-
stores = new Map();
|
|
25
|
-
/** Strict-durability wrapper for the client write journal and commit outbox. */
|
|
26
|
-
transactionStore = null;
|
|
27
|
-
syncactionStore = null;
|
|
28
|
-
db = null;
|
|
29
|
-
isInitialized = false;
|
|
30
|
-
modelRegistry;
|
|
31
|
-
constructor(modelRegistry) {
|
|
32
|
-
this.modelRegistry = modelRegistry;
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Initialize all stores for registered models
|
|
36
|
-
*/
|
|
37
|
-
async initializeStores(db) {
|
|
38
|
-
this.db = db;
|
|
39
|
-
if (this.isInitialized) {
|
|
40
|
-
// Idempotent re-entry — harmless, nothing for the consumer to act on → debug.
|
|
41
|
-
getContext().logger.debug('StoreManager already initialized');
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
44
|
-
getContext().logger.info('Initializing ObjectStore instances for all models');
|
|
45
|
-
const startTime = performance.now();
|
|
46
|
-
// Get all registered models
|
|
47
|
-
const allModels = this.modelRegistry.getRegisteredModelNames();
|
|
48
|
-
for (const modelName of allModels) {
|
|
49
|
-
await this.createStoreForModel(modelName);
|
|
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');
|
|
57
|
-
// Initialize SyncactionStore
|
|
58
|
-
this.syncactionStore = new SyncActionStore(this.db);
|
|
59
|
-
await this.syncactionStore.initialize();
|
|
60
|
-
this.isInitialized = true;
|
|
61
|
-
const duration = performance.now() - startTime;
|
|
62
|
-
getContext().logger.info('Initialized ObjectStores and SyncactionStore', {
|
|
63
|
-
count: this.stores.size,
|
|
64
|
-
ms: duration.toFixed(2),
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Create ObjectStore for a specific model
|
|
69
|
-
*/
|
|
70
|
-
async createStoreForModel(modelName) {
|
|
71
|
-
const metadata = this.modelRegistry.getMetadata(modelName);
|
|
72
|
-
if (!metadata) {
|
|
73
|
-
throw new AbloValidationError(`No metadata found for model: ${modelName}`, {
|
|
74
|
-
code: 'store_manager_unknown_model',
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
// Use model name directly as store name
|
|
78
|
-
const storeName = modelName;
|
|
79
|
-
// Create the ObjectStore. One store type currently serves every load strategy.
|
|
80
|
-
const store = new ObjectStore(this.db, modelName, storeName, metadata);
|
|
81
|
-
this.stores.set(modelName, store);
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Create stores (tables) in IndexedDB
|
|
85
|
-
*/
|
|
86
|
-
async createStores(db) {
|
|
87
|
-
getContext().logger.info('Creating tables for all registered models');
|
|
88
|
-
for (const modelName of this.modelRegistry.getRegisteredModelNames()) {
|
|
89
|
-
const storeName = modelName;
|
|
90
|
-
// Skip if store already exists
|
|
91
|
-
if (db.objectStoreNames.contains(storeName)) {
|
|
92
|
-
continue;
|
|
93
|
-
}
|
|
94
|
-
getContext().logger.debug('Creating table', { storeName, modelName });
|
|
95
|
-
// Create object store with id as keyPath
|
|
96
|
-
const store = db.createObjectStore(storeName, { keyPath: 'id' });
|
|
97
|
-
// Create indexes for indexed properties
|
|
98
|
-
const indexedProperties = this.modelRegistry.getIndexedProperties(modelName);
|
|
99
|
-
for (const propName of indexedProperties) {
|
|
100
|
-
try {
|
|
101
|
-
store.createIndex(propName, propName, { unique: false });
|
|
102
|
-
getContext().logger.debug('Created index', { store: storeName, prop: propName });
|
|
103
|
-
}
|
|
104
|
-
catch (error) {
|
|
105
|
-
// Internal IndexedDB index setup — a miss only affects local query
|
|
106
|
-
// speed and isn't consumer-actionable → debug.
|
|
107
|
-
getContext().logger.debug('Failed to create index', { store: storeName, prop: propName, error });
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
// Create special tables
|
|
112
|
-
this.createSpecialTables(db);
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Create special tables (sync_action_table, model_table, model_table_partial, __meta, __transactions)
|
|
116
|
-
*/
|
|
117
|
-
createSpecialTables(db) {
|
|
118
|
-
// Create sync_action_table for sync actions (delta packets)
|
|
119
|
-
if (!db.objectStoreNames.contains('sync_action_table')) {
|
|
120
|
-
const syncActionStore = db.createObjectStore('sync_action_table', { keyPath: 'id' });
|
|
121
|
-
syncActionStore.createIndex('syncId', 'id');
|
|
122
|
-
getContext().logger.debug('Created sync_action_table');
|
|
123
|
-
}
|
|
124
|
-
// Create __meta table for model persistence state and database metadata
|
|
125
|
-
if (!db.objectStoreNames.contains('__meta')) {
|
|
126
|
-
db.createObjectStore('__meta');
|
|
127
|
-
getContext().logger.debug('Created __meta table');
|
|
128
|
-
}
|
|
129
|
-
// Create __transactions table for unsent transactions
|
|
130
|
-
if (!db.objectStoreNames.contains('__transactions')) {
|
|
131
|
-
const transactionStore = db.createObjectStore('__transactions', {
|
|
132
|
-
keyPath: 'id',
|
|
133
|
-
autoIncrement: false,
|
|
134
|
-
});
|
|
135
|
-
// Create indexes for transaction queries
|
|
136
|
-
transactionStore.createIndex('timestamp', 'timestamp');
|
|
137
|
-
transactionStore.createIndex('status', 'status');
|
|
138
|
-
getContext().logger.debug('Created __transactions table');
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* Get ObjectStore for a model
|
|
143
|
-
*/
|
|
144
|
-
getStore(modelName) {
|
|
145
|
-
if (modelName === '__transactions') {
|
|
146
|
-
return this.transactionStore ?? undefined;
|
|
147
|
-
}
|
|
148
|
-
return this.stores.get(modelName);
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Get SyncactionStore instance
|
|
152
|
-
*/
|
|
153
|
-
getSyncactionStore() {
|
|
154
|
-
return this.syncactionStore;
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* Get all stores
|
|
158
|
-
*/
|
|
159
|
-
getAllStores() {
|
|
160
|
-
return new Map(this.stores);
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* Check readiness of all stores
|
|
164
|
-
*/
|
|
165
|
-
async checkReadinessOfStores() {
|
|
166
|
-
const readyStores = [];
|
|
167
|
-
const notReadyStores = [];
|
|
168
|
-
for (const [modelName, store] of Array.from(this.stores)) {
|
|
169
|
-
const isReady = await store.checkIsReady();
|
|
170
|
-
if (isReady) {
|
|
171
|
-
readyStores.push(modelName);
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
notReadyStores.push(modelName);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
const allReady = notReadyStores.length === 0;
|
|
178
|
-
getContext().logger.debug('Store readiness', {
|
|
179
|
-
ready: readyStores.length,
|
|
180
|
-
total: this.stores.size,
|
|
181
|
-
notReady: notReadyStores,
|
|
182
|
-
});
|
|
183
|
-
return {
|
|
184
|
-
ready: allReady,
|
|
185
|
-
readyStores,
|
|
186
|
-
notReadyStores,
|
|
187
|
-
totalStores: this.stores.size,
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* Reports whether any data store holds at least one record. This is a
|
|
192
|
-
* cache-validity check: if the stores are empty, the sync cursor
|
|
193
|
-
* (`lastSyncId`) is meaningless no matter what the metadata says, because the
|
|
194
|
-
* cursor and the data must travel together — no data means no cursor, which
|
|
195
|
-
* forces a full bootstrap. To stay cheap it samples up to three stores rather
|
|
196
|
-
* than scanning them all, and returns true as soon as one has records.
|
|
197
|
-
*/
|
|
198
|
-
async hasAnyData() {
|
|
199
|
-
const storeEntries = Array.from(this.stores);
|
|
200
|
-
// Sample a few stores — don't check all 30+ if the first one has data
|
|
201
|
-
const samplesToCheck = Math.min(storeEntries.length, 3);
|
|
202
|
-
for (let i = 0; i < samplesToCheck; i++) {
|
|
203
|
-
const entry = storeEntries[i];
|
|
204
|
-
if (!entry)
|
|
205
|
-
break;
|
|
206
|
-
const [, store] = entry;
|
|
207
|
-
try {
|
|
208
|
-
const count = await store.count();
|
|
209
|
-
if (count > 0)
|
|
210
|
-
return true;
|
|
211
|
-
}
|
|
212
|
-
catch {
|
|
213
|
-
// Store not accessible — treat as empty
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
return false;
|
|
217
|
-
}
|
|
218
|
-
/**
|
|
219
|
-
* Get stores by load strategy
|
|
220
|
-
*/
|
|
221
|
-
getStoresByStrategy(strategy) {
|
|
222
|
-
const stores = [];
|
|
223
|
-
for (const [modelName, store] of Array.from(this.stores)) {
|
|
224
|
-
const metadata = this.modelRegistry.getMetadata(modelName);
|
|
225
|
-
if (metadata?.loadStrategy === strategy) {
|
|
226
|
-
stores.push(store);
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
return stores;
|
|
230
|
-
}
|
|
231
|
-
/**
|
|
232
|
-
* Perform maintenance on all stores
|
|
233
|
-
*/
|
|
234
|
-
async performMaintenance() {
|
|
235
|
-
getContext().logger.info('Performing maintenance on all stores');
|
|
236
|
-
const promises = Array.from(this.stores.values()).map((store) => store.performMaintenance());
|
|
237
|
-
await Promise.all(promises);
|
|
238
|
-
getContext().logger.info('Store maintenance completed');
|
|
239
|
-
}
|
|
240
|
-
/**
|
|
241
|
-
* Clear all stores
|
|
242
|
-
*/
|
|
243
|
-
async clearAllStores() {
|
|
244
|
-
// Lifecycle chatter (logout / identity switch / reset), not a warning.
|
|
245
|
-
// Logged at `debug` so it stays silent under the default `warn` threshold.
|
|
246
|
-
getContext().logger.debug('Clearing all stores');
|
|
247
|
-
const promises = Array.from(this.stores.values()).map((store) => store.clear());
|
|
248
|
-
await Promise.all(promises);
|
|
249
|
-
getContext().logger.info('All stores cleared');
|
|
250
|
-
}
|
|
251
|
-
/**
|
|
252
|
-
* Mark all stores as closing to prevent new operations
|
|
253
|
-
* Called before database connection is closed
|
|
254
|
-
*/
|
|
255
|
-
markAllStoresAsClosing() {
|
|
256
|
-
getContext().logger.debug('Marking all stores as closing');
|
|
257
|
-
for (const store of this.stores.values()) {
|
|
258
|
-
store.markAsClosing();
|
|
259
|
-
}
|
|
260
|
-
this.transactionStore?.markAsClosing();
|
|
261
|
-
// SyncActionStore is a standalone store that does not extend ObjectStore
|
|
262
|
-
// and has no markAsClosing equivalent, so it is intentionally skipped here.
|
|
263
|
-
// If closing-state coordination is ever needed for sync actions, add it
|
|
264
|
-
// explicitly to SyncActionStore rather than casting to reach a method that
|
|
265
|
-
// may not exist.
|
|
266
|
-
getContext().logger.debug('All stores marked as closing');
|
|
267
|
-
}
|
|
268
|
-
/**
|
|
269
|
-
* Get comprehensive statistics
|
|
270
|
-
*/
|
|
271
|
-
async getComprehensiveStats() {
|
|
272
|
-
const storeDetails = [];
|
|
273
|
-
let totalRecords = 0;
|
|
274
|
-
let readyCount = 0;
|
|
275
|
-
for (const [modelName, store] of Array.from(this.stores)) {
|
|
276
|
-
const metadata = this.modelRegistry.getMetadata(modelName);
|
|
277
|
-
const storeName = modelName;
|
|
278
|
-
const ready = await store.checkIsReady();
|
|
279
|
-
const count = await store.count();
|
|
280
|
-
if (ready)
|
|
281
|
-
readyCount++;
|
|
282
|
-
totalRecords += count;
|
|
283
|
-
storeDetails.push({
|
|
284
|
-
modelName,
|
|
285
|
-
storeName,
|
|
286
|
-
strategy: metadata.loadStrategy,
|
|
287
|
-
ready,
|
|
288
|
-
count,
|
|
289
|
-
});
|
|
290
|
-
}
|
|
291
|
-
return {
|
|
292
|
-
totalStores: this.stores.size,
|
|
293
|
-
readiness: {
|
|
294
|
-
ready: readyCount,
|
|
295
|
-
notReady: this.stores.size - readyCount,
|
|
296
|
-
},
|
|
297
|
-
totalRecords,
|
|
298
|
-
storeDetails,
|
|
299
|
-
};
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
import { getContext } from '../context.js';
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ViewRegistry — tracks active QueryViews per typename.
|
|
3
|
-
*
|
|
4
|
-
* When the InstanceCache mutates a model, it calls notifyAdded / notifyUpdated /
|
|
5
|
-
* notifyRemoved on the registry, which fans the event out to every active
|
|
6
|
-
* QueryView subscribed to that typename.
|
|
7
|
-
*/
|
|
8
|
-
import { type Model } from '../Model.js';
|
|
9
|
-
import type { IncrementalView } from './queryUtils.js';
|
|
10
|
-
export declare class ViewRegistry {
|
|
11
|
-
private views;
|
|
12
|
-
register(typename: string, view: IncrementalView): void;
|
|
13
|
-
unregister(typename: string, view: IncrementalView): void;
|
|
14
|
-
/** Called by InstanceCache after a model is added to the pool. */
|
|
15
|
-
notifyAdded(typename: string, model: Model): void;
|
|
16
|
-
/** Called by InstanceCache after a model is updated in the pool. */
|
|
17
|
-
notifyUpdated(typename: string, model: Model): void;
|
|
18
|
-
/** Called by InstanceCache after a model is removed from the pool. */
|
|
19
|
-
notifyRemoved(typename: string, modelId: string): void;
|
|
20
|
-
}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ViewRegistry — tracks active QueryViews per typename.
|
|
3
|
-
*
|
|
4
|
-
* When the InstanceCache mutates a model, it calls notifyAdded / notifyUpdated /
|
|
5
|
-
* notifyRemoved on the registry, which fans the event out to every active
|
|
6
|
-
* QueryView subscribed to that typename.
|
|
7
|
-
*/
|
|
8
|
-
import { modelAsRow } from '../Model.js';
|
|
9
|
-
export class ViewRegistry {
|
|
10
|
-
views = new Map();
|
|
11
|
-
register(typename, view) {
|
|
12
|
-
let set = this.views.get(typename);
|
|
13
|
-
if (!set) {
|
|
14
|
-
set = new Set();
|
|
15
|
-
this.views.set(typename, set);
|
|
16
|
-
}
|
|
17
|
-
set.add(view);
|
|
18
|
-
}
|
|
19
|
-
unregister(typename, view) {
|
|
20
|
-
const set = this.views.get(typename);
|
|
21
|
-
if (!set)
|
|
22
|
-
return;
|
|
23
|
-
set.delete(view);
|
|
24
|
-
if (set.size === 0) {
|
|
25
|
-
this.views.delete(typename);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
/** Called by InstanceCache after a model is added to the pool. */
|
|
29
|
-
notifyAdded(typename, model) {
|
|
30
|
-
const set = this.views.get(typename);
|
|
31
|
-
if (!set)
|
|
32
|
-
return;
|
|
33
|
-
for (const view of set) {
|
|
34
|
-
view.handleAdded(modelAsRow(model));
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
/** Called by InstanceCache after a model is updated in the pool. */
|
|
38
|
-
notifyUpdated(typename, model) {
|
|
39
|
-
const set = this.views.get(typename);
|
|
40
|
-
if (!set)
|
|
41
|
-
return;
|
|
42
|
-
for (const view of set) {
|
|
43
|
-
view.handleUpdated(modelAsRow(model));
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
/** Called by InstanceCache after a model is removed from the pool. */
|
|
47
|
-
notifyRemoved(typename, modelId) {
|
|
48
|
-
const set = this.views.get(typename);
|
|
49
|
-
if (!set)
|
|
50
|
-
return;
|
|
51
|
-
for (const view of set) {
|
|
52
|
-
view.handleRemoved(modelId);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
package/dist/core/index.d.ts
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
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.
|
|
7
|
-
*
|
|
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.
|
|
11
|
-
*/
|
|
12
|
-
export { BaseSyncedStore, type ModelConstructor, type ConcreteModelConstructor, } from '../BaseSyncedStore.js';
|
|
13
|
-
export { SyncClient } from '../SyncClient.js';
|
|
14
|
-
export { Database } from '../Database.js';
|
|
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';
|
|
20
|
-
export { Model } from '../Model.js';
|
|
21
|
-
export { LazyReferenceCollection, type LazyCollectionOptions, } from '../LazyReferenceCollection.js';
|
|
22
|
-
export { ModelRegistry, getActiveRegistry, } from '../ModelRegistry.js';
|
|
23
|
-
export { postQuery, type PostQueryOptions } from '../query/client.js';
|
|
24
|
-
export { computeFKDepthPriority } from '../client/schemaConfig.js';
|
|
25
|
-
export type { SyncLogger, SyncObservabilityProvider, MutationExecutor, SessionErrorDetector, OnlineStatusProvider, CommitResult, MutationOperation, } from '../interfaces/index.js';
|
|
26
|
-
export { SyncWebSocket, type SyncDelta, type SyncWebSocketOptions, } from '../sync/SyncWebSocket.js';
|
|
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';
|
|
31
|
-
export { createClaimStream, type AttachableClaimStream, type ClaimStreamConfig, } from '../sync/createClaimStream.js';
|
|
32
|
-
export { awaitClaimGrant, type GrantTransport, } from '../sync/awaitClaimGrant.js';
|
|
33
|
-
export { LoadStrategy } from '../transaction/types/index.js';
|
package/dist/core/index.js
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
/**
|
|
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.
|
|
7
|
-
*
|
|
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.
|
|
11
|
-
*/
|
|
12
|
-
// The base store class, plus the constructor shapes that subclasses reference.
|
|
13
|
-
export { BaseSyncedStore, } from '../BaseSyncedStore.js';
|
|
14
|
-
// Core infrastructure classes
|
|
15
|
-
export { SyncClient } from '../SyncClient.js';
|
|
16
|
-
export { Database } from '../Database.js';
|
|
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';
|
|
22
|
-
export { Model } from '../Model.js';
|
|
23
|
-
export { LazyReferenceCollection, } from '../LazyReferenceCollection.js';
|
|
24
|
-
export { ModelRegistry, getActiveRegistry, } from '../ModelRegistry.js';
|
|
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.
|
|
27
|
-
export { postQuery } from '../query/client.js';
|
|
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.
|
|
31
|
-
export { computeFKDepthPriority } from '../client/schemaConfig.js';
|
|
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.
|
|
34
|
-
export { SyncWebSocket, } from '../sync/SyncWebSocket.js';
|
|
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`.
|
|
44
|
-
export { createClaimStream, } from '../sync/createClaimStream.js';
|
|
45
|
-
export { awaitClaimGrant, } from '../sync/awaitClaimGrant.js';
|
|
46
|
-
// An enum naming the strategies for loading a model's data. Referenced when
|
|
47
|
-
// registering models in extension code.
|
|
48
|
-
export { LoadStrategy } from '../transaction/types/index.js';
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The error raised when opening an IndexedDB database does not complete in a
|
|
3
|
-
* bounded time. {@link openIDBWithTimeout} throws it in two situations: another
|
|
4
|
-
* browser tab is holding an older version of the database open and blocking the
|
|
5
|
-
* upgrade (`reason: 'blocked'`), or the open request produced no result at all
|
|
6
|
-
* within the timeout (`reason: 'timeout'`).
|
|
7
|
-
*
|
|
8
|
-
* The native open request can otherwise hang indefinitely — when a blocking tab
|
|
9
|
-
* never closes its connection, neither the success nor the error callback fires,
|
|
10
|
-
* and any code awaiting the open waits forever. Turning that into a thrown error
|
|
11
|
-
* lets the surrounding application show a recoverable failure instead of an
|
|
12
|
-
* unbreakable spinner.
|
|
13
|
-
*/
|
|
14
|
-
export declare class IDBOpenTimeoutError extends Error {
|
|
15
|
-
readonly dbName: string;
|
|
16
|
-
readonly reason: 'blocked' | 'timeout';
|
|
17
|
-
/**
|
|
18
|
-
* A stable identifier for this failure, independent of the message text. When
|
|
19
|
-
* this error is wrapped into an {@link AbloError} by `toAbloError`, the string
|
|
20
|
-
* code is preserved, so error handlers can recognize a wedged-storage failure
|
|
21
|
-
* and offer a recovery path rather than matching on the message.
|
|
22
|
-
*/
|
|
23
|
-
readonly code = "storage_open_timeout";
|
|
24
|
-
constructor(dbName: string, reason: 'blocked' | 'timeout', message: string);
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Returns true when a caught value is the storage-open-timeout failure. It
|
|
28
|
-
* detects the failure by its stable `code`, so it still matches after the error
|
|
29
|
-
* has been wrapped into an {@link AbloError} or another error type.
|
|
30
|
-
*/
|
|
31
|
-
export declare function isStorageOpenTimeout(err: unknown): boolean;
|
|
32
|
-
export interface OpenIDBOptions {
|
|
33
|
-
/** Called inside `onupgradeneeded` — mirrors `IDBOpenDBRequest.onupgradeneeded`. */
|
|
34
|
-
onUpgrade?: (request: IDBOpenDBRequest, event: IDBVersionChangeEvent) => void;
|
|
35
|
-
/** Max milliseconds to wait for the open request to resolve. Default 10_000. */
|
|
36
|
-
timeoutMs?: number;
|
|
37
|
-
/**
|
|
38
|
-
* Called when another context — a new tab, a page reload after a deploy, or
|
|
39
|
-
* this package's own {@link deleteIDBWithTimeout} recovery — needs to upgrade
|
|
40
|
-
* or delete the database and fires a `versionchange` event on this connection.
|
|
41
|
-
* The connection is always closed first, which is what lets the other
|
|
42
|
-
* context's upgrade or delete proceed instead of blocking on this one. Provide
|
|
43
|
-
* this callback to react after that close, for example to prompt the user to
|
|
44
|
-
* reload. Any error it throws is ignored.
|
|
45
|
-
*/
|
|
46
|
-
onVersionChange?: () => void;
|
|
47
|
-
}
|
|
48
|
-
export declare function openIDBWithTimeout(name: string, version: number | undefined, options?: OpenIDBOptions): Promise<IDBDatabase>;
|
|
49
|
-
/**
|
|
50
|
-
* Deletes an IndexedDB database within a bounded time — the delete counterpart
|
|
51
|
-
* to {@link openIDBWithTimeout}. It is used to recover from a wedged backing
|
|
52
|
-
* store: when opening a database times out, the caller can delete it and start
|
|
53
|
-
* fresh, which is safe for any database whose contents can be rebuilt on the
|
|
54
|
-
* next load.
|
|
55
|
-
*
|
|
56
|
-
* Like an open request, a native delete can hang indefinitely — it fires a
|
|
57
|
-
* blocked event and waits when another connection still holds the database, and
|
|
58
|
-
* on a truly stuck store it fires no event at all. Both cases become a bounded,
|
|
59
|
-
* resolved result here, so the caller never spins.
|
|
60
|
-
*
|
|
61
|
-
* Resolves to `true` on a clean delete and `false` when the delete was blocked
|
|
62
|
-
* or timed out. Either way the caller can decide whether to retry the open; a
|
|
63
|
-
* delete that did nothing leaves the store no worse off.
|
|
64
|
-
*/
|
|
65
|
-
export declare function deleteIDBWithTimeout(name: string, timeoutMs?: number): Promise<boolean>;
|
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The error raised when opening an IndexedDB database does not complete in a
|
|
3
|
-
* bounded time. {@link openIDBWithTimeout} throws it in two situations: another
|
|
4
|
-
* browser tab is holding an older version of the database open and blocking the
|
|
5
|
-
* upgrade (`reason: 'blocked'`), or the open request produced no result at all
|
|
6
|
-
* within the timeout (`reason: 'timeout'`).
|
|
7
|
-
*
|
|
8
|
-
* The native open request can otherwise hang indefinitely — when a blocking tab
|
|
9
|
-
* never closes its connection, neither the success nor the error callback fires,
|
|
10
|
-
* and any code awaiting the open waits forever. Turning that into a thrown error
|
|
11
|
-
* lets the surrounding application show a recoverable failure instead of an
|
|
12
|
-
* unbreakable spinner.
|
|
13
|
-
*/
|
|
14
|
-
export class IDBOpenTimeoutError extends Error {
|
|
15
|
-
dbName;
|
|
16
|
-
reason;
|
|
17
|
-
/**
|
|
18
|
-
* A stable identifier for this failure, independent of the message text. When
|
|
19
|
-
* this error is wrapped into an {@link AbloError} by `toAbloError`, the string
|
|
20
|
-
* code is preserved, so error handlers can recognize a wedged-storage failure
|
|
21
|
-
* and offer a recovery path rather than matching on the message.
|
|
22
|
-
*/
|
|
23
|
-
code = 'storage_open_timeout';
|
|
24
|
-
constructor(dbName, reason, message) {
|
|
25
|
-
super(message);
|
|
26
|
-
this.dbName = dbName;
|
|
27
|
-
this.reason = reason;
|
|
28
|
-
this.name = 'IDBOpenTimeoutError';
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Returns true when a caught value is the storage-open-timeout failure. It
|
|
33
|
-
* detects the failure by its stable `code`, so it still matches after the error
|
|
34
|
-
* has been wrapped into an {@link AbloError} or another error type.
|
|
35
|
-
*/
|
|
36
|
-
export function isStorageOpenTimeout(err) {
|
|
37
|
-
return (typeof err === 'object' &&
|
|
38
|
-
err !== null &&
|
|
39
|
-
err.code === 'storage_open_timeout');
|
|
40
|
-
}
|
|
41
|
-
export function openIDBWithTimeout(name, version, options = {}) {
|
|
42
|
-
const timeoutMs = options.timeoutMs ?? 10_000;
|
|
43
|
-
return new Promise((resolve, reject) => {
|
|
44
|
-
const request = version === undefined
|
|
45
|
-
? indexedDB.open(name)
|
|
46
|
-
: indexedDB.open(name, version);
|
|
47
|
-
let settled = false;
|
|
48
|
-
const settle = (fn) => {
|
|
49
|
-
if (settled)
|
|
50
|
-
return;
|
|
51
|
-
settled = true;
|
|
52
|
-
clearTimeout(timer);
|
|
53
|
-
fn();
|
|
54
|
-
};
|
|
55
|
-
if (options.onUpgrade) {
|
|
56
|
-
request.onupgradeneeded = (event) => {
|
|
57
|
-
options.onUpgrade(request, event);
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
request.onsuccess = () => {
|
|
61
|
-
// If we already timed out or were blocked and rejected, this is a late
|
|
62
|
-
// success: the native open eventually completed after we gave up. The
|
|
63
|
-
// resulting connection is orphaned — nothing up the stack holds it, so
|
|
64
|
-
// nothing will close it. A leaked open connection holds an IndexedDB lock
|
|
65
|
-
// that wedges every later open or delete of this database name, so close
|
|
66
|
-
// it here to keep a timed-out attempt from poisoning the store.
|
|
67
|
-
if (settled) {
|
|
68
|
-
try {
|
|
69
|
-
request.result.close();
|
|
70
|
-
}
|
|
71
|
-
catch {
|
|
72
|
-
// Best-effort — a half-open connection may already be unusable.
|
|
73
|
-
}
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
const db = request.result;
|
|
77
|
-
// Required resilience handler per the IndexedDB specification: close this
|
|
78
|
-
// connection as soon as any other context wants to upgrade or delete the
|
|
79
|
-
// database. Without it, a connection that ignores `versionchange` blocks
|
|
80
|
-
// the other context's request indefinitely — a common cause of a database
|
|
81
|
-
// that stays wedged across reloads. Closing here makes the store release
|
|
82
|
-
// itself.
|
|
83
|
-
db.onversionchange = () => {
|
|
84
|
-
try {
|
|
85
|
-
db.close();
|
|
86
|
-
}
|
|
87
|
-
catch {
|
|
88
|
-
// Already closing/closed — nothing to do.
|
|
89
|
-
}
|
|
90
|
-
try {
|
|
91
|
-
options.onVersionChange?.();
|
|
92
|
-
}
|
|
93
|
-
catch {
|
|
94
|
-
// A consumer reaction must never break the close.
|
|
95
|
-
}
|
|
96
|
-
};
|
|
97
|
-
settle(() => { resolve(db); });
|
|
98
|
-
};
|
|
99
|
-
request.onerror = () => { settle(() => { reject(request.error); }); };
|
|
100
|
-
// The critical handler: another tab is blocking us. Native API leaves
|
|
101
|
-
// the request pending indefinitely; we fail fast with a clear error so
|
|
102
|
-
// the UI can tell the user to close other tabs.
|
|
103
|
-
request.onblocked = () => {
|
|
104
|
-
settle(() => {
|
|
105
|
-
reject(new IDBOpenTimeoutError(name, 'blocked', `IndexedDB \"${name}\" open blocked — another tab is holding an ` +
|
|
106
|
-
`older version. Close other Ablo tabs and reload.`));
|
|
107
|
-
});
|
|
108
|
-
};
|
|
109
|
-
// Catch-all timeout: even without `onblocked`, some browsers in some
|
|
110
|
-
// storage states hang without firing any event. Bounded wait →
|
|
111
|
-
// deterministic error.
|
|
112
|
-
const timer = setTimeout(() => {
|
|
113
|
-
settle(() => {
|
|
114
|
-
reject(new IDBOpenTimeoutError(name, 'timeout', `IndexedDB \"${name}\" open did not resolve within ${timeoutMs}ms. ` +
|
|
115
|
-
`Storage may be in a bad state — clearing site data and reloading ` +
|
|
116
|
-
`usually fixes this.`));
|
|
117
|
-
});
|
|
118
|
-
}, timeoutMs);
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* Deletes an IndexedDB database within a bounded time — the delete counterpart
|
|
123
|
-
* to {@link openIDBWithTimeout}. It is used to recover from a wedged backing
|
|
124
|
-
* store: when opening a database times out, the caller can delete it and start
|
|
125
|
-
* fresh, which is safe for any database whose contents can be rebuilt on the
|
|
126
|
-
* next load.
|
|
127
|
-
*
|
|
128
|
-
* Like an open request, a native delete can hang indefinitely — it fires a
|
|
129
|
-
* blocked event and waits when another connection still holds the database, and
|
|
130
|
-
* on a truly stuck store it fires no event at all. Both cases become a bounded,
|
|
131
|
-
* resolved result here, so the caller never spins.
|
|
132
|
-
*
|
|
133
|
-
* Resolves to `true` on a clean delete and `false` when the delete was blocked
|
|
134
|
-
* or timed out. Either way the caller can decide whether to retry the open; a
|
|
135
|
-
* delete that did nothing leaves the store no worse off.
|
|
136
|
-
*/
|
|
137
|
-
export function deleteIDBWithTimeout(name, timeoutMs = 5_000) {
|
|
138
|
-
return new Promise((resolve) => {
|
|
139
|
-
let settled = false;
|
|
140
|
-
const settle = (value) => {
|
|
141
|
-
if (settled)
|
|
142
|
-
return;
|
|
143
|
-
settled = true;
|
|
144
|
-
clearTimeout(timer);
|
|
145
|
-
resolve(value);
|
|
146
|
-
};
|
|
147
|
-
const request = indexedDB.deleteDatabase(name);
|
|
148
|
-
request.onsuccess = () => { settle(true); };
|
|
149
|
-
request.onerror = () => { settle(false); };
|
|
150
|
-
request.onblocked = () => { settle(false); };
|
|
151
|
-
const timer = setTimeout(() => { settle(false); }, timeoutMs);
|
|
152
|
-
});
|
|
153
|
-
}
|