@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
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* An in-memory {@link SyncStoreContract} for tests. It lets you seed rows,
|
|
3
|
-
* read and write them synchronously, and inspect every call the code under
|
|
4
|
-
* test made — all without a real sync backend.
|
|
5
|
-
*/
|
|
6
|
-
import { ViewRegistry } from '../../core/ViewRegistry.js';
|
|
7
|
-
import { AbloValidationError } from '../../errors.js';
|
|
8
|
-
/**
|
|
9
|
-
* An in-memory implementation of {@link SyncStoreContract}. Seed rows with
|
|
10
|
-
* {@link MockSyncStore.setModels}, then read and write through the contract
|
|
11
|
-
* methods; every call is recorded on {@link MockSyncStore.calls} so tests can
|
|
12
|
-
* assert on what happened.
|
|
13
|
-
*/
|
|
14
|
-
export class MockSyncStore {
|
|
15
|
-
// Seeded data, keyed by model class
|
|
16
|
-
byClass = new Map();
|
|
17
|
-
// Call tracking for assertions
|
|
18
|
-
calls = {
|
|
19
|
-
retrieve: [],
|
|
20
|
-
query: [],
|
|
21
|
-
save: [],
|
|
22
|
-
delete: [],
|
|
23
|
-
archive: [],
|
|
24
|
-
unarchive: [],
|
|
25
|
-
};
|
|
26
|
-
/**
|
|
27
|
-
* Seed the store with models of a specific class.
|
|
28
|
-
*
|
|
29
|
-
* @example
|
|
30
|
-
* mockStore.setModels(Task, [task1, task2]);
|
|
31
|
-
*/
|
|
32
|
-
setModels(modelClass, models) {
|
|
33
|
-
const map = new Map();
|
|
34
|
-
for (const m of models) {
|
|
35
|
-
map.set(m.id, m);
|
|
36
|
-
}
|
|
37
|
-
this.byClass.set(modelClass, map);
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Adds or replaces a single model, keyed by its id.
|
|
41
|
-
*/
|
|
42
|
-
addModel(modelClass, model) {
|
|
43
|
-
let map = this.byClass.get(modelClass);
|
|
44
|
-
if (!map) {
|
|
45
|
-
map = new Map();
|
|
46
|
-
this.byClass.set(modelClass, map);
|
|
47
|
-
}
|
|
48
|
-
map.set(model.id, model);
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Remove a model by ID.
|
|
52
|
-
*/
|
|
53
|
-
removeModel(modelClass, id) {
|
|
54
|
-
this.byClass.get(modelClass)?.delete(id);
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Clear all seeded data and call history.
|
|
58
|
-
*/
|
|
59
|
-
reset() {
|
|
60
|
-
this.byClass.clear();
|
|
61
|
-
this.calls = {
|
|
62
|
-
retrieve: [],
|
|
63
|
-
query: [],
|
|
64
|
-
save: [],
|
|
65
|
-
delete: [],
|
|
66
|
-
archive: [],
|
|
67
|
-
unarchive: [],
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
// ── SyncStoreContract implementation ──────────────────────────────────
|
|
71
|
-
retrieve(modelClass, id) {
|
|
72
|
-
this.calls.retrieve.push({ modelClass: modelClass, id });
|
|
73
|
-
return this.byClass.get(modelClass)?.get(id);
|
|
74
|
-
}
|
|
75
|
-
queryByClass(modelClass, options) {
|
|
76
|
-
this.calls.query.push({
|
|
77
|
-
modelClass: modelClass,
|
|
78
|
-
options: options,
|
|
79
|
-
});
|
|
80
|
-
const map = this.byClass.get(modelClass);
|
|
81
|
-
if (!map) {
|
|
82
|
-
return { data: [] };
|
|
83
|
-
}
|
|
84
|
-
let data = Array.from(map.values());
|
|
85
|
-
// Apply predicate
|
|
86
|
-
if (options?.predicate) {
|
|
87
|
-
data = data.filter(options.predicate);
|
|
88
|
-
}
|
|
89
|
-
// Apply ordering
|
|
90
|
-
if (options?.orderBy) {
|
|
91
|
-
const key = options.orderBy;
|
|
92
|
-
const order = options.order ?? 'asc';
|
|
93
|
-
data.sort((a, b) => {
|
|
94
|
-
const av = a[key];
|
|
95
|
-
const bv = b[key];
|
|
96
|
-
if (av === bv)
|
|
97
|
-
return 0;
|
|
98
|
-
const cmp = av < bv ? -1 : 1;
|
|
99
|
-
return order === 'asc' ? cmp : -cmp;
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
// Apply pagination
|
|
103
|
-
if (options?.offset) {
|
|
104
|
-
data = data.slice(options.offset);
|
|
105
|
-
}
|
|
106
|
-
if (options?.limit !== undefined) {
|
|
107
|
-
data = data.slice(0, options.limit);
|
|
108
|
-
}
|
|
109
|
-
return { data };
|
|
110
|
-
}
|
|
111
|
-
async save(model) {
|
|
112
|
-
this.calls.save.push(model);
|
|
113
|
-
// Store the model under its constructor so a later retrieve or query
|
|
114
|
-
// returns it.
|
|
115
|
-
const ctor = model.constructor;
|
|
116
|
-
this.addModel(ctor, model);
|
|
117
|
-
}
|
|
118
|
-
async delete(model) {
|
|
119
|
-
this.calls.delete.push(model);
|
|
120
|
-
const ctor = model.constructor;
|
|
121
|
-
this.removeModel(ctor, model.id);
|
|
122
|
-
}
|
|
123
|
-
async archive(model) {
|
|
124
|
-
this.calls.archive.push(model);
|
|
125
|
-
}
|
|
126
|
-
async unarchive(model) {
|
|
127
|
-
this.calls.unarchive.push(model);
|
|
128
|
-
}
|
|
129
|
-
// Sync-status getters default to "ready, idle". Tests that exercise
|
|
130
|
-
// offline/reconnect flows can set these before rendering.
|
|
131
|
-
isReady = true;
|
|
132
|
-
isSyncing = false;
|
|
133
|
-
isOffline = false;
|
|
134
|
-
isReconnecting = false;
|
|
135
|
-
isError = false;
|
|
136
|
-
hasUnsyncedChanges = false;
|
|
137
|
-
syncStatus = {
|
|
138
|
-
state: 'idle',
|
|
139
|
-
progress: 100,
|
|
140
|
-
pendingChanges: 0,
|
|
141
|
-
isSessionError: false,
|
|
142
|
-
};
|
|
143
|
-
/** A minimal object pool backing the useEntity and useEntities hooks in tests. */
|
|
144
|
-
pool = {
|
|
145
|
-
get: (id) => {
|
|
146
|
-
for (const models of this.byClass.values()) {
|
|
147
|
-
const model = models.get(id);
|
|
148
|
-
if (model)
|
|
149
|
-
return model;
|
|
150
|
-
}
|
|
151
|
-
return undefined;
|
|
152
|
-
},
|
|
153
|
-
getByTypeName: (_typename) => [],
|
|
154
|
-
getByForeignKey: () => [],
|
|
155
|
-
createFromData: () => null,
|
|
156
|
-
hasForeignKeyIndex: () => false,
|
|
157
|
-
createView: () => {
|
|
158
|
-
throw new AbloValidationError('MockSyncStore does not support createView', {
|
|
159
|
-
code: 'mock_unsupported_operation',
|
|
160
|
-
});
|
|
161
|
-
},
|
|
162
|
-
viewRegistry: new ViewRegistry(),
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Create a new MockSyncStore.
|
|
167
|
-
* Shorthand for `new MockSyncStore()`.
|
|
168
|
-
*/
|
|
169
|
-
export function createMockSyncStore() {
|
|
170
|
-
return new MockSyncStore();
|
|
171
|
-
}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A controllable WebSocket stand-in for sync engine tests. It reproduces the
|
|
3
|
-
* event interface of the real connection without opening a socket, so tests
|
|
4
|
-
* can drive connection changes, deltas, and bootstrap hints by hand.
|
|
5
|
-
*/
|
|
6
|
-
import type { SyncActionType } from '../../types/index.js';
|
|
7
|
-
import type { BootstrapReason } from '../../wire/bootstrapReason.js';
|
|
8
|
-
/** The shape of a single delta — one change the server pushes to the client. */
|
|
9
|
-
export interface MockDelta {
|
|
10
|
-
id: number;
|
|
11
|
-
modelName: string;
|
|
12
|
-
modelId: string;
|
|
13
|
-
action: SyncActionType;
|
|
14
|
-
data: Record<string, unknown>;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* A hint from the server that the client has fallen too far behind and should
|
|
18
|
-
* rebuild its data from scratch rather than catch up one delta at a time.
|
|
19
|
-
*/
|
|
20
|
-
export interface MockBootstrapHint {
|
|
21
|
-
reason: BootstrapReason;
|
|
22
|
-
tables?: string[];
|
|
23
|
-
staleTables?: string[];
|
|
24
|
-
}
|
|
25
|
-
type EventHandler = (...args: unknown[]) => void;
|
|
26
|
-
/**
|
|
27
|
-
* A controllable, event-based stand-in for the sync engine's WebSocket
|
|
28
|
-
* connection. Subscribe with {@link MockWebSocket.on} exactly as production
|
|
29
|
-
* code does, then use the `simulate*` and `receive*` methods to push
|
|
30
|
-
* connection changes, deltas, and bootstrap hints. Every event the mock emits
|
|
31
|
-
* is recorded on {@link MockWebSocket.emittedEvents} for assertions.
|
|
32
|
-
*/
|
|
33
|
-
export declare class MockWebSocket {
|
|
34
|
-
private _connected;
|
|
35
|
-
private _sessionError;
|
|
36
|
-
private _listeners;
|
|
37
|
-
/** Every event the mock has emitted, in order, for assertions. */
|
|
38
|
-
readonly emittedEvents: {
|
|
39
|
-
type: string;
|
|
40
|
-
data: unknown;
|
|
41
|
-
}[];
|
|
42
|
-
get connected(): boolean;
|
|
43
|
-
get sessionError(): boolean;
|
|
44
|
-
on(event: string, handler: EventHandler): () => void;
|
|
45
|
-
private emit;
|
|
46
|
-
/** Fires a successful connection, emitting the `connected` event. */
|
|
47
|
-
simulateConnect(): void;
|
|
48
|
-
/** Drops the connection, emitting the `disconnected` event. */
|
|
49
|
-
simulateDisconnect(): void;
|
|
50
|
-
/** Emits a `reconnecting` event carrying the attempt number and retry delay. */
|
|
51
|
-
simulateReconnecting(attempt: number, delay: number): void;
|
|
52
|
-
/** Emits a `session_error` event, as when the server rejects the session as unauthorized. The code defaults to 401. */
|
|
53
|
-
simulateSessionError(code?: number): void;
|
|
54
|
-
/** Emits a `reconnect_failed` event, signaling the client gave up after exhausting its retries. */
|
|
55
|
-
simulateReconnectFailed(): void;
|
|
56
|
-
/** Delivers a single delta, emitting a `delta` event as if the server had sent it. */
|
|
57
|
-
receiveDelta(delta: MockDelta): void;
|
|
58
|
-
/** Delivers a batch of deltas, emitting a `delta_batch` event. */
|
|
59
|
-
receiveDeltas(deltas: MockDelta[]): void;
|
|
60
|
-
/** Emits a `bootstrap_required` hint, telling the client to rebuild its data instead of catching up. */
|
|
61
|
-
simulateBootstrapHint(hint: MockBootstrapHint): void;
|
|
62
|
-
/** Emits a `presence_update` event carrying the given payload. */
|
|
63
|
-
simulatePresenceUpdate(data: Record<string, unknown>): void;
|
|
64
|
-
/** Returns the payloads of every emitted event of the given type, in order. */
|
|
65
|
-
getEvents(type: string): unknown[];
|
|
66
|
-
/** Reports whether an event of the given type has been emitted. */
|
|
67
|
-
hasEmitted(type: string): boolean;
|
|
68
|
-
/** Clears connection state, listeners, and the record of emitted events. */
|
|
69
|
-
reset(): void;
|
|
70
|
-
}
|
|
71
|
-
export {};
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A controllable WebSocket stand-in for sync engine tests. It reproduces the
|
|
3
|
-
* event interface of the real connection without opening a socket, so tests
|
|
4
|
-
* can drive connection changes, deltas, and bootstrap hints by hand.
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* A controllable, event-based stand-in for the sync engine's WebSocket
|
|
8
|
-
* connection. Subscribe with {@link MockWebSocket.on} exactly as production
|
|
9
|
-
* code does, then use the `simulate*` and `receive*` methods to push
|
|
10
|
-
* connection changes, deltas, and bootstrap hints. Every event the mock emits
|
|
11
|
-
* is recorded on {@link MockWebSocket.emittedEvents} for assertions.
|
|
12
|
-
*/
|
|
13
|
-
export class MockWebSocket {
|
|
14
|
-
_connected = false;
|
|
15
|
-
_sessionError = false;
|
|
16
|
-
_listeners = new Map();
|
|
17
|
-
/** Every event the mock has emitted, in order, for assertions. */
|
|
18
|
-
emittedEvents = [];
|
|
19
|
-
get connected() {
|
|
20
|
-
return this._connected;
|
|
21
|
-
}
|
|
22
|
-
get sessionError() {
|
|
23
|
-
return this._sessionError;
|
|
24
|
-
}
|
|
25
|
-
// ─────────────────────────────────────────────
|
|
26
|
-
// Event subscription (matches the real connection's API)
|
|
27
|
-
// ─────────────────────────────────────────────
|
|
28
|
-
on(event, handler) {
|
|
29
|
-
if (!this._listeners.has(event)) {
|
|
30
|
-
this._listeners.set(event, new Set());
|
|
31
|
-
}
|
|
32
|
-
this._listeners.get(event).add(handler);
|
|
33
|
-
return () => {
|
|
34
|
-
this._listeners.get(event)?.delete(handler);
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
emit(event, ...args) {
|
|
38
|
-
this.emittedEvents.push({ type: event, data: args[0] });
|
|
39
|
-
const handlers = this._listeners.get(event);
|
|
40
|
-
if (handlers) {
|
|
41
|
-
for (const handler of handlers) {
|
|
42
|
-
handler(...args);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
// ─────────────────────────────────────────────
|
|
47
|
-
// Test control: connection lifecycle
|
|
48
|
-
// ─────────────────────────────────────────────
|
|
49
|
-
/** Fires a successful connection, emitting the `connected` event. */
|
|
50
|
-
simulateConnect() {
|
|
51
|
-
this._connected = true;
|
|
52
|
-
this._sessionError = false;
|
|
53
|
-
this.emit('connected');
|
|
54
|
-
}
|
|
55
|
-
/** Drops the connection, emitting the `disconnected` event. */
|
|
56
|
-
simulateDisconnect() {
|
|
57
|
-
this._connected = false;
|
|
58
|
-
this.emit('disconnected');
|
|
59
|
-
}
|
|
60
|
-
/** Emits a `reconnecting` event carrying the attempt number and retry delay. */
|
|
61
|
-
simulateReconnecting(attempt, delay) {
|
|
62
|
-
this.emit('reconnecting', { attempt, delay });
|
|
63
|
-
}
|
|
64
|
-
/** Emits a `session_error` event, as when the server rejects the session as unauthorized. The code defaults to 401. */
|
|
65
|
-
simulateSessionError(code = 401) {
|
|
66
|
-
this._sessionError = true;
|
|
67
|
-
this._connected = false;
|
|
68
|
-
this.emit('session_error', { code });
|
|
69
|
-
}
|
|
70
|
-
/** Emits a `reconnect_failed` event, signaling the client gave up after exhausting its retries. */
|
|
71
|
-
simulateReconnectFailed() {
|
|
72
|
-
this._connected = false;
|
|
73
|
-
this.emit('reconnect_failed');
|
|
74
|
-
}
|
|
75
|
-
// ─────────────────────────────────────────────
|
|
76
|
-
// Test control: delta injection
|
|
77
|
-
// ─────────────────────────────────────────────
|
|
78
|
-
/** Delivers a single delta, emitting a `delta` event as if the server had sent it. */
|
|
79
|
-
receiveDelta(delta) {
|
|
80
|
-
this.emit('delta', delta);
|
|
81
|
-
}
|
|
82
|
-
/** Delivers a batch of deltas, emitting a `delta_batch` event. */
|
|
83
|
-
receiveDeltas(deltas) {
|
|
84
|
-
this.emit('delta_batch', deltas);
|
|
85
|
-
}
|
|
86
|
-
// ─────────────────────────────────────────────
|
|
87
|
-
// Test control: bootstrap hints
|
|
88
|
-
// ─────────────────────────────────────────────
|
|
89
|
-
/** Emits a `bootstrap_required` hint, telling the client to rebuild its data instead of catching up. */
|
|
90
|
-
simulateBootstrapHint(hint) {
|
|
91
|
-
this.emit('bootstrap_required', hint);
|
|
92
|
-
}
|
|
93
|
-
// ─────────────────────────────────────────────
|
|
94
|
-
// Test control: presence
|
|
95
|
-
// ─────────────────────────────────────────────
|
|
96
|
-
/** Emits a `presence_update` event carrying the given payload. */
|
|
97
|
-
simulatePresenceUpdate(data) {
|
|
98
|
-
this.emit('presence_update', data);
|
|
99
|
-
}
|
|
100
|
-
// ─────────────────────────────────────────────
|
|
101
|
-
// Assertions
|
|
102
|
-
// ─────────────────────────────────────────────
|
|
103
|
-
/** Returns the payloads of every emitted event of the given type, in order. */
|
|
104
|
-
getEvents(type) {
|
|
105
|
-
return this.emittedEvents.filter((e) => e.type === type).map((e) => e.data);
|
|
106
|
-
}
|
|
107
|
-
/** Reports whether an event of the given type has been emitted. */
|
|
108
|
-
hasEmitted(type) {
|
|
109
|
-
return this.emittedEvents.some((e) => e.type === type);
|
|
110
|
-
}
|
|
111
|
-
/** Clears connection state, listeners, and the record of emitted events. */
|
|
112
|
-
reset() {
|
|
113
|
-
this._connected = false;
|
|
114
|
-
this._sessionError = false;
|
|
115
|
-
this._listeners.clear();
|
|
116
|
-
this.emittedEvents.length = 0;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Product-facing persistence contract for writes that must survive a process
|
|
3
|
-
* restart or an ambiguous network response.
|
|
4
|
-
*
|
|
5
|
-
* The engine implements this contract with a transactional outbox internally,
|
|
6
|
-
* but callers should only need to think in terms of pending durable writes.
|
|
7
|
-
*/
|
|
8
|
-
import { z } from 'zod';
|
|
9
|
-
import { durableCommitEnvelopeSchema } from './commitEnvelope.js';
|
|
10
|
-
import { durableHttpCommitEnvelopeSchema } from './httpCommitEnvelope.js';
|
|
11
|
-
/** Every write shape that Ablo may ask an injected store to persist. */
|
|
12
|
-
export const pendingWriteSchema = z.union([
|
|
13
|
-
durableCommitEnvelopeSchema,
|
|
14
|
-
durableHttpCommitEnvelopeSchema,
|
|
15
|
-
]);
|
|
16
|
-
/** Runtime validation for injected adapters, including JavaScript consumers. */
|
|
17
|
-
export const durableWriteStoreSchema = z.custom((value) => {
|
|
18
|
-
if (typeof value !== 'object' || value === null)
|
|
19
|
-
return false;
|
|
20
|
-
const candidate = value;
|
|
21
|
-
return (typeof candidate.seal === 'function' &&
|
|
22
|
-
typeof candidate.list === 'function' &&
|
|
23
|
-
typeof candidate.remove === 'function');
|
|
24
|
-
}, { message: 'store must implement seal(), list(), and remove()' });
|
|
25
|
-
/** Options for crash-durable `create`, `update`, and `delete` calls. */
|
|
26
|
-
export const durableWritesConfigSchema = z.strictObject({
|
|
27
|
-
store: durableWriteStoreSchema,
|
|
28
|
-
/** Separates deployments or workflow lanes that share an authenticated actor. */
|
|
29
|
-
namespace: z.string().trim().min(1).optional(),
|
|
30
|
-
});
|
package/dist/utils/duration.d.ts
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Parses a duration into milliseconds. A duration is either a number of seconds
|
|
3
|
-
* or a string with a unit suffix — milliseconds, seconds, minutes, or hours:
|
|
4
|
-
*
|
|
5
|
-
* - `'500ms'` → 500 ms
|
|
6
|
-
* - `'30s'` → 30 000 ms
|
|
7
|
-
* - `'3m'` → 180 000 ms
|
|
8
|
-
* - `'24h'` → 86 400 000 ms
|
|
9
|
-
*
|
|
10
|
-
* A bare number is interpreted as seconds rather than milliseconds, matching the
|
|
11
|
-
* `ttlSeconds` fields used throughout the SDK, so a numeric caller and a string
|
|
12
|
-
* caller can pass the same field interchangeably. {@link toMs} returns
|
|
13
|
-
* milliseconds; {@link toSeconds} returns whole seconds.
|
|
14
|
-
*/
|
|
15
|
-
export type Duration = number | `${number}ms` | `${number}s` | `${number}m` | `${number}h`;
|
|
16
|
-
/**
|
|
17
|
-
* Parses a duration and returns the equivalent number of milliseconds. Accepts
|
|
18
|
-
* either a bare number, interpreted as seconds, or a unit-suffixed string such
|
|
19
|
-
* as `'500ms'`, `'30s'`, `'3m'`, or `'24h'`. Throws an
|
|
20
|
-
* {@link AbloValidationError} with code `duration_invalid` when a string does
|
|
21
|
-
* not match a supported unit.
|
|
22
|
-
*/
|
|
23
|
-
export declare function toMs(input: Duration): number;
|
|
24
|
-
/** Parses a duration like {@link toMs} but returns whole seconds, rounding down. */
|
|
25
|
-
export declare function toSeconds(input: Duration): number;
|
package/dist/utils/json.js
DELETED
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* json.ts — key-order-insensitive comparison helpers for JSON-shaped values.
|
|
3
|
-
*
|
|
4
|
-
* Why this exists as a first-class, exported util:
|
|
5
|
-
*
|
|
6
|
-
* A `field.json()` value may be backed by a Postgres `jsonb` column, and **jsonb
|
|
7
|
-
* does not preserve object key order** (it reorders keys by length, then
|
|
8
|
-
* bytewise, and drops insignificant whitespace — see
|
|
9
|
-
* https://www.postgresql.org/docs/current/datatype-json.html). So a document an
|
|
10
|
-
* app wrote as `{type,text}` streams back in a delta as `{text,type}`: the same
|
|
11
|
-
* value, a different serialization.
|
|
12
|
-
*
|
|
13
|
-
* That bites any app that reconciles an Ablo row against an *external* state
|
|
14
|
-
* container it doesn't control — a rich-text editor (Tiptap/ProseMirror/Slate),
|
|
15
|
-
* a `useState`, a form buffer. The natural guard, `JSON.stringify(remote) ===
|
|
16
|
-
* JSON.stringify(local)`, is silently wrong because the two sides serialize keys
|
|
17
|
-
* in different orders, so it never matches — and the app re-applies the remote
|
|
18
|
-
* value on every render, clobbering in-flight edits and fighting the cursor.
|
|
19
|
-
*
|
|
20
|
-
* The fix is to compare order-insensitively. `deepEqual` does structural
|
|
21
|
-
* equality directly; `stableStringify` produces a canonical string (recursively
|
|
22
|
-
* sorted keys) for when you need a stable cache key / dependency value. The SDK
|
|
23
|
-
* already uses `deepEqual` internally for store-level echo detection; this
|
|
24
|
-
* module makes the same guarantee available to app authors so they don't each
|
|
25
|
-
* reinvent it.
|
|
26
|
-
*
|
|
27
|
-
* (If you need byte-exact key order preserved end-to-end, store the field in a
|
|
28
|
-
* `text` column instead of `jsonb` — Ablo's adaptive codec serializes verbatim
|
|
29
|
-
* there, matching Postgres's `json` type behavior.)
|
|
30
|
-
*/
|
|
31
|
-
/** Structural equality for JSON-shaped values (scalars, arrays, plain objects); key order is ignored. */
|
|
32
|
-
export function deepEqual(a, b) {
|
|
33
|
-
if (a === b)
|
|
34
|
-
return true;
|
|
35
|
-
if (a === null || b === null || typeof a !== 'object' || typeof b !== 'object') {
|
|
36
|
-
return false;
|
|
37
|
-
}
|
|
38
|
-
const aArr = Array.isArray(a);
|
|
39
|
-
if (aArr !== Array.isArray(b))
|
|
40
|
-
return false;
|
|
41
|
-
if (aArr) {
|
|
42
|
-
const av = a;
|
|
43
|
-
const bv = b;
|
|
44
|
-
if (av.length !== bv.length)
|
|
45
|
-
return false;
|
|
46
|
-
for (let i = 0; i < av.length; i++) {
|
|
47
|
-
if (!deepEqual(av[i], bv[i]))
|
|
48
|
-
return false;
|
|
49
|
-
}
|
|
50
|
-
return true;
|
|
51
|
-
}
|
|
52
|
-
const ao = a;
|
|
53
|
-
const bo = b;
|
|
54
|
-
const ak = Object.keys(ao);
|
|
55
|
-
const bk = Object.keys(bo);
|
|
56
|
-
if (ak.length !== bk.length)
|
|
57
|
-
return false;
|
|
58
|
-
for (const k of ak) {
|
|
59
|
-
if (!Object.prototype.hasOwnProperty.call(bo, k))
|
|
60
|
-
return false;
|
|
61
|
-
if (!deepEqual(ao[k], bo[k]))
|
|
62
|
-
return false;
|
|
63
|
-
}
|
|
64
|
-
return true;
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Canonical JSON serialization: recursively sorts object keys so two values that
|
|
68
|
-
* differ only in key order (e.g. a jsonb round-trip) produce the same string.
|
|
69
|
-
* Use this when you need a comparable/cacheable string rather than a boolean —
|
|
70
|
-
* e.g. an echo guard or a `useEffect`/`useMemo` dependency.
|
|
71
|
-
*/
|
|
72
|
-
export function stableStringify(value) {
|
|
73
|
-
return JSON.stringify(sortKeysDeep(value));
|
|
74
|
-
}
|
|
75
|
-
function sortKeysDeep(value) {
|
|
76
|
-
if (Array.isArray(value))
|
|
77
|
-
return value.map(sortKeysDeep);
|
|
78
|
-
if (value && typeof value === 'object') {
|
|
79
|
-
const source = value;
|
|
80
|
-
return Object.keys(source)
|
|
81
|
-
.sort()
|
|
82
|
-
.reduce((acc, key) => {
|
|
83
|
-
acc[key] = sortKeysDeep(source[key]);
|
|
84
|
-
return acc;
|
|
85
|
-
}, {});
|
|
86
|
-
}
|
|
87
|
-
return value;
|
|
88
|
-
}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The fixed, public-facing message returned for an unclassified 500. A raw
|
|
3
|
-
* `err.message` can carry driver text, connection strings, or stack fragments,
|
|
4
|
-
* so it is never placed on the wire; a caller that needs those details logs the
|
|
5
|
-
* original error server-side before formatting the response.
|
|
6
|
-
*/
|
|
7
|
-
export declare const INTERNAL_ERROR_PUBLIC_MESSAGE = "An internal error occurred.";
|
|
8
|
-
/** The canonical error envelope. Every HTTP error response and every structured
|
|
9
|
-
* frame error carries this exact set of keys, regardless of which route or
|
|
10
|
-
* transport produced it. */
|
|
11
|
-
export interface ErrorEnvelope {
|
|
12
|
-
readonly type: string;
|
|
13
|
-
readonly code?: string;
|
|
14
|
-
readonly param?: string;
|
|
15
|
-
readonly message: string;
|
|
16
|
-
readonly doc_url?: string;
|
|
17
|
-
readonly request_id?: string;
|
|
18
|
-
/** Field-level failures collected together, so a single 4xx can report every
|
|
19
|
-
* invalid input at once — for example a schema push, a batch commit, or CLI
|
|
20
|
-
* argument validation — instead of failing on the first. Use `param` for the
|
|
21
|
-
* single-field case. */
|
|
22
|
-
readonly errors?: readonly {
|
|
23
|
-
readonly code?: string;
|
|
24
|
-
readonly message: string;
|
|
25
|
-
readonly param?: string;
|
|
26
|
-
}[];
|
|
27
|
-
/** Additional typed details. {@link AbloError} serialization spreads its
|
|
28
|
-
* `details` — such as `missingIds`, `conflicts`, or `retryAfterSeconds` — as
|
|
29
|
-
* top-level members here. Ignore any member you do not recognize, so new ones
|
|
30
|
-
* can be added without breaking you. */
|
|
31
|
-
readonly [key: string]: unknown;
|
|
32
|
-
}
|
|
33
|
-
/** Maps an {@link AbloError} subclass name to its default HTTP status. Each
|
|
34
|
-
* subclass is chosen to match the status — a validation error is a 400, a
|
|
35
|
-
* permission error a 403 — so a throw site picks the right class and code and
|
|
36
|
-
* the status follows. An explicit `httpStatus` is supplied only when it
|
|
37
|
-
* diverges, such as a 404 on the base class or a 503 on a server error. */
|
|
38
|
-
export declare function statusForType(type: string): number;
|
|
39
|
-
/**
|
|
40
|
-
* Converts any thrown value into the canonical {@link ErrorEnvelope} and an HTTP
|
|
41
|
-
* status. A typed {@link AbloError} is serialized through its own `toJSON`, so
|
|
42
|
-
* its code, param, doc_url, and structured details survive, and its status comes
|
|
43
|
-
* from an explicit `httpStatus` or, failing that, {@link statusForType}.
|
|
44
|
-
* Anything else becomes a 500 `internal_error` envelope — never a bare framework
|
|
45
|
-
* "Internal Server Error" body, and never a raw error string leaked onto the
|
|
46
|
-
* wire as an unregistered code.
|
|
47
|
-
*
|
|
48
|
-
* When `requestId` is supplied and the error does not already carry one, it is
|
|
49
|
-
* stamped into the body so the response and the `x-request-id` header agree for
|
|
50
|
-
* support correlation.
|
|
51
|
-
*/
|
|
52
|
-
export declare function errorEnvelope(err: unknown, requestId?: string): {
|
|
53
|
-
body: ErrorEnvelope;
|
|
54
|
-
status: number;
|
|
55
|
-
};
|