@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,255 +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
|
-
/**
|
|
10
|
-
* The default in-memory cache. It keeps a reverse index from model type to the
|
|
11
|
-
* cache keys for that type, so invalidating one model type costs work
|
|
12
|
-
* proportional to that type's keys rather than a scan of the whole cache. A
|
|
13
|
-
* regex fallback still covers the rare pattern that is not a plain model-type
|
|
14
|
-
* match.
|
|
15
|
-
*/
|
|
16
|
-
class BasicQueryCache {
|
|
17
|
-
cache = new Map();
|
|
18
|
-
// Reverse index: model type -> set of cache keys for that type
|
|
19
|
-
modelTypeIndex = new Map();
|
|
20
|
-
get(key) {
|
|
21
|
-
return this.cache.get(key);
|
|
22
|
-
}
|
|
23
|
-
get size() {
|
|
24
|
-
return this.cache.size;
|
|
25
|
-
}
|
|
26
|
-
set(key, data) {
|
|
27
|
-
this.cache.set(key, data);
|
|
28
|
-
// Extract model type from cache key (format: "operation:ModelType:options")
|
|
29
|
-
const modelType = this.extractModelType(key);
|
|
30
|
-
if (modelType) {
|
|
31
|
-
if (!this.modelTypeIndex.has(modelType)) {
|
|
32
|
-
this.modelTypeIndex.set(modelType, new Set());
|
|
33
|
-
}
|
|
34
|
-
this.modelTypeIndex.get(modelType).add(key);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Optimized invalidation - O(k) where k = keys for model type
|
|
39
|
-
* Supports both exact model type names and regex patterns (fallback)
|
|
40
|
-
*/
|
|
41
|
-
invalidate(pattern) {
|
|
42
|
-
if (!pattern) {
|
|
43
|
-
this.cache.clear();
|
|
44
|
-
this.modelTypeIndex.clear();
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
// Fast path: Check if pattern is a simple model type match like ".*ModelType.*"
|
|
48
|
-
const modelType = /^\.\*(\w+)\.\*$/.exec(pattern)?.[1];
|
|
49
|
-
if (modelType !== undefined) {
|
|
50
|
-
const keysToDelete = this.modelTypeIndex.get(modelType);
|
|
51
|
-
if (keysToDelete) {
|
|
52
|
-
for (const key of keysToDelete) {
|
|
53
|
-
this.cache.delete(key);
|
|
54
|
-
}
|
|
55
|
-
this.modelTypeIndex.delete(modelType);
|
|
56
|
-
}
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
// Slow path fallback: regex matching for complex patterns
|
|
60
|
-
// This should rarely be needed with proper model type patterns
|
|
61
|
-
const regex = new RegExp(pattern);
|
|
62
|
-
const keysToDelete = [];
|
|
63
|
-
for (const key of this.cache.keys()) {
|
|
64
|
-
if (regex.test(key)) {
|
|
65
|
-
keysToDelete.push(key);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
// Batch delete to avoid iterator invalidation
|
|
69
|
-
for (const key of keysToDelete) {
|
|
70
|
-
this.cache.delete(key);
|
|
71
|
-
// Clean up index
|
|
72
|
-
const modelType = this.extractModelType(key);
|
|
73
|
-
if (modelType) {
|
|
74
|
-
this.modelTypeIndex.get(modelType)?.delete(key);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
clear() {
|
|
79
|
-
this.cache.clear();
|
|
80
|
-
this.modelTypeIndex.clear();
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Extract model type from cache key
|
|
84
|
-
* Cache key format: "operation:ModelType:options"
|
|
85
|
-
*/
|
|
86
|
-
extractModelType(key) {
|
|
87
|
-
// A missing second segment reads as undefined, so `?? null` yields null.
|
|
88
|
-
return key.split(':')[1] ?? null;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
export class QueryProcessor {
|
|
92
|
-
cache;
|
|
93
|
-
enableCache;
|
|
94
|
-
// Stable-reference cache for predicate queries. A string cache key cannot
|
|
95
|
-
// capture a closure, so predicate queries use a separate identity-based
|
|
96
|
-
// cache keyed on the deterministic part of the query (model name plus
|
|
97
|
-
// serializable options). Each entry stores the previous result and a
|
|
98
|
-
// fingerprint of its model ids; when the ids are unchanged, the processor
|
|
99
|
-
// returns the previous array reference so observers do not re-render.
|
|
100
|
-
predicateResultCache = new Map();
|
|
101
|
-
constructor(config = {}) {
|
|
102
|
-
this.enableCache = config.enableCache ?? true;
|
|
103
|
-
this.cache = new BasicQueryCache();
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Process query with filtering, sorting, and pagination
|
|
107
|
-
*/
|
|
108
|
-
processQuery(models, modelName, options = {}) {
|
|
109
|
-
// Generate cache key
|
|
110
|
-
const cacheKey = this.generateCacheKey('query', modelName, options);
|
|
111
|
-
// Check string-based cache (non-predicate queries only)
|
|
112
|
-
if (!options.predicate && !options.skipCache && this.enableCache) {
|
|
113
|
-
const cached = this.cache.get(cacheKey);
|
|
114
|
-
if (cached) {
|
|
115
|
-
return { ...cached, fromCache: true };
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
// Apply predicate filter
|
|
119
|
-
let filtered = options.predicate ? models.filter(options.predicate) : models;
|
|
120
|
-
// Sort models
|
|
121
|
-
if (options.orderBy) {
|
|
122
|
-
filtered = this.sortModels(filtered, options.orderBy, options.order);
|
|
123
|
-
}
|
|
124
|
-
const total = filtered.length;
|
|
125
|
-
// Apply pagination
|
|
126
|
-
const offset = options.offset || 0;
|
|
127
|
-
const limit = options.limit || filtered.length;
|
|
128
|
-
const data = filtered.slice(offset, offset + limit);
|
|
129
|
-
const result = {
|
|
130
|
-
data,
|
|
131
|
-
total,
|
|
132
|
-
hasMore: offset + limit < total,
|
|
133
|
-
fromCache: false,
|
|
134
|
-
};
|
|
135
|
-
// For predicate queries: compare by structural identity. Return the
|
|
136
|
-
// previous array reference when the model ids are unchanged, so observers
|
|
137
|
-
// don't re-render on a structurally identical result.
|
|
138
|
-
if (options.predicate && this.enableCache) {
|
|
139
|
-
const ids = data.map((m) => m.id).join(',');
|
|
140
|
-
const cached = this.predicateResultCache.get(cacheKey);
|
|
141
|
-
if (cached && cached.ids === ids) {
|
|
142
|
-
// Structural match — return previous reference for stability
|
|
143
|
-
return { ...cached.result, fromCache: true };
|
|
144
|
-
}
|
|
145
|
-
// New result — store for future comparison
|
|
146
|
-
this.predicateResultCache.set(cacheKey, { ids, result });
|
|
147
|
-
}
|
|
148
|
-
// For non-predicate queries: use the string-based cache.
|
|
149
|
-
if (!options.predicate && this.enableCache) {
|
|
150
|
-
this.cache.set(cacheKey, result);
|
|
151
|
-
}
|
|
152
|
-
return result;
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* Sort models by field
|
|
156
|
-
*/
|
|
157
|
-
sortModels(models, field, order = 'asc') {
|
|
158
|
-
return [...models].sort((a, b) => {
|
|
159
|
-
const aVal = a[field];
|
|
160
|
-
const bVal = b[field];
|
|
161
|
-
if (aVal === bVal)
|
|
162
|
-
return 0;
|
|
163
|
-
if (aVal === null || aVal === undefined)
|
|
164
|
-
return 1;
|
|
165
|
-
if (bVal === null || bVal === undefined)
|
|
166
|
-
return -1;
|
|
167
|
-
const comparison = aVal < bVal ? -1 : 1;
|
|
168
|
-
return order === 'asc' ? comparison : -comparison;
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
/**
|
|
172
|
-
* Find first matching model with predicate
|
|
173
|
-
*/
|
|
174
|
-
findFirst(models, predicate) {
|
|
175
|
-
for (const model of models) {
|
|
176
|
-
if (predicate(model)) {
|
|
177
|
-
return model;
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
return undefined;
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* Count models with optional predicate
|
|
184
|
-
*/
|
|
185
|
-
countModels(models, predicate) {
|
|
186
|
-
let count = 0;
|
|
187
|
-
for (const model of models) {
|
|
188
|
-
if (!predicate || predicate(model)) {
|
|
189
|
-
count++;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
return count;
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* Generate a deterministic cache key from query parameters.
|
|
196
|
-
* Functions (predicates) are excluded from the key — predicate queries use
|
|
197
|
-
* the structural identity cache (predicateResultCache) instead of the
|
|
198
|
-
* string-based cache.
|
|
199
|
-
*/
|
|
200
|
-
generateCacheKey(operation, modelName, options) {
|
|
201
|
-
const serializableOptions = {};
|
|
202
|
-
let hasPredicate = false;
|
|
203
|
-
for (const [key, value] of Object.entries(options)) {
|
|
204
|
-
if (typeof value === 'function') {
|
|
205
|
-
hasPredicate = true;
|
|
206
|
-
// Mark that this query has a predicate, but use a stable marker
|
|
207
|
-
// (not Math.random). The actual caching for predicate queries
|
|
208
|
-
// is handled by predicateResultCache using ID comparison.
|
|
209
|
-
serializableOptions[key] = `__predicate__`;
|
|
210
|
-
}
|
|
211
|
-
else {
|
|
212
|
-
serializableOptions[key] = value;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
const sortedOptions = JSON.stringify(serializableOptions, Object.keys(serializableOptions).sort());
|
|
216
|
-
const key = `${operation}:${modelName}:${sortedOptions}`;
|
|
217
|
-
return hasPredicate ? `pred:${key}` : key;
|
|
218
|
-
}
|
|
219
|
-
/**
|
|
220
|
-
* Invalidate cache by pattern
|
|
221
|
-
*/
|
|
222
|
-
invalidateCache(pattern) {
|
|
223
|
-
this.cache.invalidate(pattern);
|
|
224
|
-
// Also invalidate predicate result cache for this model type
|
|
225
|
-
if (pattern) {
|
|
226
|
-
const modelType = /^\.\*(\w+)\.\*$/.exec(pattern)?.[1];
|
|
227
|
-
if (modelType !== undefined) {
|
|
228
|
-
for (const key of this.predicateResultCache.keys()) {
|
|
229
|
-
if (key.includes(modelType)) {
|
|
230
|
-
this.predicateResultCache.delete(key);
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
else {
|
|
236
|
-
this.predicateResultCache.clear();
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
/**
|
|
240
|
-
* Clear all cache
|
|
241
|
-
*/
|
|
242
|
-
clearCache() {
|
|
243
|
-
this.cache.clear();
|
|
244
|
-
this.predicateResultCache.clear();
|
|
245
|
-
}
|
|
246
|
-
/**
|
|
247
|
-
* Get cache stats for debugging
|
|
248
|
-
*/
|
|
249
|
-
getCacheStats() {
|
|
250
|
-
return {
|
|
251
|
-
size: this.cache.size,
|
|
252
|
-
enabled: this.enableCache,
|
|
253
|
-
};
|
|
254
|
-
}
|
|
255
|
-
}
|
package/dist/core/QueryView.d.ts
DELETED
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* QueryView<T> — Incrementally maintained materialized view for a single query.
|
|
3
|
-
*
|
|
4
|
-
* Instead of scanning the full collection on every render, a QueryView
|
|
5
|
-
* builds the result set once, then maintains it via handleAdded /
|
|
6
|
-
* handleUpdated / handleRemoved calls from the ViewRegistry.
|
|
7
|
-
*
|
|
8
|
-
* `results` is a stable MobX observable array — components observe it
|
|
9
|
-
* directly and receive granular updates (splice/push, never replacement).
|
|
10
|
-
*/
|
|
11
|
-
import { type IObservableArray } from 'mobx';
|
|
12
|
-
import { type Model } from '../Model.js';
|
|
13
|
-
import { ModelScope } from '../transaction/types/index.js';
|
|
14
|
-
import type { ViewRegistry } from './ViewRegistry.js';
|
|
15
|
-
import type { IncrementalView } from './queryUtils.js';
|
|
16
|
-
/**
|
|
17
|
-
* The slice of the object pool that a {@link QueryView} reads. It is a minimal
|
|
18
|
-
* structural interface rather than the concrete pool class, which lets a query
|
|
19
|
-
* view avoid importing the pool and so breaks what would otherwise be an import
|
|
20
|
-
* cycle — the pool imports {@link QueryView} to construct one. The concrete
|
|
21
|
-
* pool satisfies this interface structurally.
|
|
22
|
-
*/
|
|
23
|
-
export interface QueryViewPool {
|
|
24
|
-
hasForeignKeyIndex(typename: string, fieldName: string): boolean;
|
|
25
|
-
getByForeignKey(modelName: string, fieldName: string, fieldValue: string): Model[];
|
|
26
|
-
getByTypeName(modelName: string, scope?: ModelScope): Model[];
|
|
27
|
-
}
|
|
28
|
-
export interface QueryViewOptions<T> {
|
|
29
|
-
where?: Partial<T>;
|
|
30
|
-
filter?: (entity: T) => boolean;
|
|
31
|
-
orderBy?: keyof T & string;
|
|
32
|
-
order?: 'asc' | 'desc';
|
|
33
|
-
limit?: number;
|
|
34
|
-
offset?: number;
|
|
35
|
-
/** Lifecycle filter — `live` (the default), `archived`, or `all`. It is
|
|
36
|
-
* named `state` rather than `scope` so it does not collide with the
|
|
37
|
-
* sync-group `scope`. */
|
|
38
|
-
state?: ModelScope;
|
|
39
|
-
}
|
|
40
|
-
export declare class QueryView<T extends Record<string, unknown>> implements IncrementalView {
|
|
41
|
-
/** The full (unlimited) internal result set, kept sorted. */
|
|
42
|
-
private _internal;
|
|
43
|
-
/**
|
|
44
|
-
* Public observable result set — windowed by offset/limit.
|
|
45
|
-
* Components observe this directly.
|
|
46
|
-
*/
|
|
47
|
-
readonly results: IObservableArray<T>;
|
|
48
|
-
private readonly typename;
|
|
49
|
-
private readonly pool;
|
|
50
|
-
private readonly registry;
|
|
51
|
-
private readonly whereEntries;
|
|
52
|
-
private readonly filterFn;
|
|
53
|
-
private readonly sortKey;
|
|
54
|
-
private readonly sortDir;
|
|
55
|
-
private readonly limitN;
|
|
56
|
-
private readonly offsetN;
|
|
57
|
-
private readonly scope;
|
|
58
|
-
/** FK-index optimization: if the where clause targets a single FK-indexed field. */
|
|
59
|
-
private readonly fkField;
|
|
60
|
-
private readonly fkValue;
|
|
61
|
-
private disposed;
|
|
62
|
-
constructor(typename: string, pool: QueryViewPool, registry: ViewRegistry, options?: QueryViewOptions<T>);
|
|
63
|
-
private initialScan;
|
|
64
|
-
handleAdded(model: Record<string, unknown>): void;
|
|
65
|
-
handleUpdated(model: Record<string, unknown>): void;
|
|
66
|
-
handleRemoved(modelId: string): void;
|
|
67
|
-
dispose(): void;
|
|
68
|
-
/** Check whether an entity passes both `where` and `filter`. */
|
|
69
|
-
private matchesFilter;
|
|
70
|
-
/** Insert entity into _internal at the correct sorted position. */
|
|
71
|
-
private insertSorted;
|
|
72
|
-
/** Find index of entity by id in _internal. */
|
|
73
|
-
private findIndexById;
|
|
74
|
-
/**
|
|
75
|
-
* Synchronize the public `results` array with the windowed slice of
|
|
76
|
-
* `_internal`. Mutates in place to keep the reference stable.
|
|
77
|
-
*/
|
|
78
|
-
private syncWindow;
|
|
79
|
-
}
|
package/dist/core/QueryView.js
DELETED
|
@@ -1,218 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* QueryView<T> — Incrementally maintained materialized view for a single query.
|
|
3
|
-
*
|
|
4
|
-
* Instead of scanning the full collection on every render, a QueryView
|
|
5
|
-
* builds the result set once, then maintains it via handleAdded /
|
|
6
|
-
* handleUpdated / handleRemoved calls from the ViewRegistry.
|
|
7
|
-
*
|
|
8
|
-
* `results` is a stable MobX observable array — components observe it
|
|
9
|
-
* directly and receive granular updates (splice/push, never replacement).
|
|
10
|
-
*/
|
|
11
|
-
import { observable, runInAction } from 'mobx';
|
|
12
|
-
import { modelAsRow } from '../Model.js';
|
|
13
|
-
import { ModelScope } from '../transaction/types/index.js';
|
|
14
|
-
import { compareValues, binaryInsertionIndex, findIndexById, } from './queryUtils.js';
|
|
15
|
-
// ---------------------------------------------------------------------------
|
|
16
|
-
// QueryView
|
|
17
|
-
// ---------------------------------------------------------------------------
|
|
18
|
-
export class QueryView {
|
|
19
|
-
/** The full (unlimited) internal result set, kept sorted. */
|
|
20
|
-
_internal;
|
|
21
|
-
/**
|
|
22
|
-
* Public observable result set — windowed by offset/limit.
|
|
23
|
-
* Components observe this directly.
|
|
24
|
-
*/
|
|
25
|
-
results;
|
|
26
|
-
typename;
|
|
27
|
-
pool;
|
|
28
|
-
registry;
|
|
29
|
-
whereEntries;
|
|
30
|
-
filterFn;
|
|
31
|
-
sortKey;
|
|
32
|
-
sortDir;
|
|
33
|
-
limitN;
|
|
34
|
-
offsetN;
|
|
35
|
-
scope;
|
|
36
|
-
/** FK-index optimization: if the where clause targets a single FK-indexed field. */
|
|
37
|
-
fkField;
|
|
38
|
-
fkValue;
|
|
39
|
-
disposed = false;
|
|
40
|
-
constructor(typename, pool, registry, options = {}) {
|
|
41
|
-
this.typename = typename;
|
|
42
|
-
this.pool = pool;
|
|
43
|
-
this.registry = registry;
|
|
44
|
-
// Parse options
|
|
45
|
-
this.whereEntries = options.where
|
|
46
|
-
? Object.entries(options.where).filter(([, v]) => v !== undefined)
|
|
47
|
-
: null;
|
|
48
|
-
this.filterFn = options.filter ?? null;
|
|
49
|
-
this.sortKey = options.orderBy ?? null;
|
|
50
|
-
this.sortDir = options.order === 'desc' ? -1 : 1;
|
|
51
|
-
this.limitN = options.limit;
|
|
52
|
-
this.offsetN = options.offset ?? 0;
|
|
53
|
-
this.scope = options.state ?? ModelScope.live;
|
|
54
|
-
// Check for FK-index optimization: single-field where with an indexed FK
|
|
55
|
-
this.fkField = null;
|
|
56
|
-
this.fkValue = null;
|
|
57
|
-
const soleWhereEntry = this.whereEntries && this.whereEntries.length === 1 ? this.whereEntries[0] : undefined;
|
|
58
|
-
if (soleWhereEntry && typeof soleWhereEntry[1] === 'string') {
|
|
59
|
-
const [field, value] = soleWhereEntry;
|
|
60
|
-
if (pool.hasForeignKeyIndex(typename, field)) {
|
|
61
|
-
this.fkField = field;
|
|
62
|
-
this.fkValue = value;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
// Create observable arrays (shallow — models are already observable)
|
|
66
|
-
this._internal = observable.array([], { deep: false });
|
|
67
|
-
this.results = observable.array([], { deep: false });
|
|
68
|
-
// Perform initial scan
|
|
69
|
-
this.initialScan();
|
|
70
|
-
// Register for incremental updates
|
|
71
|
-
this.registry.register(typename, this);
|
|
72
|
-
}
|
|
73
|
-
// -----------------------------------------------------------------------
|
|
74
|
-
// Initial scan
|
|
75
|
-
// -----------------------------------------------------------------------
|
|
76
|
-
initialScan() {
|
|
77
|
-
let candidates;
|
|
78
|
-
if (this.fkField && this.fkValue) {
|
|
79
|
-
// O(1) FK-index lookup
|
|
80
|
-
candidates = this.pool.getByForeignKey(this.typename, this.fkField, this.fkValue);
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
candidates = this.pool.getByTypeName(this.typename, this.scope);
|
|
84
|
-
}
|
|
85
|
-
const matching = [];
|
|
86
|
-
for (const model of candidates) {
|
|
87
|
-
const entity = modelAsRow(model);
|
|
88
|
-
if (this.matchesFilter(entity)) {
|
|
89
|
-
matching.push(entity);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
// Sort
|
|
93
|
-
if (this.sortKey) {
|
|
94
|
-
const key = this.sortKey;
|
|
95
|
-
const dir = this.sortDir;
|
|
96
|
-
matching.sort((a, b) => compareValues(a[key], b[key], dir));
|
|
97
|
-
}
|
|
98
|
-
runInAction(() => {
|
|
99
|
-
this._internal.replace(matching);
|
|
100
|
-
this.syncWindow();
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
// -----------------------------------------------------------------------
|
|
104
|
-
// Incremental update handlers (called by ViewRegistry)
|
|
105
|
-
// -----------------------------------------------------------------------
|
|
106
|
-
handleAdded(model) {
|
|
107
|
-
if (this.disposed)
|
|
108
|
-
return;
|
|
109
|
-
const entity = model;
|
|
110
|
-
const passesFilter = this.matchesFilter(entity);
|
|
111
|
-
if (!passesFilter)
|
|
112
|
-
return;
|
|
113
|
-
runInAction(() => {
|
|
114
|
-
this.insertSorted(entity);
|
|
115
|
-
this.syncWindow();
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
handleUpdated(model) {
|
|
119
|
-
if (this.disposed)
|
|
120
|
-
return;
|
|
121
|
-
const entity = model;
|
|
122
|
-
const id = entity.id;
|
|
123
|
-
const idx = id !== undefined ? this.findIndexById(id) : -1;
|
|
124
|
-
const matchesNow = this.matchesFilter(entity);
|
|
125
|
-
runInAction(() => {
|
|
126
|
-
if (idx >= 0 && matchesNow) {
|
|
127
|
-
// Was in view and still matches.
|
|
128
|
-
// Models are plain objects (not MobX-observable), so we must notify
|
|
129
|
-
// observers that the data changed. Splice-in-place triggers the
|
|
130
|
-
// observable array to fire, which causes useQuery consumers to
|
|
131
|
-
// re-render with fresh property values.
|
|
132
|
-
this._internal.splice(idx, 1);
|
|
133
|
-
this.insertSorted(entity);
|
|
134
|
-
}
|
|
135
|
-
else if (idx >= 0 && !matchesNow) {
|
|
136
|
-
// Was in view but no longer matches — remove
|
|
137
|
-
this._internal.splice(idx, 1);
|
|
138
|
-
}
|
|
139
|
-
else if (idx < 0 && matchesNow) {
|
|
140
|
-
// Wasn't in view but now matches — add
|
|
141
|
-
this.insertSorted(entity);
|
|
142
|
-
}
|
|
143
|
-
this.syncWindow();
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
handleRemoved(modelId) {
|
|
147
|
-
if (this.disposed)
|
|
148
|
-
return;
|
|
149
|
-
const idx = this.findIndexById(modelId);
|
|
150
|
-
if (idx < 0)
|
|
151
|
-
return;
|
|
152
|
-
runInAction(() => {
|
|
153
|
-
this._internal.splice(idx, 1);
|
|
154
|
-
this.syncWindow();
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
// -----------------------------------------------------------------------
|
|
158
|
-
// Dispose
|
|
159
|
-
// -----------------------------------------------------------------------
|
|
160
|
-
dispose() {
|
|
161
|
-
if (this.disposed)
|
|
162
|
-
return;
|
|
163
|
-
this.disposed = true;
|
|
164
|
-
this.registry.unregister(this.typename, this);
|
|
165
|
-
}
|
|
166
|
-
// -----------------------------------------------------------------------
|
|
167
|
-
// Private helpers
|
|
168
|
-
// -----------------------------------------------------------------------
|
|
169
|
-
/** Check whether an entity passes both `where` and `filter`. */
|
|
170
|
-
matchesFilter(entity) {
|
|
171
|
-
// Note: scope is tracked per-entry in the InstanceCache, not on the model.
|
|
172
|
-
// The initial scan handles scope via getByTypeName(typename, scope).
|
|
173
|
-
// Incremental notifications from the pool are scope-appropriate since
|
|
174
|
-
// add/upsert/remove reflect the pool's authoritative scope tracking.
|
|
175
|
-
// Where clause: declarative field matching
|
|
176
|
-
if (this.whereEntries) {
|
|
177
|
-
for (const [key, value] of this.whereEntries) {
|
|
178
|
-
if (entity[key] !== value)
|
|
179
|
-
return false;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
// Arbitrary predicate
|
|
183
|
-
if (this.filterFn) {
|
|
184
|
-
if (!this.filterFn(entity))
|
|
185
|
-
return false;
|
|
186
|
-
}
|
|
187
|
-
return true;
|
|
188
|
-
}
|
|
189
|
-
/** Insert entity into _internal at the correct sorted position. */
|
|
190
|
-
insertSorted(entity) {
|
|
191
|
-
if (this.sortKey) {
|
|
192
|
-
const idx = binaryInsertionIndex(this._internal, entity, this.sortKey, this.sortDir);
|
|
193
|
-
this._internal.splice(idx, 0, entity);
|
|
194
|
-
}
|
|
195
|
-
else {
|
|
196
|
-
this._internal.push(entity);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
/** Find index of entity by id in _internal. */
|
|
200
|
-
findIndexById(id) {
|
|
201
|
-
return findIndexById(this._internal, id);
|
|
202
|
-
}
|
|
203
|
-
/**
|
|
204
|
-
* Synchronize the public `results` array with the windowed slice of
|
|
205
|
-
* `_internal`. Mutates in place to keep the reference stable.
|
|
206
|
-
*/
|
|
207
|
-
syncWindow() {
|
|
208
|
-
const start = this.offsetN;
|
|
209
|
-
const end = this.limitN !== undefined ? start + this.limitN : this._internal.length;
|
|
210
|
-
const windowed = this._internal.slice(start, end);
|
|
211
|
-
// Minimal diff: only splice if contents differ
|
|
212
|
-
if (windowed.length === this.results.length &&
|
|
213
|
-
windowed.every((item, i) => this.results[i] === item)) {
|
|
214
|
-
return; // no change
|
|
215
|
-
}
|
|
216
|
-
this.results.replace(windowed);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Manages the {@link ObjectStore} instances the sync engine keeps in the
|
|
3
|
-
* browser — one per registered model — alongside the single
|
|
4
|
-
* {@link SyncActionStore} for pending changes. It creates each store from the
|
|
5
|
-
* model's metadata, tracks readiness, and provisions the underlying IndexedDB
|
|
6
|
-
* object stores. A model's load strategy — instant or lazy — decides how and
|
|
7
|
-
* when its data is loaded.
|
|
8
|
-
*/
|
|
9
|
-
import { ModelRegistry } from '../ModelRegistry.js';
|
|
10
|
-
import { ObjectStore } from '../stores/ObjectStore.js';
|
|
11
|
-
import { SyncActionStore } from '../stores/SyncActionStore.js';
|
|
12
|
-
import { LoadStrategy } from '../transaction/types/index.js';
|
|
13
|
-
/**
|
|
14
|
-
* StoreManager - Central manager for all ObjectStore instances
|
|
15
|
-
*
|
|
16
|
-
* Key responsibilities:
|
|
17
|
-
* - Creates ObjectStore instances for each registered model
|
|
18
|
-
* - Manages store lifecycle and readiness
|
|
19
|
-
* - Provides unified interface for database operations
|
|
20
|
-
* - Handles store-specific optimizations based on load strategies
|
|
21
|
-
*/
|
|
22
|
-
export declare class StoreManager {
|
|
23
|
-
private stores;
|
|
24
|
-
/** Strict-durability wrapper for the client write journal and commit outbox. */
|
|
25
|
-
private transactionStore;
|
|
26
|
-
private syncactionStore;
|
|
27
|
-
private db;
|
|
28
|
-
private isInitialized;
|
|
29
|
-
private modelRegistry;
|
|
30
|
-
constructor(modelRegistry: ModelRegistry);
|
|
31
|
-
/**
|
|
32
|
-
* Initialize all stores for registered models
|
|
33
|
-
*/
|
|
34
|
-
initializeStores(db: IDBDatabase): Promise<void>;
|
|
35
|
-
/**
|
|
36
|
-
* Create ObjectStore for a specific model
|
|
37
|
-
*/
|
|
38
|
-
private createStoreForModel;
|
|
39
|
-
/**
|
|
40
|
-
* Create stores (tables) in IndexedDB
|
|
41
|
-
*/
|
|
42
|
-
createStores(db: IDBDatabase): Promise<void>;
|
|
43
|
-
/**
|
|
44
|
-
* Create special tables (sync_action_table, model_table, model_table_partial, __meta, __transactions)
|
|
45
|
-
*/
|
|
46
|
-
private createSpecialTables;
|
|
47
|
-
/**
|
|
48
|
-
* Get ObjectStore for a model
|
|
49
|
-
*/
|
|
50
|
-
getStore(modelName: string): ObjectStore | undefined;
|
|
51
|
-
/**
|
|
52
|
-
* Get SyncactionStore instance
|
|
53
|
-
*/
|
|
54
|
-
getSyncactionStore(): SyncActionStore | null;
|
|
55
|
-
/**
|
|
56
|
-
* Get all stores
|
|
57
|
-
*/
|
|
58
|
-
getAllStores(): Map<string, ObjectStore>;
|
|
59
|
-
/**
|
|
60
|
-
* Check readiness of all stores
|
|
61
|
-
*/
|
|
62
|
-
checkReadinessOfStores(): Promise<{
|
|
63
|
-
ready: boolean;
|
|
64
|
-
readyStores: string[];
|
|
65
|
-
notReadyStores: string[];
|
|
66
|
-
totalStores: number;
|
|
67
|
-
}>;
|
|
68
|
-
/**
|
|
69
|
-
* Reports whether any data store holds at least one record. This is a
|
|
70
|
-
* cache-validity check: if the stores are empty, the sync cursor
|
|
71
|
-
* (`lastSyncId`) is meaningless no matter what the metadata says, because the
|
|
72
|
-
* cursor and the data must travel together — no data means no cursor, which
|
|
73
|
-
* forces a full bootstrap. To stay cheap it samples up to three stores rather
|
|
74
|
-
* than scanning them all, and returns true as soon as one has records.
|
|
75
|
-
*/
|
|
76
|
-
hasAnyData(): Promise<boolean>;
|
|
77
|
-
/**
|
|
78
|
-
* Get stores by load strategy
|
|
79
|
-
*/
|
|
80
|
-
getStoresByStrategy(strategy: LoadStrategy): ObjectStore[];
|
|
81
|
-
/**
|
|
82
|
-
* Perform maintenance on all stores
|
|
83
|
-
*/
|
|
84
|
-
performMaintenance(): Promise<void>;
|
|
85
|
-
/**
|
|
86
|
-
* Clear all stores
|
|
87
|
-
*/
|
|
88
|
-
clearAllStores(): Promise<void>;
|
|
89
|
-
/**
|
|
90
|
-
* Mark all stores as closing to prevent new operations
|
|
91
|
-
* Called before database connection is closed
|
|
92
|
-
*/
|
|
93
|
-
markAllStoresAsClosing(): void;
|
|
94
|
-
/**
|
|
95
|
-
* Get comprehensive statistics
|
|
96
|
-
*/
|
|
97
|
-
getComprehensiveStats(): Promise<{
|
|
98
|
-
totalStores: number;
|
|
99
|
-
readiness: {
|
|
100
|
-
ready: number;
|
|
101
|
-
notReady: number;
|
|
102
|
-
};
|
|
103
|
-
totalRecords: number;
|
|
104
|
-
storeDetails: {
|
|
105
|
-
modelName: string;
|
|
106
|
-
storeName: string;
|
|
107
|
-
strategy: LoadStrategy;
|
|
108
|
-
ready: boolean;
|
|
109
|
-
count: number;
|
|
110
|
-
}[];
|
|
111
|
-
}>;
|
|
112
|
-
}
|