@abloatai/ablo 0.26.0 → 0.27.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/CHANGELOG.md +14 -0
- package/README.md +101 -85
- package/dist/BaseSyncedStore.d.ts +85 -88
- package/dist/BaseSyncedStore.js +131 -147
- package/dist/Database.d.ts +54 -68
- package/dist/Database.js +97 -113
- package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
- package/dist/{ObjectPool.js → InstanceCache.js} +85 -83
- package/dist/LazyReferenceCollection.d.ts +11 -15
- package/dist/LazyReferenceCollection.js +12 -16
- package/dist/Model.d.ts +37 -52
- package/dist/Model.js +46 -61
- package/dist/ModelRegistry.d.ts +21 -19
- package/dist/ModelRegistry.js +23 -27
- package/dist/NetworkMonitor.d.ts +5 -6
- package/dist/NetworkMonitor.js +5 -6
- package/dist/SyncClient.d.ts +112 -112
- package/dist/SyncClient.js +165 -172
- package/dist/adapters/alwaysOnline.d.ts +6 -8
- package/dist/adapters/alwaysOnline.js +6 -8
- package/dist/adapters/inMemoryStorage.d.ts +9 -9
- package/dist/adapters/inMemoryStorage.js +9 -9
- package/dist/agent/Agent.d.ts +27 -32
- package/dist/agent/Agent.js +18 -19
- package/dist/agent/index.d.ts +4 -4
- package/dist/agent/index.js +5 -5
- package/dist/agent/session.d.ts +47 -44
- package/dist/agent/session.js +37 -48
- package/dist/agent/types.d.ts +26 -31
- package/dist/agent/types.js +6 -7
- package/dist/ai-sdk/coordinatedTool.d.ts +108 -0
- package/dist/ai-sdk/{coordinated-tool.js → coordinatedTool.js} +44 -38
- package/dist/ai-sdk/coordinationContext.d.ts +46 -0
- package/dist/ai-sdk/{coordination-context.js → coordinationContext.js} +26 -33
- package/dist/ai-sdk/index.d.ts +25 -22
- package/dist/ai-sdk/index.js +25 -22
- package/dist/ai-sdk/wrap.d.ts +6 -7
- package/dist/ai-sdk/wrap.js +1 -1
- package/dist/auth/credentialPolicy.d.ts +69 -74
- package/dist/auth/credentialPolicy.js +51 -56
- package/dist/auth/credentialSource.d.ts +6 -5
- package/dist/auth/credentialSource.js +9 -10
- package/dist/auth/index.d.ts +59 -58
- package/dist/auth/index.js +31 -37
- package/dist/auth/schemas.d.ts +5 -4
- package/dist/auth/schemas.js +5 -4
- package/dist/batching/index.d.ts +19 -21
- package/dist/batching/index.js +14 -17
- package/dist/cli.cjs +167 -119
- package/dist/client/Ablo.d.ts +73 -73
- package/dist/client/Ablo.js +125 -160
- package/dist/client/ApiClient.d.ts +30 -19
- package/dist/client/ApiClient.js +133 -38
- package/dist/client/auth.d.ts +47 -47
- package/dist/client/auth.js +108 -117
- package/dist/client/claimHeartbeatLoop.d.ts +50 -0
- package/dist/client/claimHeartbeatLoop.js +88 -0
- package/dist/client/consoleLogger.d.ts +5 -6
- package/dist/client/consoleLogger.js +5 -6
- package/dist/client/createInternalComponents.d.ts +14 -17
- package/dist/client/createInternalComponents.js +25 -30
- package/dist/client/createModelProxy.d.ts +130 -120
- package/dist/client/createModelProxy.js +152 -122
- package/dist/client/credentialEndpoint.d.ts +40 -42
- package/dist/client/credentialEndpoint.js +35 -36
- package/dist/client/functionalUpdate.d.ts +29 -27
- package/dist/client/functionalUpdate.js +21 -21
- package/dist/client/hostedEndpoints.d.ts +9 -12
- package/dist/client/hostedEndpoints.js +9 -12
- package/dist/client/httpClient.d.ts +57 -53
- package/dist/client/httpClient.js +29 -31
- package/dist/client/identity.d.ts +15 -20
- package/dist/client/identity.js +47 -58
- package/dist/client/modelRegistration.d.ts +5 -9
- package/dist/client/modelRegistration.js +67 -87
- package/dist/client/options.d.ts +134 -157
- package/dist/client/options.js +3 -7
- package/dist/client/registerDataSource.d.ts +9 -9
- package/dist/client/registerDataSource.js +15 -16
- package/dist/client/resourceTypes.d.ts +64 -75
- package/dist/client/resourceTypes.js +4 -10
- package/dist/client/schemaConfig.d.ts +31 -43
- package/dist/client/schemaConfig.js +38 -50
- package/dist/client/sessionMint.d.ts +16 -12
- package/dist/client/sessionMint.js +26 -31
- package/dist/client/validateAbloOptions.d.ts +12 -14
- package/dist/client/validateAbloOptions.js +8 -9
- package/dist/client/writeOptionsSchema.d.ts +18 -16
- package/dist/client/writeOptionsSchema.js +23 -20
- package/dist/client/wsMutationExecutor.d.ts +15 -20
- package/dist/client/wsMutationExecutor.js +17 -23
- package/dist/context.d.ts +6 -4
- package/dist/context.js +6 -4
- package/dist/coordination/index.d.ts +10 -8
- package/dist/coordination/index.js +14 -12
- package/dist/coordination/schema.d.ts +176 -128
- package/dist/coordination/schema.js +197 -133
- package/dist/coordination/trace.d.ts +9 -10
- package/dist/coordination/trace.js +13 -14
- package/dist/core/DatabaseManager.d.ts +5 -7
- package/dist/core/DatabaseManager.js +15 -19
- package/dist/core/QueryProcessor.d.ts +7 -9
- package/dist/core/QueryProcessor.js +22 -28
- package/dist/core/QueryView.d.ts +8 -8
- package/dist/core/QueryView.js +2 -2
- package/dist/core/StoreManager.d.ts +12 -14
- package/dist/core/StoreManager.js +21 -24
- package/dist/core/ViewRegistry.d.ts +5 -5
- package/dist/core/ViewRegistry.js +4 -4
- package/dist/core/index.d.ts +17 -12
- package/dist/core/index.js +32 -26
- package/dist/core/openIDBWithTimeout.d.ts +38 -36
- package/dist/core/openIDBWithTimeout.js +42 -43
- package/dist/core/queryUtils.d.ts +45 -0
- package/dist/core/queryUtils.js +69 -0
- package/dist/core/storeContract.d.ts +63 -61
- package/dist/core/storeContract.js +8 -12
- package/dist/environment.d.ts +28 -0
- package/dist/environment.js +21 -0
- package/dist/errorCodes.d.ts +107 -99
- package/dist/errorCodes.js +131 -132
- package/dist/errors.d.ts +160 -166
- package/dist/errors.js +155 -158
- package/dist/index.d.ts +30 -27
- package/dist/index.js +89 -86
- package/dist/interfaces/index.d.ts +102 -113
- package/dist/interfaces/index.js +5 -4
- package/dist/keys/index.d.ts +27 -29
- package/dist/keys/index.js +41 -40
- package/dist/mutators/RecordingTransaction.d.ts +16 -16
- package/dist/mutators/RecordingTransaction.js +31 -37
- package/dist/mutators/Transaction.d.ts +18 -26
- package/dist/mutators/Transaction.js +14 -20
- package/dist/mutators/UndoManager.d.ts +122 -131
- package/dist/mutators/UndoManager.js +145 -156
- package/dist/mutators/defineMutators.d.ts +23 -34
- package/dist/mutators/defineMutators.js +14 -20
- package/dist/mutators/inverseOp.d.ts +12 -15
- package/dist/mutators/inverseOp.js +12 -15
- package/dist/mutators/mutateActions.d.ts +10 -9
- package/dist/mutators/mutateActions.js +1 -1
- package/dist/mutators/readerActions.d.ts +9 -8
- package/dist/mutators/readerActions.js +2 -2
- package/dist/mutators/undoApply.d.ts +31 -27
- package/dist/mutators/undoApply.js +26 -24
- package/dist/policy/index.d.ts +5 -3
- package/dist/policy/index.js +5 -3
- package/dist/policy/types.d.ts +104 -100
- package/dist/policy/types.js +67 -66
- package/dist/query/client.d.ts +28 -23
- package/dist/query/client.js +45 -43
- package/dist/query/types.d.ts +37 -60
- package/dist/query/types.js +13 -33
- package/dist/react/AbloProvider.d.ts +1 -1
- package/dist/react/AbloProvider.js +2 -2
- package/dist/react/context.d.ts +25 -28
- package/dist/react/context.js +9 -10
- package/dist/react/index.d.ts +41 -42
- package/dist/react/index.js +37 -38
- package/dist/react/internalContext.d.ts +17 -19
- package/dist/react/useAblo.d.ts +23 -22
- package/dist/react/useAblo.js +16 -14
- package/dist/react/useCurrentUserId.d.ts +8 -7
- package/dist/react/useCurrentUserId.js +8 -7
- package/dist/react/useErrorListener.d.ts +7 -7
- package/dist/react/useErrorListener.js +10 -11
- package/dist/react/useMutationFailureListener.d.ts +8 -8
- package/dist/react/useMutationFailureListener.js +8 -8
- package/dist/react/useMutators.d.ts +11 -11
- package/dist/react/useMutators.js +3 -3
- package/dist/react/useReactive.js +2 -2
- package/dist/react/useSyncStatus.d.ts +4 -6
- package/dist/react/useUndoScope.d.ts +7 -9
- package/dist/react/useUndoScope.js +1 -1
- package/dist/schema/coordination.d.ts +21 -25
- package/dist/schema/coordination.js +21 -25
- package/dist/schema/ddl.d.ts +43 -39
- package/dist/schema/ddl.js +75 -68
- package/dist/schema/ddlLock.d.ts +20 -24
- package/dist/schema/ddlLock.js +18 -23
- package/dist/schema/diff.d.ts +99 -61
- package/dist/schema/diff.js +43 -34
- package/dist/schema/field.d.ts +37 -42
- package/dist/schema/field.js +35 -48
- package/dist/schema/generate.d.ts +12 -12
- package/dist/schema/generate.js +12 -12
- package/dist/schema/index.d.ts +2 -2
- package/dist/schema/index.js +21 -23
- package/dist/schema/model.d.ts +118 -143
- package/dist/schema/model.js +22 -33
- package/dist/schema/openapi.d.ts +10 -9
- package/dist/schema/openapi.js +5 -3
- package/dist/schema/queries.d.ts +29 -31
- package/dist/schema/queries.js +23 -25
- package/dist/schema/relation.d.ts +89 -99
- package/dist/schema/relation.js +13 -13
- package/dist/schema/residency.d.ts +16 -13
- package/dist/schema/residency.js +16 -13
- package/dist/schema/roles.d.ts +36 -43
- package/dist/schema/roles.js +31 -37
- package/dist/schema/schema.d.ts +33 -42
- package/dist/schema/schema.js +31 -32
- package/dist/schema/select.d.ts +13 -13
- package/dist/schema/select.js +13 -13
- package/dist/schema/serialize.d.ts +28 -31
- package/dist/schema/serialize.js +27 -31
- package/dist/schema/sugar.d.ts +17 -32
- package/dist/schema/sugar.js +14 -29
- package/dist/schema/{sync-delta-row.d.ts → syncDeltaRow.d.ts} +26 -49
- package/dist/schema/syncDeltaRow.js +89 -0
- package/dist/schema/tenancy.d.ts +44 -46
- package/dist/schema/tenancy.js +46 -48
- package/dist/server/adapter.d.ts +58 -58
- package/dist/server/adapter.js +13 -14
- package/dist/server/commit.d.ts +60 -64
- package/dist/server/index.d.ts +9 -10
- package/dist/server/index.js +1 -1
- package/dist/server/readConfig.d.ts +70 -0
- package/dist/server/readConfig.js +8 -0
- package/dist/server/storageMode.d.ts +23 -0
- package/dist/server/storageMode.js +17 -0
- package/dist/source/adapter.d.ts +30 -25
- package/dist/source/adapter.js +10 -10
- package/dist/source/adapters/drizzle.d.ts +28 -23
- package/dist/source/adapters/drizzle.js +30 -25
- package/dist/source/adapters/kysely.d.ts +27 -25
- package/dist/source/adapters/kysely.js +24 -23
- package/dist/source/adapters/memory.d.ts +8 -7
- package/dist/source/adapters/memory.js +9 -8
- package/dist/source/adapters/prisma.d.ts +13 -12
- package/dist/source/adapters/prisma.js +22 -25
- package/dist/source/conformance.d.ts +18 -11
- package/dist/source/conformance.js +17 -11
- package/dist/source/connector.d.ts +31 -32
- package/dist/source/connector.js +28 -28
- package/dist/source/connectorProtocol.d.ts +160 -0
- package/dist/source/connectorProtocol.js +162 -0
- package/dist/source/contract.d.ts +26 -27
- package/dist/source/contract.js +28 -29
- package/dist/source/factory.d.ts +46 -58
- package/dist/source/factory.js +22 -27
- package/dist/source/index.d.ts +7 -9
- package/dist/source/index.js +12 -14
- package/dist/source/migrations.d.ts +9 -9
- package/dist/source/migrations.js +9 -9
- package/dist/source/next.d.ts +9 -10
- package/dist/source/next.js +6 -7
- package/dist/source/pushQueue.d.ts +69 -47
- package/dist/source/pushQueue.js +32 -28
- package/dist/source/signing.d.ts +46 -17
- package/dist/source/signing.js +28 -11
- package/dist/source/types.d.ts +121 -104
- package/dist/source/types.js +13 -14
- package/dist/stores/ObjectStore.d.ts +10 -11
- package/dist/stores/ObjectStore.js +11 -12
- package/dist/stores/ObjectStoreContract.d.ts +12 -15
- package/dist/stores/SyncActionStore.d.ts +7 -11
- package/dist/stores/SyncActionStore.js +13 -17
- package/dist/surface.d.ts +27 -20
- package/dist/surface.js +27 -20
- package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +36 -42
- package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +76 -76
- package/dist/sync/ConnectionManager.d.ts +39 -50
- package/dist/sync/ConnectionManager.js +55 -66
- package/dist/sync/NetworkProbe.d.ts +24 -29
- package/dist/sync/NetworkProbe.js +63 -69
- package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +42 -41
- package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +59 -54
- package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +43 -57
- package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +43 -51
- package/dist/sync/SyncWebSocket.d.ts +139 -165
- package/dist/sync/SyncWebSocket.js +191 -223
- package/dist/sync/awaitClaimGrant.d.ts +18 -18
- package/dist/sync/awaitClaimGrant.js +11 -11
- package/dist/sync/bootstrapApply.d.ts +34 -24
- package/dist/sync/bootstrapApply.js +27 -19
- package/dist/sync/commitFrames.d.ts +21 -20
- package/dist/sync/commitFrames.js +18 -18
- package/dist/sync/createClaimStream.d.ts +23 -22
- package/dist/sync/createClaimStream.js +105 -23
- package/dist/sync/createPresenceStream.d.ts +19 -18
- package/dist/sync/createPresenceStream.js +25 -26
- package/dist/sync/createSnapshot.d.ts +12 -14
- package/dist/sync/createSnapshot.js +20 -26
- package/dist/sync/credentialLifecycle.d.ts +104 -104
- package/dist/sync/credentialLifecycle.js +140 -147
- package/dist/sync/deltaPipeline.d.ts +36 -34
- package/dist/sync/deltaPipeline.js +64 -65
- package/dist/sync/groupChange.d.ts +63 -61
- package/dist/sync/groupChange.js +74 -78
- package/dist/sync/heartbeat.d.ts +34 -33
- package/dist/sync/heartbeat.js +31 -31
- package/dist/sync/participants.d.ts +19 -19
- package/dist/sync/schemas.d.ts +3 -2
- package/dist/sync/schemas.js +14 -10
- package/dist/sync/syncCursor.d.ts +17 -21
- package/dist/sync/syncCursor.js +17 -21
- package/dist/sync/syncPlan.d.ts +28 -36
- package/dist/sync/syncPlan.js +18 -19
- package/dist/sync/syncPosition.d.ts +54 -49
- package/dist/sync/syncPosition.js +57 -52
- package/dist/sync/wsFrameHandlers.d.ts +35 -36
- package/dist/sync/wsFrameHandlers.js +63 -67
- package/dist/testing/fixtures/bootstrap.d.ts +12 -6
- package/dist/testing/fixtures/bootstrap.js +12 -6
- package/dist/testing/fixtures/deltas.d.ts +30 -33
- package/dist/testing/fixtures/deltas.js +30 -33
- package/dist/testing/fixtures/models.d.ts +11 -10
- package/dist/testing/fixtures/models.js +11 -10
- package/dist/testing/helpers/{react-wrapper.d.ts → reactWrapper.d.ts} +13 -10
- package/dist/testing/helpers/{react-wrapper.js → reactWrapper.js} +15 -12
- package/dist/testing/helpers/{sync-engine-harness.d.ts → syncEngineHarness.d.ts} +17 -15
- package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +12 -10
- package/dist/testing/helpers/wait.d.ts +13 -8
- package/dist/testing/helpers/wait.js +13 -8
- package/dist/testing/index.d.ts +3 -3
- package/dist/testing/index.js +2 -2
- package/dist/testing/mocks/MockMutationExecutor.d.ts +18 -17
- package/dist/testing/mocks/MockMutationExecutor.js +15 -14
- package/dist/testing/mocks/MockNetworkMonitor.d.ts +8 -8
- package/dist/testing/mocks/MockNetworkMonitor.js +8 -8
- package/dist/testing/mocks/MockSyncContext.d.ts +20 -17
- package/dist/testing/mocks/MockSyncContext.js +15 -13
- package/dist/testing/mocks/MockSyncStore.d.ts +10 -10
- package/dist/testing/mocks/MockSyncStore.js +11 -11
- package/dist/testing/mocks/MockWebSocket.d.ts +26 -22
- package/dist/testing/mocks/MockWebSocket.js +22 -21
- package/dist/transactions/TransactionQueue.d.ts +181 -176
- package/dist/transactions/TransactionQueue.js +338 -350
- package/dist/transactions/TransactionStore.d.ts +6 -4
- package/dist/transactions/TransactionStore.js +6 -4
- package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
- package/dist/transactions/UnconfirmedWrites.js +104 -0
- package/dist/transactions/coalesceRules.d.ts +41 -17
- package/dist/transactions/coalesceRules.js +40 -17
- package/dist/transactions/commitPayload.d.ts +48 -52
- package/dist/transactions/commitPayload.js +48 -57
- package/dist/transactions/deltaConfirmation.d.ts +20 -22
- package/dist/transactions/deltaConfirmation.js +37 -45
- package/dist/transactions/optimisticApply.d.ts +49 -0
- package/dist/transactions/optimisticApply.js +65 -0
- package/dist/transactions/{persistedReplay.d.ts → replayValidation.d.ts} +28 -22
- package/dist/transactions/{persistedReplay.js → replayValidation.js} +33 -27
- package/dist/types/global.d.ts +46 -41
- package/dist/types/global.js +20 -19
- package/dist/types/index.d.ts +71 -77
- package/dist/types/index.js +22 -22
- package/dist/types/modelData.d.ts +6 -8
- package/dist/types/modelData.js +5 -7
- package/dist/types/participant.d.ts +10 -11
- package/dist/types/participant.js +6 -8
- package/dist/types/streams.d.ts +208 -195
- package/dist/types/streams.js +7 -7
- package/dist/utils/asyncIterator.d.ts +25 -32
- package/dist/utils/asyncIterator.js +25 -32
- package/dist/utils/duration.d.ts +12 -15
- package/dist/utils/duration.js +12 -15
- package/dist/utils/mobxSetup.d.ts +53 -0
- package/dist/utils/{mobx-setup.js → mobxSetup.js} +42 -98
- package/dist/webhooks/events.d.ts +21 -16
- package/dist/webhooks/events.js +10 -8
- package/dist/webhooks/index.d.ts +5 -7
- package/dist/webhooks/index.js +5 -7
- package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
- package/dist/wire/delta.js +114 -0
- package/dist/wire/errorEnvelope.d.ts +30 -31
- package/dist/wire/errorEnvelope.js +34 -40
- package/dist/wire/frames.d.ts +79 -86
- package/dist/wire/frames.js +26 -33
- package/dist/wire/index.d.ts +14 -12
- package/dist/wire/index.js +30 -26
- package/dist/wire/listEnvelope.d.ts +16 -23
- package/dist/wire/listEnvelope.js +7 -6
- package/dist/wire/protocol.d.ts +25 -32
- package/dist/wire/protocol.js +25 -32
- package/dist/wire/protocolVersion.d.ts +44 -40
- package/dist/wire/protocolVersion.js +44 -40
- package/docs/coordination.md +59 -0
- package/package.json +11 -10
- package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
- package/dist/ai-sdk/coordination-context.d.ts +0 -52
- package/dist/core/query-utils.d.ts +0 -34
- package/dist/core/query-utils.js +0 -59
- package/dist/schema/sync-delta-row.js +0 -103
- package/dist/schema/sync-delta-wire.js +0 -102
- package/dist/server/read-config.d.ts +0 -67
- package/dist/server/read-config.js +0 -8
- package/dist/server/storage-mode.d.ts +0 -8
- package/dist/server/storage-mode.js +0 -28
- package/dist/source/connector-protocol.d.ts +0 -159
- package/dist/source/connector-protocol.js +0 -161
- package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
- package/dist/transactions/OptimisticEchoTracker.js +0 -104
- package/dist/transactions/mutation-error-handler.d.ts +0 -5
- package/dist/transactions/mutation-error-handler.js +0 -39
- package/dist/transactions/optimistic.d.ts +0 -24
- package/dist/transactions/optimistic.js +0 -45
- package/dist/utils/mobx-setup.d.ts +0 -42
package/dist/webhooks/index.js
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* the open Standard Webhooks library (`svix` / `standardwebhooks`), so Ablo
|
|
8
|
-
* ships no crypto.
|
|
2
|
+
* The public entry point for webhooks. Import {@link AbloWebhookEvent} to type
|
|
3
|
+
* your event handler, and use {@link deltaToWebhookEvent} to turn a committed
|
|
4
|
+
* change from the transaction log into an event to deliver. This module does not
|
|
5
|
+
* verify signatures and ships no cryptography; recipients verify deliveries with
|
|
6
|
+
* a standard webhooks library.
|
|
9
7
|
*/
|
|
10
8
|
export { deltaToWebhookEvent, } from './events.js';
|
|
@@ -1,35 +1,51 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* `actionType` as `string` and `createdBy` as a nested ref; the client typed
|
|
8
|
-
* `actionType` as the 8-value union and `createdBy` as a flat string — a silent
|
|
9
|
-
* divergence the client never noticed because it ignores attribution).
|
|
2
|
+
* The delta wire contract: the object the server broadcasts to a client as the
|
|
3
|
+
* payload of a `delta` or `sync_response` frame. Both the client SDK and the
|
|
4
|
+
* server derive their delta types from the schemas here, so the two ends share
|
|
5
|
+
* one definition and cannot drift apart. This is the delta's home in the wire
|
|
6
|
+
* layer, alongside the other protocol shapes in `wire/`.
|
|
10
7
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* {@link ParticipantRef}s.
|
|
8
|
+
* The wire delta is a projection of the stored `sync_deltas` row (see
|
|
9
|
+
* {@link import('../schema/syncDeltaRow.js').syncDeltaRowSchema}) and differs from
|
|
10
|
+
* it in three ways: it omits `organizationId` (the tenant-isolation predicate is
|
|
11
|
+
* never broadcast), it uses the full action vocabulary (see
|
|
12
|
+
* {@link syncDeltaActionSchema}) rather than plain create, update, and delete, and
|
|
13
|
+
* it carries attribution as nested {@link ParticipantRef}s instead of flat columns.
|
|
17
14
|
*
|
|
18
|
-
*
|
|
19
|
-
* - {@link syncDeltaWireCoreSchema} — the fields
|
|
20
|
-
* - {@link clientSyncDeltaSchema}
|
|
21
|
-
* - {@link serverSyncDeltaSchema}
|
|
22
|
-
*
|
|
23
|
-
* structurally ignores these).
|
|
15
|
+
* The schemas layer a shared core plus per-side extensions:
|
|
16
|
+
* - {@link syncDeltaWireCoreSchema} — the fields both sides agree on.
|
|
17
|
+
* - {@link clientSyncDeltaSchema} — the core plus the fields only the client reads.
|
|
18
|
+
* - {@link serverSyncDeltaSchema} — the core plus the audit attribution the server
|
|
19
|
+
* adds to each broadcast, which the client ignores.
|
|
24
20
|
*
|
|
25
|
-
*
|
|
21
|
+
* The two participant enums below (`participantKind`, `confirmationState`) are the
|
|
22
|
+
* shared vocabulary of the protocol. They live here, at the wire layer, so the
|
|
23
|
+
* stored-row schema can import them downward rather than the wire delta reaching
|
|
24
|
+
* up into the schema DSL for them.
|
|
26
25
|
*/
|
|
27
26
|
import { z } from 'zod';
|
|
27
|
+
/** `participant_kind` — who a delta is attributed to. */
|
|
28
|
+
export declare const participantKindSchema: z.ZodEnum<{
|
|
29
|
+
user: "user";
|
|
30
|
+
agent: "agent";
|
|
31
|
+
system: "system";
|
|
32
|
+
}>;
|
|
33
|
+
export type ParticipantKind = z.infer<typeof participantKindSchema>;
|
|
34
|
+
/** `confirmation_state` — the approval stage a committed change was in. */
|
|
35
|
+
export declare const confirmationStateSchema: z.ZodEnum<{
|
|
36
|
+
auto: "auto";
|
|
37
|
+
previewed: "previewed";
|
|
38
|
+
approved: "approved";
|
|
39
|
+
required_human_approval: "required_human_approval";
|
|
40
|
+
auto_historical: "auto_historical";
|
|
41
|
+
}>;
|
|
42
|
+
export type ConfirmationState = z.infer<typeof confirmationStateSchema>;
|
|
28
43
|
/**
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
* `
|
|
32
|
-
* `S`
|
|
44
|
+
* The full set of action codes a wire delta can carry — a broader vocabulary than
|
|
45
|
+
* the stored row's create, update, and delete. Each is a single character: `I`
|
|
46
|
+
* insert, `U` update, `D` delete, `A` archive, `V` revive (unarchive), `C` covering
|
|
47
|
+
* (the row just became visible to this subscriber), `G` group added, and `S` group
|
|
48
|
+
* removed.
|
|
33
49
|
*/
|
|
34
50
|
export declare const syncDeltaActionSchema: z.ZodEnum<{
|
|
35
51
|
I: "I";
|
|
@@ -43,16 +59,17 @@ export declare const syncDeltaActionSchema: z.ZodEnum<{
|
|
|
43
59
|
}>;
|
|
44
60
|
export type SyncDeltaAction = z.infer<typeof syncDeltaActionSchema>;
|
|
45
61
|
/**
|
|
46
|
-
*
|
|
47
|
-
* (
|
|
48
|
-
* deletes
|
|
49
|
-
* group
|
|
62
|
+
* The payload carried on a wire delta: the post-mutation row as an object, a
|
|
63
|
+
* serialized string (used by the group-change frames on `G` and `S` deltas), or
|
|
64
|
+
* `null` on deletes. This is wider than the stored row's payload — which is only a
|
|
65
|
+
* row or null — because the group-change frames encode their payload as a string.
|
|
50
66
|
*/
|
|
51
67
|
export declare const wireDeltaDataSchema: z.ZodNullable<z.ZodUnion<readonly [z.ZodRecord<z.ZodString, z.ZodUnknown>, z.ZodString]>>;
|
|
52
68
|
export type WireDeltaData = z.infer<typeof wireDeltaDataSchema>;
|
|
53
69
|
/**
|
|
54
|
-
* A
|
|
55
|
-
*
|
|
70
|
+
* A participant reference as carried on a broadcast delta. The server expands the
|
|
71
|
+
* flat `actor_id` and `actor_kind` stored columns into this nested `{ kind, id }`
|
|
72
|
+
* shape.
|
|
56
73
|
*/
|
|
57
74
|
export declare const participantRefSchema: z.ZodObject<{
|
|
58
75
|
kind: z.ZodEnum<{
|
|
@@ -64,11 +81,11 @@ export declare const participantRefSchema: z.ZodObject<{
|
|
|
64
81
|
}, z.core.$strip>;
|
|
65
82
|
export type ParticipantRef = z.infer<typeof participantRefSchema>;
|
|
66
83
|
/**
|
|
67
|
-
* The fields
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
* broadcast)
|
|
71
|
-
* live in the extensions below.
|
|
84
|
+
* The fields the server and client agree on for a broadcast delta — the shared core
|
|
85
|
+
* both projections extend. `transactionId` is typed as the client sees it (an
|
|
86
|
+
* optional string); {@link serverSyncDeltaSchema} widens it to nullable. There is no
|
|
87
|
+
* `organizationId` here (it is never broadcast) and no attribution — those fields
|
|
88
|
+
* differ between the two sides and live in the extensions below.
|
|
72
89
|
*/
|
|
73
90
|
export declare const syncDeltaWireCoreSchema: z.ZodObject<{
|
|
74
91
|
id: z.ZodNumber;
|
|
@@ -92,8 +109,8 @@ export declare const syncDeltaWireCoreSchema: z.ZodObject<{
|
|
|
92
109
|
}, z.core.$strip>;
|
|
93
110
|
export type SyncDeltaWireCore = z.infer<typeof syncDeltaWireCoreSchema>;
|
|
94
111
|
/**
|
|
95
|
-
*
|
|
96
|
-
*
|
|
112
|
+
* The client's view of a wire delta: the shared core plus the fields only the
|
|
113
|
+
* client reads. Inferring this schema gives the SDK's `SyncDelta` type.
|
|
97
114
|
*/
|
|
98
115
|
export declare const clientSyncDeltaSchema: z.ZodObject<{
|
|
99
116
|
id: z.ZodNumber;
|
|
@@ -120,9 +137,9 @@ export declare const clientSyncDeltaSchema: z.ZodObject<{
|
|
|
120
137
|
}, z.core.$strip>;
|
|
121
138
|
export type ClientSyncDelta = z.infer<typeof clientSyncDeltaSchema>;
|
|
122
139
|
/**
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
* `transactionId` to nullable
|
|
140
|
+
* The server's view of a wire delta: the shared core plus the audit attribution the
|
|
141
|
+
* server adds to each broadcast. The client structurally ignores these fields. This
|
|
142
|
+
* projection also narrows `transactionId` to nullable, matching the stored column.
|
|
126
143
|
*/
|
|
127
144
|
export declare const serverSyncDeltaSchema: z.ZodObject<{
|
|
128
145
|
id: z.ZodNumber;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The delta wire contract: the object the server broadcasts to a client as the
|
|
3
|
+
* payload of a `delta` or `sync_response` frame. Both the client SDK and the
|
|
4
|
+
* server derive their delta types from the schemas here, so the two ends share
|
|
5
|
+
* one definition and cannot drift apart. This is the delta's home in the wire
|
|
6
|
+
* layer, alongside the other protocol shapes in `wire/`.
|
|
7
|
+
*
|
|
8
|
+
* The wire delta is a projection of the stored `sync_deltas` row (see
|
|
9
|
+
* {@link import('../schema/syncDeltaRow.js').syncDeltaRowSchema}) and differs from
|
|
10
|
+
* it in three ways: it omits `organizationId` (the tenant-isolation predicate is
|
|
11
|
+
* never broadcast), it uses the full action vocabulary (see
|
|
12
|
+
* {@link syncDeltaActionSchema}) rather than plain create, update, and delete, and
|
|
13
|
+
* it carries attribution as nested {@link ParticipantRef}s instead of flat columns.
|
|
14
|
+
*
|
|
15
|
+
* The schemas layer a shared core plus per-side extensions:
|
|
16
|
+
* - {@link syncDeltaWireCoreSchema} — the fields both sides agree on.
|
|
17
|
+
* - {@link clientSyncDeltaSchema} — the core plus the fields only the client reads.
|
|
18
|
+
* - {@link serverSyncDeltaSchema} — the core plus the audit attribution the server
|
|
19
|
+
* adds to each broadcast, which the client ignores.
|
|
20
|
+
*
|
|
21
|
+
* The two participant enums below (`participantKind`, `confirmationState`) are the
|
|
22
|
+
* shared vocabulary of the protocol. They live here, at the wire layer, so the
|
|
23
|
+
* stored-row schema can import them downward rather than the wire delta reaching
|
|
24
|
+
* up into the schema DSL for them.
|
|
25
|
+
*/
|
|
26
|
+
import { z } from 'zod';
|
|
27
|
+
// ── Shared participant vocabulary (mirrors the corresponding Postgres enums) ──
|
|
28
|
+
/** `participant_kind` — who a delta is attributed to. */
|
|
29
|
+
export const participantKindSchema = z.enum(['user', 'agent', 'system']);
|
|
30
|
+
/** `confirmation_state` — the approval stage a committed change was in. */
|
|
31
|
+
export const confirmationStateSchema = z.enum([
|
|
32
|
+
'auto',
|
|
33
|
+
'previewed',
|
|
34
|
+
'approved',
|
|
35
|
+
'required_human_approval',
|
|
36
|
+
'auto_historical',
|
|
37
|
+
]);
|
|
38
|
+
// ── The delta wire shapes ─────────────────────────────────────────────────────
|
|
39
|
+
/**
|
|
40
|
+
* The full set of action codes a wire delta can carry — a broader vocabulary than
|
|
41
|
+
* the stored row's create, update, and delete. Each is a single character: `I`
|
|
42
|
+
* insert, `U` update, `D` delete, `A` archive, `V` revive (unarchive), `C` covering
|
|
43
|
+
* (the row just became visible to this subscriber), `G` group added, and `S` group
|
|
44
|
+
* removed.
|
|
45
|
+
*/
|
|
46
|
+
export const syncDeltaActionSchema = z.enum(['I', 'U', 'D', 'A', 'V', 'C', 'G', 'S']);
|
|
47
|
+
/**
|
|
48
|
+
* The payload carried on a wire delta: the post-mutation row as an object, a
|
|
49
|
+
* serialized string (used by the group-change frames on `G` and `S` deltas), or
|
|
50
|
+
* `null` on deletes. This is wider than the stored row's payload — which is only a
|
|
51
|
+
* row or null — because the group-change frames encode their payload as a string.
|
|
52
|
+
*/
|
|
53
|
+
export const wireDeltaDataSchema = z
|
|
54
|
+
.union([z.record(z.string(), z.unknown()), z.string()])
|
|
55
|
+
.nullable();
|
|
56
|
+
/**
|
|
57
|
+
* A participant reference as carried on a broadcast delta. The server expands the
|
|
58
|
+
* flat `actor_id` and `actor_kind` stored columns into this nested `{ kind, id }`
|
|
59
|
+
* shape.
|
|
60
|
+
*/
|
|
61
|
+
export const participantRefSchema = z.object({
|
|
62
|
+
kind: participantKindSchema,
|
|
63
|
+
id: z.string(),
|
|
64
|
+
});
|
|
65
|
+
/**
|
|
66
|
+
* The fields the server and client agree on for a broadcast delta — the shared core
|
|
67
|
+
* both projections extend. `transactionId` is typed as the client sees it (an
|
|
68
|
+
* optional string); {@link serverSyncDeltaSchema} widens it to nullable. There is no
|
|
69
|
+
* `organizationId` here (it is never broadcast) and no attribution — those fields
|
|
70
|
+
* differ between the two sides and live in the extensions below.
|
|
71
|
+
*/
|
|
72
|
+
export const syncDeltaWireCoreSchema = z.object({
|
|
73
|
+
id: z.number(),
|
|
74
|
+
actionType: syncDeltaActionSchema,
|
|
75
|
+
modelName: z.string().min(1),
|
|
76
|
+
modelId: z.string().min(1),
|
|
77
|
+
data: wireDeltaDataSchema,
|
|
78
|
+
previousData: wireDeltaDataSchema.optional(),
|
|
79
|
+
syncGroups: z.array(z.string()),
|
|
80
|
+
transactionId: z.string().optional(),
|
|
81
|
+
createdAt: z.string(),
|
|
82
|
+
});
|
|
83
|
+
/**
|
|
84
|
+
* The client's view of a wire delta: the shared core plus the fields only the
|
|
85
|
+
* client reads. Inferring this schema gives the SDK's `SyncDelta` type.
|
|
86
|
+
*/
|
|
87
|
+
export const clientSyncDeltaSchema = syncDeltaWireCoreSchema.extend({
|
|
88
|
+
/** @deprecated The actor id as a flat string; superseded by the server's nested
|
|
89
|
+
* `actor`. The client does not read it — it exists only so the wire shape round-trips. */
|
|
90
|
+
createdBy: z.string().optional(),
|
|
91
|
+
/** A payload slot the client reads locally, such as group-change metadata. */
|
|
92
|
+
metadata: wireDeltaDataSchema.optional(),
|
|
93
|
+
/** Echo-matching id the client correlates against its optimistic mutation. */
|
|
94
|
+
clientMutationId: z.string().optional(),
|
|
95
|
+
});
|
|
96
|
+
/**
|
|
97
|
+
* The server's view of a wire delta: the shared core plus the audit attribution the
|
|
98
|
+
* server adds to each broadcast. The client structurally ignores these fields. This
|
|
99
|
+
* projection also narrows `transactionId` to nullable, matching the stored column.
|
|
100
|
+
*/
|
|
101
|
+
export const serverSyncDeltaSchema = syncDeltaWireCoreSchema.extend({
|
|
102
|
+
transactionId: z.string().nullable(),
|
|
103
|
+
/** @deprecated Duplicates `actor`; read `actor` instead. */
|
|
104
|
+
createdBy: participantRefSchema.nullable(),
|
|
105
|
+
/** The participant who performed the action. */
|
|
106
|
+
actor: participantRefSchema.nullable(),
|
|
107
|
+
/** The participant on whose authority the actor acted; equal to `actor` for direct human commits. */
|
|
108
|
+
onBehalfOf: participantRefSchema.nullable(),
|
|
109
|
+
/** Foreign key to the authorizing capability; non-null for agent and system commits. */
|
|
110
|
+
capabilityId: z.string().nullable(),
|
|
111
|
+
confirmationState: confirmationStateSchema.nullable(),
|
|
112
|
+
/** Foreign key to the task for the AI turn whose prompt caused this delta. */
|
|
113
|
+
causedByTaskId: z.string().nullable(),
|
|
114
|
+
});
|
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The
|
|
3
|
-
* `
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* be the wire message; callers that need the detail log the original error
|
|
7
|
-
* server-side before/at the envelope call.
|
|
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.
|
|
8
6
|
*/
|
|
9
7
|
export declare const INTERNAL_ERROR_PUBLIC_MESSAGE = "An internal error occurred.";
|
|
10
|
-
/** The canonical
|
|
11
|
-
*
|
|
12
|
-
*
|
|
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. */
|
|
13
11
|
export interface ErrorEnvelope {
|
|
14
12
|
readonly type: string;
|
|
15
13
|
readonly code?: string;
|
|
@@ -17,38 +15,39 @@ export interface ErrorEnvelope {
|
|
|
17
15
|
readonly message: string;
|
|
18
16
|
readonly doc_url?: string;
|
|
19
17
|
readonly request_id?: string;
|
|
20
|
-
/**
|
|
21
|
-
* at once
|
|
22
|
-
* on the first. `param`
|
|
23
|
-
*
|
|
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. */
|
|
24
22
|
readonly errors?: readonly {
|
|
25
23
|
readonly code?: string;
|
|
26
24
|
readonly message: string;
|
|
27
25
|
readonly param?: string;
|
|
28
26
|
}[];
|
|
29
|
-
/**
|
|
30
|
-
* `missingIds`, `conflicts`, `retryAfterSeconds`
|
|
31
|
-
*
|
|
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. */
|
|
32
31
|
readonly [key: string]: unknown;
|
|
33
32
|
}
|
|
34
|
-
/** {@link AbloError} subclass
|
|
35
|
-
* match status
|
|
36
|
-
* 403
|
|
37
|
-
* follows
|
|
38
|
-
* 404 on the base class
|
|
39
|
-
* apps/sync-server's self-contained `errors.ts`. */
|
|
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. */
|
|
40
38
|
export declare function statusForType(type: string): number;
|
|
41
39
|
/**
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
* Anything else
|
|
47
|
-
*
|
|
48
|
-
*
|
|
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.
|
|
49
47
|
*
|
|
50
|
-
* `requestId` is
|
|
51
|
-
* so the response and the `x-request-id` header agree for
|
|
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.
|
|
52
51
|
*/
|
|
53
52
|
export declare function errorEnvelope(err: unknown, requestId?: string): {
|
|
54
53
|
body: ErrorEnvelope;
|
|
@@ -1,38 +1,31 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
2
|
+
* Turns any thrown value into the canonical error envelope and an HTTP status,
|
|
3
|
+
* so every error response carries the same
|
|
4
|
+
* `{ type, code, param, message, doc_url, request_id }` shape no matter which
|
|
5
|
+
* route or transport produced it. This is the counterpart to the wire-parsing
|
|
6
|
+
* helpers in the errors module, which turn a received envelope back into a typed
|
|
7
|
+
* error.
|
|
6
8
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* The classifier is the UNIVERSAL baseline: a typed {@link AbloError} passes
|
|
13
|
-
* through (subclass + code + httpStatus preserved), everything else degrades to
|
|
14
|
-
* a 500 `internal_error`. Service-specific normalization that needs a DB driver
|
|
15
|
-
* (apps/sync-server classifies raw Postgres SQLSTATE + MutatorError) is layered
|
|
16
|
-
* on top in that service — it is intentionally NOT pulled into the shared,
|
|
17
|
-
* dependency-free contract.
|
|
9
|
+
* It has no dependency on the client runtime, so a server-side handler can
|
|
10
|
+
* import it on its own to format error responses. A typed {@link AbloError}
|
|
11
|
+
* passes through with its code and status intact; anything else becomes a
|
|
12
|
+
* generic 500. A service that needs to classify database-driver failures can
|
|
13
|
+
* layer that on top before falling back to this baseline.
|
|
18
14
|
*/
|
|
19
15
|
import { AbloError, docUrlForCode } from '../errors.js';
|
|
20
16
|
import { errorCodeSpec } from '../errorCodes.js';
|
|
21
17
|
/**
|
|
22
|
-
* The
|
|
23
|
-
* `
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* be the wire message; callers that need the detail log the original error
|
|
27
|
-
* server-side before/at the envelope call.
|
|
18
|
+
* The fixed, public-facing message returned for an unclassified 500. A raw
|
|
19
|
+
* `err.message` can carry driver text, connection strings, or stack fragments,
|
|
20
|
+
* so it is never placed on the wire; a caller that needs those details logs the
|
|
21
|
+
* original error server-side before formatting the response.
|
|
28
22
|
*/
|
|
29
23
|
export const INTERNAL_ERROR_PUBLIC_MESSAGE = 'An internal error occurred.';
|
|
30
|
-
/** {@link AbloError} subclass
|
|
31
|
-
* match status
|
|
32
|
-
* 403
|
|
33
|
-
* follows
|
|
34
|
-
* 404 on the base class
|
|
35
|
-
* apps/sync-server's self-contained `errors.ts`. */
|
|
24
|
+
/** Maps an {@link AbloError} subclass name to its default HTTP status. Each
|
|
25
|
+
* subclass is chosen to match the status — a validation error is a 400, a
|
|
26
|
+
* permission error a 403 — so a throw site picks the right class and code and
|
|
27
|
+
* the status follows. An explicit `httpStatus` is supplied only when it
|
|
28
|
+
* diverges, such as a 404 on the base class or a 503 on a server error. */
|
|
36
29
|
export function statusForType(type) {
|
|
37
30
|
switch (type) {
|
|
38
31
|
case 'AbloAuthenticationError':
|
|
@@ -56,16 +49,17 @@ export function statusForType(type) {
|
|
|
56
49
|
}
|
|
57
50
|
}
|
|
58
51
|
/**
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
* Anything else
|
|
64
|
-
*
|
|
65
|
-
*
|
|
52
|
+
* Converts any thrown value into the canonical {@link ErrorEnvelope} and an HTTP
|
|
53
|
+
* status. A typed {@link AbloError} is serialized through its own `toJSON`, so
|
|
54
|
+
* its code, param, doc_url, and structured details survive, and its status comes
|
|
55
|
+
* from an explicit `httpStatus` or, failing that, {@link statusForType}.
|
|
56
|
+
* Anything else becomes a 500 `internal_error` envelope — never a bare framework
|
|
57
|
+
* "Internal Server Error" body, and never a raw error string leaked onto the
|
|
58
|
+
* wire as an unregistered code.
|
|
66
59
|
*
|
|
67
|
-
* `requestId` is
|
|
68
|
-
* so the response and the `x-request-id` header agree for
|
|
60
|
+
* When `requestId` is supplied and the error does not already carry one, it is
|
|
61
|
+
* stamped into the body so the response and the `x-request-id` header agree for
|
|
62
|
+
* support correlation.
|
|
69
63
|
*/
|
|
70
64
|
export function errorEnvelope(err, requestId) {
|
|
71
65
|
if (err instanceof AbloError) {
|
|
@@ -81,10 +75,10 @@ export function errorEnvelope(err, requestId) {
|
|
|
81
75
|
status,
|
|
82
76
|
};
|
|
83
77
|
}
|
|
84
|
-
// Unknown throw
|
|
85
|
-
//
|
|
86
|
-
//
|
|
87
|
-
//
|
|
78
|
+
// Unknown throw: mask it. An unclassified 500 can carry database, driver, or
|
|
79
|
+
// other internal detail, so the raw message is never echoed here — this
|
|
80
|
+
// envelope is served directly to browsers. The original error stays with the
|
|
81
|
+
// caller for logging.
|
|
88
82
|
return {
|
|
89
83
|
body: {
|
|
90
84
|
type: 'AbloServerError',
|