@abloatai/ablo 0.36.0 → 0.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +2 -2
- package/CHANGELOG.md +71 -2013
- package/NOTICE +2 -2
- package/README.md +25 -71
- package/assets/banner.png +0 -0
- package/dist/auth.d.ts +2 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +2 -0
- package/dist/auth.js.map +1 -0
- package/dist/client.d.ts +3 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +3 -0
- package/dist/client.js.map +1 -0
- package/dist/coordination.d.ts +2 -0
- package/dist/coordination.d.ts.map +1 -0
- package/dist/coordination.js +2 -0
- package/dist/coordination.js.map +1 -0
- package/dist/index.d.ts +3 -114
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -163
- package/dist/index.js.map +1 -0
- package/dist/react.d.ts +4 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +3 -0
- package/dist/react.js.map +1 -0
- package/dist/schema.d.ts +2 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +2 -0
- package/dist/schema.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -0
- package/dist/source-conformance.d.ts +2 -0
- package/dist/source-conformance.d.ts.map +1 -0
- package/dist/source-conformance.js +2 -0
- package/dist/source-conformance.js.map +1 -0
- package/dist/source-drizzle.d.ts +2 -0
- package/dist/source-drizzle.d.ts.map +1 -0
- package/dist/source-drizzle.js +2 -0
- package/dist/source-drizzle.js.map +1 -0
- package/dist/source-kysely.d.ts +2 -0
- package/dist/source-kysely.d.ts.map +1 -0
- package/dist/source-kysely.js +2 -0
- package/dist/source-kysely.js.map +1 -0
- package/dist/source-next.d.ts +2 -0
- package/dist/source-next.d.ts.map +1 -0
- package/dist/source-next.js +2 -0
- package/dist/source-next.js.map +1 -0
- package/dist/source.d.ts +2 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +2 -0
- package/dist/source.js.map +1 -0
- package/dist/wire.d.ts +2 -0
- package/dist/wire.d.ts.map +1 -0
- package/dist/wire.js +2 -0
- package/dist/wire.js.map +1 -0
- package/docs/agents.md +1 -1
- package/docs/api-keys.md +7 -6
- package/docs/api.md +10 -10
- package/docs/client-behavior.md +5 -5
- package/docs/coordination.md +52 -62
- package/docs/data-sources.md +1 -1
- package/docs/examples/agent-human.md +4 -4
- package/docs/examples/ai-sdk-tool.md +1 -1
- package/docs/examples/existing-python-backend.md +15 -4
- package/docs/examples/nextjs.md +27 -6
- package/docs/examples/server-agent.md +2 -2
- package/docs/how-it-works.md +4 -4
- package/docs/identity.md +2 -1
- package/docs/integration-guide.md +24 -13
- package/docs/internal/README.md +18 -0
- package/docs/internal/agent-fleet-coordination-design.md +171 -0
- package/docs/internal/agent-orchestration.md +58 -0
- package/docs/internal/commit-identifiers.md +91 -0
- package/docs/internal/concurrency-open-decisions.md +37 -0
- package/docs/internal/data-source-reverse-channel.md +150 -0
- package/docs/internal/per-field-conflict-detection.md +165 -0
- package/docs/internal/postgres-replication.md +64 -0
- package/docs/internal/serializable-schema.md +119 -0
- package/docs/internal/structure.md +32 -0
- package/docs/mcp.md +2 -2
- package/docs/migration.md +3 -3
- package/docs/quickstart.md +2 -2
- package/docs/react.md +5 -5
- package/docs/schema-contract.md +3 -3
- package/docs/sessions.md +91 -37
- package/examples/README.md +2 -2
- package/examples/data-source/README.md +1 -1
- package/examples/data-source/ablo-driver.ts +1 -1
- package/examples/data-source/customer-server.ts +1 -1
- package/examples/data-source/run.ts +1 -1
- package/examples/data-source/schema.ts +1 -1
- package/examples/quickstart.ts +2 -2
- package/llms.txt +8 -8
- package/package.json +63 -166
- package/bin/ablo.cjs +0 -39
- package/dist/BaseSyncedStore.d.ts +0 -843
- package/dist/BaseSyncedStore.js +0 -1971
- package/dist/Database.d.ts +0 -323
- package/dist/Database.js +0 -1502
- package/dist/InstanceCache.d.ts +0 -237
- package/dist/InstanceCache.js +0 -1166
- package/dist/LazyReferenceCollection.d.ts +0 -177
- package/dist/LazyReferenceCollection.js +0 -461
- package/dist/Model.d.ts +0 -454
- package/dist/Model.js +0 -919
- package/dist/ModelRegistry.d.ts +0 -225
- package/dist/ModelRegistry.js +0 -539
- package/dist/NetworkMonitor.d.ts +0 -28
- package/dist/NetworkMonitor.js +0 -79
- package/dist/RuntimeContext.d.ts +0 -52
- package/dist/RuntimeContext.js +0 -80
- package/dist/SyncClient.d.ts +0 -541
- package/dist/SyncClient.js +0 -2202
- package/dist/adapters/alwaysOnline.d.ts +0 -14
- package/dist/adapters/alwaysOnline.js +0 -17
- package/dist/adapters/inMemoryStorage.d.ts +0 -31
- package/dist/adapters/inMemoryStorage.js +0 -110
- package/dist/ai-sdk/coordinatedTool.d.ts +0 -120
- package/dist/ai-sdk/coordinatedTool.js +0 -134
- package/dist/ai-sdk/coordinationContext.d.ts +0 -46
- package/dist/ai-sdk/coordinationContext.js +0 -106
- package/dist/ai-sdk/index.d.ts +0 -121
- package/dist/ai-sdk/index.js +0 -121
- package/dist/ai-sdk/wrap.d.ts +0 -65
- package/dist/ai-sdk/wrap.js +0 -39
- package/dist/auth/index.d.ts +0 -1
- package/dist/auth/index.js +0 -8
- package/dist/batching/index.d.ts +0 -55
- package/dist/batching/index.js +0 -147
- package/dist/client/Ablo.d.ts +0 -231
- package/dist/client/Ablo.js +0 -160
- package/dist/client/abloClient.d.ts +0 -309
- package/dist/client/abloClient.js +0 -13
- package/dist/client/clientPrelude.d.ts +0 -52
- package/dist/client/clientPrelude.js +0 -60
- package/dist/client/consoleLogger.d.ts +0 -35
- package/dist/client/consoleLogger.js +0 -44
- package/dist/client/coreClient.d.ts +0 -60
- package/dist/client/coreClient.js +0 -118
- package/dist/client/createInternalComponents.d.ts +0 -50
- package/dist/client/createInternalComponents.js +0 -98
- package/dist/client/createModelProxy.d.ts +0 -248
- package/dist/client/createModelProxy.js +0 -884
- package/dist/client/humans.d.ts +0 -69
- package/dist/client/humans.js +0 -78
- package/dist/client/modelRegistration.d.ts +0 -10
- package/dist/client/modelRegistration.js +0 -312
- package/dist/client/options.d.ts +0 -461
- package/dist/client/options.js +0 -7
- package/dist/client/reactiveEngine.d.ts +0 -53
- package/dist/client/reactiveEngine.js +0 -688
- package/dist/client/resourceTypes.d.ts +0 -12
- package/dist/client/resourceTypes.js +0 -10
- package/dist/client/schemaConfig.d.ts +0 -44
- package/dist/client/schemaConfig.js +0 -185
- package/dist/client/storeCluster.d.ts +0 -47
- package/dist/client/storeCluster.js +0 -118
- package/dist/client/storeLifecycle.d.ts +0 -61
- package/dist/client/storeLifecycle.js +0 -231
- package/dist/client/validateAbloOptions.d.ts +0 -42
- package/dist/client/validateAbloOptions.js +0 -43
- package/dist/client/wsMutationExecutor.d.ts +0 -27
- package/dist/client/wsMutationExecutor.js +0 -72
- package/dist/context.d.ts +0 -42
- package/dist/context.js +0 -81
- package/dist/coordination/ClaimLog.d.ts +0 -26
- package/dist/coordination/ClaimLog.js +0 -32
- package/dist/coordination/index.d.ts +0 -1
- package/dist/coordination/index.js +0 -8
- package/dist/core/index.d.ts +0 -33
- package/dist/core/index.js +0 -48
- package/dist/docs/catalog.d.ts +0 -72
- package/dist/docs/catalog.js +0 -230
- package/dist/docs/index.d.ts +0 -10
- package/dist/docs/index.js +0 -10
- package/dist/environment.d.ts +0 -1
- package/dist/environment.js +0 -8
- package/dist/interfaces/index.d.ts +0 -311
- package/dist/interfaces/index.js +0 -9
- package/dist/keys/index.d.ts +0 -1
- package/dist/keys/index.js +0 -8
- package/dist/mutators/RecordingMutation.d.ts +0 -36
- package/dist/mutators/RecordingMutation.js +0 -182
- package/dist/mutators/Transaction.d.ts +0 -40
- package/dist/mutators/Transaction.js +0 -58
- package/dist/mutators/UndoManager.d.ts +0 -258
- package/dist/mutators/UndoManager.js +0 -658
- package/dist/mutators/defineMutators.d.ts +0 -60
- package/dist/mutators/defineMutators.js +0 -18
- package/dist/mutators/inverseOp.d.ts +0 -126
- package/dist/mutators/inverseOp.js +0 -71
- package/dist/mutators/mutateActions.d.ts +0 -45
- package/dist/mutators/mutateActions.js +0 -105
- package/dist/mutators/readerActions.d.ts +0 -33
- package/dist/mutators/readerActions.js +0 -57
- package/dist/mutators/undoApply.d.ts +0 -51
- package/dist/mutators/undoApply.js +0 -117
- package/dist/policy/index.d.ts +0 -21
- package/dist/policy/index.js +0 -20
- package/dist/query/QueryProcessor.d.ts +0 -75
- package/dist/query/QueryProcessor.js +0 -255
- package/dist/query/client.d.ts +0 -64
- package/dist/query/client.js +0 -138
- package/dist/query/types.d.ts +0 -85
- package/dist/query/types.js +0 -16
- package/dist/react/AbloProvider.d.ts +0 -242
- package/dist/react/AbloProvider.js +0 -458
- package/dist/react/ClientSideSuspense.d.ts +0 -36
- package/dist/react/ClientSideSuspense.js +0 -17
- package/dist/react/DefaultFallback.d.ts +0 -24
- package/dist/react/DefaultFallback.js +0 -43
- package/dist/react/context.d.ts +0 -55
- package/dist/react/context.js +0 -29
- package/dist/react/createAbloReact.d.ts +0 -56
- package/dist/react/createAbloReact.js +0 -51
- package/dist/react/index.d.ts +0 -62
- package/dist/react/index.js +0 -69
- package/dist/react/internalContext.d.ts +0 -33
- package/dist/react/internalContext.js +0 -3
- package/dist/react/useAblo.d.ts +0 -82
- package/dist/react/useAblo.js +0 -120
- package/dist/react/useCurrentUserId.d.ts +0 -22
- package/dist/react/useCurrentUserId.js +0 -34
- package/dist/react/useErrorListener.d.ts +0 -20
- package/dist/react/useErrorListener.js +0 -38
- package/dist/react/useMutationFailureListener.d.ts +0 -26
- package/dist/react/useMutationFailureListener.js +0 -38
- package/dist/react/useMutators.d.ts +0 -56
- package/dist/react/useMutators.js +0 -84
- package/dist/react/useReactive.d.ts +0 -35
- package/dist/react/useReactive.js +0 -123
- package/dist/react/useSyncStatus.d.ts +0 -59
- package/dist/react/useSyncStatus.js +0 -76
- package/dist/react/useUndoScope.d.ts +0 -34
- package/dist/react/useUndoScope.js +0 -81
- package/dist/schema/coordination.d.ts +0 -112
- package/dist/schema/coordination.js +0 -133
- package/dist/schema/ddl.d.ts +0 -97
- package/dist/schema/ddl.js +0 -491
- package/dist/schema/ddlLock.d.ts +0 -35
- package/dist/schema/ddlLock.js +0 -46
- package/dist/schema/diff.d.ts +0 -225
- package/dist/schema/diff.js +0 -289
- package/dist/schema/generate.d.ts +0 -19
- package/dist/schema/generate.js +0 -86
- package/dist/schema/index.d.ts +0 -42
- package/dist/schema/index.js +0 -80
- package/dist/schema/queries.d.ts +0 -201
- package/dist/schema/queries.js +0 -144
- package/dist/schema/select.d.ts +0 -40
- package/dist/schema/select.js +0 -90
- package/dist/schema/serialize.d.ts +0 -115
- package/dist/schema/serialize.js +0 -265
- package/dist/schema/sugar.d.ts +0 -109
- package/dist/schema/sugar.js +0 -83
- package/dist/schema/syncDeltaRow.d.ts +0 -6
- package/dist/schema/syncDeltaRow.js +0 -6
- package/dist/server/adapter.d.ts +0 -173
- package/dist/server/adapter.js +0 -18
- package/dist/server/commit.d.ts +0 -107
- package/dist/server/commit.js +0 -1
- package/dist/server/index.d.ts +0 -14
- package/dist/server/index.js +0 -2
- package/dist/server/readConfig.d.ts +0 -80
- package/dist/server/readConfig.js +0 -8
- package/dist/server/storageMode.d.ts +0 -23
- package/dist/server/storageMode.js +0 -17
- package/dist/source/adapter.d.ts +0 -83
- package/dist/source/adapter.js +0 -24
- package/dist/source/adapters/drizzle.d.ts +0 -48
- package/dist/source/adapters/drizzle.js +0 -219
- package/dist/source/adapters/kysely.d.ts +0 -42
- package/dist/source/adapters/kysely.js +0 -205
- package/dist/source/adapters/kyselyMutationCore.d.ts +0 -76
- package/dist/source/adapters/kyselyMutationCore.js +0 -125
- package/dist/source/adapters/memory.d.ts +0 -13
- package/dist/source/adapters/memory.js +0 -130
- package/dist/source/adapters/prisma.d.ts +0 -63
- package/dist/source/adapters/prisma.js +0 -202
- package/dist/source/conformance.d.ts +0 -37
- package/dist/source/conformance.js +0 -215
- package/dist/source/connector.d.ts +0 -95
- package/dist/source/connector.js +0 -266
- package/dist/source/connectorProtocol.d.ts +0 -154
- package/dist/source/connectorProtocol.js +0 -163
- package/dist/source/contract.d.ts +0 -195
- package/dist/source/contract.js +0 -164
- package/dist/source/factory.d.ts +0 -92
- package/dist/source/factory.js +0 -286
- package/dist/source/idempotency.d.ts +0 -61
- package/dist/source/idempotency.js +0 -144
- package/dist/source/index.d.ts +0 -23
- package/dist/source/index.js +0 -30
- package/dist/source/migrations.d.ts +0 -21
- package/dist/source/migrations.js +0 -103
- package/dist/source/next.d.ts +0 -32
- package/dist/source/next.js +0 -25
- package/dist/source/pushQueue.d.ts +0 -134
- package/dist/source/pushQueue.js +0 -256
- package/dist/source/signing.d.ts +0 -92
- package/dist/source/signing.js +0 -162
- package/dist/source/types.d.ts +0 -401
- package/dist/source/types.js +0 -59
- package/dist/storeContract.d.ts +0 -145
- package/dist/storeContract.js +0 -12
- package/dist/stores/DatabaseManager.d.ts +0 -107
- package/dist/stores/DatabaseManager.js +0 -388
- package/dist/stores/ObjectStore.d.ts +0 -115
- package/dist/stores/ObjectStore.js +0 -393
- package/dist/stores/ObjectStoreContract.d.ts +0 -38
- package/dist/stores/ObjectStoreContract.js +0 -1
- package/dist/stores/StoreManager.d.ts +0 -114
- package/dist/stores/StoreManager.js +0 -304
- package/dist/stores/SyncActionStore.d.ts +0 -99
- package/dist/stores/SyncActionStore.js +0 -506
- package/dist/stores/openIDBWithTimeout.d.ts +0 -65
- package/dist/stores/openIDBWithTimeout.js +0 -153
- package/dist/stores/syncAction.d.ts +0 -26
- package/dist/stores/syncAction.js +0 -16
- package/dist/surface.d.ts +0 -36
- package/dist/surface.js +0 -75
- package/dist/sync/BootstrapFetcher.d.ts +0 -284
- package/dist/sync/BootstrapFetcher.js +0 -964
- package/dist/sync/ConnectionManager.d.ts +0 -8
- package/dist/sync/ConnectionManager.js +0 -8
- package/dist/sync/OnDemandLoader.d.ts +0 -231
- package/dist/sync/OnDemandLoader.js +0 -743
- package/dist/sync/SubscriptionManager.d.ts +0 -159
- package/dist/sync/SubscriptionManager.js +0 -243
- package/dist/sync/SyncWebSocket.d.ts +0 -173
- package/dist/sync/SyncWebSocket.js +0 -438
- package/dist/sync/awaitClaimGrant.d.ts +0 -6
- package/dist/sync/awaitClaimGrant.js +0 -6
- package/dist/sync/bootstrapApply.d.ts +0 -73
- package/dist/sync/bootstrapApply.js +0 -73
- package/dist/sync/commitFrames.d.ts +0 -8
- package/dist/sync/commitFrames.js +0 -8
- package/dist/sync/contextPorts.d.ts +0 -18
- package/dist/sync/contextPorts.js +0 -31
- package/dist/sync/createClaimStream.d.ts +0 -7
- package/dist/sync/createClaimStream.js +0 -7
- package/dist/sync/createPresenceStream.d.ts +0 -69
- package/dist/sync/createPresenceStream.js +0 -200
- package/dist/sync/createSnapshot.d.ts +0 -29
- package/dist/sync/createSnapshot.js +0 -118
- package/dist/sync/credentialLifecycle.d.ts +0 -7
- package/dist/sync/credentialLifecycle.js +0 -7
- package/dist/sync/deltaPipeline.d.ts +0 -114
- package/dist/sync/deltaPipeline.js +0 -278
- package/dist/sync/groupChange.d.ts +0 -116
- package/dist/sync/groupChange.js +0 -244
- package/dist/sync/participants.d.ts +0 -132
- package/dist/sync/participants.js +0 -346
- package/dist/sync/persistedPrefix.d.ts +0 -12
- package/dist/sync/persistedPrefix.js +0 -22
- package/dist/sync/schemaDrift.d.ts +0 -55
- package/dist/sync/schemaDrift.js +0 -53
- package/dist/sync/schemas.d.ts +0 -71
- package/dist/sync/schemas.js +0 -94
- package/dist/sync/syncCursor.d.ts +0 -40
- package/dist/sync/syncCursor.js +0 -55
- package/dist/sync/syncPlan.d.ts +0 -54
- package/dist/sync/syncPlan.js +0 -50
- package/dist/sync/wsFrameHandlers.d.ts +0 -8
- package/dist/sync/wsFrameHandlers.js +0 -8
- package/dist/syncLog/contract.d.ts +0 -20
- package/dist/syncLog/contract.js +0 -19
- package/dist/syncLog/index.d.ts +0 -1
- package/dist/syncLog/index.js +0 -1
- package/dist/transaction/ablo.d.ts +0 -88
- package/dist/transaction/ablo.js +0 -33
- package/dist/transaction/auth/apiKey.d.ts +0 -152
- package/dist/transaction/auth/apiKey.js +0 -419
- package/dist/transaction/auth/bootstrapScope.d.ts +0 -15
- package/dist/transaction/auth/bootstrapScope.js +0 -1
- package/dist/transaction/auth/capability.d.ts +0 -212
- package/dist/transaction/auth/capability.js +0 -224
- package/dist/transaction/auth/credentialEndpoint.d.ts +0 -61
- package/dist/transaction/auth/credentialEndpoint.js +0 -86
- package/dist/transaction/auth/credentialPolicy.d.ts +0 -148
- package/dist/transaction/auth/credentialPolicy.js +0 -125
- package/dist/transaction/auth/credentialSource.d.ts +0 -30
- package/dist/transaction/auth/credentialSource.js +0 -55
- package/dist/transaction/auth/hostedEndpoints.d.ts +0 -21
- package/dist/transaction/auth/hostedEndpoints.js +0 -21
- package/dist/transaction/auth/identity.d.ts +0 -55
- package/dist/transaction/auth/identity.js +0 -210
- package/dist/transaction/auth/index.d.ts +0 -162
- package/dist/transaction/auth/index.js +0 -304
- package/dist/transaction/auth/schemas.d.ts +0 -59
- package/dist/transaction/auth/schemas.js +0 -85
- package/dist/transaction/auth/sessionMint.d.ts +0 -28
- package/dist/transaction/auth/sessionMint.js +0 -85
- package/dist/transaction/coordination/awaitClaimGrant.d.ts +0 -56
- package/dist/transaction/coordination/awaitClaimGrant.js +0 -124
- package/dist/transaction/coordination/claimHeartbeatLoop.d.ts +0 -84
- package/dist/transaction/coordination/claimHeartbeatLoop.js +0 -108
- package/dist/transaction/coordination/claimMeta.d.ts +0 -49
- package/dist/transaction/coordination/claimMeta.js +0 -52
- package/dist/transaction/coordination/createClaimStream.d.ts +0 -64
- package/dist/transaction/coordination/createClaimStream.js +0 -475
- package/dist/transaction/coordination/events.d.ts +0 -74
- package/dist/transaction/coordination/events.js +0 -7
- package/dist/transaction/coordination/index.d.ts +0 -19
- package/dist/transaction/coordination/index.js +0 -45
- package/dist/transaction/coordination/locator.d.ts +0 -104
- package/dist/transaction/coordination/locator.js +0 -102
- package/dist/transaction/coordination/schema.d.ts +0 -1536
- package/dist/transaction/coordination/schema.js +0 -1177
- package/dist/transaction/coordination/targetConflict.d.ts +0 -2
- package/dist/transaction/coordination/targetConflict.js +0 -107
- package/dist/transaction/coordination/trace.d.ts +0 -78
- package/dist/transaction/coordination/trace.js +0 -138
- package/dist/transaction/durableWrites.d.ts +0 -62
- package/dist/transaction/durableWrites.js +0 -71
- package/dist/transaction/environment.d.ts +0 -105
- package/dist/transaction/environment.js +0 -108
- package/dist/transaction/errorCodes.d.ts +0 -403
- package/dist/transaction/errorCodes.js +0 -484
- package/dist/transaction/errors.d.ts +0 -428
- package/dist/transaction/errors.js +0 -686
- package/dist/transaction/footprint.d.ts +0 -111
- package/dist/transaction/footprint.js +0 -0
- package/dist/transaction/index.d.ts +0 -20
- package/dist/transaction/index.js +0 -20
- package/dist/transaction/keys/index.d.ts +0 -87
- package/dist/transaction/keys/index.js +0 -207
- package/dist/transaction/log/syncDeltaRow.d.ts +0 -158
- package/dist/transaction/log/syncDeltaRow.js +0 -95
- package/dist/transaction/logPosition.d.ts +0 -97
- package/dist/transaction/logPosition.js +0 -125
- package/dist/transaction/logger.d.ts +0 -16
- package/dist/transaction/logger.js +0 -7
- package/dist/transaction/observability.d.ts +0 -53
- package/dist/transaction/observability.js +0 -19
- package/dist/transaction/persistence.d.ts +0 -12
- package/dist/transaction/persistence.js +0 -11
- package/dist/transaction/plugin.d.ts +0 -285
- package/dist/transaction/plugin.js +0 -106
- package/dist/transaction/policy/types.d.ts +0 -217
- package/dist/transaction/policy/types.js +0 -126
- package/dist/transaction/resources/functionalUpdate.d.ts +0 -79
- package/dist/transaction/resources/functionalUpdate.js +0 -87
- package/dist/transaction/resources/httpResources.d.ts +0 -321
- package/dist/transaction/resources/httpResources.js +0 -7
- package/dist/transaction/resources/modelOperations.d.ts +0 -427
- package/dist/transaction/resources/modelOperations.js +0 -12
- package/dist/transaction/resources/mutationOptions.d.ts +0 -66
- package/dist/transaction/resources/mutationOptions.js +0 -9
- package/dist/transaction/resources/where.d.ts +0 -101
- package/dist/transaction/resources/where.js +0 -115
- package/dist/transaction/resources/writeOptionsSchema.d.ts +0 -47
- package/dist/transaction/resources/writeOptionsSchema.js +0 -73
- package/dist/transaction/schema/field.d.ts +0 -120
- package/dist/transaction/schema/field.js +0 -265
- package/dist/transaction/schema/fieldRef.d.ts +0 -38
- package/dist/transaction/schema/fieldRef.js +0 -11
- package/dist/transaction/schema/loadStrategy.d.ts +0 -45
- package/dist/transaction/schema/loadStrategy.js +0 -46
- package/dist/transaction/schema/model.d.ts +0 -379
- package/dist/transaction/schema/model.js +0 -123
- package/dist/transaction/schema/openapi.d.ts +0 -58
- package/dist/transaction/schema/openapi.js +0 -501
- package/dist/transaction/schema/relation.d.ts +0 -204
- package/dist/transaction/schema/relation.js +0 -104
- package/dist/transaction/schema/residency.d.ts +0 -29
- package/dist/transaction/schema/residency.js +0 -25
- package/dist/transaction/schema/roles.d.ts +0 -249
- package/dist/transaction/schema/roles.js +0 -230
- package/dist/transaction/schema/schema.d.ts +0 -351
- package/dist/transaction/schema/schema.js +0 -325
- package/dist/transaction/schema/tenancy.d.ts +0 -139
- package/dist/transaction/schema/tenancy.js +0 -190
- package/dist/transaction/transactionLayer.d.ts +0 -82
- package/dist/transaction/transactionLayer.js +0 -24
- package/dist/transaction/transactions/settlement/commitEnvelope.d.ts +0 -143
- package/dist/transaction/transactions/settlement/commitEnvelope.js +0 -161
- package/dist/transaction/transactions/settlement/httpCommitEnvelope.d.ts +0 -53
- package/dist/transaction/transactions/settlement/httpCommitEnvelope.js +0 -207
- package/dist/transaction/transactions/settlement/idempotencyKey.d.ts +0 -10
- package/dist/transaction/transactions/settlement/idempotencyKey.js +0 -9
- package/dist/transaction/transactions/settlement/pendingWrite.d.ts +0 -112
- package/dist/transaction/transactions/settlement/pendingWrite.js +0 -20
- package/dist/transaction/transport/commitFrames.d.ts +0 -90
- package/dist/transaction/transport/commitFrames.js +0 -134
- package/dist/transaction/transport/connectionManager.d.ts +0 -215
- package/dist/transaction/transport/connectionManager.js +0 -673
- package/dist/transaction/transport/credentialLifecycle.d.ts +0 -177
- package/dist/transaction/transport/credentialLifecycle.js +0 -324
- package/dist/transaction/transport/heartbeat.d.ts +0 -65
- package/dist/transaction/transport/heartbeat.js +0 -93
- package/dist/transaction/transport/httpClient.d.ts +0 -131
- package/dist/transaction/transport/httpClient.js +0 -146
- package/dist/transaction/transport/httpOptions.d.ts +0 -33
- package/dist/transaction/transport/httpOptions.js +0 -12
- package/dist/transaction/transport/httpTransport.d.ts +0 -8
- package/dist/transaction/transport/httpTransport.js +0 -1388
- package/dist/transaction/transport/networkProbe.d.ts +0 -84
- package/dist/transaction/transport/networkProbe.js +0 -207
- package/dist/transaction/transport/wsFrameHandlers.d.ts +0 -128
- package/dist/transaction/transport/wsFrameHandlers.js +0 -429
- package/dist/transaction/transport/wsTransport.d.ts +0 -574
- package/dist/transaction/transport/wsTransport.js +0 -1023
- package/dist/transaction/types/assertExact.d.ts +0 -17
- package/dist/transaction/types/assertExact.js +0 -1
- package/dist/transaction/types/global.d.ts +0 -107
- package/dist/transaction/types/global.js +0 -40
- package/dist/transaction/types/index.d.ts +0 -205
- package/dist/transaction/types/index.js +0 -56
- package/dist/transaction/types/modelData.d.ts +0 -10
- package/dist/transaction/types/modelData.js +0 -9
- package/dist/transaction/types/participant.d.ts +0 -20
- package/dist/transaction/types/participant.js +0 -10
- package/dist/transaction/types/streams.d.ts +0 -550
- package/dist/transaction/types/streams.js +0 -11
- package/dist/transaction/utils/asyncIterator.d.ts +0 -34
- package/dist/transaction/utils/asyncIterator.js +0 -135
- package/dist/transaction/utils/duration.d.ts +0 -50
- package/dist/transaction/utils/duration.js +0 -77
- package/dist/transaction/utils/json.d.ts +0 -57
- package/dist/transaction/utils/json.js +0 -276
- package/dist/transaction/wire/accountResponses.d.ts +0 -420
- package/dist/transaction/wire/accountResponses.js +0 -290
- package/dist/transaction/wire/auth.d.ts +0 -56
- package/dist/transaction/wire/auth.js +0 -63
- package/dist/transaction/wire/bootstrapReason.d.ts +0 -9
- package/dist/transaction/wire/bootstrapReason.js +0 -8
- package/dist/transaction/wire/claimEvent.d.ts +0 -76
- package/dist/transaction/wire/claimEvent.js +0 -73
- package/dist/transaction/wire/claims.d.ts +0 -530
- package/dist/transaction/wire/claims.js +0 -327
- package/dist/transaction/wire/commit.d.ts +0 -603
- package/dist/transaction/wire/commit.js +0 -321
- package/dist/transaction/wire/delta.d.ts +0 -250
- package/dist/transaction/wire/delta.js +0 -147
- package/dist/transaction/wire/errorEnvelope.d.ts +0 -72
- package/dist/transaction/wire/errorEnvelope.js +0 -123
- package/dist/transaction/wire/feedCursor.d.ts +0 -60
- package/dist/transaction/wire/feedCursor.js +0 -82
- package/dist/transaction/wire/feedEvent.d.ts +0 -204
- package/dist/transaction/wire/feedEvent.js +0 -65
- package/dist/transaction/wire/frames.d.ts +0 -194
- package/dist/transaction/wire/frames.js +0 -50
- package/dist/transaction/wire/inboundFrames.d.ts +0 -562
- package/dist/transaction/wire/inboundFrames.js +0 -116
- package/dist/transaction/wire/index.d.ts +0 -54
- package/dist/transaction/wire/index.js +0 -83
- package/dist/transaction/wire/listEnvelope.d.ts +0 -37
- package/dist/transaction/wire/listEnvelope.js +0 -42
- package/dist/transaction/wire/modelMutations.d.ts +0 -31
- package/dist/transaction/wire/modelMutations.js +0 -52
- package/dist/transaction/wire/modelResponses.d.ts +0 -85
- package/dist/transaction/wire/modelResponses.js +0 -43
- package/dist/transaction/wire/modelShape.d.ts +0 -78
- package/dist/transaction/wire/modelShape.js +0 -74
- package/dist/transaction/wire/protocol.d.ts +0 -38
- package/dist/transaction/wire/protocol.js +0 -38
- package/dist/transaction/wire/protocolVersion.d.ts +0 -73
- package/dist/transaction/wire/protocolVersion.js +0 -83
- package/dist/transactions/mutations/MutationQueue.d.ts +0 -661
- package/dist/transactions/mutations/MutationQueue.js +0 -2807
- package/dist/transactions/mutations/MutationStore.d.ts +0 -20
- package/dist/transactions/mutations/MutationStore.js +0 -53
- package/dist/transactions/mutations/UnconfirmedWrites.d.ts +0 -82
- package/dist/transactions/mutations/UnconfirmedWrites.js +0 -104
- package/dist/transactions/mutations/coalesceRules.d.ts +0 -58
- package/dist/transactions/mutations/coalesceRules.js +0 -140
- package/dist/transactions/mutations/commitLatency.d.ts +0 -52
- package/dist/transactions/mutations/commitLatency.js +0 -130
- package/dist/transactions/mutations/commitOutboxStore.d.ts +0 -28
- package/dist/transactions/mutations/commitOutboxStore.js +0 -26
- package/dist/transactions/mutations/commitPayload.d.ts +0 -165
- package/dist/transactions/mutations/commitPayload.js +0 -152
- package/dist/transactions/mutations/deltaConfirmation.d.ts +0 -63
- package/dist/transactions/mutations/deltaConfirmation.js +0 -235
- package/dist/transactions/mutations/durableWriteStore.d.ts +0 -14
- package/dist/transactions/mutations/durableWriteStore.js +0 -12
- package/dist/transactions/mutations/optimisticApply.d.ts +0 -49
- package/dist/transactions/mutations/optimisticApply.js +0 -65
- package/dist/transactions/mutations/replayValidation.d.ts +0 -187
- package/dist/transactions/mutations/replayValidation.js +0 -164
- package/dist/utils/mobxSetup.d.ts +0 -53
- package/dist/utils/mobxSetup.js +0 -330
- package/dist/views/QueryView.d.ts +0 -79
- package/dist/views/QueryView.js +0 -218
- package/dist/views/ViewRegistry.d.ts +0 -20
- package/dist/views/ViewRegistry.js +0 -55
- package/dist/views/incrementalView.d.ts +0 -45
- package/dist/views/incrementalView.js +0 -69
- package/dist/webhooks/events.d.ts +0 -43
- package/dist/webhooks/events.js +0 -42
- package/dist/webhooks/index.d.ts +0 -8
- package/dist/webhooks/index.js +0 -8
- package/dist/wire/index.d.ts +0 -1
- package/dist/wire/index.js +0 -8
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Detects real network and session connectivity for the sync engine. It exists
|
|
3
|
-
* because `navigator.onLine` is unreliable: it reports true whenever the device
|
|
4
|
-
* has a local network connection, even with no route to the internet, and after
|
|
5
|
-
* sleep/wake it can report true before Wi-Fi or DNS are working again.
|
|
6
|
-
*
|
|
7
|
-
* The probe makes one authenticated request to the sync server's
|
|
8
|
-
* `/api/auth/check` endpoint — which runs the same auth middleware as the
|
|
9
|
-
* WebSocket upgrade — and classifies the response into a single
|
|
10
|
-
* {@link ProbeOutcome} through the recovery taxonomy ({@link classifyRecovery}):
|
|
11
|
-
* 204 No Content → `reachable` (credential valid)
|
|
12
|
-
* 401 `apikey_expired` (ephemeral key) → `credential_stale` (re-mint and retry, no sign-out)
|
|
13
|
-
* 401 `session_expired` / bare 401 → `session_expired` (sign out)
|
|
14
|
-
* 401/403 credential-type/config/perm → `auth_blocked` (stop; no loop, no sign-out)
|
|
15
|
-
* network failure / offline → `unreachable`
|
|
16
|
-
*
|
|
17
|
-
* This closes a real gap. The browser's WebSocket API hides the HTTP status of
|
|
18
|
-
* a failed handshake, so a 401 on the upgrade surfaces only as close code 1006.
|
|
19
|
-
* Without this HTTP probe, the client cannot tell an auth failure from a network
|
|
20
|
-
* blip, and loops reconnecting forever instead of sending the user to sign in.
|
|
21
|
-
*
|
|
22
|
-
* @see https://developer.mozilla.org/en-US/docs/Web/API/Navigator/onLine
|
|
23
|
-
*/
|
|
24
|
-
import { z } from 'zod';
|
|
25
|
-
import { type AuthTokenGetter } from '../auth/credentialSource.js';
|
|
26
|
-
import { type Logger } from '../logger.js';
|
|
27
|
-
/**
|
|
28
|
-
* The complete set of probe outcomes. Each value carries both reachability and
|
|
29
|
-
* credential state, so the connection state machine can branch on one exhaustive
|
|
30
|
-
* discriminant instead of piecing the situation together from several booleans.
|
|
31
|
-
* It mirrors the `RecoveryClass` taxonomy at the connectivity layer.
|
|
32
|
-
*/
|
|
33
|
-
export declare const PROBE_OUTCOMES: readonly ["reachable", "unreachable", "session_expired", "credential_stale", "auth_blocked"];
|
|
34
|
-
/** Zod enum derived from {@link PROBE_OUTCOMES}. */
|
|
35
|
-
export declare const probeOutcomeSchema: z.ZodEnum<{
|
|
36
|
-
auth_blocked: "auth_blocked";
|
|
37
|
-
session_expired: "session_expired";
|
|
38
|
-
reachable: "reachable";
|
|
39
|
-
unreachable: "unreachable";
|
|
40
|
-
credential_stale: "credential_stale";
|
|
41
|
-
}>;
|
|
42
|
-
/** A single probe outcome. See {@link PROBE_OUTCOMES}. */
|
|
43
|
-
export type ProbeOutcome = z.infer<typeof probeOutcomeSchema>;
|
|
44
|
-
/** Result of a network probe: a single {@link ProbeOutcome} plus round-trip
|
|
45
|
-
* latency (null when the probe never completed). */
|
|
46
|
-
export declare const probeResultSchema: z.ZodObject<{
|
|
47
|
-
outcome: z.ZodEnum<{
|
|
48
|
-
auth_blocked: "auth_blocked";
|
|
49
|
-
session_expired: "session_expired";
|
|
50
|
-
reachable: "reachable";
|
|
51
|
-
unreachable: "unreachable";
|
|
52
|
-
credential_stale: "credential_stale";
|
|
53
|
-
}>;
|
|
54
|
-
latencyMs: z.ZodNullable<z.ZodNumber>;
|
|
55
|
-
}, z.core.$strip>;
|
|
56
|
-
/** @see {@link probeResultSchema} */
|
|
57
|
-
export type ProbeResult = z.infer<typeof probeResultSchema>;
|
|
58
|
-
export interface NetworkProbeOptions {
|
|
59
|
-
/**
|
|
60
|
-
* Sync-server base URL (HTTP or WS scheme accepted). If omitted, the probe
|
|
61
|
-
* targets the canonical hosted endpoint ({@link ABLO_DEFAULT_BASE_URL}) —
|
|
62
|
-
* the same default `Ablo()` resolves.
|
|
63
|
-
*/
|
|
64
|
-
baseUrl?: string;
|
|
65
|
-
/**
|
|
66
|
-
* Optional bearer credential. Browser cookie deployments can omit this;
|
|
67
|
-
* bearer-first deployments must pass the same `ek_`/`rk_` token used by
|
|
68
|
-
* bootstrap and the WebSocket upgrade.
|
|
69
|
-
*/
|
|
70
|
-
getAuthToken?: AuthTokenGetter;
|
|
71
|
-
/** Compatibility fallback for callers with a copied token string. */
|
|
72
|
-
authToken?: string | null;
|
|
73
|
-
/** Where probe outcomes are logged. Defaults to silent. */
|
|
74
|
-
logger?: Logger;
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Probes the sync server with a lightweight HEAD request, returning both
|
|
78
|
-
* reachability and session status in a single call so the connection state
|
|
79
|
-
* machine can pick the right transition without guessing.
|
|
80
|
-
*
|
|
81
|
-
* @param input The sync-server base URL (an HTTP or WS scheme is accepted), or
|
|
82
|
-
* an options bag. A bare string is also accepted.
|
|
83
|
-
*/
|
|
84
|
-
export declare function probeNetwork(input?: string | NetworkProbeOptions): Promise<ProbeResult>;
|
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Detects real network and session connectivity for the sync engine. It exists
|
|
3
|
-
* because `navigator.onLine` is unreliable: it reports true whenever the device
|
|
4
|
-
* has a local network connection, even with no route to the internet, and after
|
|
5
|
-
* sleep/wake it can report true before Wi-Fi or DNS are working again.
|
|
6
|
-
*
|
|
7
|
-
* The probe makes one authenticated request to the sync server's
|
|
8
|
-
* `/api/auth/check` endpoint — which runs the same auth middleware as the
|
|
9
|
-
* WebSocket upgrade — and classifies the response into a single
|
|
10
|
-
* {@link ProbeOutcome} through the recovery taxonomy ({@link classifyRecovery}):
|
|
11
|
-
* 204 No Content → `reachable` (credential valid)
|
|
12
|
-
* 401 `apikey_expired` (ephemeral key) → `credential_stale` (re-mint and retry, no sign-out)
|
|
13
|
-
* 401 `session_expired` / bare 401 → `session_expired` (sign out)
|
|
14
|
-
* 401/403 credential-type/config/perm → `auth_blocked` (stop; no loop, no sign-out)
|
|
15
|
-
* network failure / offline → `unreachable`
|
|
16
|
-
*
|
|
17
|
-
* This closes a real gap. The browser's WebSocket API hides the HTTP status of
|
|
18
|
-
* a failed handshake, so a 401 on the upgrade surfaces only as close code 1006.
|
|
19
|
-
* Without this HTTP probe, the client cannot tell an auth failure from a network
|
|
20
|
-
* blip, and loops reconnecting forever instead of sending the user to sign in.
|
|
21
|
-
*
|
|
22
|
-
* @see https://developer.mozilla.org/en-US/docs/Web/API/Navigator/onLine
|
|
23
|
-
*/
|
|
24
|
-
import { z } from 'zod';
|
|
25
|
-
import { classifyRecovery } from '../errors.js';
|
|
26
|
-
import { withAuthHeaders } from '../auth/credentialSource.js';
|
|
27
|
-
import { ABLO_DEFAULT_BASE_URL } from '../auth/hostedEndpoints.js';
|
|
28
|
-
import { noopLogger } from '../logger.js';
|
|
29
|
-
/**
|
|
30
|
-
* The complete set of probe outcomes. Each value carries both reachability and
|
|
31
|
-
* credential state, so the connection state machine can branch on one exhaustive
|
|
32
|
-
* discriminant instead of piecing the situation together from several booleans.
|
|
33
|
-
* It mirrors the `RecoveryClass` taxonomy at the connectivity layer.
|
|
34
|
-
*/
|
|
35
|
-
export const PROBE_OUTCOMES = [
|
|
36
|
-
/** Server reachable and the access credential is currently valid. */
|
|
37
|
-
'reachable',
|
|
38
|
-
/** Could not reach the server (offline, DNS, TLS, or timeout). */
|
|
39
|
-
'unreachable',
|
|
40
|
-
/** Reachable, but the long-lived login is gone. Terminal: sign out. */
|
|
41
|
-
'session_expired',
|
|
42
|
-
/** Reachable, but the ephemeral access key (`ek_`/`rk_`) expired. Silently
|
|
43
|
-
* re-mint a fresh key from the still-valid login and retry; not a sign-out. */
|
|
44
|
-
'credential_stale',
|
|
45
|
-
/** Reachable, but the credential's type or configuration was rejected (wrong
|
|
46
|
-
* key kind, untrusted issuer, no organization, or a 403). Stop: neither
|
|
47
|
-
* reconnecting nor re-authenticating helps. Distinct from a sign-out. */
|
|
48
|
-
'auth_blocked',
|
|
49
|
-
];
|
|
50
|
-
/** Zod enum derived from {@link PROBE_OUTCOMES}. */
|
|
51
|
-
export const probeOutcomeSchema = z.enum(PROBE_OUTCOMES);
|
|
52
|
-
/** Result of a network probe: a single {@link ProbeOutcome} plus round-trip
|
|
53
|
-
* latency (null when the probe never completed). */
|
|
54
|
-
export const probeResultSchema = z.object({
|
|
55
|
-
outcome: probeOutcomeSchema,
|
|
56
|
-
latencyMs: z.number().nullable(),
|
|
57
|
-
});
|
|
58
|
-
const PROBE_TIMEOUT_MS = 4000;
|
|
59
|
-
/**
|
|
60
|
-
* Derive the probe URL from a sync-server base URL. Accepts `ws://`,
|
|
61
|
-
* `wss://`, `http://`, `https://`, or a bare host — mirrors the
|
|
62
|
-
* normalisation in `BootstrapFetcher` / `createSyncEngine`.
|
|
63
|
-
*/
|
|
64
|
-
function resolveProbeUrl(baseUrl) {
|
|
65
|
-
// No explicit baseUrl → probe the canonical hosted endpoint, matching the
|
|
66
|
-
// `Ablo()` default.
|
|
67
|
-
const resolved = baseUrl ?? ABLO_DEFAULT_BASE_URL;
|
|
68
|
-
// Normalize ws → http so fetch() accepts the URL. Strip any trailing slash
|
|
69
|
-
// so we don't produce `//api/auth/check`.
|
|
70
|
-
const httpBase = resolved.replace(/^ws/, 'http').replace(/\/+$/, '');
|
|
71
|
-
return `${httpBase}/api/auth/check`;
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Probes the sync server with a lightweight HEAD request, returning both
|
|
75
|
-
* reachability and session status in a single call so the connection state
|
|
76
|
-
* machine can pick the right transition without guessing.
|
|
77
|
-
*
|
|
78
|
-
* @param input The sync-server base URL (an HTTP or WS scheme is accepted), or
|
|
79
|
-
* an options bag. A bare string is also accepted.
|
|
80
|
-
*/
|
|
81
|
-
export async function probeNetwork(input) {
|
|
82
|
-
const baseUrl = typeof input === 'string' ? input : input?.baseUrl;
|
|
83
|
-
const getAuthToken = typeof input === 'string' ? undefined : input?.getAuthToken;
|
|
84
|
-
const authToken = typeof input === 'string' ? undefined : input?.authToken;
|
|
85
|
-
const logger = (typeof input === 'string' ? undefined : input?.logger) ?? noopLogger;
|
|
86
|
-
const url = resolveProbeUrl(baseUrl);
|
|
87
|
-
// Fast-fail: if navigator.onLine is false, skip the probe entirely. This is
|
|
88
|
-
// the one case where navigator.onLine is reliable (MDN: "false means
|
|
89
|
-
// definitely offline"). Use `=== false` rather than `!onLine` because Node
|
|
90
|
-
// 22+ exposes `navigator` with `onLine === undefined`, and `!undefined` is
|
|
91
|
-
// true, which would short-circuit the probe server-side.
|
|
92
|
-
if (typeof navigator !== 'undefined' && navigator.onLine === false) {
|
|
93
|
-
return { outcome: 'unreachable', latencyMs: null };
|
|
94
|
-
}
|
|
95
|
-
const controller = new AbortController();
|
|
96
|
-
const timeout = setTimeout(() => { controller.abort(); }, PROBE_TIMEOUT_MS);
|
|
97
|
-
const start = performance.now();
|
|
98
|
-
try {
|
|
99
|
-
const headers = withAuthHeaders(getAuthToken, { 'Cache-Control': 'no-cache' }, authToken);
|
|
100
|
-
const response = await fetch(url, {
|
|
101
|
-
method: 'HEAD',
|
|
102
|
-
signal: controller.signal,
|
|
103
|
-
// Cache-bust to avoid stale responses
|
|
104
|
-
headers,
|
|
105
|
-
});
|
|
106
|
-
const latencyMs = Math.round(performance.now() - start);
|
|
107
|
-
// The probe is a HEAD request (no body), but the server sets
|
|
108
|
-
// `X-Auth-Failure: <code>` on every auth rejection. Route the code through
|
|
109
|
-
// the recovery taxonomy so each failure mode gets its correct outcome. That
|
|
110
|
-
// distinction is the whole point: an expired ephemeral key
|
|
111
|
-
// (`access_credential_expiry`) must re-mint, not sign the user out the way a
|
|
112
|
-
// genuine login expiry (`session_expiry`) does, and not wedge the way a
|
|
113
|
-
// credential type or configuration rejection (`auth_blocked`) does.
|
|
114
|
-
const authFailure = response.headers.get('x-auth-failure');
|
|
115
|
-
if (authFailure) {
|
|
116
|
-
const recovery = classifyRecovery(authFailure);
|
|
117
|
-
switch (recovery) {
|
|
118
|
-
case 'session_expiry':
|
|
119
|
-
logger.info('[NetworkProbe] Server reachable, login expired', {
|
|
120
|
-
status: response.status,
|
|
121
|
-
code: authFailure,
|
|
122
|
-
latencyMs,
|
|
123
|
-
});
|
|
124
|
-
return { outcome: 'session_expired', latencyMs };
|
|
125
|
-
case 'access_credential_expiry':
|
|
126
|
-
logger.info('[NetworkProbe] Server reachable, access key stale — will re-mint', {
|
|
127
|
-
status: response.status,
|
|
128
|
-
code: authFailure,
|
|
129
|
-
latencyMs,
|
|
130
|
-
});
|
|
131
|
-
return { outcome: 'credential_stale', latencyMs };
|
|
132
|
-
case 'auth_blocked':
|
|
133
|
-
case 'permission':
|
|
134
|
-
case 'none':
|
|
135
|
-
// A non-expiry auth rejection — wrong credential type or config, a
|
|
136
|
-
// 403, or an auth-tagged code this SDK does not recognise.
|
|
137
|
-
// Re-authenticating re-mints the same rejected credential and
|
|
138
|
-
// retrying will not help, so stop rather than reconnect-loop or sign
|
|
139
|
-
// the user out.
|
|
140
|
-
logger.debug('[NetworkProbe] Reachable but auth-blocked (non-retryable, non-expiry)', {
|
|
141
|
-
status: response.status,
|
|
142
|
-
code: authFailure,
|
|
143
|
-
recovery,
|
|
144
|
-
latencyMs,
|
|
145
|
-
});
|
|
146
|
-
return { outcome: 'auth_blocked', latencyMs };
|
|
147
|
-
case 'transient':
|
|
148
|
-
// Retryable auth-tagged response — connectivity is proven; fall
|
|
149
|
-
// through to `reachable` and let the normal retry path handle it.
|
|
150
|
-
break;
|
|
151
|
-
default: {
|
|
152
|
-
const _exhaustive = recovery;
|
|
153
|
-
void _exhaustive;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
else if (response.status === 401) {
|
|
158
|
-
// Bare 401 with no readable structured code. This is ambiguous and must
|
|
159
|
-
// not sign the user out on its own — two common causes are both
|
|
160
|
-
// recoverable, and only one is a real logout:
|
|
161
|
-
// 1. The server did send `X-Auth-Failure: apikey_expired`, but it is a
|
|
162
|
-
// custom header on a cross-origin response the server did not list in
|
|
163
|
-
// `Access-Control-Expose-Headers`, so the browser stripped it to
|
|
164
|
-
// null. The access key just needs a re-mint.
|
|
165
|
-
// 2. A genuinely expired access key on a non-Ablo proxy or cookie path.
|
|
166
|
-
// So route to `credential_stale`: the state machine attempts a re-mint,
|
|
167
|
-
// and the only way to actually sign out is that re-mint resolving `null`
|
|
168
|
-
// (the login is truly gone). If no refresher is wired, the bounded attempt
|
|
169
|
-
// counter falls through to `auth_blocked` (stop) — still never a spurious
|
|
170
|
-
// logout. The invariant holds: null is the only terminal path, never a
|
|
171
|
-
// bare 401.
|
|
172
|
-
logger.info('[NetworkProbe] Server reachable, bare 401 — re-mint (not sign-out)', {
|
|
173
|
-
latencyMs,
|
|
174
|
-
});
|
|
175
|
-
return { outcome: 'credential_stale', latencyMs };
|
|
176
|
-
}
|
|
177
|
-
// 2xx (including 204) means reachable + credential valid.
|
|
178
|
-
// 3xx/4xx (non-auth) still prove connectivity even though the probe
|
|
179
|
-
// expected 204; log a warning so misconfigurations surface instead of
|
|
180
|
-
// silently passing.
|
|
181
|
-
if (response.status < 200 || response.status >= 300) {
|
|
182
|
-
logger.debug('[NetworkProbe] Unexpected probe response', {
|
|
183
|
-
status: response.status,
|
|
184
|
-
url,
|
|
185
|
-
latencyMs,
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
else {
|
|
189
|
-
logger.debug('[NetworkProbe] Server reachable, credential valid', {
|
|
190
|
-
status: response.status,
|
|
191
|
-
latencyMs,
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
return { outcome: 'reachable', latencyMs };
|
|
195
|
-
}
|
|
196
|
-
catch (error) {
|
|
197
|
-
clearTimeout(timeout);
|
|
198
|
-
const isAbort = error instanceof DOMException && error.name === 'AbortError';
|
|
199
|
-
logger.info('[NetworkProbe] Probe failed', {
|
|
200
|
-
reason: isAbort ? 'timeout' : error.message,
|
|
201
|
-
});
|
|
202
|
-
return { outcome: 'unreachable', latencyMs: null };
|
|
203
|
-
}
|
|
204
|
-
finally {
|
|
205
|
-
clearTimeout(timeout);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Routes each inbound frame from the sync WebSocket to the handler for its
|
|
3
|
-
* type. Handlers work against a minimal {@link WsSession} interface — only
|
|
4
|
-
* the members they actually touch, rather than the transport object itself,
|
|
5
|
-
* which keeps this module free of an import cycle. Reading a message off the
|
|
6
|
-
* socket, parsing its JSON, and tracking heartbeats all happen before this
|
|
7
|
-
* point; every parsed frame then passes through {@link dispatchWsFrame}.
|
|
8
|
-
*/
|
|
9
|
-
import { type WsInboundEnvelope } from '../wire/inboundFrames.js';
|
|
10
|
-
import { type CommitAck } from './commitFrames.js';
|
|
11
|
-
import type { Logger } from '../logger.js';
|
|
12
|
-
import type { SocketObservability } from '../observability.js';
|
|
13
|
-
/**
|
|
14
|
-
* In-flight `commit` request record, keyed by clientTxId in the session.
|
|
15
|
-
* Resolved when a matching `mutation_result` frame arrives from the
|
|
16
|
-
* server, or rejected on timeout / disconnect.
|
|
17
|
-
*/
|
|
18
|
-
export interface PendingCommit {
|
|
19
|
-
resolve: (value: CommitAck) => void;
|
|
20
|
-
reject: (err: Error) => void;
|
|
21
|
-
timeout: ReturnType<typeof setTimeout>;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* In-flight `claim` request record, keyed by claimId. Resolved when the
|
|
25
|
-
* matching `claim_ack` arrives, or rejected on timeout/disconnect.
|
|
26
|
-
*/
|
|
27
|
-
export interface PendingClaim {
|
|
28
|
-
resolve: (value: {
|
|
29
|
-
syncGroups: string[];
|
|
30
|
-
ttlSeconds?: number;
|
|
31
|
-
}) => void;
|
|
32
|
-
reject: (err: Error) => void;
|
|
33
|
-
timeout: ReturnType<typeof setTimeout>;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* An in-flight `update_subscription` request awaiting its
|
|
37
|
-
* `subscription_ack`. The wire carries no correlation id, so requests are
|
|
38
|
-
* matched to their acknowledgements in first-in, first-out order, the same
|
|
39
|
-
* order the server applies them.
|
|
40
|
-
*/
|
|
41
|
-
export interface PendingSubscription {
|
|
42
|
-
resolve: (value: {
|
|
43
|
-
syncGroups: string[];
|
|
44
|
-
}) => void;
|
|
45
|
-
reject: (err: Error) => void;
|
|
46
|
-
timeout: ReturnType<typeof setTimeout>;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* A parsed inbound wire frame — the envelope only, with its payload still
|
|
50
|
-
* untrusted. Inferred from {@link wsInboundEnvelopeSchema} rather than written
|
|
51
|
-
* out, so the type a handler sees and the check the socket runs are the same
|
|
52
|
-
* statement. The open key set is what carries the oldest delta form, which puts
|
|
53
|
-
* a delta's own fields (`actionType`, `modelName`) at the top level instead of
|
|
54
|
-
* under `payload`.
|
|
55
|
-
*/
|
|
56
|
-
export type WsInboundFrame = WsInboundEnvelope;
|
|
57
|
-
/** Narrow arbitrary wire data to a plain string-keyed record. */
|
|
58
|
-
export declare function isRecord(value: unknown): value is Record<string, unknown>;
|
|
59
|
-
/**
|
|
60
|
-
* Read the envelope off an inbound message, or `null` when it is not one —
|
|
61
|
-
* anything that is not an object, or whose `type` is not a string. The payload
|
|
62
|
-
* is not checked here; that belongs to the frame's own schema, applied at
|
|
63
|
-
* dispatch.
|
|
64
|
-
*/
|
|
65
|
-
export declare function readWsInboundFrame(value: unknown): WsInboundFrame | null;
|
|
66
|
-
/**
|
|
67
|
-
* The subset of the sync WebSocket that the frame handlers need. The
|
|
68
|
-
* transport builds a single object exposing these members over its own
|
|
69
|
-
* private state. Handlers read the fields live rather than capturing them,
|
|
70
|
-
* so resetting a field elsewhere — such as clearing pending subscriptions
|
|
71
|
-
* on close — never leaves a handler holding a stale value.
|
|
72
|
-
*/
|
|
73
|
-
export interface WsSession {
|
|
74
|
-
/** EventEmitter surface — handlers emit the typed transport events. */
|
|
75
|
-
emit(event: string, ...args: unknown[]): boolean;
|
|
76
|
-
/** Where the handlers log. The transport passes its own port. */
|
|
77
|
-
logger: Logger;
|
|
78
|
-
/** Where coordination outcomes and lifecycle breadcrumbs are reported. */
|
|
79
|
-
observability: SocketObservability;
|
|
80
|
-
/** In-flight commit acks keyed by clientTxId. */
|
|
81
|
-
pendingMutations: Map<string, PendingCommit>;
|
|
82
|
-
/** In-flight claim acks keyed by claimId. */
|
|
83
|
-
pendingClaims: Map<string, PendingClaim>;
|
|
84
|
-
/** Removes and returns the oldest in-flight `update_subscription` request. */
|
|
85
|
-
shiftPendingSubscription(): PendingSubscription | undefined;
|
|
86
|
-
/** Connection options subset the handlers write back (acked sync groups). */
|
|
87
|
-
options: {
|
|
88
|
-
syncGroups: string[];
|
|
89
|
-
};
|
|
90
|
-
/** Registered collaboration event keys (colon format). */
|
|
91
|
-
collaborationEventTypes: ReadonlySet<string>;
|
|
92
|
-
/**
|
|
93
|
-
* Processes one inbound delta. The argument is untrusted wire data; the
|
|
94
|
-
* transport validates it against the canonical delta schema and drops
|
|
95
|
-
* anything malformed, so handlers here never cast.
|
|
96
|
-
*/
|
|
97
|
-
handleDelta(delta: unknown): void;
|
|
98
|
-
handleSyncResponse(payload: unknown): void;
|
|
99
|
-
handleBootstrapResponse(payload: unknown): void;
|
|
100
|
-
handlePresenceUpdate(message: {
|
|
101
|
-
payload?: unknown;
|
|
102
|
-
[k: string]: unknown;
|
|
103
|
-
}): void;
|
|
104
|
-
}
|
|
105
|
-
export type WsFrameHandler = (session: WsSession, message: WsInboundFrame) => void;
|
|
106
|
-
/**
|
|
107
|
-
* Maps each frame type to its handler. Every named server frame this
|
|
108
|
-
* package understands is dispatched from this table; anything else falls
|
|
109
|
-
* through to the collaboration-event and unknown-type path in
|
|
110
|
-
* {@link dispatchWsFrame}.
|
|
111
|
-
*/
|
|
112
|
-
export declare const wsFrameHandlers: Record<string, WsFrameHandler>;
|
|
113
|
-
/**
|
|
114
|
-
* Routes one inbound frame to its handler, validating the payload first.
|
|
115
|
-
*
|
|
116
|
-
* A frame the protocol declares with a payload schema is parsed here, so its
|
|
117
|
-
* handler works on a proven shape. A frame the protocol does not declare is
|
|
118
|
-
* rejected: the server and this package ship together, so an unrecognised type
|
|
119
|
-
* means the two have drifted, and a change nobody validated should not reach a
|
|
120
|
-
* local store. The one exception is an application's own collaboration events,
|
|
121
|
-
* which the consumer registers at construction and the protocol knows nothing
|
|
122
|
-
* about.
|
|
123
|
-
*
|
|
124
|
-
* Throwing is the reporting channel. The transport's message loop catches and
|
|
125
|
-
* reports through `captureWebSocketError`, so a bad frame surfaces as a
|
|
126
|
-
* captured error and the connection survives.
|
|
127
|
-
*/
|
|
128
|
-
export declare function dispatchWsFrame(session: WsSession, message: WsInboundFrame): void;
|