@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,105 +0,0 @@
|
|
|
1
|
-
/**
|
|
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.
|
|
7
|
-
*/
|
|
8
|
-
export interface DatabaseInfo {
|
|
9
|
-
name: string;
|
|
10
|
-
userId: string;
|
|
11
|
-
workspaceId: string;
|
|
12
|
-
schemaHash: string;
|
|
13
|
-
schemaVersion: number;
|
|
14
|
-
userVersion?: number;
|
|
15
|
-
createdAt: Date;
|
|
16
|
-
updatedAt: Date;
|
|
17
|
-
}
|
|
18
|
-
export interface WorkspaceMetadata {
|
|
19
|
-
lastSyncId: number;
|
|
20
|
-
firstSyncId: number;
|
|
21
|
-
backendDatabaseVersion: number;
|
|
22
|
-
subscribedSyncGroups: string[];
|
|
23
|
-
updatedAt: Date;
|
|
24
|
-
schemaHash?: string;
|
|
25
|
-
syncGroups?: string[];
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* DatabaseManager - Manages Ablo's two-tier database architecture
|
|
29
|
-
*
|
|
30
|
-
* Key responsibilities:
|
|
31
|
-
* - Manages ablo_databases (database registry)
|
|
32
|
-
* - Creates workspace-specific databases (ablo_hash)
|
|
33
|
-
* - Handles database migration and versioning
|
|
34
|
-
* - Provides database info and metadata management
|
|
35
|
-
*/
|
|
36
|
-
export declare class DatabaseManager {
|
|
37
|
-
private metaDb;
|
|
38
|
-
private readonly metaDbName;
|
|
39
|
-
constructor();
|
|
40
|
-
/**
|
|
41
|
-
* Initialize the meta database (ablo_databases)
|
|
42
|
-
*/
|
|
43
|
-
initializeMetaDatabase(): Promise<void>;
|
|
44
|
-
/**
|
|
45
|
-
* Calculate database info for a user/workspace combination
|
|
46
|
-
*/
|
|
47
|
-
calculateDatabaseInfo(userId: string, workspaceId: string, userVersion?: number): Promise<DatabaseInfo>;
|
|
48
|
-
/**
|
|
49
|
-
* Generate deterministic database name
|
|
50
|
-
*/
|
|
51
|
-
private generateDatabaseName;
|
|
52
|
-
/**
|
|
53
|
-
* Register database info in ablo_databases
|
|
54
|
-
*/
|
|
55
|
-
registerDatabase(info: DatabaseInfo): Promise<void>;
|
|
56
|
-
/**
|
|
57
|
-
* Get database info by name
|
|
58
|
-
*/
|
|
59
|
-
getDatabaseInfo(name: string): Promise<DatabaseInfo | null>;
|
|
60
|
-
/**
|
|
61
|
-
* Get all databases for a user
|
|
62
|
-
*/
|
|
63
|
-
getDatabasesForUser(userId: string): Promise<DatabaseInfo[]>;
|
|
64
|
-
/**
|
|
65
|
-
* Open workspace-specific database
|
|
66
|
-
*/
|
|
67
|
-
openWorkspaceDatabase(dbInfo: DatabaseInfo, createStoresFn?: (db: IDBDatabase, tx: IDBTransaction) => Promise<void>): Promise<IDBDatabase>;
|
|
68
|
-
/**
|
|
69
|
-
* Read workspace metadata from __meta table
|
|
70
|
-
*/
|
|
71
|
-
getWorkspaceMetadata(db: IDBDatabase): Promise<WorkspaceMetadata | null>;
|
|
72
|
-
/**
|
|
73
|
-
* Write workspace metadata to __meta table
|
|
74
|
-
*/
|
|
75
|
-
setWorkspaceMetadata(db: IDBDatabase, metadata: WorkspaceMetadata): Promise<void>;
|
|
76
|
-
/**
|
|
77
|
-
* Check if a model is persisted (all instances loaded)
|
|
78
|
-
*/
|
|
79
|
-
isModelPersisted(db: IDBDatabase, modelName: string): Promise<boolean>;
|
|
80
|
-
/**
|
|
81
|
-
* Mark a model as persisted
|
|
82
|
-
*/
|
|
83
|
-
setModelPersisted(db: IDBDatabase, modelName: string, persisted: boolean): Promise<void>;
|
|
84
|
-
/**
|
|
85
|
-
* Get all model persistence states
|
|
86
|
-
*/
|
|
87
|
-
getAllModelPersistenceStates(db: IDBDatabase): Promise<Record<string, boolean>>;
|
|
88
|
-
/**
|
|
89
|
-
* Delete a workspace database
|
|
90
|
-
*/
|
|
91
|
-
deleteWorkspaceDatabase(dbInfo: DatabaseInfo): Promise<void>;
|
|
92
|
-
/**
|
|
93
|
-
* Get comprehensive database statistics
|
|
94
|
-
*/
|
|
95
|
-
getDatabaseStatistics(): Promise<{
|
|
96
|
-
metaDatabaseSize: number;
|
|
97
|
-
totalWorkspaceDatabases: number;
|
|
98
|
-
databasesByUser: Record<string, number>;
|
|
99
|
-
schemaVersions: Record<string, number>;
|
|
100
|
-
}>;
|
|
101
|
-
/**
|
|
102
|
-
* Close all database connections
|
|
103
|
-
*/
|
|
104
|
-
close(): Promise<void>;
|
|
105
|
-
}
|
|
@@ -1,387 +0,0 @@
|
|
|
1
|
-
/**
|
|
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.
|
|
7
|
-
*/
|
|
8
|
-
import { getContext } from '../context.js';
|
|
9
|
-
import { openIDBWithTimeout, deleteIDBWithTimeout, IDBOpenTimeoutError, } from './openIDBWithTimeout.js';
|
|
10
|
-
import { AbloConnectionError } from '../transaction/errors.js';
|
|
11
|
-
import { getActiveRegistry, hasActiveRegistry } from '../ModelRegistry.js';
|
|
12
|
-
/**
|
|
13
|
-
* DatabaseManager - Manages Ablo's two-tier database architecture
|
|
14
|
-
*
|
|
15
|
-
* Key responsibilities:
|
|
16
|
-
* - Manages ablo_databases (database registry)
|
|
17
|
-
* - Creates workspace-specific databases (ablo_hash)
|
|
18
|
-
* - Handles database migration and versioning
|
|
19
|
-
* - Provides database info and metadata management
|
|
20
|
-
*/
|
|
21
|
-
export class DatabaseManager {
|
|
22
|
-
metaDb = null;
|
|
23
|
-
metaDbName = 'ablo_databases';
|
|
24
|
-
constructor() {
|
|
25
|
-
// Singleton-like behavior
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Initialize the meta database (ablo_databases)
|
|
29
|
-
*/
|
|
30
|
-
async initializeMetaDatabase() {
|
|
31
|
-
const open = () => openIDBWithTimeout(this.metaDbName, 1, {
|
|
32
|
-
onUpgrade: (request) => {
|
|
33
|
-
const db = request.result;
|
|
34
|
-
if (!db.objectStoreNames.contains('databases')) {
|
|
35
|
-
const store = db.createObjectStore('databases', { keyPath: 'name' });
|
|
36
|
-
store.createIndex('userId', 'userId');
|
|
37
|
-
store.createIndex('workspaceId', 'workspaceId');
|
|
38
|
-
store.createIndex('schemaHash', 'schemaHash');
|
|
39
|
-
store.createIndex('updatedAt', 'updatedAt');
|
|
40
|
-
}
|
|
41
|
-
},
|
|
42
|
-
});
|
|
43
|
-
try {
|
|
44
|
-
this.metaDb = await open();
|
|
45
|
-
}
|
|
46
|
-
catch (error) {
|
|
47
|
-
// Self-heal a wedged meta DB. When `ablo_databases`'s backing store gets
|
|
48
|
-
// stuck (a corrupted store, or a leaked connection from a prior
|
|
49
|
-
// timed-out open), every open of that name hangs with no event and the
|
|
50
|
-
// app is permanently bricked until the user manually clears site data —
|
|
51
|
-
// the "open did not resolve within 10000ms" dead end. The registry this
|
|
52
|
-
// DB holds is rebuildable from the server on the next bootstrap, so it is
|
|
53
|
-
// safe to delete and re-create. Try exactly once: delete, then re-open.
|
|
54
|
-
if (!(error instanceof IDBOpenTimeoutError))
|
|
55
|
-
throw error;
|
|
56
|
-
getContext().logger.debug('[sync-engine] meta DB open timed out — attempting self-heal (delete + retry)', { db: this.metaDbName, reason: error.reason });
|
|
57
|
-
getContext().observability.captureBootstrapFailure(error, {
|
|
58
|
-
type: 'meta-db-open-timeout',
|
|
59
|
-
});
|
|
60
|
-
const deleted = await deleteIDBWithTimeout(this.metaDbName);
|
|
61
|
-
if (!deleted) {
|
|
62
|
-
// The delete itself was blocked/stuck — a live connection in another
|
|
63
|
-
// window or a deadlocked backing store. We cannot recover in-page;
|
|
64
|
-
// rethrow so the provider surfaces the real (now actionable) error.
|
|
65
|
-
throw error;
|
|
66
|
-
}
|
|
67
|
-
// Fresh store — this open creates `ablo_databases` from scratch.
|
|
68
|
-
this.metaDb = await open();
|
|
69
|
-
getContext().logger.info('[sync-engine] meta DB self-heal succeeded');
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Calculate database info for a user/workspace combination
|
|
74
|
-
*/
|
|
75
|
-
async calculateDatabaseInfo(userId, workspaceId, userVersion = 1) {
|
|
76
|
-
// Get schema hash from the active ModelRegistry
|
|
77
|
-
const schemaHash = hasActiveRegistry()
|
|
78
|
-
? getActiveRegistry().getSchemaHash()
|
|
79
|
-
: 'no-registry-hash';
|
|
80
|
-
// Generate database name from userId, workspaceId, and versions
|
|
81
|
-
const dbName = this.generateDatabaseName(userId, workspaceId, userVersion);
|
|
82
|
-
// Check if we need to increment schema version
|
|
83
|
-
const existingInfo = await this.getDatabaseInfo(dbName);
|
|
84
|
-
let schemaVersion = 1;
|
|
85
|
-
if (existingInfo && existingInfo.schemaHash !== schemaHash) {
|
|
86
|
-
schemaVersion = (existingInfo.schemaVersion || 1) + 1;
|
|
87
|
-
}
|
|
88
|
-
else if (existingInfo) {
|
|
89
|
-
schemaVersion = existingInfo.schemaVersion || 1;
|
|
90
|
-
}
|
|
91
|
-
// Record the existing databases for this user so duplicates can be detected.
|
|
92
|
-
const allUserDatabases = await this.getDatabasesForUser(userId);
|
|
93
|
-
const allIndexedDBs = (await indexedDB.databases?.()) || [];
|
|
94
|
-
const abloDatabases = allIndexedDBs.filter((db) => db.name?.startsWith('ablo_'));
|
|
95
|
-
getContext().observability.breadcrumb('Database info calculated', 'sync.database', 'info', {
|
|
96
|
-
dbName,
|
|
97
|
-
schemaVersion,
|
|
98
|
-
existingDbCount: allUserDatabases.length,
|
|
99
|
-
abloDbCount: abloDatabases.length,
|
|
100
|
-
});
|
|
101
|
-
return {
|
|
102
|
-
name: dbName,
|
|
103
|
-
userId,
|
|
104
|
-
workspaceId,
|
|
105
|
-
schemaHash,
|
|
106
|
-
schemaVersion,
|
|
107
|
-
userVersion,
|
|
108
|
-
createdAt: existingInfo?.createdAt ?? new Date(),
|
|
109
|
-
updatedAt: new Date(),
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Generate deterministic database name
|
|
114
|
-
*/
|
|
115
|
-
generateDatabaseName(userId, workspaceId, userVersion = 1) {
|
|
116
|
-
// Combine userId, workspaceId, and userVersion for unique database
|
|
117
|
-
const combined = `${userId}:${workspaceId}:${userVersion}`;
|
|
118
|
-
// Hash the combined key into a compact, deterministic identifier.
|
|
119
|
-
let hash = 0;
|
|
120
|
-
for (let i = 0; i < combined.length; i++) {
|
|
121
|
-
hash = (hash << 5) - hash + combined.charCodeAt(i);
|
|
122
|
-
hash = hash & hash; // Convert to 32bit integer
|
|
123
|
-
}
|
|
124
|
-
// Convert to hex and create Ablo-style name
|
|
125
|
-
const hexHash = Math.abs(hash).toString(16).padStart(8, '0');
|
|
126
|
-
return `ablo_${hexHash}`;
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* Register database info in ablo_databases
|
|
130
|
-
*/
|
|
131
|
-
async registerDatabase(info) {
|
|
132
|
-
if (!this.metaDb) {
|
|
133
|
-
throw new AbloConnectionError('Meta database not initialized', {
|
|
134
|
-
code: 'meta_db_not_initialized',
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
return new Promise((resolve, reject) => {
|
|
138
|
-
const tx = this.metaDb.transaction(['databases'], 'readwrite');
|
|
139
|
-
const store = tx.objectStore('databases');
|
|
140
|
-
const request = store.put(info);
|
|
141
|
-
tx.oncomplete = () => {
|
|
142
|
-
resolve();
|
|
143
|
-
};
|
|
144
|
-
tx.onerror = () => { reject(tx.error); };
|
|
145
|
-
request.onerror = () => { reject(request.error); };
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Get database info by name
|
|
150
|
-
*/
|
|
151
|
-
async getDatabaseInfo(name) {
|
|
152
|
-
if (!this.metaDb)
|
|
153
|
-
return null;
|
|
154
|
-
return new Promise((resolve, reject) => {
|
|
155
|
-
const tx = this.metaDb.transaction(['databases'], 'readonly');
|
|
156
|
-
const store = tx.objectStore('databases');
|
|
157
|
-
const request = store.get(name);
|
|
158
|
-
request.onsuccess = () => { resolve(request.result ?? null); };
|
|
159
|
-
request.onerror = () => { reject(request.error); };
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* Get all databases for a user
|
|
164
|
-
*/
|
|
165
|
-
async getDatabasesForUser(userId) {
|
|
166
|
-
if (!this.metaDb)
|
|
167
|
-
return [];
|
|
168
|
-
return new Promise((resolve, reject) => {
|
|
169
|
-
const tx = this.metaDb.transaction(['databases'], 'readonly');
|
|
170
|
-
const store = tx.objectStore('databases');
|
|
171
|
-
const index = store.index('userId');
|
|
172
|
-
const request = index.getAll(userId);
|
|
173
|
-
request.onsuccess = () => { resolve(request.result || []); };
|
|
174
|
-
request.onerror = () => { reject(request.error); };
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* Open workspace-specific database
|
|
179
|
-
*/
|
|
180
|
-
async openWorkspaceDatabase(dbInfo, createStoresFn) {
|
|
181
|
-
try {
|
|
182
|
-
return await openIDBWithTimeout(dbInfo.name, dbInfo.schemaVersion, {
|
|
183
|
-
onUpgrade: (request, event) => {
|
|
184
|
-
const db = request.result;
|
|
185
|
-
const tx = event.target.transaction;
|
|
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.
|
|
192
|
-
if (createStoresFn && tx) {
|
|
193
|
-
try {
|
|
194
|
-
void createStoresFn(db, tx).catch((err) => {
|
|
195
|
-
getContext().observability.captureBootstrapFailure(err, {
|
|
196
|
-
type: 'store-creation',
|
|
197
|
-
});
|
|
198
|
-
});
|
|
199
|
-
}
|
|
200
|
-
catch (err) {
|
|
201
|
-
getContext().observability.captureBootstrapFailure(err, {
|
|
202
|
-
type: 'store-creation',
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
},
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
catch (error) {
|
|
210
|
-
getContext().observability.captureBootstrapFailure(error, {
|
|
211
|
-
type: 'database-open',
|
|
212
|
-
});
|
|
213
|
-
throw error;
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
/**
|
|
217
|
-
* Read workspace metadata from __meta table
|
|
218
|
-
*/
|
|
219
|
-
async getWorkspaceMetadata(db) {
|
|
220
|
-
return new Promise((resolve, reject) => {
|
|
221
|
-
const tx = db.transaction(['__meta'], 'readonly');
|
|
222
|
-
const store = tx.objectStore('__meta');
|
|
223
|
-
const request = store.get('metadata');
|
|
224
|
-
request.onsuccess = () => {
|
|
225
|
-
const data = request.result;
|
|
226
|
-
if (!data) {
|
|
227
|
-
resolve(null);
|
|
228
|
-
return;
|
|
229
|
-
}
|
|
230
|
-
const meta = {
|
|
231
|
-
lastSyncId: data.lastSyncId ?? 0,
|
|
232
|
-
firstSyncId: data.firstSyncId ?? 0,
|
|
233
|
-
backendDatabaseVersion: data.backendDatabaseVersion ?? 1,
|
|
234
|
-
subscribedSyncGroups: data.subscribedSyncGroups ?? [],
|
|
235
|
-
updatedAt: data.updatedAt ? new Date(data.updatedAt) : new Date(),
|
|
236
|
-
schemaHash: data.schemaHash,
|
|
237
|
-
syncGroups: data.syncGroups,
|
|
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.
|
|
240
|
-
};
|
|
241
|
-
resolve(meta);
|
|
242
|
-
};
|
|
243
|
-
request.onerror = () => { reject(request.error); };
|
|
244
|
-
});
|
|
245
|
-
}
|
|
246
|
-
/**
|
|
247
|
-
* Write workspace metadata to __meta table
|
|
248
|
-
*/
|
|
249
|
-
async setWorkspaceMetadata(db, metadata) {
|
|
250
|
-
return new Promise((resolve, reject) => {
|
|
251
|
-
const tx = db.transaction(['__meta'], 'readwrite');
|
|
252
|
-
const store = tx.objectStore('__meta');
|
|
253
|
-
const request = store.put(metadata, 'metadata');
|
|
254
|
-
tx.oncomplete = () => { resolve(); };
|
|
255
|
-
tx.onerror = () => { reject(tx.error); };
|
|
256
|
-
request.onerror = () => { reject(request.error); };
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
|
-
/**
|
|
260
|
-
* Check if a model is persisted (all instances loaded)
|
|
261
|
-
*/
|
|
262
|
-
async isModelPersisted(db, modelName) {
|
|
263
|
-
return new Promise((resolve, reject) => {
|
|
264
|
-
const tx = db.transaction(['__meta'], 'readonly');
|
|
265
|
-
const store = tx.objectStore('__meta');
|
|
266
|
-
const request = store.get(modelName);
|
|
267
|
-
request.onsuccess = () => {
|
|
268
|
-
const data = request.result;
|
|
269
|
-
resolve(data?.persisted === true);
|
|
270
|
-
};
|
|
271
|
-
request.onerror = () => { reject(request.error); };
|
|
272
|
-
});
|
|
273
|
-
}
|
|
274
|
-
/**
|
|
275
|
-
* Mark a model as persisted
|
|
276
|
-
*/
|
|
277
|
-
async setModelPersisted(db, modelName, persisted) {
|
|
278
|
-
return new Promise((resolve, reject) => {
|
|
279
|
-
const tx = db.transaction(['__meta'], 'readwrite');
|
|
280
|
-
const store = tx.objectStore('__meta');
|
|
281
|
-
const persistenceData = {
|
|
282
|
-
persisted,
|
|
283
|
-
modelName,
|
|
284
|
-
timestamp: Date.now(),
|
|
285
|
-
updatedAt: new Date().toISOString(),
|
|
286
|
-
};
|
|
287
|
-
const request = store.put(persistenceData, modelName);
|
|
288
|
-
tx.oncomplete = () => { resolve(); };
|
|
289
|
-
tx.onerror = () => { reject(tx.error); };
|
|
290
|
-
request.onerror = () => { reject(request.error); };
|
|
291
|
-
});
|
|
292
|
-
}
|
|
293
|
-
/**
|
|
294
|
-
* Get all model persistence states
|
|
295
|
-
*/
|
|
296
|
-
async getAllModelPersistenceStates(db) {
|
|
297
|
-
return new Promise((resolve, reject) => {
|
|
298
|
-
const tx = db.transaction(['__meta'], 'readonly');
|
|
299
|
-
const store = tx.objectStore('__meta');
|
|
300
|
-
const request = store.getAll();
|
|
301
|
-
request.onsuccess = () => {
|
|
302
|
-
const states = {};
|
|
303
|
-
for (const item of request.result) {
|
|
304
|
-
// Skip metadata entry
|
|
305
|
-
if (item.key === 'metadata')
|
|
306
|
-
continue;
|
|
307
|
-
if (item.modelName) {
|
|
308
|
-
states[item.modelName] = item.persisted === true;
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
resolve(states);
|
|
312
|
-
};
|
|
313
|
-
request.onerror = () => { reject(request.error); };
|
|
314
|
-
});
|
|
315
|
-
}
|
|
316
|
-
/**
|
|
317
|
-
* Delete a workspace database
|
|
318
|
-
*/
|
|
319
|
-
async deleteWorkspaceDatabase(dbInfo) {
|
|
320
|
-
return new Promise((resolve, reject) => {
|
|
321
|
-
const deleteRequest = indexedDB.deleteDatabase(dbInfo.name);
|
|
322
|
-
deleteRequest.onsuccess = async () => {
|
|
323
|
-
// Remove from registry
|
|
324
|
-
if (this.metaDb) {
|
|
325
|
-
const tx = this.metaDb.transaction(['databases'], 'readwrite');
|
|
326
|
-
const store = tx.objectStore('databases');
|
|
327
|
-
store.delete(dbInfo.name);
|
|
328
|
-
}
|
|
329
|
-
resolve();
|
|
330
|
-
};
|
|
331
|
-
deleteRequest.onerror = () => {
|
|
332
|
-
getContext().observability.breadcrumb(`Failed to delete workspace database: ${dbInfo.name}`, 'sync.database', 'error');
|
|
333
|
-
reject(deleteRequest.error);
|
|
334
|
-
};
|
|
335
|
-
deleteRequest.onblocked = () => {
|
|
336
|
-
getContext().observability.breadcrumb(`Database deletion blocked: ${dbInfo.name}`, 'sync.database', 'warning');
|
|
337
|
-
// Could implement retry logic or user notification
|
|
338
|
-
};
|
|
339
|
-
});
|
|
340
|
-
}
|
|
341
|
-
/**
|
|
342
|
-
* Get comprehensive database statistics
|
|
343
|
-
*/
|
|
344
|
-
async getDatabaseStatistics() {
|
|
345
|
-
if (!this.metaDb) {
|
|
346
|
-
return {
|
|
347
|
-
metaDatabaseSize: 0,
|
|
348
|
-
totalWorkspaceDatabases: 0,
|
|
349
|
-
databasesByUser: {},
|
|
350
|
-
schemaVersions: {},
|
|
351
|
-
};
|
|
352
|
-
}
|
|
353
|
-
return new Promise((resolve, reject) => {
|
|
354
|
-
const tx = this.metaDb.transaction(['databases'], 'readonly');
|
|
355
|
-
const store = tx.objectStore('databases');
|
|
356
|
-
const request = store.getAll();
|
|
357
|
-
request.onsuccess = () => {
|
|
358
|
-
const databases = request.result;
|
|
359
|
-
const databasesByUser = {};
|
|
360
|
-
const schemaVersions = {};
|
|
361
|
-
for (const db of databases) {
|
|
362
|
-
// Count by user
|
|
363
|
-
databasesByUser[db.userId] = (databasesByUser[db.userId] ?? 0) + 1;
|
|
364
|
-
// Count schema versions
|
|
365
|
-
const versionKey = `v${db.schemaVersion}`;
|
|
366
|
-
schemaVersions[versionKey] = (schemaVersions[versionKey] ?? 0) + 1;
|
|
367
|
-
}
|
|
368
|
-
resolve({
|
|
369
|
-
metaDatabaseSize: databases.length,
|
|
370
|
-
totalWorkspaceDatabases: databases.length,
|
|
371
|
-
databasesByUser,
|
|
372
|
-
schemaVersions,
|
|
373
|
-
});
|
|
374
|
-
};
|
|
375
|
-
request.onerror = () => { reject(request.error); };
|
|
376
|
-
});
|
|
377
|
-
}
|
|
378
|
-
/**
|
|
379
|
-
* Close all database connections
|
|
380
|
-
*/
|
|
381
|
-
async close() {
|
|
382
|
-
if (this.metaDb) {
|
|
383
|
-
this.metaDb.close();
|
|
384
|
-
this.metaDb = null;
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
/**
|
|
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.
|
|
8
|
-
*/
|
|
9
|
-
import type { Model } from '../Model.js';
|
|
10
|
-
import type { ModelScope } from '../InstanceCache.js';
|
|
11
|
-
export interface QueryOptions<T extends Model> {
|
|
12
|
-
predicate?: (model: T) => boolean;
|
|
13
|
-
/** Stable key to distinguish different predicates for the same model type.
|
|
14
|
-
* Required when multiple predicate queries exist for the same model — without this,
|
|
15
|
-
* they share a cache key and thrash each other's cached result every render. */
|
|
16
|
-
predicateKey?: string;
|
|
17
|
-
scope?: ModelScope;
|
|
18
|
-
orderBy?: keyof T;
|
|
19
|
-
order?: 'asc' | 'desc';
|
|
20
|
-
limit?: number;
|
|
21
|
-
offset?: number;
|
|
22
|
-
skipCache?: boolean;
|
|
23
|
-
}
|
|
24
|
-
export interface QueryResult<T extends Model> {
|
|
25
|
-
data: T[];
|
|
26
|
-
total: number;
|
|
27
|
-
hasMore: boolean;
|
|
28
|
-
fromCache?: boolean;
|
|
29
|
-
}
|
|
30
|
-
export declare class QueryProcessor {
|
|
31
|
-
private cache;
|
|
32
|
-
private enableCache;
|
|
33
|
-
private predicateResultCache;
|
|
34
|
-
constructor(config?: {
|
|
35
|
-
enableCache?: boolean;
|
|
36
|
-
});
|
|
37
|
-
/**
|
|
38
|
-
* Process query with filtering, sorting, and pagination
|
|
39
|
-
*/
|
|
40
|
-
processQuery<T extends Model>(models: T[], modelName: string, options?: QueryOptions<T>): QueryResult<T>;
|
|
41
|
-
/**
|
|
42
|
-
* Sort models by field
|
|
43
|
-
*/
|
|
44
|
-
private sortModels;
|
|
45
|
-
/**
|
|
46
|
-
* Find first matching model with predicate
|
|
47
|
-
*/
|
|
48
|
-
findFirst<T extends Model>(models: Generator<T, void, unknown>, predicate: (model: T) => boolean): T | undefined;
|
|
49
|
-
/**
|
|
50
|
-
* Count models with optional predicate
|
|
51
|
-
*/
|
|
52
|
-
countModels<T extends Model>(models: Generator<T, void, unknown>, predicate?: (model: T) => boolean): number;
|
|
53
|
-
/**
|
|
54
|
-
* Generate a deterministic cache key from query parameters.
|
|
55
|
-
* Functions (predicates) are excluded from the key — predicate queries use
|
|
56
|
-
* the structural identity cache (predicateResultCache) instead of the
|
|
57
|
-
* string-based cache.
|
|
58
|
-
*/
|
|
59
|
-
private generateCacheKey;
|
|
60
|
-
/**
|
|
61
|
-
* Invalidate cache by pattern
|
|
62
|
-
*/
|
|
63
|
-
invalidateCache(pattern?: string): void;
|
|
64
|
-
/**
|
|
65
|
-
* Clear all cache
|
|
66
|
-
*/
|
|
67
|
-
clearCache(): void;
|
|
68
|
-
/**
|
|
69
|
-
* Get cache stats for debugging
|
|
70
|
-
*/
|
|
71
|
-
getCacheStats(): {
|
|
72
|
-
size: number;
|
|
73
|
-
enabled: boolean;
|
|
74
|
-
};
|
|
75
|
-
}
|