@abloatai/ablo 0.36.0 → 0.37.1
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 +55 -2014
- package/NOTICE +2 -2
- package/README.md +45 -63
- 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 -114
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -163
- 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 +1 -1
- package/docs/api-keys.md +7 -6
- package/docs/api.md +10 -10
- package/docs/client-behavior.md +5 -5
- package/docs/coordination.md +52 -62
- package/docs/data-sources.md +1 -1
- 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/server-agent.md +2 -2
- package/docs/how-it-works.md +4 -4
- package/docs/identity.md +2 -1
- package/docs/integration-guide.md +24 -13
- 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 +2 -2
- package/docs/migration.md +3 -3
- package/docs/quickstart.md +2 -2
- package/docs/react.md +5 -5
- package/docs/schema-contract.md +3 -3
- package/docs/sessions.md +91 -37
- 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 +8 -8
- package/package.json +63 -166
- package/bin/ablo.cjs +0 -39
- package/dist/BaseSyncedStore.d.ts +0 -843
- package/dist/BaseSyncedStore.js +0 -1971
- package/dist/Database.d.ts +0 -323
- package/dist/Database.js +0 -1502
- package/dist/InstanceCache.d.ts +0 -237
- package/dist/InstanceCache.js +0 -1166
- package/dist/LazyReferenceCollection.d.ts +0 -177
- package/dist/LazyReferenceCollection.js +0 -461
- package/dist/Model.d.ts +0 -454
- package/dist/Model.js +0 -919
- package/dist/ModelRegistry.d.ts +0 -225
- package/dist/ModelRegistry.js +0 -539
- package/dist/NetworkMonitor.d.ts +0 -28
- package/dist/NetworkMonitor.js +0 -79
- package/dist/RuntimeContext.d.ts +0 -52
- package/dist/RuntimeContext.js +0 -80
- package/dist/SyncClient.d.ts +0 -541
- package/dist/SyncClient.js +0 -2202
- 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/client/Ablo.d.ts +0 -231
- package/dist/client/Ablo.js +0 -160
- 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 -50
- package/dist/client/createInternalComponents.js +0 -98
- package/dist/client/createModelProxy.d.ts +0 -248
- package/dist/client/createModelProxy.js +0 -884
- package/dist/client/humans.d.ts +0 -69
- package/dist/client/humans.js +0 -78
- 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 -53
- package/dist/client/reactiveEngine.js +0 -688
- 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/storeCluster.d.ts +0 -47
- package/dist/client/storeCluster.js +0 -118
- package/dist/client/storeLifecycle.d.ts +0 -61
- package/dist/client/storeLifecycle.js +0 -231
- 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 -42
- package/dist/context.js +0 -81
- 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/index.d.ts +0 -33
- package/dist/core/index.js +0 -48
- package/dist/docs/catalog.d.ts +0 -72
- package/dist/docs/catalog.js +0 -230
- 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/QueryProcessor.d.ts +0 -75
- package/dist/query/QueryProcessor.js +0 -255
- package/dist/query/client.d.ts +0 -64
- package/dist/query/client.js +0 -138
- package/dist/query/types.d.ts +0 -85
- package/dist/query/types.js +0 -16
- package/dist/react/AbloProvider.d.ts +0 -242
- package/dist/react/AbloProvider.js +0 -458
- 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/createAbloReact.d.ts +0 -56
- package/dist/react/createAbloReact.js +0 -51
- package/dist/react/index.d.ts +0 -62
- package/dist/react/index.js +0 -69
- package/dist/react/internalContext.d.ts +0 -33
- package/dist/react/internalContext.js +0 -3
- package/dist/react/useAblo.d.ts +0 -82
- package/dist/react/useAblo.js +0 -120
- 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 -133
- 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 -42
- package/dist/schema/index.js +0 -80
- 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 -90
- package/dist/schema/serialize.d.ts +0 -115
- package/dist/schema/serialize.js +0 -265
- 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 -83
- package/dist/source/adapter.js +0 -24
- 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/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/storeContract.d.ts +0 -145
- package/dist/storeContract.js +0 -12
- package/dist/stores/DatabaseManager.d.ts +0 -107
- package/dist/stores/DatabaseManager.js +0 -388
- 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/StoreManager.d.ts +0 -114
- package/dist/stores/StoreManager.js +0 -304
- package/dist/stores/SyncActionStore.d.ts +0 -99
- package/dist/stores/SyncActionStore.js +0 -506
- package/dist/stores/openIDBWithTimeout.d.ts +0 -65
- package/dist/stores/openIDBWithTimeout.js +0 -153
- 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 -284
- package/dist/sync/BootstrapFetcher.js +0 -964
- package/dist/sync/ConnectionManager.d.ts +0 -8
- package/dist/sync/ConnectionManager.js +0 -8
- package/dist/sync/OnDemandLoader.d.ts +0 -231
- package/dist/sync/OnDemandLoader.js +0 -743
- 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 -73
- 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 -114
- package/dist/sync/deltaPipeline.js +0 -278
- package/dist/sync/groupChange.d.ts +0 -116
- package/dist/sync/groupChange.js +0 -244
- package/dist/sync/participants.d.ts +0 -132
- package/dist/sync/participants.js +0 -346
- 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 -71
- 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/syncLog/contract.d.ts +0 -20
- package/dist/syncLog/contract.js +0 -19
- package/dist/syncLog/index.d.ts +0 -1
- package/dist/syncLog/index.js +0 -1
- 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 -212
- package/dist/transaction/auth/capability.js +0 -224
- 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 -56
- package/dist/transaction/coordination/awaitClaimGrant.js +0 -124
- package/dist/transaction/coordination/claimHeartbeatLoop.d.ts +0 -84
- package/dist/transaction/coordination/claimHeartbeatLoop.js +0 -108
- 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 -45
- package/dist/transaction/coordination/locator.d.ts +0 -104
- package/dist/transaction/coordination/locator.js +0 -102
- package/dist/transaction/coordination/schema.d.ts +0 -1536
- package/dist/transaction/coordination/schema.js +0 -1177
- package/dist/transaction/coordination/targetConflict.d.ts +0 -2
- package/dist/transaction/coordination/targetConflict.js +0 -107
- 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 -484
- package/dist/transaction/errors.d.ts +0 -428
- package/dist/transaction/errors.js +0 -686
- package/dist/transaction/footprint.d.ts +0 -111
- package/dist/transaction/footprint.js +0 -0
- 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 -285
- package/dist/transaction/plugin.js +0 -106
- 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 -321
- package/dist/transaction/resources/httpResources.js +0 -7
- package/dist/transaction/resources/modelOperations.d.ts +0 -427
- 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 -101
- package/dist/transaction/resources/where.js +0 -115
- 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 -120
- package/dist/transaction/schema/field.js +0 -265
- package/dist/transaction/schema/fieldRef.d.ts +0 -38
- package/dist/transaction/schema/fieldRef.js +0 -11
- 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 -58
- package/dist/transaction/schema/openapi.js +0 -501
- package/dist/transaction/schema/relation.d.ts +0 -204
- 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 -351
- package/dist/transaction/schema/schema.js +0 -325
- 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 -131
- package/dist/transaction/transport/httpClient.js +0 -146
- 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 -1388
- 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 -574
- package/dist/transaction/transport/wsTransport.js +0 -1023
- 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 -550
- 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 -50
- package/dist/transaction/utils/duration.js +0 -77
- 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 -420
- package/dist/transaction/wire/accountResponses.js +0 -290
- package/dist/transaction/wire/auth.d.ts +0 -56
- package/dist/transaction/wire/auth.js +0 -63
- 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 -530
- package/dist/transaction/wire/claims.js +0 -327
- 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 -204
- package/dist/transaction/wire/feedEvent.js +0 -65
- 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 -562
- package/dist/transaction/wire/inboundFrames.js +0 -116
- package/dist/transaction/wire/index.d.ts +0 -54
- package/dist/transaction/wire/index.js +0 -83
- package/dist/transaction/wire/listEnvelope.d.ts +0 -37
- package/dist/transaction/wire/listEnvelope.js +0 -42
- package/dist/transaction/wire/modelMutations.d.ts +0 -31
- package/dist/transaction/wire/modelMutations.js +0 -52
- package/dist/transaction/wire/modelResponses.d.ts +0 -85
- package/dist/transaction/wire/modelResponses.js +0 -43
- package/dist/transaction/wire/modelShape.d.ts +0 -78
- package/dist/transaction/wire/modelShape.js +0 -74
- 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 -661
- package/dist/transactions/mutations/MutationQueue.js +0 -2807
- 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 -165
- package/dist/transactions/mutations/commitPayload.js +0 -152
- package/dist/transactions/mutations/deltaConfirmation.d.ts +0 -63
- package/dist/transactions/mutations/deltaConfirmation.js +0 -235
- 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 -187
- package/dist/transactions/mutations/replayValidation.js +0 -164
- package/dist/utils/mobxSetup.d.ts +0 -53
- package/dist/utils/mobxSetup.js +0 -330
- package/dist/views/QueryView.d.ts +0 -79
- package/dist/views/QueryView.js +0 -218
- package/dist/views/ViewRegistry.d.ts +0 -20
- package/dist/views/ViewRegistry.js +0 -55
- package/dist/views/incrementalView.d.ts +0 -45
- package/dist/views/incrementalView.js +0 -69
- 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/dist/storeContract.d.ts
DELETED
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The framework-neutral store contract. {@link SyncStoreContract} is the minimal
|
|
3
|
-
* store interface the SDK's hooks and mutators are written against, and
|
|
4
|
-
* {@link BaseSyncedStore} is the concrete class that implements it. Framework
|
|
5
|
-
* integrations, such as the React bindings, re-export these types, so a hook can
|
|
6
|
-
* accept any store that satisfies the contract without depending on a particular
|
|
7
|
-
* UI framework.
|
|
8
|
-
*
|
|
9
|
-
* This module is type-only: it has no runtime imports and contributes nothing to
|
|
10
|
-
* the runtime bundle beyond the erased interface declarations.
|
|
11
|
-
*/
|
|
12
|
-
import type { Model } from './Model.js';
|
|
13
|
-
import type { ModelScope } from './transaction/types/index.js';
|
|
14
|
-
import type { QueryView, QueryViewOptions } from './views/QueryView.js';
|
|
15
|
-
import type { ViewRegistry } from './views/ViewRegistry.js';
|
|
16
|
-
import type { ParticipantScope } from './sync/participants.js';
|
|
17
|
-
/**
|
|
18
|
-
* A snapshot of the client's synchronization state, shaped for binding to UI.
|
|
19
|
-
* {@link SyncStoreContract.syncStatus} exposes a reactive instance of this, and
|
|
20
|
-
* the `useSyncStatus()` hook reads its fields to render connection and progress
|
|
21
|
-
* indicators.
|
|
22
|
-
*/
|
|
23
|
-
export interface SyncStatus {
|
|
24
|
-
state: 'idle' | 'syncing' | 'error' | 'offline' | 'reconnecting';
|
|
25
|
-
progress: number;
|
|
26
|
-
error?: Error;
|
|
27
|
-
/** When true, the error is a session/auth error requiring re-authentication. */
|
|
28
|
-
isSessionError: boolean;
|
|
29
|
-
lastSyncAt?: Date;
|
|
30
|
-
pendingChanges: number;
|
|
31
|
-
offlineSince?: Date;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* A single locally-originated mutation, observed as it flows through the commit
|
|
35
|
-
* stream. The undo system records these to build its inverse operations: one is
|
|
36
|
-
* emitted per local create, update, delete, or archive. Changes arriving from
|
|
37
|
-
* other participants do not appear here — they apply through a separate path
|
|
38
|
-
* that does not queue mutations. Because `previousData` captures the field
|
|
39
|
-
* values as they were before the edit, each event carries everything needed to
|
|
40
|
-
* derive its inverse, with no separate snapshot step. A store exposes this
|
|
41
|
-
* stream through {@link SyncStoreContract.subscribeLocalMutations}.
|
|
42
|
-
*/
|
|
43
|
-
export interface LocalMutation {
|
|
44
|
-
type: 'create' | 'update' | 'delete' | 'archive' | 'unarchive';
|
|
45
|
-
/** The registered name of the mutated model, for example `'Block'`. */
|
|
46
|
-
modelName: string;
|
|
47
|
-
modelId: string;
|
|
48
|
-
/** The new field values, for a create or an update. */
|
|
49
|
-
data?: Record<string, unknown> | null;
|
|
50
|
-
/** The field values as they were before the edit. For an update these form
|
|
51
|
-
* the inverse patch; for a delete they hold the full row needed to recreate
|
|
52
|
-
* it. */
|
|
53
|
-
previousData?: Record<string, unknown> | null;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* The minimal store interface the SDK's hooks and mutators depend on. Provide a
|
|
57
|
-
* concrete store that implements it — {@link BaseSyncedStore} is the built-in
|
|
58
|
-
* implementation — and the hooks work against your store without knowing its
|
|
59
|
-
* exact type. Optional members exist so lightweight test doubles can implement
|
|
60
|
-
* only the parts they exercise.
|
|
61
|
-
*/
|
|
62
|
-
export interface SyncStoreContract {
|
|
63
|
-
/**
|
|
64
|
-
* Subscribes to the stream of local mutations for undo recording, delivering
|
|
65
|
-
* each optimistic write before it is acknowledged by the server. See
|
|
66
|
-
* {@link LocalMutation}. Returns a function that removes the subscription.
|
|
67
|
-
* This is optional: when a store does not implement it, undo scopes simply
|
|
68
|
-
* record nothing.
|
|
69
|
-
*/
|
|
70
|
-
subscribeLocalMutations?(handler: (mutation: LocalMutation) => void): () => void;
|
|
71
|
-
retrieve(modelClass: abstract new (...args: never[]) => Model, id: string): Model | undefined;
|
|
72
|
-
queryByClass(modelClass: abstract new (...args: never[]) => Model, options?: {
|
|
73
|
-
predicate?: (model: Model) => boolean;
|
|
74
|
-
scope?: ModelScope;
|
|
75
|
-
orderBy?: keyof Model;
|
|
76
|
-
order?: 'asc' | 'desc';
|
|
77
|
-
limit?: number;
|
|
78
|
-
offset?: number;
|
|
79
|
-
}): {
|
|
80
|
-
data: Model[];
|
|
81
|
-
};
|
|
82
|
-
/**
|
|
83
|
-
* Saves one entity, creating it if new or updating it if it already exists.
|
|
84
|
-
* Calling `save` repeatedly within the same tick is efficient: the writes are
|
|
85
|
-
* coalesced and persisted, then sent to the server, as a single commit. There
|
|
86
|
-
* is deliberately no bulk method — issue one `save` per row and let the tick
|
|
87
|
-
* boundary batch them.
|
|
88
|
-
*
|
|
89
|
-
* Pass `skipValidation` on trusted, high-volume paths — bulk import or
|
|
90
|
-
* hydration, where the data has already been validated — to skip the per-row
|
|
91
|
-
* schema check, which is a measurable cost at that volume.
|
|
92
|
-
*/
|
|
93
|
-
save(model: Model, options?: {
|
|
94
|
-
skipValidation?: boolean;
|
|
95
|
-
}): Promise<void>;
|
|
96
|
-
delete(model: Model): Promise<void>;
|
|
97
|
-
archive(model: Model): Promise<void>;
|
|
98
|
-
unarchive(model: Model): Promise<void>;
|
|
99
|
-
/** The in-memory object pool: look up individual entities or collections by
|
|
100
|
-
* id or model name, create views, and resolve foreign-key relationships. */
|
|
101
|
-
pool: {
|
|
102
|
-
get(id: string): Model | undefined;
|
|
103
|
-
getByTypeName(typename: string, scope?: ModelScope): Model[];
|
|
104
|
-
getByForeignKey(modelName: string, fieldName: string, fieldValue: string): Model[];
|
|
105
|
-
createFromData(data: Record<string, unknown>): Model | null;
|
|
106
|
-
hasForeignKeyIndex(typename: string, fieldName: string): boolean;
|
|
107
|
-
createView<T extends Record<string, unknown>>(typename: string, options?: QueryViewOptions<T>): QueryView<T>;
|
|
108
|
-
viewRegistry: ViewRegistry;
|
|
109
|
-
};
|
|
110
|
-
/**
|
|
111
|
-
* Reactive getters for the current sync state. In the built-in store these
|
|
112
|
-
* are backed by observable computeds, so reading them inside a reactive
|
|
113
|
-
* context — an observer component or a reaction — re-runs that context when
|
|
114
|
-
* the state changes. Code that prefers not to work with the reactivity system
|
|
115
|
-
* directly can read the same values through the `useSyncStatus()` hook.
|
|
116
|
-
*/
|
|
117
|
-
readonly isReady: boolean;
|
|
118
|
-
readonly isSyncing: boolean;
|
|
119
|
-
readonly isOffline: boolean;
|
|
120
|
-
readonly isReconnecting: boolean;
|
|
121
|
-
readonly isError: boolean;
|
|
122
|
-
readonly hasUnsyncedChanges: boolean;
|
|
123
|
-
/**
|
|
124
|
-
* Manages the connection's area of interest — the dynamic set of data it
|
|
125
|
-
* subscribes to. Call `enterScope` and `leaveScope` to move that interest as
|
|
126
|
-
* the user navigates between documents, and `pinScope` and `unpinScope` to
|
|
127
|
-
* keep a scope subscribed while it stays important, such as while a claim is
|
|
128
|
-
* held. Every scope resolves through the same resolver the claim path uses, so
|
|
129
|
-
* read subscriptions and write claims always agree on which group they refer
|
|
130
|
-
* to. These are optional and do nothing until the connection is open.
|
|
131
|
-
*/
|
|
132
|
-
enterScope?(scope: ParticipantScope, opts?: {
|
|
133
|
-
hydrate?: boolean;
|
|
134
|
-
}): Promise<void>;
|
|
135
|
-
leaveScope?(scope: ParticipantScope): Promise<void>;
|
|
136
|
-
pinScope?(scope: ParticipantScope): Promise<void>;
|
|
137
|
-
unpinScope?(scope: ParticipantScope): Promise<void>;
|
|
138
|
-
/**
|
|
139
|
-
* The full reactive {@link SyncStatus} record. The `useSyncStatus()` hook
|
|
140
|
-
* reads its fields — `state`, `progress`, `pendingChanges`, `isSessionError`,
|
|
141
|
-
* and `error` — to present the current sync state. It is part of the contract
|
|
142
|
-
* so hooks and test doubles can read or set it directly.
|
|
143
|
-
*/
|
|
144
|
-
readonly syncStatus: SyncStatus;
|
|
145
|
-
}
|
package/dist/storeContract.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The framework-neutral store contract. {@link SyncStoreContract} is the minimal
|
|
3
|
-
* store interface the SDK's hooks and mutators are written against, and
|
|
4
|
-
* {@link BaseSyncedStore} is the concrete class that implements it. Framework
|
|
5
|
-
* integrations, such as the React bindings, re-export these types, so a hook can
|
|
6
|
-
* accept any store that satisfies the contract without depending on a particular
|
|
7
|
-
* UI framework.
|
|
8
|
-
*
|
|
9
|
-
* This module is type-only: it has no runtime imports and contributes nothing to
|
|
10
|
-
* the runtime bundle beyond the erased interface declarations.
|
|
11
|
-
*/
|
|
12
|
-
export {};
|
|
@@ -1,107 +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 type { RuntimeContext } from '../RuntimeContext.js';
|
|
9
|
-
export interface DatabaseInfo {
|
|
10
|
-
name: string;
|
|
11
|
-
userId: string;
|
|
12
|
-
workspaceId: string;
|
|
13
|
-
schemaHash: string;
|
|
14
|
-
schemaVersion: number;
|
|
15
|
-
userVersion?: number;
|
|
16
|
-
createdAt: Date;
|
|
17
|
-
updatedAt: Date;
|
|
18
|
-
}
|
|
19
|
-
export interface WorkspaceMetadata {
|
|
20
|
-
lastSyncId: number;
|
|
21
|
-
firstSyncId: number;
|
|
22
|
-
backendDatabaseVersion: number;
|
|
23
|
-
subscribedSyncGroups: string[];
|
|
24
|
-
updatedAt: Date;
|
|
25
|
-
schemaHash?: string;
|
|
26
|
-
syncGroups?: string[];
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* DatabaseManager - Manages Ablo's two-tier database architecture
|
|
30
|
-
*
|
|
31
|
-
* Key responsibilities:
|
|
32
|
-
* - Manages ablo_databases (database registry)
|
|
33
|
-
* - Creates workspace-specific databases (ablo_hash)
|
|
34
|
-
* - Handles database migration and versioning
|
|
35
|
-
* - Provides database info and metadata management
|
|
36
|
-
*/
|
|
37
|
-
export declare class DatabaseManager {
|
|
38
|
-
private readonly runtime;
|
|
39
|
-
private metaDb;
|
|
40
|
-
private readonly metaDbName;
|
|
41
|
-
constructor(runtime?: RuntimeContext);
|
|
42
|
-
/**
|
|
43
|
-
* Initialize the meta database (ablo_databases)
|
|
44
|
-
*/
|
|
45
|
-
initializeMetaDatabase(): Promise<void>;
|
|
46
|
-
/**
|
|
47
|
-
* Calculate database info for a user/workspace combination
|
|
48
|
-
*/
|
|
49
|
-
calculateDatabaseInfo(userId: string, workspaceId: string, userVersion?: number): Promise<DatabaseInfo>;
|
|
50
|
-
/**
|
|
51
|
-
* Generate deterministic database name
|
|
52
|
-
*/
|
|
53
|
-
private generateDatabaseName;
|
|
54
|
-
/**
|
|
55
|
-
* Register database info in ablo_databases
|
|
56
|
-
*/
|
|
57
|
-
registerDatabase(info: DatabaseInfo): Promise<void>;
|
|
58
|
-
/**
|
|
59
|
-
* Get database info by name
|
|
60
|
-
*/
|
|
61
|
-
getDatabaseInfo(name: string): Promise<DatabaseInfo | null>;
|
|
62
|
-
/**
|
|
63
|
-
* Get all databases for a user
|
|
64
|
-
*/
|
|
65
|
-
getDatabasesForUser(userId: string): Promise<DatabaseInfo[]>;
|
|
66
|
-
/**
|
|
67
|
-
* Open workspace-specific database
|
|
68
|
-
*/
|
|
69
|
-
openWorkspaceDatabase(dbInfo: DatabaseInfo, createStoresFn?: (db: IDBDatabase, tx: IDBTransaction) => Promise<void>): Promise<IDBDatabase>;
|
|
70
|
-
/**
|
|
71
|
-
* Read workspace metadata from __meta table
|
|
72
|
-
*/
|
|
73
|
-
getWorkspaceMetadata(db: IDBDatabase): Promise<WorkspaceMetadata | null>;
|
|
74
|
-
/**
|
|
75
|
-
* Write workspace metadata to __meta table
|
|
76
|
-
*/
|
|
77
|
-
setWorkspaceMetadata(db: IDBDatabase, metadata: WorkspaceMetadata): Promise<void>;
|
|
78
|
-
/**
|
|
79
|
-
* Check if a model is persisted (all instances loaded)
|
|
80
|
-
*/
|
|
81
|
-
isModelPersisted(db: IDBDatabase, modelName: string): Promise<boolean>;
|
|
82
|
-
/**
|
|
83
|
-
* Mark a model as persisted
|
|
84
|
-
*/
|
|
85
|
-
setModelPersisted(db: IDBDatabase, modelName: string, persisted: boolean): Promise<void>;
|
|
86
|
-
/**
|
|
87
|
-
* Get all model persistence states
|
|
88
|
-
*/
|
|
89
|
-
getAllModelPersistenceStates(db: IDBDatabase): Promise<Record<string, boolean>>;
|
|
90
|
-
/**
|
|
91
|
-
* Delete a workspace database
|
|
92
|
-
*/
|
|
93
|
-
deleteWorkspaceDatabase(dbInfo: DatabaseInfo): Promise<void>;
|
|
94
|
-
/**
|
|
95
|
-
* Get comprehensive database statistics
|
|
96
|
-
*/
|
|
97
|
-
getDatabaseStatistics(): Promise<{
|
|
98
|
-
metaDatabaseSize: number;
|
|
99
|
-
totalWorkspaceDatabases: number;
|
|
100
|
-
databasesByUser: Record<string, number>;
|
|
101
|
-
schemaVersions: Record<string, number>;
|
|
102
|
-
}>;
|
|
103
|
-
/**
|
|
104
|
-
* Close all database connections
|
|
105
|
-
*/
|
|
106
|
-
close(): Promise<void>;
|
|
107
|
-
}
|
|
@@ -1,388 +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 { globalRuntime } 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
|
-
runtime;
|
|
23
|
-
metaDb = null;
|
|
24
|
-
metaDbName = 'ablo_databases';
|
|
25
|
-
constructor(runtime = globalRuntime) {
|
|
26
|
-
this.runtime = runtime;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Initialize the meta database (ablo_databases)
|
|
30
|
-
*/
|
|
31
|
-
async initializeMetaDatabase() {
|
|
32
|
-
const open = () => openIDBWithTimeout(this.metaDbName, 1, {
|
|
33
|
-
onUpgrade: (request) => {
|
|
34
|
-
const db = request.result;
|
|
35
|
-
if (!db.objectStoreNames.contains('databases')) {
|
|
36
|
-
const store = db.createObjectStore('databases', { keyPath: 'name' });
|
|
37
|
-
store.createIndex('userId', 'userId');
|
|
38
|
-
store.createIndex('workspaceId', 'workspaceId');
|
|
39
|
-
store.createIndex('schemaHash', 'schemaHash');
|
|
40
|
-
store.createIndex('updatedAt', 'updatedAt');
|
|
41
|
-
}
|
|
42
|
-
},
|
|
43
|
-
});
|
|
44
|
-
try {
|
|
45
|
-
this.metaDb = await open();
|
|
46
|
-
}
|
|
47
|
-
catch (error) {
|
|
48
|
-
// Self-heal a wedged meta DB. When `ablo_databases`'s backing store gets
|
|
49
|
-
// stuck (a corrupted store, or a leaked connection from a prior
|
|
50
|
-
// timed-out open), every open of that name hangs with no event and the
|
|
51
|
-
// app is permanently bricked until the user manually clears site data —
|
|
52
|
-
// the "open did not resolve within 10000ms" dead end. The registry this
|
|
53
|
-
// DB holds is rebuildable from the server on the next bootstrap, so it is
|
|
54
|
-
// safe to delete and re-create. Try exactly once: delete, then re-open.
|
|
55
|
-
if (!(error instanceof IDBOpenTimeoutError))
|
|
56
|
-
throw error;
|
|
57
|
-
this.runtime.logger.debug('[sync-engine] meta DB open timed out — attempting self-heal (delete + retry)', { db: this.metaDbName, reason: error.reason });
|
|
58
|
-
this.runtime.observability.captureBootstrapFailure(error, {
|
|
59
|
-
type: 'meta-db-open-timeout',
|
|
60
|
-
});
|
|
61
|
-
const deleted = await deleteIDBWithTimeout(this.metaDbName);
|
|
62
|
-
if (!deleted) {
|
|
63
|
-
// The delete itself was blocked/stuck — a live connection in another
|
|
64
|
-
// window or a deadlocked backing store. We cannot recover in-page;
|
|
65
|
-
// rethrow so the provider surfaces the real (now actionable) error.
|
|
66
|
-
throw error;
|
|
67
|
-
}
|
|
68
|
-
// Fresh store — this open creates `ablo_databases` from scratch.
|
|
69
|
-
this.metaDb = await open();
|
|
70
|
-
this.runtime.logger.info('[sync-engine] meta DB self-heal succeeded');
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Calculate database info for a user/workspace combination
|
|
75
|
-
*/
|
|
76
|
-
async calculateDatabaseInfo(userId, workspaceId, userVersion = 1) {
|
|
77
|
-
// Get schema hash from the active ModelRegistry
|
|
78
|
-
const schemaHash = hasActiveRegistry()
|
|
79
|
-
? getActiveRegistry().getSchemaHash()
|
|
80
|
-
: 'no-registry-hash';
|
|
81
|
-
// Generate database name from userId, workspaceId, and versions
|
|
82
|
-
const dbName = this.generateDatabaseName(userId, workspaceId, userVersion);
|
|
83
|
-
// Check if we need to increment schema version
|
|
84
|
-
const existingInfo = await this.getDatabaseInfo(dbName);
|
|
85
|
-
let schemaVersion = 1;
|
|
86
|
-
if (existingInfo && existingInfo.schemaHash !== schemaHash) {
|
|
87
|
-
schemaVersion = (existingInfo.schemaVersion || 1) + 1;
|
|
88
|
-
}
|
|
89
|
-
else if (existingInfo) {
|
|
90
|
-
schemaVersion = existingInfo.schemaVersion || 1;
|
|
91
|
-
}
|
|
92
|
-
// Record the existing databases for this user so duplicates can be detected.
|
|
93
|
-
const allUserDatabases = await this.getDatabasesForUser(userId);
|
|
94
|
-
const allIndexedDBs = (await indexedDB.databases?.()) || [];
|
|
95
|
-
const abloDatabases = allIndexedDBs.filter((db) => db.name?.startsWith('ablo_'));
|
|
96
|
-
this.runtime.observability.breadcrumb('Database info calculated', 'sync.database', 'info', {
|
|
97
|
-
dbName,
|
|
98
|
-
schemaVersion,
|
|
99
|
-
existingDbCount: allUserDatabases.length,
|
|
100
|
-
abloDbCount: abloDatabases.length,
|
|
101
|
-
});
|
|
102
|
-
return {
|
|
103
|
-
name: dbName,
|
|
104
|
-
userId,
|
|
105
|
-
workspaceId,
|
|
106
|
-
schemaHash,
|
|
107
|
-
schemaVersion,
|
|
108
|
-
userVersion,
|
|
109
|
-
createdAt: existingInfo?.createdAt ?? new Date(),
|
|
110
|
-
updatedAt: new Date(),
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Generate deterministic database name
|
|
115
|
-
*/
|
|
116
|
-
generateDatabaseName(userId, workspaceId, userVersion = 1) {
|
|
117
|
-
// Combine userId, workspaceId, and userVersion for unique database
|
|
118
|
-
const combined = `${userId}:${workspaceId}:${userVersion}`;
|
|
119
|
-
// Hash the combined key into a compact, deterministic identifier.
|
|
120
|
-
let hash = 0;
|
|
121
|
-
for (let i = 0; i < combined.length; i++) {
|
|
122
|
-
hash = (hash << 5) - hash + combined.charCodeAt(i);
|
|
123
|
-
hash = hash & hash; // Convert to 32bit integer
|
|
124
|
-
}
|
|
125
|
-
// Convert to hex and create Ablo-style name
|
|
126
|
-
const hexHash = Math.abs(hash).toString(16).padStart(8, '0');
|
|
127
|
-
return `ablo_${hexHash}`;
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Register database info in ablo_databases
|
|
131
|
-
*/
|
|
132
|
-
async registerDatabase(info) {
|
|
133
|
-
if (!this.metaDb) {
|
|
134
|
-
throw new AbloConnectionError('Meta database not initialized', {
|
|
135
|
-
code: 'meta_db_not_initialized',
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
return new Promise((resolve, reject) => {
|
|
139
|
-
const tx = this.metaDb.transaction(['databases'], 'readwrite');
|
|
140
|
-
const store = tx.objectStore('databases');
|
|
141
|
-
const request = store.put(info);
|
|
142
|
-
tx.oncomplete = () => {
|
|
143
|
-
resolve();
|
|
144
|
-
};
|
|
145
|
-
tx.onerror = () => { reject(tx.error); };
|
|
146
|
-
request.onerror = () => { reject(request.error); };
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Get database info by name
|
|
151
|
-
*/
|
|
152
|
-
async getDatabaseInfo(name) {
|
|
153
|
-
if (!this.metaDb)
|
|
154
|
-
return null;
|
|
155
|
-
return new Promise((resolve, reject) => {
|
|
156
|
-
const tx = this.metaDb.transaction(['databases'], 'readonly');
|
|
157
|
-
const store = tx.objectStore('databases');
|
|
158
|
-
const request = store.get(name);
|
|
159
|
-
request.onsuccess = () => { resolve(request.result ?? null); };
|
|
160
|
-
request.onerror = () => { reject(request.error); };
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* Get all databases for a user
|
|
165
|
-
*/
|
|
166
|
-
async getDatabasesForUser(userId) {
|
|
167
|
-
if (!this.metaDb)
|
|
168
|
-
return [];
|
|
169
|
-
return new Promise((resolve, reject) => {
|
|
170
|
-
const tx = this.metaDb.transaction(['databases'], 'readonly');
|
|
171
|
-
const store = tx.objectStore('databases');
|
|
172
|
-
const index = store.index('userId');
|
|
173
|
-
const request = index.getAll(userId);
|
|
174
|
-
request.onsuccess = () => { resolve(request.result || []); };
|
|
175
|
-
request.onerror = () => { reject(request.error); };
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
/**
|
|
179
|
-
* Open workspace-specific database
|
|
180
|
-
*/
|
|
181
|
-
async openWorkspaceDatabase(dbInfo, createStoresFn) {
|
|
182
|
-
try {
|
|
183
|
-
return await openIDBWithTimeout(dbInfo.name, dbInfo.schemaVersion, {
|
|
184
|
-
onUpgrade: (request, event) => {
|
|
185
|
-
const db = request.result;
|
|
186
|
-
const tx = event.target.transaction;
|
|
187
|
-
// IndexedDB rule: only awaits on IndexedDB requests keep an upgrade
|
|
188
|
-
// transaction alive. Any other await — a fetch, a timer — commits the
|
|
189
|
-
// transaction early, and later operations then throw
|
|
190
|
-
// `TransactionInactiveError`. StoreManager.createStores runs only
|
|
191
|
-
// synchronous createObjectStore / createIndex calls under an `async`
|
|
192
|
-
// keyword, so calling it without awaiting is safe here.
|
|
193
|
-
if (createStoresFn && tx) {
|
|
194
|
-
try {
|
|
195
|
-
void createStoresFn(db, tx).catch((err) => {
|
|
196
|
-
this.runtime.observability.captureBootstrapFailure(err, {
|
|
197
|
-
type: 'store-creation',
|
|
198
|
-
});
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
catch (err) {
|
|
202
|
-
this.runtime.observability.captureBootstrapFailure(err, {
|
|
203
|
-
type: 'store-creation',
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
},
|
|
208
|
-
});
|
|
209
|
-
}
|
|
210
|
-
catch (error) {
|
|
211
|
-
this.runtime.observability.captureBootstrapFailure(error, {
|
|
212
|
-
type: 'database-open',
|
|
213
|
-
});
|
|
214
|
-
throw error;
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
/**
|
|
218
|
-
* Read workspace metadata from __meta table
|
|
219
|
-
*/
|
|
220
|
-
async getWorkspaceMetadata(db) {
|
|
221
|
-
return new Promise((resolve, reject) => {
|
|
222
|
-
const tx = db.transaction(['__meta'], 'readonly');
|
|
223
|
-
const store = tx.objectStore('__meta');
|
|
224
|
-
const request = store.get('metadata');
|
|
225
|
-
request.onsuccess = () => {
|
|
226
|
-
const data = request.result;
|
|
227
|
-
if (!data) {
|
|
228
|
-
resolve(null);
|
|
229
|
-
return;
|
|
230
|
-
}
|
|
231
|
-
const meta = {
|
|
232
|
-
lastSyncId: data.lastSyncId ?? 0,
|
|
233
|
-
firstSyncId: data.firstSyncId ?? 0,
|
|
234
|
-
backendDatabaseVersion: data.backendDatabaseVersion ?? 1,
|
|
235
|
-
subscribedSyncGroups: data.subscribedSyncGroups ?? [],
|
|
236
|
-
updatedAt: data.updatedAt ? new Date(data.updatedAt) : new Date(),
|
|
237
|
-
schemaHash: data.schemaHash,
|
|
238
|
-
syncGroups: data.syncGroups,
|
|
239
|
-
// Older persisted records may still carry an extra `versions` key
|
|
240
|
-
// that is no longer used; it is tolerated by simply not reading it here.
|
|
241
|
-
};
|
|
242
|
-
resolve(meta);
|
|
243
|
-
};
|
|
244
|
-
request.onerror = () => { reject(request.error); };
|
|
245
|
-
});
|
|
246
|
-
}
|
|
247
|
-
/**
|
|
248
|
-
* Write workspace metadata to __meta table
|
|
249
|
-
*/
|
|
250
|
-
async setWorkspaceMetadata(db, metadata) {
|
|
251
|
-
return new Promise((resolve, reject) => {
|
|
252
|
-
const tx = db.transaction(['__meta'], 'readwrite');
|
|
253
|
-
const store = tx.objectStore('__meta');
|
|
254
|
-
const request = store.put(metadata, 'metadata');
|
|
255
|
-
tx.oncomplete = () => { resolve(); };
|
|
256
|
-
tx.onerror = () => { reject(tx.error); };
|
|
257
|
-
request.onerror = () => { reject(request.error); };
|
|
258
|
-
});
|
|
259
|
-
}
|
|
260
|
-
/**
|
|
261
|
-
* Check if a model is persisted (all instances loaded)
|
|
262
|
-
*/
|
|
263
|
-
async isModelPersisted(db, modelName) {
|
|
264
|
-
return new Promise((resolve, reject) => {
|
|
265
|
-
const tx = db.transaction(['__meta'], 'readonly');
|
|
266
|
-
const store = tx.objectStore('__meta');
|
|
267
|
-
const request = store.get(modelName);
|
|
268
|
-
request.onsuccess = () => {
|
|
269
|
-
const data = request.result;
|
|
270
|
-
resolve(data?.persisted === true);
|
|
271
|
-
};
|
|
272
|
-
request.onerror = () => { reject(request.error); };
|
|
273
|
-
});
|
|
274
|
-
}
|
|
275
|
-
/**
|
|
276
|
-
* Mark a model as persisted
|
|
277
|
-
*/
|
|
278
|
-
async setModelPersisted(db, modelName, persisted) {
|
|
279
|
-
return new Promise((resolve, reject) => {
|
|
280
|
-
const tx = db.transaction(['__meta'], 'readwrite');
|
|
281
|
-
const store = tx.objectStore('__meta');
|
|
282
|
-
const persistenceData = {
|
|
283
|
-
persisted,
|
|
284
|
-
modelName,
|
|
285
|
-
timestamp: Date.now(),
|
|
286
|
-
updatedAt: new Date().toISOString(),
|
|
287
|
-
};
|
|
288
|
-
const request = store.put(persistenceData, modelName);
|
|
289
|
-
tx.oncomplete = () => { resolve(); };
|
|
290
|
-
tx.onerror = () => { reject(tx.error); };
|
|
291
|
-
request.onerror = () => { reject(request.error); };
|
|
292
|
-
});
|
|
293
|
-
}
|
|
294
|
-
/**
|
|
295
|
-
* Get all model persistence states
|
|
296
|
-
*/
|
|
297
|
-
async getAllModelPersistenceStates(db) {
|
|
298
|
-
return new Promise((resolve, reject) => {
|
|
299
|
-
const tx = db.transaction(['__meta'], 'readonly');
|
|
300
|
-
const store = tx.objectStore('__meta');
|
|
301
|
-
const request = store.getAll();
|
|
302
|
-
request.onsuccess = () => {
|
|
303
|
-
const states = {};
|
|
304
|
-
for (const item of request.result) {
|
|
305
|
-
// Skip metadata entry
|
|
306
|
-
if (item.key === 'metadata')
|
|
307
|
-
continue;
|
|
308
|
-
if (item.modelName) {
|
|
309
|
-
states[item.modelName] = item.persisted === true;
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
resolve(states);
|
|
313
|
-
};
|
|
314
|
-
request.onerror = () => { reject(request.error); };
|
|
315
|
-
});
|
|
316
|
-
}
|
|
317
|
-
/**
|
|
318
|
-
* Delete a workspace database
|
|
319
|
-
*/
|
|
320
|
-
async deleteWorkspaceDatabase(dbInfo) {
|
|
321
|
-
return new Promise((resolve, reject) => {
|
|
322
|
-
const deleteRequest = indexedDB.deleteDatabase(dbInfo.name);
|
|
323
|
-
deleteRequest.onsuccess = async () => {
|
|
324
|
-
// Remove from registry
|
|
325
|
-
if (this.metaDb) {
|
|
326
|
-
const tx = this.metaDb.transaction(['databases'], 'readwrite');
|
|
327
|
-
const store = tx.objectStore('databases');
|
|
328
|
-
store.delete(dbInfo.name);
|
|
329
|
-
}
|
|
330
|
-
resolve();
|
|
331
|
-
};
|
|
332
|
-
deleteRequest.onerror = () => {
|
|
333
|
-
this.runtime.observability.breadcrumb(`Failed to delete workspace database: ${dbInfo.name}`, 'sync.database', 'error');
|
|
334
|
-
reject(deleteRequest.error);
|
|
335
|
-
};
|
|
336
|
-
deleteRequest.onblocked = () => {
|
|
337
|
-
this.runtime.observability.breadcrumb(`Database deletion blocked: ${dbInfo.name}`, 'sync.database', 'warning');
|
|
338
|
-
// Could implement retry logic or user notification
|
|
339
|
-
};
|
|
340
|
-
});
|
|
341
|
-
}
|
|
342
|
-
/**
|
|
343
|
-
* Get comprehensive database statistics
|
|
344
|
-
*/
|
|
345
|
-
async getDatabaseStatistics() {
|
|
346
|
-
if (!this.metaDb) {
|
|
347
|
-
return {
|
|
348
|
-
metaDatabaseSize: 0,
|
|
349
|
-
totalWorkspaceDatabases: 0,
|
|
350
|
-
databasesByUser: {},
|
|
351
|
-
schemaVersions: {},
|
|
352
|
-
};
|
|
353
|
-
}
|
|
354
|
-
return new Promise((resolve, reject) => {
|
|
355
|
-
const tx = this.metaDb.transaction(['databases'], 'readonly');
|
|
356
|
-
const store = tx.objectStore('databases');
|
|
357
|
-
const request = store.getAll();
|
|
358
|
-
request.onsuccess = () => {
|
|
359
|
-
const databases = request.result;
|
|
360
|
-
const databasesByUser = {};
|
|
361
|
-
const schemaVersions = {};
|
|
362
|
-
for (const db of databases) {
|
|
363
|
-
// Count by user
|
|
364
|
-
databasesByUser[db.userId] = (databasesByUser[db.userId] ?? 0) + 1;
|
|
365
|
-
// Count schema versions
|
|
366
|
-
const versionKey = `v${db.schemaVersion}`;
|
|
367
|
-
schemaVersions[versionKey] = (schemaVersions[versionKey] ?? 0) + 1;
|
|
368
|
-
}
|
|
369
|
-
resolve({
|
|
370
|
-
metaDatabaseSize: databases.length,
|
|
371
|
-
totalWorkspaceDatabases: databases.length,
|
|
372
|
-
databasesByUser,
|
|
373
|
-
schemaVersions,
|
|
374
|
-
});
|
|
375
|
-
};
|
|
376
|
-
request.onerror = () => { reject(request.error); };
|
|
377
|
-
});
|
|
378
|
-
}
|
|
379
|
-
/**
|
|
380
|
-
* Close all database connections
|
|
381
|
-
*/
|
|
382
|
-
async close() {
|
|
383
|
-
if (this.metaDb) {
|
|
384
|
-
this.metaDb.close();
|
|
385
|
-
this.metaDb = null;
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
}
|