@abloatai/ablo 0.34.1 → 0.36.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 -1
- package/CHANGELOG.md +758 -5
- package/README.md +56 -502
- package/bin/ablo.cjs +39 -0
- package/dist/BaseSyncedStore.d.ts +176 -48
- package/dist/BaseSyncedStore.js +346 -214
- package/dist/Database.d.ts +17 -44
- package/dist/Database.js +96 -79
- package/dist/InstanceCache.d.ts +31 -6
- package/dist/InstanceCache.js +65 -30
- package/dist/LazyReferenceCollection.d.ts +3 -3
- package/dist/LazyReferenceCollection.js +4 -4
- package/dist/Model.d.ts +23 -13
- package/dist/Model.js +27 -17
- package/dist/ModelRegistry.d.ts +8 -4
- package/dist/ModelRegistry.js +20 -18
- package/dist/NetworkMonitor.d.ts +3 -1
- package/dist/NetworkMonitor.js +7 -5
- package/dist/{SyncEngineContext.d.ts → RuntimeContext.d.ts} +20 -13
- package/dist/{SyncEngineContext.js → RuntimeContext.js} +11 -12
- package/dist/SyncClient.d.ts +47 -47
- package/dist/SyncClient.js +215 -156
- package/dist/ai-sdk/coordinatedTool.d.ts +2 -2
- package/dist/ai-sdk/coordinatedTool.js +1 -1
- package/dist/ai-sdk/coordinationContext.d.ts +2 -2
- package/dist/ai-sdk/coordinationContext.js +1 -1
- package/dist/ai-sdk/wrap.d.ts +3 -3
- package/dist/ai-sdk/wrap.js +2 -2
- package/dist/auth/index.d.ts +1 -156
- package/dist/auth/index.js +8 -301
- package/dist/client/Ablo.d.ts +42 -287
- package/dist/client/Ablo.js +129 -963
- package/dist/client/abloClient.d.ts +309 -0
- package/dist/client/abloClient.js +13 -0
- package/dist/client/clientPrelude.d.ts +52 -0
- package/dist/client/clientPrelude.js +60 -0
- package/dist/client/consoleLogger.d.ts +2 -2
- package/dist/client/coreClient.d.ts +60 -0
- package/dist/client/coreClient.js +118 -0
- package/dist/client/createInternalComponents.d.ts +8 -4
- package/dist/client/createInternalComponents.js +17 -10
- package/dist/client/createModelProxy.d.ts +98 -373
- package/dist/client/createModelProxy.js +233 -139
- package/dist/client/humans.d.ts +69 -0
- package/dist/client/humans.js +78 -0
- package/dist/client/modelRegistration.d.ts +1 -1
- package/dist/client/modelRegistration.js +9 -9
- package/dist/client/options.d.ts +73 -17
- package/dist/client/reactiveEngine.d.ts +53 -0
- package/dist/client/reactiveEngine.js +688 -0
- package/dist/client/resourceTypes.d.ts +9 -250
- package/dist/client/resourceTypes.js +8 -5
- package/dist/client/schemaConfig.d.ts +4 -4
- package/dist/client/schemaConfig.js +6 -2
- package/dist/client/storeCluster.d.ts +47 -0
- package/dist/client/storeCluster.js +118 -0
- package/dist/client/storeLifecycle.d.ts +61 -0
- package/dist/client/storeLifecycle.js +231 -0
- package/dist/client/validateAbloOptions.d.ts +3 -2
- package/dist/client/validateAbloOptions.js +1 -1
- package/dist/client/wsMutationExecutor.d.ts +3 -3
- package/dist/client/wsMutationExecutor.js +3 -3
- package/dist/context.d.ts +22 -9
- package/dist/context.js +33 -9
- package/dist/coordination/ClaimLog.d.ts +26 -0
- package/dist/coordination/ClaimLog.js +32 -0
- package/dist/coordination/index.d.ts +1 -15
- package/dist/coordination/index.js +8 -31
- package/dist/core/index.d.ts +3 -3
- package/dist/core/index.js +2 -2
- package/dist/docs/catalog.d.ts +72 -0
- package/dist/docs/catalog.js +230 -0
- package/dist/docs/index.d.ts +10 -0
- package/dist/docs/index.js +10 -0
- package/dist/environment.d.ts +1 -40
- package/dist/environment.js +8 -37
- package/dist/index.d.ts +44 -36
- package/dist/index.js +30 -22
- package/dist/interfaces/index.d.ts +44 -134
- package/dist/keys/index.d.ts +1 -77
- package/dist/keys/index.js +8 -190
- package/dist/mutators/{RecordingTransaction.d.ts → RecordingMutation.d.ts} +4 -4
- package/dist/mutators/{RecordingTransaction.js → RecordingMutation.js} +2 -2
- package/dist/mutators/Transaction.d.ts +1 -1
- package/dist/mutators/Transaction.js +1 -1
- package/dist/mutators/UndoManager.d.ts +6 -6
- package/dist/mutators/UndoManager.js +5 -5
- package/dist/mutators/defineMutators.d.ts +3 -3
- package/dist/mutators/defineMutators.js +1 -1
- package/dist/mutators/inverseOp.js +2 -2
- package/dist/mutators/mutateActions.d.ts +3 -3
- package/dist/mutators/mutateActions.js +1 -1
- package/dist/mutators/readerActions.d.ts +1 -1
- package/dist/mutators/undoApply.d.ts +1 -1
- package/dist/mutators/undoApply.js +1 -1
- package/dist/policy/index.d.ts +2 -2
- package/dist/policy/index.js +1 -1
- package/dist/query/client.d.ts +5 -2
- package/dist/query/client.js +10 -9
- package/dist/query/types.d.ts +6 -41
- package/dist/query/types.js +2 -2
- package/dist/react/AbloProvider.d.ts +18 -8
- package/dist/react/AbloProvider.js +10 -9
- package/dist/react/context.d.ts +3 -3
- package/dist/react/context.js +1 -1
- package/dist/react/createAbloReact.d.ts +56 -0
- package/dist/react/createAbloReact.js +51 -0
- package/dist/react/index.d.ts +6 -5
- package/dist/react/index.js +6 -3
- package/dist/react/internalContext.d.ts +1 -1
- package/dist/react/useAblo.d.ts +12 -5
- package/dist/react/useAblo.js +26 -8
- package/dist/react/useCurrentUserId.js +1 -1
- package/dist/react/useErrorListener.js +1 -1
- package/dist/react/useMutationFailureListener.d.ts +2 -2
- package/dist/react/useMutationFailureListener.js +1 -1
- package/dist/react/useMutators.d.ts +3 -3
- package/dist/react/useMutators.js +3 -3
- package/dist/react/useUndoScope.d.ts +5 -5
- package/dist/react/useUndoScope.js +1 -1
- package/dist/schema/coordination.d.ts +69 -10
- package/dist/schema/coordination.js +90 -9
- package/dist/schema/ddl.js +2 -2
- package/dist/schema/diff.d.ts +1 -1
- package/dist/schema/generate.js +1 -1
- package/dist/schema/index.d.ts +11 -10
- package/dist/schema/index.js +22 -18
- package/dist/schema/queries.d.ts +27 -27
- package/dist/schema/queries.js +23 -23
- package/dist/schema/select.d.ts +3 -3
- package/dist/schema/select.js +6 -3
- package/dist/schema/serialize.d.ts +15 -6
- package/dist/schema/serialize.js +20 -3
- package/dist/schema/sugar.d.ts +6 -7
- package/dist/schema/sugar.js +9 -12
- package/dist/schema/syncDeltaRow.d.ts +4 -152
- package/dist/schema/syncDeltaRow.js +4 -105
- package/dist/server/adapter.d.ts +18 -1
- package/dist/server/commit.d.ts +10 -16
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/readConfig.d.ts +1 -1
- package/dist/source/adapter.d.ts +7 -5
- package/dist/source/adapter.js +7 -5
- package/dist/source/adapters/drizzle.d.ts +1 -1
- package/dist/source/adapters/drizzle.js +2 -2
- package/dist/source/adapters/kysely.d.ts +1 -1
- package/dist/source/adapters/kysely.js +1 -1
- package/dist/source/adapters/kyselyMutationCore.d.ts +1 -1
- package/dist/source/adapters/kyselyMutationCore.js +2 -2
- package/dist/source/adapters/memory.js +1 -1
- package/dist/source/adapters/prisma.d.ts +8 -3
- package/dist/source/adapters/prisma.js +1 -1
- package/dist/source/connector.js +1 -1
- package/dist/source/connectorProtocol.d.ts +2 -8
- package/dist/source/connectorProtocol.js +3 -2
- package/dist/source/contract.d.ts +29 -17
- package/dist/source/contract.js +27 -22
- package/dist/source/factory.d.ts +1 -1
- package/dist/source/idempotency.js +2 -2
- package/dist/source/index.d.ts +1 -0
- package/dist/source/index.js +3 -0
- package/dist/source/next.d.ts +1 -1
- package/dist/source/signing.d.ts +9 -2
- package/dist/source/signing.js +4 -1
- package/dist/source/types.d.ts +6 -4
- package/dist/source/types.js +1 -1
- package/dist/{core/storeContract.d.ts → storeContract.d.ts} +6 -6
- package/dist/{core → stores}/DatabaseManager.d.ts +3 -1
- package/dist/{core → stores}/DatabaseManager.js +14 -13
- package/dist/stores/ObjectStore.d.ts +1 -1
- package/dist/{core → stores}/StoreManager.d.ts +9 -26
- package/dist/{core → stores}/StoreManager.js +29 -77
- package/dist/stores/SyncActionStore.d.ts +4 -2
- package/dist/stores/SyncActionStore.js +11 -17
- package/dist/stores/syncAction.d.ts +26 -0
- package/dist/stores/syncAction.js +16 -0
- package/dist/surface.d.ts +3 -3
- package/dist/surface.js +6 -4
- package/dist/sync/BootstrapFetcher.d.ts +127 -6
- package/dist/sync/BootstrapFetcher.js +511 -83
- package/dist/sync/ConnectionManager.d.ts +6 -198
- package/dist/sync/ConnectionManager.js +6 -677
- package/dist/sync/OnDemandLoader.d.ts +5 -2
- package/dist/sync/OnDemandLoader.js +61 -21
- package/dist/sync/SubscriptionManager.d.ts +13 -2
- package/dist/sync/SubscriptionManager.js +23 -5
- package/dist/sync/SyncWebSocket.d.ts +27 -510
- package/dist/sync/SyncWebSocket.js +76 -954
- package/dist/sync/awaitClaimGrant.d.ts +4 -44
- package/dist/sync/awaitClaimGrant.js +4 -109
- package/dist/sync/bootstrapApply.d.ts +3 -0
- package/dist/sync/bootstrapApply.js +2 -2
- package/dist/sync/commitFrames.d.ts +6 -40
- package/dist/sync/commitFrames.js +6 -97
- package/dist/sync/contextPorts.d.ts +18 -0
- package/dist/sync/contextPorts.js +31 -0
- package/dist/sync/createClaimStream.d.ts +5 -49
- package/dist/sync/createClaimStream.js +5 -469
- package/dist/sync/createPresenceStream.d.ts +26 -4
- package/dist/sync/createPresenceStream.js +28 -20
- package/dist/sync/createSnapshot.d.ts +2 -2
- package/dist/sync/createSnapshot.js +1 -1
- package/dist/sync/credentialLifecycle.d.ts +5 -173
- package/dist/sync/credentialLifecycle.js +5 -320
- package/dist/sync/deltaPipeline.d.ts +13 -12
- package/dist/sync/deltaPipeline.js +21 -4
- package/dist/sync/groupChange.d.ts +3 -0
- package/dist/sync/groupChange.js +16 -14
- package/dist/sync/participants.d.ts +24 -6
- package/dist/sync/participants.js +32 -23
- package/dist/sync/schemaDrift.d.ts +55 -0
- package/dist/sync/schemaDrift.js +53 -0
- package/dist/sync/schemas.d.ts +23 -33
- package/dist/sync/schemas.js +29 -20
- package/dist/sync/syncPlan.d.ts +3 -3
- package/dist/sync/wsFrameHandlers.d.ts +6 -114
- package/dist/sync/wsFrameHandlers.js +6 -392
- package/dist/syncLog/contract.d.ts +20 -0
- package/dist/syncLog/contract.js +19 -0
- package/dist/syncLog/index.d.ts +1 -0
- package/dist/syncLog/index.js +1 -0
- package/dist/transaction/ablo.d.ts +88 -0
- package/dist/transaction/ablo.js +33 -0
- package/dist/{client/auth.d.ts → transaction/auth/apiKey.d.ts} +43 -8
- package/dist/{client/auth.js → transaction/auth/apiKey.js} +19 -0
- package/dist/transaction/auth/bootstrapScope.d.ts +15 -0
- package/dist/transaction/auth/bootstrapScope.js +1 -0
- package/dist/transaction/auth/capability.d.ts +212 -0
- package/dist/transaction/auth/capability.js +224 -0
- package/dist/{auth → transaction/auth}/credentialSource.d.ts +8 -1
- package/dist/{client → transaction/auth}/identity.d.ts +8 -7
- package/dist/{client → transaction/auth}/identity.js +1 -1
- package/dist/transaction/auth/index.d.ts +162 -0
- package/dist/transaction/auth/index.js +304 -0
- package/dist/{auth → transaction/auth}/schemas.d.ts +1 -1
- package/dist/{auth → transaction/auth}/schemas.js +13 -13
- package/dist/{client → transaction/auth}/sessionMint.d.ts +8 -8
- package/dist/{client → transaction/auth}/sessionMint.js +4 -7
- package/dist/transaction/coordination/awaitClaimGrant.d.ts +56 -0
- package/dist/transaction/coordination/awaitClaimGrant.js +124 -0
- package/dist/{client → transaction/coordination}/claimHeartbeatLoop.d.ts +34 -0
- package/dist/{client → transaction/coordination}/claimHeartbeatLoop.js +20 -0
- package/dist/transaction/coordination/claimMeta.d.ts +49 -0
- package/dist/transaction/coordination/claimMeta.js +52 -0
- package/dist/transaction/coordination/createClaimStream.d.ts +64 -0
- package/dist/transaction/coordination/createClaimStream.js +475 -0
- package/dist/transaction/coordination/events.d.ts +74 -0
- package/dist/transaction/coordination/events.js +7 -0
- package/dist/transaction/coordination/index.d.ts +19 -0
- package/dist/transaction/coordination/index.js +45 -0
- package/dist/transaction/coordination/locator.d.ts +104 -0
- package/dist/transaction/coordination/locator.js +102 -0
- package/dist/transaction/coordination/schema.d.ts +1536 -0
- package/dist/transaction/coordination/schema.js +1177 -0
- package/dist/transaction/coordination/targetConflict.d.ts +2 -0
- package/dist/transaction/coordination/targetConflict.js +107 -0
- package/dist/{coordination → transaction/coordination}/trace.d.ts +7 -18
- package/dist/{coordination → transaction/coordination}/trace.js +18 -25
- package/dist/transaction/durableWrites.d.ts +62 -0
- package/dist/{client → transaction}/durableWrites.js +28 -3
- package/dist/transaction/environment.d.ts +105 -0
- package/dist/transaction/environment.js +108 -0
- package/dist/{errorCodes.d.ts → transaction/errorCodes.d.ts} +12 -12
- package/dist/{errorCodes.js → transaction/errorCodes.js} +45 -18
- package/dist/{errors.d.ts → transaction/errors.d.ts} +37 -13
- package/dist/{errors.js → transaction/errors.js} +85 -16
- package/dist/transaction/footprint.d.ts +111 -0
- package/dist/transaction/footprint.js +0 -0
- package/dist/transaction/index.d.ts +20 -0
- package/dist/transaction/index.js +20 -0
- package/dist/transaction/keys/index.d.ts +87 -0
- package/dist/transaction/keys/index.js +207 -0
- package/dist/transaction/log/syncDeltaRow.d.ts +158 -0
- package/dist/transaction/log/syncDeltaRow.js +95 -0
- package/dist/{sync/syncPosition.d.ts → transaction/logPosition.d.ts} +22 -8
- package/dist/{sync/syncPosition.js → transaction/logPosition.js} +15 -6
- package/dist/transaction/logger.d.ts +16 -0
- package/dist/transaction/logger.js +7 -0
- package/dist/transaction/observability.d.ts +53 -0
- package/dist/transaction/observability.js +19 -0
- package/dist/transaction/plugin.d.ts +285 -0
- package/dist/transaction/plugin.js +106 -0
- package/dist/{policy → transaction/policy}/types.d.ts +3 -3
- package/dist/{policy → transaction/policy}/types.js +2 -0
- package/dist/transaction/resources/httpResources.d.ts +321 -0
- package/dist/transaction/resources/httpResources.js +7 -0
- package/dist/transaction/resources/modelOperations.d.ts +427 -0
- package/dist/transaction/resources/modelOperations.js +12 -0
- package/dist/transaction/resources/mutationOptions.d.ts +66 -0
- package/dist/transaction/resources/mutationOptions.js +9 -0
- package/dist/transaction/resources/where.d.ts +101 -0
- package/dist/transaction/resources/where.js +115 -0
- package/dist/{client → transaction/resources}/writeOptionsSchema.d.ts +2 -6
- package/dist/{client → transaction/resources}/writeOptionsSchema.js +9 -5
- package/dist/{schema → transaction/schema}/field.d.ts +17 -23
- package/dist/{schema → transaction/schema}/field.js +5 -5
- package/dist/transaction/schema/fieldRef.d.ts +38 -0
- package/dist/transaction/schema/fieldRef.js +11 -0
- package/dist/transaction/schema/loadStrategy.d.ts +45 -0
- package/dist/transaction/schema/loadStrategy.js +46 -0
- package/dist/{schema → transaction/schema}/model.d.ts +50 -35
- package/dist/{schema → transaction/schema}/model.js +30 -20
- package/dist/transaction/schema/openapi.d.ts +58 -0
- package/dist/transaction/schema/openapi.js +501 -0
- package/dist/{schema → transaction/schema}/relation.d.ts +21 -16
- package/dist/{schema → transaction/schema}/relation.js +7 -7
- package/dist/{schema → transaction/schema}/residency.d.ts +0 -9
- package/dist/{schema → transaction/schema}/residency.js +0 -5
- package/dist/{schema → transaction/schema}/roles.d.ts +5 -5
- package/dist/{schema → transaction/schema}/roles.js +5 -5
- package/dist/{schema → transaction/schema}/schema.d.ts +39 -10
- package/dist/{schema → transaction/schema}/schema.js +24 -3
- package/dist/{schema → transaction/schema}/tenancy.d.ts +1 -1
- package/dist/{schema → transaction/schema}/tenancy.js +7 -4
- package/dist/transaction/transactionLayer.d.ts +82 -0
- package/dist/transaction/transactionLayer.js +24 -0
- package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.d.ts +5 -6
- package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.js +9 -13
- package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.d.ts +9 -2
- package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.js +5 -9
- package/dist/{transactions/durableWriteStore.d.ts → transaction/transactions/settlement/pendingWrite.d.ts} +11 -37
- package/dist/transaction/transactions/settlement/pendingWrite.js +20 -0
- package/dist/transaction/transport/commitFrames.d.ts +90 -0
- package/dist/transaction/transport/commitFrames.js +134 -0
- package/dist/transaction/transport/connectionManager.d.ts +215 -0
- package/dist/transaction/transport/connectionManager.js +673 -0
- package/dist/transaction/transport/credentialLifecycle.d.ts +177 -0
- package/dist/transaction/transport/credentialLifecycle.js +324 -0
- package/dist/{sync → transaction/transport}/heartbeat.d.ts +3 -1
- package/dist/{sync → transaction/transport}/heartbeat.js +6 -4
- package/dist/transaction/transport/httpClient.d.ts +131 -0
- package/dist/{client → transaction/transport}/httpClient.js +6 -5
- package/dist/transaction/transport/httpOptions.d.ts +33 -0
- package/dist/transaction/transport/httpOptions.js +12 -0
- package/dist/{client → transaction/transport}/httpTransport.js +295 -97
- package/dist/{sync/NetworkProbe.d.ts → transaction/transport/networkProbe.d.ts} +7 -4
- package/dist/{sync/NetworkProbe.js → transaction/transport/networkProbe.js} +14 -13
- package/dist/transaction/transport/wsFrameHandlers.d.ts +128 -0
- package/dist/transaction/transport/wsFrameHandlers.js +429 -0
- package/dist/transaction/transport/wsTransport.d.ts +574 -0
- package/dist/transaction/transport/wsTransport.js +1023 -0
- package/dist/transaction/types/assertExact.d.ts +17 -0
- package/dist/transaction/types/assertExact.js +1 -0
- package/dist/{types → transaction/types}/global.d.ts +17 -2
- package/dist/{types → transaction/types}/global.js +2 -1
- package/dist/{types → transaction/types}/index.d.ts +14 -46
- package/dist/{types → transaction/types}/index.js +7 -16
- package/dist/{types → transaction/types}/streams.d.ts +73 -45
- package/dist/transaction/utils/duration.d.ts +50 -0
- package/dist/{utils → transaction/utils}/duration.js +32 -0
- package/dist/{utils → transaction/utils}/json.d.ts +18 -0
- package/dist/transaction/utils/json.js +276 -0
- package/dist/transaction/wire/accountResponses.d.ts +420 -0
- package/dist/transaction/wire/accountResponses.js +290 -0
- package/dist/transaction/wire/auth.d.ts +56 -0
- package/dist/transaction/wire/auth.js +63 -0
- package/dist/transaction/wire/claimEvent.d.ts +76 -0
- package/dist/transaction/wire/claimEvent.js +73 -0
- package/dist/transaction/wire/claims.d.ts +530 -0
- package/dist/transaction/wire/claims.js +327 -0
- package/dist/{wire → transaction/wire}/commit.d.ts +125 -193
- package/dist/{wire → transaction/wire}/commit.js +68 -47
- package/dist/{wire → transaction/wire}/delta.d.ts +66 -17
- package/dist/{wire → transaction/wire}/delta.js +37 -13
- package/dist/transaction/wire/errorEnvelope.d.ts +72 -0
- package/dist/{wire → transaction/wire}/errorEnvelope.js +36 -5
- package/dist/transaction/wire/feedCursor.d.ts +60 -0
- package/dist/transaction/wire/feedCursor.js +82 -0
- package/dist/transaction/wire/feedEvent.d.ts +204 -0
- package/dist/transaction/wire/feedEvent.js +65 -0
- package/dist/transaction/wire/frames.d.ts +194 -0
- package/dist/transaction/wire/frames.js +50 -0
- package/dist/transaction/wire/inboundFrames.d.ts +562 -0
- package/dist/transaction/wire/inboundFrames.js +116 -0
- package/dist/transaction/wire/index.d.ts +54 -0
- package/dist/transaction/wire/index.js +83 -0
- package/dist/{wire → transaction/wire}/listEnvelope.d.ts +13 -14
- package/dist/transaction/wire/listEnvelope.js +42 -0
- package/dist/transaction/wire/modelMutations.d.ts +31 -0
- package/dist/transaction/wire/modelMutations.js +52 -0
- package/dist/transaction/wire/modelResponses.d.ts +85 -0
- package/dist/transaction/wire/modelResponses.js +43 -0
- package/dist/transaction/wire/modelShape.d.ts +78 -0
- package/dist/transaction/wire/modelShape.js +74 -0
- package/dist/transactions/{TransactionQueue.d.ts → mutations/MutationQueue.d.ts} +85 -38
- package/dist/transactions/{TransactionQueue.js → mutations/MutationQueue.js} +141 -80
- package/dist/transactions/{TransactionStore.d.ts → mutations/MutationStore.d.ts} +8 -8
- package/dist/transactions/{TransactionStore.js → mutations/MutationStore.js} +2 -2
- package/dist/transactions/{coalesceRules.d.ts → mutations/coalesceRules.d.ts} +10 -10
- package/dist/transactions/{coalesceRules.js → mutations/coalesceRules.js} +1 -1
- package/dist/transactions/mutations/commitLatency.d.ts +52 -0
- package/dist/transactions/mutations/commitLatency.js +130 -0
- package/dist/transactions/{commitOutboxStore.d.ts → mutations/commitOutboxStore.d.ts} +1 -5
- package/dist/transactions/{commitOutboxStore.js → mutations/commitOutboxStore.js} +1 -1
- package/dist/transactions/{commitPayload.d.ts → mutations/commitPayload.d.ts} +18 -16
- package/dist/transactions/{commitPayload.js → mutations/commitPayload.js} +15 -15
- package/dist/transactions/{deltaConfirmation.d.ts → mutations/deltaConfirmation.d.ts} +15 -11
- package/dist/transactions/{deltaConfirmation.js → mutations/deltaConfirmation.js} +14 -12
- package/dist/transactions/mutations/durableWriteStore.d.ts +14 -0
- package/dist/transactions/mutations/durableWriteStore.js +12 -0
- package/dist/transactions/{optimisticApply.d.ts → mutations/optimisticApply.d.ts} +7 -7
- package/dist/transactions/{replayValidation.d.ts → mutations/replayValidation.d.ts} +4 -3
- package/dist/transactions/{replayValidation.js → mutations/replayValidation.js} +7 -5
- package/dist/utils/mobxSetup.d.ts +1 -1
- package/dist/utils/mobxSetup.js +5 -2
- package/dist/{core → views}/QueryView.d.ts +2 -2
- package/dist/{core → views}/QueryView.js +2 -2
- package/dist/{core → views}/ViewRegistry.d.ts +1 -1
- package/dist/{core/queryUtils.d.ts → views/incrementalView.d.ts} +6 -6
- package/dist/{core/queryUtils.js → views/incrementalView.js} +6 -6
- package/dist/webhooks/events.d.ts +2 -2
- package/dist/wire/index.d.ts +1 -34
- package/dist/wire/index.js +8 -49
- package/docs/agent-messaging.md +3 -3
- package/docs/agents.md +20 -13
- package/docs/api-keys.md +14 -10
- package/docs/api.md +27 -61
- package/docs/audit.md +6 -3
- package/docs/cli.md +41 -13
- package/docs/client-behavior.md +11 -9
- package/docs/concurrency-convention.md +49 -57
- package/docs/coordination.md +283 -121
- package/docs/data-sources.md +7 -5
- package/docs/debugging.md +39 -15
- package/docs/deployment.md +267 -0
- package/docs/examples/agent-human.md +49 -42
- package/docs/examples/ai-sdk-tool.md +69 -44
- package/docs/examples/existing-python-backend.md +8 -6
- package/docs/examples/nextjs.md +129 -47
- package/docs/examples/scoped-agent.md +46 -45
- package/docs/examples/server-agent.md +46 -26
- package/docs/groups.md +87 -30
- package/docs/guarantees.md +41 -12
- package/docs/how-it-works.md +38 -12
- package/docs/idempotency.md +126 -0
- package/docs/identity.md +77 -74
- package/docs/index.md +172 -86
- package/docs/integration-guide.md +31 -19
- package/docs/mcp.md +46 -21
- package/docs/migration.md +95 -18
- package/docs/operating-on-your-database.md +3 -1
- package/docs/projects.md +3 -1
- package/docs/quickstart.md +22 -5
- package/docs/react.md +31 -18
- package/docs/schema-contract.md +5 -3
- package/docs/session-settings.md +108 -0
- package/docs/sessions.md +4 -2
- package/docs/webhooks.md +12 -10
- package/llms.txt +48 -18
- package/package.json +21 -26
- package/dist/agent/Agent.d.ts +0 -366
- package/dist/agent/Agent.js +0 -514
- package/dist/agent/index.d.ts +0 -115
- package/dist/agent/index.js +0 -128
- package/dist/agent/session.d.ts +0 -93
- package/dist/agent/session.js +0 -149
- package/dist/agent/types.d.ts +0 -68
- package/dist/agent/types.js +0 -9
- package/dist/cli.cjs +0 -286329
- package/dist/client/durableWrites.d.ts +0 -21
- package/dist/client/httpClient.d.ts +0 -80
- package/dist/coordination/schema.d.ts +0 -722
- package/dist/coordination/schema.js +0 -578
- package/dist/schema/openapi.d.ts +0 -29
- package/dist/schema/openapi.js +0 -124
- 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/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 -192
- 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 -71
- 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/transactions/durableWriteStore.js +0 -30
- package/dist/utils/duration.d.ts +0 -25
- package/dist/utils/json.js +0 -88
- package/dist/wire/errorEnvelope.d.ts +0 -55
- package/dist/wire/frames.d.ts +0 -197
- package/dist/wire/frames.js +0 -49
- package/dist/wire/listEnvelope.js +0 -18
- package/docs/interaction-model.md +0 -97
- /package/dist/{core → query}/QueryProcessor.d.ts +0 -0
- /package/dist/{core → query}/QueryProcessor.js +0 -0
- /package/dist/{core/storeContract.js → storeContract.js} +0 -0
- /package/dist/{core → stores}/openIDBWithTimeout.d.ts +0 -0
- /package/dist/{core → stores}/openIDBWithTimeout.js +0 -0
- /package/dist/{client → transaction/auth}/credentialEndpoint.d.ts +0 -0
- /package/dist/{client → transaction/auth}/credentialEndpoint.js +0 -0
- /package/dist/{auth → transaction/auth}/credentialPolicy.d.ts +0 -0
- /package/dist/{auth → transaction/auth}/credentialPolicy.js +0 -0
- /package/dist/{auth → transaction/auth}/credentialSource.js +0 -0
- /package/dist/{client → transaction/auth}/hostedEndpoints.d.ts +0 -0
- /package/dist/{client → transaction/auth}/hostedEndpoints.js +0 -0
- /package/dist/{client → transaction}/persistence.d.ts +0 -0
- /package/dist/{client → transaction}/persistence.js +0 -0
- /package/dist/{client → transaction/resources}/functionalUpdate.d.ts +0 -0
- /package/dist/{client → transaction/resources}/functionalUpdate.js +0 -0
- /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.d.ts +0 -0
- /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.js +0 -0
- /package/dist/{client → transaction/transport}/httpTransport.d.ts +0 -0
- /package/dist/{types → transaction/types}/modelData.d.ts +0 -0
- /package/dist/{types → transaction/types}/modelData.js +0 -0
- /package/dist/{types → transaction/types}/participant.d.ts +0 -0
- /package/dist/{types → transaction/types}/participant.js +0 -0
- /package/dist/{types → transaction/types}/streams.js +0 -0
- /package/dist/{utils → transaction/utils}/asyncIterator.d.ts +0 -0
- /package/dist/{utils → transaction/utils}/asyncIterator.js +0 -0
- /package/dist/{wire → transaction/wire}/bootstrapReason.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/bootstrapReason.js +0 -0
- /package/dist/{wire → transaction/wire}/protocol.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/protocol.js +0 -0
- /package/dist/{wire → transaction/wire}/protocolVersion.d.ts +0 -0
- /package/dist/{wire → transaction/wire}/protocolVersion.js +0 -0
- /package/dist/transactions/{UnconfirmedWrites.d.ts → mutations/UnconfirmedWrites.d.ts} +0 -0
- /package/dist/transactions/{UnconfirmedWrites.js → mutations/UnconfirmedWrites.js} +0 -0
- /package/dist/transactions/{optimisticApply.js → mutations/optimisticApply.js} +0 -0
- /package/dist/{core → views}/ViewRegistry.js +0 -0
|
@@ -3,18 +3,18 @@
|
|
|
3
3
|
* The status index keeps the queue's hot paths — such as `getByStatus('pending')`
|
|
4
4
|
* on every batch and coalesce decision — proportional to the number of
|
|
5
5
|
* transactions in that status rather than the total across all statuses.
|
|
6
|
-
* {@link
|
|
6
|
+
* {@link MutationQueue} owns an instance and routes every status change
|
|
7
7
|
* through {@link updateStatus}, which keeps the two indexes consistent.
|
|
8
8
|
*/
|
|
9
|
-
import type {
|
|
10
|
-
export declare class
|
|
9
|
+
import type { QueuedMutation } from './commitPayload.js';
|
|
10
|
+
export declare class MutationStore {
|
|
11
11
|
private transactions;
|
|
12
12
|
private byStatus;
|
|
13
|
-
add(transaction:
|
|
14
|
-
get(id: string):
|
|
15
|
-
updateStatus(id: string, newStatus:
|
|
16
|
-
getByStatus(status:
|
|
13
|
+
add(transaction: QueuedMutation): void;
|
|
14
|
+
get(id: string): QueuedMutation | undefined;
|
|
15
|
+
updateStatus(id: string, newStatus: QueuedMutation['status']): void;
|
|
16
|
+
getByStatus(status: QueuedMutation['status']): QueuedMutation[];
|
|
17
17
|
remove(id: string): void;
|
|
18
18
|
clear(): void;
|
|
19
|
-
getAll():
|
|
19
|
+
getAll(): QueuedMutation[];
|
|
20
20
|
}
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
* The status index keeps the queue's hot paths — such as `getByStatus('pending')`
|
|
4
4
|
* on every batch and coalesce decision — proportional to the number of
|
|
5
5
|
* transactions in that status rather than the total across all statuses.
|
|
6
|
-
* {@link
|
|
6
|
+
* {@link MutationQueue} owns an instance and routes every status change
|
|
7
7
|
* through {@link updateStatus}, which keeps the two indexes consistent.
|
|
8
8
|
*/
|
|
9
|
-
export class
|
|
9
|
+
export class MutationStore {
|
|
10
10
|
transactions = new Map();
|
|
11
11
|
byStatus = new Map();
|
|
12
12
|
add(transaction) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The queue's rules for coalescing operations that touch the same row, so their
|
|
3
|
-
* causal order is preserved. {@link
|
|
3
|
+
* causal order is preserved. {@link MutationQueue} calls into these through a
|
|
4
4
|
* small store-shaped interface:
|
|
5
5
|
*
|
|
6
6
|
* - Create-then-delete cancellation ({@link takeUnsentCreateForModel}):
|
|
@@ -16,11 +16,11 @@
|
|
|
16
16
|
* The queue keeps the `enqueue` and `delete` methods that orchestrate optimistic
|
|
17
17
|
* state and events; these functions hold only the coalescing rules.
|
|
18
18
|
*/
|
|
19
|
-
import type { MutationInput,
|
|
20
|
-
/** The subset of {@link
|
|
21
|
-
export interface
|
|
22
|
-
get(id: string):
|
|
23
|
-
getByStatus(status:
|
|
19
|
+
import type { MutationInput, QueuedMutation } from './commitPayload.js';
|
|
20
|
+
/** The subset of {@link MutationStore} that the coalescing rules read. */
|
|
21
|
+
export interface MutationStoreLike {
|
|
22
|
+
get(id: string): QueuedMutation | undefined;
|
|
23
|
+
getByStatus(status: QueuedMutation['status']): QueuedMutation[];
|
|
24
24
|
}
|
|
25
25
|
export declare const entityKey: (modelName: string, modelId: string) => string;
|
|
26
26
|
/**
|
|
@@ -30,25 +30,25 @@ export declare const entityKey: (modelName: string, modelId: string) => string;
|
|
|
30
30
|
* held it, so the caller can cancel it rather than send a create followed by a
|
|
31
31
|
* delete.
|
|
32
32
|
*/
|
|
33
|
-
export declare function takeUnsentCreateForModel(staged:
|
|
33
|
+
export declare function takeUnsentCreateForModel(staged: QueuedMutation[], queued: QueuedMutation[], store: Pick<MutationStoreLike, 'getByStatus'>, modelName: string, modelId: string): QueuedMutation | undefined;
|
|
34
34
|
/**
|
|
35
35
|
* Returns the most recent in-flight create for the given model and id that a
|
|
36
36
|
* delete must wait behind, or undefined if there is none. A pending create that
|
|
37
37
|
* has never been attempted is not a barrier, because it can be cancelled
|
|
38
38
|
* instead; once a create has been sent, even a retry-pending one is a barrier.
|
|
39
39
|
*/
|
|
40
|
-
export declare function findCreateBarrierForDelete(store: Pick<
|
|
40
|
+
export declare function findCreateBarrierForDelete(store: Pick<MutationStoreLike, 'getByStatus'>, modelName: string, modelId: string): QueuedMutation | undefined;
|
|
41
41
|
/**
|
|
42
42
|
* Parks a delete until the create for the same row settles, keyed by the
|
|
43
43
|
* create's model and id. {@link releaseDeferredDeletesForCreate} re-enqueues
|
|
44
44
|
* the parked deletes once that create completes.
|
|
45
45
|
*/
|
|
46
|
-
export declare function deferDeleteUntilCreateSettles(deferredDeletesByCreate: Map<string,
|
|
46
|
+
export declare function deferDeleteUntilCreateSettles(deferredDeletesByCreate: Map<string, QueuedMutation[]>, createTransaction: QueuedMutation, deleteTransaction: QueuedMutation): void;
|
|
47
47
|
/**
|
|
48
48
|
* Re-enqueues the deletes parked behind a create once that create settles,
|
|
49
49
|
* skipping any whose status is no longer pending.
|
|
50
50
|
*/
|
|
51
|
-
export declare function releaseDeferredDeletesForCreate(deferredDeletesByCreate: Map<string,
|
|
51
|
+
export declare function releaseDeferredDeletesForCreate(deferredDeletesByCreate: Map<string, QueuedMutation[]>, store: Pick<MutationStoreLike, 'get'>, enqueue: (transaction: QueuedMutation) => void, createTransaction: QueuedMutation): void;
|
|
52
52
|
/**
|
|
53
53
|
* Merges two update payloads for the same row into one. Later values win, with
|
|
54
54
|
* one exception: a `metadata` field is deep-merged as an object — parsing it
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The queue's rules for coalescing operations that touch the same row, so their
|
|
3
|
-
* causal order is preserved. {@link
|
|
3
|
+
* causal order is preserved. {@link MutationQueue} calls into these through a
|
|
4
4
|
* small store-shaped interface:
|
|
5
5
|
*
|
|
6
6
|
* - Create-then-delete cancellation ({@link takeUnsentCreateForModel}):
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Commit latency — how long a user's edit actually takes to land.
|
|
3
|
+
*
|
|
4
|
+
* The engine has never measured this. HUDs and dashboards reach for
|
|
5
|
+
* `window.fetch` timings, which the sync engine's WebSocket never touches, so
|
|
6
|
+
* the latency a user sees reported while editing has had nothing to do with
|
|
7
|
+
* the writes they are making. This module closes that gap without adding a
|
|
8
|
+
* single timestamp to the hot path: `MutationQueue` already emits the commit
|
|
9
|
+
* lifecycle, and the events already carry the correlation key.
|
|
10
|
+
*
|
|
11
|
+
* Three events, two intervals:
|
|
12
|
+
*
|
|
13
|
+
* commit:staging ──sealMs──▶ commit:created ──ackMs──▶ transaction:completed
|
|
14
|
+
*
|
|
15
|
+
* - `sealMs` is **local** — writing the durable envelope before the commit is
|
|
16
|
+
* allowed onto the wire. Slow here means storage (IndexedDB), not network.
|
|
17
|
+
* - `ackMs` is **remote** — dispatch, round-trip, and server work. For a
|
|
18
|
+
* commit routed at a connected source this also spans the wait for the
|
|
19
|
+
* correlated echo that promotes `queued` to `confirmed`, so it answers
|
|
20
|
+
* "when did my edit become real" rather than raw socket round-trip. Read a
|
|
21
|
+
* large `ackMs` against a small `sealMs` as a network or replication cost.
|
|
22
|
+
*
|
|
23
|
+
* Correlation is by `clientTxId`: `MutationQueue` uses it as the transaction
|
|
24
|
+
* id verbatim, so the staging event and the completion event share one key.
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* The slice of an event emitter this module needs. Declared structurally so a
|
|
28
|
+
* plain object can stand in under test — `MutationQueue` satisfies it by
|
|
29
|
+
* extending `EventEmitter`.
|
|
30
|
+
*/
|
|
31
|
+
export interface CommitEventSource {
|
|
32
|
+
on(event: string, listener: (payload: unknown) => void): unknown;
|
|
33
|
+
off(event: string, listener: (payload: unknown) => void): unknown;
|
|
34
|
+
}
|
|
35
|
+
/** One completed commit, broken into its local and remote halves. */
|
|
36
|
+
export interface CommitLatencySample {
|
|
37
|
+
/** The commit's `clientTxId`, identical to its transaction id. */
|
|
38
|
+
clientTxId: string;
|
|
39
|
+
/** Milliseconds sealing the durable envelope locally. */
|
|
40
|
+
sealMs: number;
|
|
41
|
+
/** Milliseconds from sealed envelope to acknowledgement. */
|
|
42
|
+
ackMs: number;
|
|
43
|
+
/** Milliseconds from staging to acknowledgement — `sealMs + ackMs`. */
|
|
44
|
+
totalMs: number;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Pair commit lifecycle events into latency samples. Returns an unsubscribe
|
|
48
|
+
* function that also drops any still-pending timings.
|
|
49
|
+
*
|
|
50
|
+
* `onSample` fires once per commit that completes, in completion order.
|
|
51
|
+
*/
|
|
52
|
+
export declare function observeCommitLatency(source: CommitEventSource, onSample: (sample: CommitLatencySample) => void): () => void;
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Commit latency — how long a user's edit actually takes to land.
|
|
3
|
+
*
|
|
4
|
+
* The engine has never measured this. HUDs and dashboards reach for
|
|
5
|
+
* `window.fetch` timings, which the sync engine's WebSocket never touches, so
|
|
6
|
+
* the latency a user sees reported while editing has had nothing to do with
|
|
7
|
+
* the writes they are making. This module closes that gap without adding a
|
|
8
|
+
* single timestamp to the hot path: `MutationQueue` already emits the commit
|
|
9
|
+
* lifecycle, and the events already carry the correlation key.
|
|
10
|
+
*
|
|
11
|
+
* Three events, two intervals:
|
|
12
|
+
*
|
|
13
|
+
* commit:staging ──sealMs──▶ commit:created ──ackMs──▶ transaction:completed
|
|
14
|
+
*
|
|
15
|
+
* - `sealMs` is **local** — writing the durable envelope before the commit is
|
|
16
|
+
* allowed onto the wire. Slow here means storage (IndexedDB), not network.
|
|
17
|
+
* - `ackMs` is **remote** — dispatch, round-trip, and server work. For a
|
|
18
|
+
* commit routed at a connected source this also spans the wait for the
|
|
19
|
+
* correlated echo that promotes `queued` to `confirmed`, so it answers
|
|
20
|
+
* "when did my edit become real" rather than raw socket round-trip. Read a
|
|
21
|
+
* large `ackMs` against a small `sealMs` as a network or replication cost.
|
|
22
|
+
*
|
|
23
|
+
* Correlation is by `clientTxId`: `MutationQueue` uses it as the transaction
|
|
24
|
+
* id verbatim, so the staging event and the completion event share one key.
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* Cap on commits awaiting completion. A commit whose completion never arrives
|
|
28
|
+
* (connection dropped mid-flight, retry abandoned) would otherwise pin its
|
|
29
|
+
* entry forever, so the map is bounded rather than trusted to drain.
|
|
30
|
+
*/
|
|
31
|
+
const MAX_PENDING_COMMITS = 256;
|
|
32
|
+
function nowMs() {
|
|
33
|
+
return typeof performance !== 'undefined' ? performance.now() : Date.now();
|
|
34
|
+
}
|
|
35
|
+
/** Read `clientTxId` off a `commit:*` payload, or null if it isn't shaped so. */
|
|
36
|
+
function readClientTxId(payload) {
|
|
37
|
+
if (typeof payload !== 'object' || payload === null)
|
|
38
|
+
return null;
|
|
39
|
+
const { clientTxId } = payload;
|
|
40
|
+
return typeof clientTxId === 'string' ? clientTxId : null;
|
|
41
|
+
}
|
|
42
|
+
/** Read `id` off a transaction payload (`transaction:completed` sends the tx). */
|
|
43
|
+
function readTransactionId(payload) {
|
|
44
|
+
if (typeof payload !== 'object' || payload === null)
|
|
45
|
+
return null;
|
|
46
|
+
const { id } = payload;
|
|
47
|
+
return typeof id === 'string' ? id : null;
|
|
48
|
+
}
|
|
49
|
+
/** `transaction:failed` wraps the transaction rather than sending it bare. */
|
|
50
|
+
function readFailedTransactionId(payload) {
|
|
51
|
+
if (typeof payload !== 'object' || payload === null)
|
|
52
|
+
return null;
|
|
53
|
+
return readTransactionId(payload.transaction);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Pair commit lifecycle events into latency samples. Returns an unsubscribe
|
|
57
|
+
* function that also drops any still-pending timings.
|
|
58
|
+
*
|
|
59
|
+
* `onSample` fires once per commit that completes, in completion order.
|
|
60
|
+
*/
|
|
61
|
+
export function observeCommitLatency(source, onSample) {
|
|
62
|
+
const pending = new Map();
|
|
63
|
+
const handleStaging = (payload) => {
|
|
64
|
+
const id = readClientTxId(payload);
|
|
65
|
+
if (id === null)
|
|
66
|
+
return;
|
|
67
|
+
// Map preserves insertion order, so the first key is the stalest entry.
|
|
68
|
+
if (pending.size >= MAX_PENDING_COMMITS) {
|
|
69
|
+
const oldest = pending.keys().next();
|
|
70
|
+
if (!oldest.done)
|
|
71
|
+
pending.delete(oldest.value);
|
|
72
|
+
}
|
|
73
|
+
pending.set(id, { stagedAt: nowMs(), sealedAt: null });
|
|
74
|
+
};
|
|
75
|
+
const handleCreated = (payload) => {
|
|
76
|
+
const id = readClientTxId(payload);
|
|
77
|
+
if (id === null)
|
|
78
|
+
return;
|
|
79
|
+
const timing = pending.get(id);
|
|
80
|
+
if (timing === undefined)
|
|
81
|
+
return;
|
|
82
|
+
timing.sealedAt = nowMs();
|
|
83
|
+
};
|
|
84
|
+
const handleCompleted = (payload) => {
|
|
85
|
+
const id = readTransactionId(payload);
|
|
86
|
+
if (id === null)
|
|
87
|
+
return;
|
|
88
|
+
const timing = pending.get(id);
|
|
89
|
+
// `transaction:completed` also fires for local (non-commit) transactions
|
|
90
|
+
// and for mutation-log replay. Only ids we staged are commits, so an
|
|
91
|
+
// absent entry is the normal way those are filtered out.
|
|
92
|
+
if (timing === undefined)
|
|
93
|
+
return;
|
|
94
|
+
pending.delete(id);
|
|
95
|
+
const completedAt = nowMs();
|
|
96
|
+
// A commit can complete without an observed seal only if the listener was
|
|
97
|
+
// attached mid-flight; attributing the whole span to `ackMs` keeps
|
|
98
|
+
// `sealMs + ackMs === totalMs` true rather than reporting a bogus seal.
|
|
99
|
+
const sealedAt = timing.sealedAt ?? timing.stagedAt;
|
|
100
|
+
onSample({
|
|
101
|
+
clientTxId: id,
|
|
102
|
+
sealMs: sealedAt - timing.stagedAt,
|
|
103
|
+
ackMs: completedAt - sealedAt,
|
|
104
|
+
totalMs: completedAt - timing.stagedAt,
|
|
105
|
+
});
|
|
106
|
+
};
|
|
107
|
+
const handleSealFailed = (payload) => {
|
|
108
|
+
const id = readClientTxId(payload);
|
|
109
|
+
if (id !== null)
|
|
110
|
+
pending.delete(id);
|
|
111
|
+
};
|
|
112
|
+
const handleFailed = (payload) => {
|
|
113
|
+
const id = readFailedTransactionId(payload);
|
|
114
|
+
if (id !== null)
|
|
115
|
+
pending.delete(id);
|
|
116
|
+
};
|
|
117
|
+
source.on('commit:staging', handleStaging);
|
|
118
|
+
source.on('commit:created', handleCreated);
|
|
119
|
+
source.on('commit:seal_failed', handleSealFailed);
|
|
120
|
+
source.on('transaction:completed', handleCompleted);
|
|
121
|
+
source.on('transaction:failed', handleFailed);
|
|
122
|
+
return () => {
|
|
123
|
+
source.off('commit:staging', handleStaging);
|
|
124
|
+
source.off('commit:created', handleCreated);
|
|
125
|
+
source.off('commit:seal_failed', handleSealFailed);
|
|
126
|
+
source.off('transaction:completed', handleCompleted);
|
|
127
|
+
source.off('transaction:failed', handleFailed);
|
|
128
|
+
pending.clear();
|
|
129
|
+
};
|
|
130
|
+
}
|
|
@@ -3,13 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Browser clients use {@link DatabaseCommitOutboxStore}. Agent/Node hosts can
|
|
5
5
|
* inject a workflow-, SQLite-, or filesystem-backed implementation without
|
|
6
|
-
* coupling
|
|
6
|
+
* coupling MutationQueue to the browser database/cache implementation.
|
|
7
7
|
*/
|
|
8
8
|
import type { DurableWriteStore, PendingWrite } from './durableWriteStore.js';
|
|
9
|
-
/** @deprecated Use {@link PendingWrite}. */
|
|
10
|
-
export type CommitOutboxRecord = PendingWrite;
|
|
11
|
-
/** @deprecated Use {@link DurableWriteStore}. */
|
|
12
|
-
export type CommitOutboxStore = DurableWriteStore;
|
|
13
9
|
/**
|
|
14
10
|
* The exact subset of the browser `Database` that {@link DatabaseCommitOutboxStore}
|
|
15
11
|
* drives. Typing the adapter to this narrow port instead of importing the
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Browser clients use {@link DatabaseCommitOutboxStore}. Agent/Node hosts can
|
|
5
5
|
* inject a workflow-, SQLite-, or filesystem-backed implementation without
|
|
6
|
-
* coupling
|
|
6
|
+
* coupling MutationQueue to the browser database/cache implementation.
|
|
7
7
|
*/
|
|
8
8
|
/** Strict IndexedDB adapter backed by Database's `__transactions` store. */
|
|
9
9
|
export class DatabaseCommitOutboxStore {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The vocabulary a local transaction uses on the wire. This module defines the
|
|
3
|
-
* {@link
|
|
3
|
+
* {@link QueuedMutation} record and the helpers that turn a transaction into a
|
|
4
4
|
* wire-safe commit operation: schema-field projection
|
|
5
5
|
* ({@link projectCommitPayload}), write-option projection
|
|
6
6
|
* ({@link applyWriteOptions}), foreign-key-aware priority scoring
|
|
@@ -8,9 +8,11 @@
|
|
|
8
8
|
* transport errors. Nothing here holds queue state or timers, so the batched
|
|
9
9
|
* queue path and the HTTP commit path share the same projection.
|
|
10
10
|
*/
|
|
11
|
-
import {
|
|
12
|
-
import
|
|
13
|
-
import type {
|
|
11
|
+
import type { RuntimeContext } from '../../RuntimeContext.js';
|
|
12
|
+
import { MutationOperationType } from '../../transaction/types/index.js';
|
|
13
|
+
import type { OnStaleMode } from '../../transaction/coordination/schema.js';
|
|
14
|
+
import type { MutationOptions, WriteOptions } from '../../interfaces/index.js';
|
|
15
|
+
import type { CommitEnvelopeMember } from '../../transaction/transactions/settlement/commitEnvelope.js';
|
|
14
16
|
export interface UserContext {
|
|
15
17
|
userId: string;
|
|
16
18
|
organizationId: string;
|
|
@@ -25,22 +27,22 @@ export type MutationInput = Record<string, unknown>;
|
|
|
25
27
|
*
|
|
26
28
|
* 1. Drops framework-internal keys (`__class`, `__typename`, `clientId`,
|
|
27
29
|
* `syncStatus`) and anything not declared on the model's schema.
|
|
28
|
-
* 2.
|
|
29
|
-
*
|
|
30
|
-
*
|
|
30
|
+
* 2. Takes a fresh plain JSON snapshot of the projected values. JSON-typed
|
|
31
|
+
* fields stay objects rather than pre-serialized strings, while reactive
|
|
32
|
+
* proxies cannot leak into persistence or the wire payload.
|
|
31
33
|
*
|
|
32
34
|
* For updates (`dropUndefined: true`), `undefined` values are also removed so
|
|
33
35
|
* they are not written as `SET column = NULL` on the server.
|
|
34
36
|
*
|
|
35
37
|
* Field metadata comes from the model registry, populated when the schema is
|
|
36
38
|
* registered at initialization. If a model has no registered field metadata —
|
|
37
|
-
* for example a manually registered model — projection
|
|
38
|
-
* data
|
|
39
|
+
* for example a manually registered model — projection snapshots all serialized
|
|
40
|
+
* data apart from the framework keys.
|
|
39
41
|
*/
|
|
40
42
|
export declare function projectCommitPayload(modelName: string, source: Record<string, unknown>, opts: {
|
|
41
43
|
dropUndefined: boolean;
|
|
42
|
-
}): MutationInput;
|
|
43
|
-
export interface
|
|
44
|
+
}, runtime?: RuntimeContext): MutationInput;
|
|
45
|
+
export interface QueuedMutation {
|
|
44
46
|
id: string;
|
|
45
47
|
type: 'create' | 'update' | 'delete' | 'archive' | 'unarchive';
|
|
46
48
|
modelName: string;
|
|
@@ -95,7 +97,7 @@ export interface Transaction {
|
|
|
95
97
|
* recovers. This gives a caller one place to await the answer to "did my write
|
|
96
98
|
* land?", matching the
|
|
97
99
|
* `commits.create({ wait: 'confirmed' })` and
|
|
98
|
-
* {@link
|
|
100
|
+
* {@link MutationQueue.waitForConfirmation} vocabulary, so a failure
|
|
99
101
|
* surfaces at the call site instead of only as a silent local rollback. The
|
|
100
102
|
* permanent-rejection value is the same {@link AbloError} carried on the
|
|
101
103
|
* queue's `transaction:failed` event.
|
|
@@ -117,14 +119,14 @@ export declare const stripModelSuffix: (modelName: string) => string;
|
|
|
117
119
|
* foreign-key ordering because the row already exists, so they all share the
|
|
118
120
|
* configured default non-create priority.
|
|
119
121
|
*/
|
|
120
|
-
export declare const computePriorityScore: (type:
|
|
121
|
-
export declare const TX_TYPE_TO_MUTATION_OP: Record<
|
|
122
|
+
export declare const computePriorityScore: (type: QueuedMutation["type"], modelName: string, runtime?: RuntimeContext) => number;
|
|
123
|
+
export declare const TX_TYPE_TO_MUTATION_OP: Record<QueuedMutation['type'], MutationOperationType>;
|
|
122
124
|
export declare function hasStaleWriteOptions(options?: WriteOptions): boolean;
|
|
123
125
|
/** Options whose identity/audit semantics forbid merging two caller writes. */
|
|
124
126
|
export declare function hasCommitCoalescingBarrier(options?: WriteOptions): boolean;
|
|
125
127
|
export interface WriteOperationFields {
|
|
126
128
|
readAt?: number | null;
|
|
127
|
-
onStale?:
|
|
129
|
+
onStale?: OnStaleMode | null;
|
|
128
130
|
fenceToken?: number | null;
|
|
129
131
|
options?: Pick<MutationOptions, 'idempotencyKey' | 'label'>;
|
|
130
132
|
}
|
|
@@ -135,7 +137,7 @@ export interface WriteOperationFields {
|
|
|
135
137
|
* `mutation_log` cache key and audit tag. This is the one place caller-supplied
|
|
136
138
|
* write options cross onto the wire.
|
|
137
139
|
*/
|
|
138
|
-
export declare function applyWriteOptions<T extends object>(op: T, transaction:
|
|
140
|
+
export declare function applyWriteOptions<T extends object>(op: T, transaction: QueuedMutation): T & WriteOperationFields;
|
|
139
141
|
/**
|
|
140
142
|
* The structural shape used to inspect transport-layer errors. It covers the
|
|
141
143
|
* GraphQL-style and HTTP-style error shapes the mutation executor can surface,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The vocabulary a local transaction uses on the wire. This module defines the
|
|
3
|
-
* {@link
|
|
3
|
+
* {@link QueuedMutation} record and the helpers that turn a transaction into a
|
|
4
4
|
* wire-safe commit operation: schema-field projection
|
|
5
5
|
* ({@link projectCommitPayload}), write-option projection
|
|
6
6
|
* ({@link applyWriteOptions}), foreign-key-aware priority scoring
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
* transport errors. Nothing here holds queue state or timers, so the batched
|
|
9
9
|
* queue path and the HTTP commit path share the same projection.
|
|
10
10
|
*/
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
11
|
+
import { globalRuntime } from '../../context.js';
|
|
12
|
+
import { MutationOperationType } from '../../transaction/types/index.js';
|
|
13
|
+
import { snapshotJsonValue } from '../../transaction/utils/json.js';
|
|
14
14
|
/**
|
|
15
15
|
* Framework-internal keys added by `Model.toJSON()` that must never
|
|
16
16
|
* reach the wire. The server treats each top-level key as a target
|
|
@@ -23,20 +23,20 @@ const FRAMEWORK_KEYS = new Set(['__class', '__typename', 'clientId', 'syncStatus
|
|
|
23
23
|
*
|
|
24
24
|
* 1. Drops framework-internal keys (`__class`, `__typename`, `clientId`,
|
|
25
25
|
* `syncStatus`) and anything not declared on the model's schema.
|
|
26
|
-
* 2.
|
|
27
|
-
*
|
|
28
|
-
*
|
|
26
|
+
* 2. Takes a fresh plain JSON snapshot of the projected values. JSON-typed
|
|
27
|
+
* fields stay objects rather than pre-serialized strings, while reactive
|
|
28
|
+
* proxies cannot leak into persistence or the wire payload.
|
|
29
29
|
*
|
|
30
30
|
* For updates (`dropUndefined: true`), `undefined` values are also removed so
|
|
31
31
|
* they are not written as `SET column = NULL` on the server.
|
|
32
32
|
*
|
|
33
33
|
* Field metadata comes from the model registry, populated when the schema is
|
|
34
34
|
* registered at initialization. If a model has no registered field metadata —
|
|
35
|
-
* for example a manually registered model — projection
|
|
36
|
-
* data
|
|
35
|
+
* for example a manually registered model — projection snapshots all serialized
|
|
36
|
+
* data apart from the framework keys.
|
|
37
37
|
*/
|
|
38
|
-
export function projectCommitPayload(modelName, source, opts) {
|
|
39
|
-
const metadata =
|
|
38
|
+
export function projectCommitPayload(modelName, source, opts, runtime = globalRuntime) {
|
|
39
|
+
const metadata = runtime.getModelMetadata(modelName);
|
|
40
40
|
const fields = metadata?.fields;
|
|
41
41
|
const out = {};
|
|
42
42
|
if (!fields) {
|
|
@@ -48,7 +48,7 @@ export function projectCommitPayload(modelName, source, opts) {
|
|
|
48
48
|
continue;
|
|
49
49
|
out[k] = v;
|
|
50
50
|
}
|
|
51
|
-
return out;
|
|
51
|
+
return snapshotJsonValue(out, '$.input');
|
|
52
52
|
}
|
|
53
53
|
for (const key of Object.keys(fields)) {
|
|
54
54
|
if (!(key in source))
|
|
@@ -73,7 +73,7 @@ export function projectCommitPayload(modelName, source, opts) {
|
|
|
73
73
|
// to jsonb correctly once the column is identified as jsonb.
|
|
74
74
|
out[key] = value;
|
|
75
75
|
}
|
|
76
|
-
return out;
|
|
76
|
+
return snapshotJsonValue(out, '$.input');
|
|
77
77
|
}
|
|
78
78
|
export const normalizeModelKey = (modelName) => modelName.replace('Model', '').toLowerCase();
|
|
79
79
|
export const stripModelSuffix = (modelName) => modelName.replace('Model', '');
|
|
@@ -90,8 +90,8 @@ export const stripModelSuffix = (modelName) => modelName.replace('Model', '');
|
|
|
90
90
|
* foreign-key ordering because the row already exists, so they all share the
|
|
91
91
|
* configured default non-create priority.
|
|
92
92
|
*/
|
|
93
|
-
export const computePriorityScore = (type, modelName) => {
|
|
94
|
-
const { modelCreatePriority, defaultCreatePriority, defaultNonCreatePriority } =
|
|
93
|
+
export const computePriorityScore = (type, modelName, runtime = globalRuntime) => {
|
|
94
|
+
const { modelCreatePriority, defaultCreatePriority, defaultNonCreatePriority } = runtime.config;
|
|
95
95
|
if (type !== 'create')
|
|
96
96
|
return defaultNonCreatePriority;
|
|
97
97
|
return modelCreatePriority.get(modelName) ?? defaultCreatePriority;
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Tracks whether the confirming delta for a write has arrived. It holds the
|
|
3
|
-
* acknowledgement watermark (through the shared {@link
|
|
3
|
+
* acknowledgement watermark (through the shared {@link LogPosition}), the
|
|
4
4
|
* per-transaction confirmation timeouts, and the retry-with-backoff and
|
|
5
5
|
* reconciliation policy for transactions in the `awaiting_delta` status. It
|
|
6
|
-
* reaches back to {@link
|
|
6
|
+
* reaches back to {@link MutationQueue} only through the small
|
|
7
7
|
* {@link DeltaConfirmationContext} interface, not the queue class itself, so it
|
|
8
8
|
* has no cyclic dependency and can be tested on its own.
|
|
9
9
|
*/
|
|
10
|
-
import type {
|
|
11
|
-
import type {
|
|
10
|
+
import type { RuntimeContext } from '../../RuntimeContext.js';
|
|
11
|
+
import type { LogPosition } from '../../transaction/logPosition.js';
|
|
12
|
+
import type { QueuedMutation } from './commitPayload.js';
|
|
12
13
|
/**
|
|
13
|
-
* The subset of {@link
|
|
14
|
+
* The subset of {@link MutationQueue} that the confirmation tracker needs:
|
|
14
15
|
* store lookups and status changes, removing optimistic entries once a write
|
|
15
16
|
* confirms, the queue's event emitter (`transaction:completed`,
|
|
16
17
|
* `reconciliation:needed`, and so on), a connection check (so timeouts
|
|
@@ -20,16 +21,18 @@ import type { Transaction } from './commitPayload.js';
|
|
|
20
21
|
*/
|
|
21
22
|
export interface DeltaConfirmationContext {
|
|
22
23
|
store: {
|
|
23
|
-
get(id: string):
|
|
24
|
-
getByStatus(status:
|
|
25
|
-
updateStatus(id: string, status:
|
|
24
|
+
get(id: string): QueuedMutation | undefined;
|
|
25
|
+
getByStatus(status: QueuedMutation['status']): QueuedMutation[];
|
|
26
|
+
updateStatus(id: string, status: QueuedMutation['status']): void;
|
|
26
27
|
};
|
|
27
28
|
optimisticUpdates: {
|
|
28
29
|
delete(id: string): boolean;
|
|
29
30
|
};
|
|
30
31
|
emit(event: string, payload?: unknown): void;
|
|
31
32
|
isConnected(): boolean;
|
|
32
|
-
position:
|
|
33
|
+
position: LogPosition;
|
|
34
|
+
/** The owning client's runtime. Defaults to the module-global bridge. */
|
|
35
|
+
runtime?: RuntimeContext;
|
|
33
36
|
}
|
|
34
37
|
export declare class DeltaConfirmationTracker {
|
|
35
38
|
private readonly ctx;
|
|
@@ -37,6 +40,7 @@ export declare class DeltaConfirmationTracker {
|
|
|
37
40
|
private static readonly DELTA_MAX_TIMEOUT_MS;
|
|
38
41
|
private deltaConfirmationTimeouts;
|
|
39
42
|
private deltaConfirmationRetries;
|
|
43
|
+
private readonly runtime;
|
|
40
44
|
constructor(ctx: DeltaConfirmationContext);
|
|
41
45
|
/** Applied-cursor alias, kept so the read sites below stay legible. */
|
|
42
46
|
private get lastSeenSyncId();
|
|
@@ -48,11 +52,11 @@ export declare class DeltaConfirmationTracker {
|
|
|
48
52
|
* @param syncId - The sync id of the received delta.
|
|
49
53
|
*/
|
|
50
54
|
onDeltaReceived(syncId: number, correlationId?: string): void;
|
|
51
|
-
scheduleDeltaConfirmationTimeout(tx:
|
|
55
|
+
scheduleDeltaConfirmationTimeout(tx: QueuedMutation, timeoutMs: number): void;
|
|
52
56
|
private cancelDeltaConfirmationTimeout;
|
|
53
57
|
/**
|
|
54
58
|
* Clears every armed confirmation timer, one per in-flight transaction.
|
|
55
|
-
* {@link
|
|
59
|
+
* {@link MutationQueue.dispose} calls this; without it a disposed queue
|
|
56
60
|
* would keep the process alive and fire callbacks against a cleared store.
|
|
57
61
|
*/
|
|
58
62
|
dispose(): void;
|