@abloatai/ablo 0.26.0 → 0.28.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 +42 -2
- package/README.md +102 -86
- package/dist/BaseSyncedStore.d.ts +85 -88
- package/dist/BaseSyncedStore.js +134 -151
- package/dist/Database.d.ts +68 -69
- package/dist/Database.js +316 -135
- 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 +54 -52
- package/dist/Model.js +78 -62
- 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 +122 -118
- package/dist/SyncClient.js +541 -245
- package/dist/adapters/alwaysOnline.d.ts +6 -8
- package/dist/adapters/alwaysOnline.js +6 -8
- package/dist/adapters/inMemoryStorage.d.ts +10 -9
- package/dist/adapters/inMemoryStorage.js +21 -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 +173 -121
- package/dist/client/Ablo.d.ts +97 -74
- package/dist/client/Ablo.js +129 -163
- package/dist/client/ApiClient.d.ts +30 -19
- package/dist/client/ApiClient.js +442 -81
- 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 +16 -17
- package/dist/client/createInternalComponents.js +26 -31
- 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 +59 -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 +78 -87
- package/dist/client/options.d.ts +157 -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 +16 -20
- package/dist/client/wsMutationExecutor.js +18 -23
- package/dist/commit/contract.d.ts +493 -0
- package/dist/commit/contract.js +187 -0
- package/dist/commit/index.d.ts +6 -0
- package/dist/commit/index.js +5 -0
- 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 +14 -14
- package/dist/core/StoreManager.js +33 -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 +137 -134
- package/dist/errors.d.ts +160 -166
- package/dist/errors.js +155 -158
- package/dist/index.d.ts +36 -27
- package/dist/index.js +91 -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 +124 -131
- package/dist/mutators/UndoManager.js +177 -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 +28 -25
- package/dist/react/useAblo.js +41 -17
- 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 +3 -3
- 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 +64 -43
- 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 +24 -12
- package/dist/stores/ObjectStore.js +38 -16
- package/dist/stores/ObjectStoreContract.d.ts +14 -15
- package/dist/stores/SyncActionStore.d.ts +7 -11
- package/dist/stores/SyncActionStore.js +13 -17
- package/dist/surface.d.ts +28 -21
- package/dist/surface.js +29 -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 +141 -166
- 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/persistedPrefix.d.ts +12 -0
- package/dist/sync/persistedPrefix.js +22 -0
- 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 +5 -3
- package/dist/testing/index.js +3 -2
- package/dist/testing/mocks/FakeDatabase.d.ts +18 -0
- package/dist/testing/mocks/FakeDatabase.js +10 -0
- 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 +28 -23
- package/dist/testing/mocks/MockWebSocket.js +22 -21
- package/dist/transactions/TransactionQueue.d.ts +244 -181
- package/dist/transactions/TransactionQueue.js +929 -423
- 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/commitEnvelope.d.ts +132 -0
- package/dist/transactions/commitEnvelope.js +139 -0
- package/dist/transactions/commitOutboxStore.d.ts +32 -0
- package/dist/transactions/commitOutboxStore.js +26 -0
- package/dist/transactions/commitPayload.d.ts +63 -52
- package/dist/transactions/commitPayload.js +54 -57
- package/dist/transactions/deltaConfirmation.d.ts +20 -22
- package/dist/transactions/deltaConfirmation.js +37 -45
- package/dist/transactions/httpCommitEnvelope.d.ts +43 -0
- package/dist/transactions/httpCommitEnvelope.js +179 -0
- package/dist/transactions/optimisticApply.d.ts +49 -0
- package/dist/transactions/optimisticApply.js +65 -0
- package/dist/transactions/replayValidation.d.ts +182 -0
- package/dist/transactions/replayValidation.js +156 -0
- 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/wire/bootstrapReason.d.ts +9 -0
- package/dist/wire/bootstrapReason.js +8 -0
- 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 +315 -86
- package/dist/wire/frames.js +47 -33
- package/dist/wire/index.d.ts +18 -14
- package/dist/wire/index.js +32 -27
- 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/api.md +10 -10
- package/docs/coordination.md +59 -0
- package/docs/mcp.md +1 -1
- package/package.json +17 -11
- 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/transactions/persistedReplay.d.ts +0 -93
- package/dist/transactions/persistedReplay.js +0 -105
- package/dist/utils/mobx-setup.d.ts +0 -42
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The validation boundary for replaying persisted transactions after a restart.
|
|
3
|
+
*
|
|
4
|
+
* Rows read back from the on-disk transaction store may have been written by an
|
|
5
|
+
* earlier run — possibly by an older version of this package, possibly
|
|
6
|
+
* corrupted. Rather than trust them, the schemas here validate exactly the
|
|
7
|
+
* fields the transaction queue and the offline-mutation restore read during
|
|
8
|
+
* replay. A row that fails to parse is dropped and reported, never replayed as
|
|
9
|
+
* a malformed commit.
|
|
10
|
+
*
|
|
11
|
+
* The same store also holds two kinds of rows that are not replayable
|
|
12
|
+
* transactions — the offline mutation queue (`type: 'queue'`) and delta-await
|
|
13
|
+
* markers (`type: 'awaiting_delta'`), each owned by another part of the client.
|
|
14
|
+
* {@link isNonReplayablePersistedRow} recognizes them so they are skipped
|
|
15
|
+
* quietly rather than flagged as corruption.
|
|
16
|
+
*/
|
|
17
|
+
import { z } from 'zod';
|
|
18
|
+
import type { Transaction } from './commitPayload.js';
|
|
19
|
+
/**
|
|
20
|
+
* The shape of a persisted transaction that can be replayed: the fields the
|
|
21
|
+
* transaction queue reads when it re-enqueues the row — its id, operation type,
|
|
22
|
+
* model addressing, payload, and identity context. Any remaining bookkeeping is
|
|
23
|
+
* filled in with defaults when the row is rehydrated by
|
|
24
|
+
* {@link deserializePersistedTransaction}.
|
|
25
|
+
*/
|
|
26
|
+
export declare const persistedTransactionSchema: z.ZodObject<{
|
|
27
|
+
id: z.ZodString;
|
|
28
|
+
type: z.ZodEnum<{
|
|
29
|
+
update: "update";
|
|
30
|
+
create: "create";
|
|
31
|
+
delete: "delete";
|
|
32
|
+
archive: "archive";
|
|
33
|
+
unarchive: "unarchive";
|
|
34
|
+
}>;
|
|
35
|
+
modelName: z.ZodString;
|
|
36
|
+
modelId: z.ZodString;
|
|
37
|
+
modelKey: z.ZodOptional<z.ZodString>;
|
|
38
|
+
data: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
39
|
+
previousData: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
40
|
+
context: z.ZodObject<{
|
|
41
|
+
userId: z.ZodString;
|
|
42
|
+
organizationId: z.ZodString;
|
|
43
|
+
role: z.ZodOptional<z.ZodString>;
|
|
44
|
+
teamIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
45
|
+
}, z.core.$strip>;
|
|
46
|
+
createdAt: z.ZodOptional<z.ZodNumber>;
|
|
47
|
+
batchId: z.ZodOptional<z.ZodString>;
|
|
48
|
+
commitEnvelope: z.ZodOptional<z.ZodObject<{
|
|
49
|
+
idempotencyKey: z.core.$ZodBranded<z.ZodString, "IdempotencyKey", "out">;
|
|
50
|
+
operationIndex: z.ZodNumber;
|
|
51
|
+
operationCount: z.ZodNumber;
|
|
52
|
+
sealedAt: z.ZodOptional<z.ZodNumber>;
|
|
53
|
+
sequence: z.ZodOptional<z.ZodNumber>;
|
|
54
|
+
}, z.core.$strict>>;
|
|
55
|
+
sourceMutationIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
56
|
+
writeOptions: z.ZodOptional<z.ZodObject<{
|
|
57
|
+
readAt: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
58
|
+
onStale: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
|
|
59
|
+
reject: "reject";
|
|
60
|
+
overwrite: "overwrite";
|
|
61
|
+
notify: "notify";
|
|
62
|
+
}>>>;
|
|
63
|
+
idempotencyKey: z.ZodOptional<z.ZodString>;
|
|
64
|
+
label: z.ZodOptional<z.ZodString>;
|
|
65
|
+
}, z.core.$loose>>;
|
|
66
|
+
localOnly: z.ZodOptional<z.ZodBoolean>;
|
|
67
|
+
}, z.core.$loose>;
|
|
68
|
+
export type PersistedReplayableTransaction = z.infer<typeof persistedTransactionSchema>;
|
|
69
|
+
/**
|
|
70
|
+
* Reports whether a stored row is one of the non-transaction kinds, so callers
|
|
71
|
+
* skip it instead of treating it as a corrupt transaction.
|
|
72
|
+
*/
|
|
73
|
+
export declare function isNonReplayablePersistedRow(row: unknown): boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Validates one stored row and rehydrates it into a {@link Transaction} ready
|
|
76
|
+
* to replay, or returns `null` when the row fails validation. Bookkeeping
|
|
77
|
+
* fields the stored row lacks — status, attempts, priority, timestamp — are
|
|
78
|
+
* re-derived the same way a freshly staged transaction derives them.
|
|
79
|
+
*/
|
|
80
|
+
export declare function deserializePersistedTransaction(row: unknown): Transaction | null;
|
|
81
|
+
/**
|
|
82
|
+
* The shape of one entry in the persisted offline mutation queue — an item of
|
|
83
|
+
* the `'queue'` row's `mutations` array, carrying the fields read when the
|
|
84
|
+
* queue is restored on reconnect.
|
|
85
|
+
*/
|
|
86
|
+
export declare const persistedMutationSchema: z.ZodObject<{
|
|
87
|
+
mutationId: z.ZodOptional<z.ZodString>;
|
|
88
|
+
type: z.ZodEnum<{
|
|
89
|
+
update: "update";
|
|
90
|
+
create: "create";
|
|
91
|
+
delete: "delete";
|
|
92
|
+
archive: "archive";
|
|
93
|
+
}>;
|
|
94
|
+
modelData: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
95
|
+
modelName: z.ZodString;
|
|
96
|
+
timestamp: z.ZodString;
|
|
97
|
+
capturedChanges: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
98
|
+
writeOptions: z.ZodOptional<z.ZodObject<{
|
|
99
|
+
readAt: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
100
|
+
onStale: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
|
|
101
|
+
reject: "reject";
|
|
102
|
+
overwrite: "overwrite";
|
|
103
|
+
notify: "notify";
|
|
104
|
+
}>>>;
|
|
105
|
+
idempotencyKey: z.ZodOptional<z.ZodString>;
|
|
106
|
+
label: z.ZodOptional<z.ZodString>;
|
|
107
|
+
}, z.core.$loose>>;
|
|
108
|
+
}, z.core.$loose>;
|
|
109
|
+
export type PersistedQueuedMutation = z.infer<typeof persistedMutationSchema>;
|
|
110
|
+
export declare const PENDING_MUTATION_RECORD_PREFIX = "pending-mutation:";
|
|
111
|
+
/**
|
|
112
|
+
* Stay one hour inside the server's 24-hour idempotency retention window.
|
|
113
|
+
* A journaled write older than this can no longer be deduplicated by the
|
|
114
|
+
* server, so restore holds it for review instead of replaying it.
|
|
115
|
+
*/
|
|
116
|
+
export declare const PENDING_MUTATION_REPLAY_WINDOW_MS: number;
|
|
117
|
+
/** Scope-less records written by the first aggregate-journal release. */
|
|
118
|
+
export declare const legacyPendingMutationRecordSchema: z.ZodObject<{
|
|
119
|
+
storageVersion: z.ZodLiteral<1>;
|
|
120
|
+
id: z.ZodString;
|
|
121
|
+
type: z.ZodLiteral<"pending_mutation">;
|
|
122
|
+
mutation: z.ZodObject<{
|
|
123
|
+
type: z.ZodEnum<{
|
|
124
|
+
update: "update";
|
|
125
|
+
create: "create";
|
|
126
|
+
delete: "delete";
|
|
127
|
+
archive: "archive";
|
|
128
|
+
}>;
|
|
129
|
+
modelData: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
130
|
+
modelName: z.ZodString;
|
|
131
|
+
timestamp: z.ZodString;
|
|
132
|
+
capturedChanges: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
133
|
+
writeOptions: z.ZodOptional<z.ZodObject<{
|
|
134
|
+
readAt: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
135
|
+
onStale: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
|
|
136
|
+
reject: "reject";
|
|
137
|
+
overwrite: "overwrite";
|
|
138
|
+
notify: "notify";
|
|
139
|
+
}>>>;
|
|
140
|
+
idempotencyKey: z.ZodOptional<z.ZodString>;
|
|
141
|
+
label: z.ZodOptional<z.ZodString>;
|
|
142
|
+
}, z.core.$loose>>;
|
|
143
|
+
mutationId: z.ZodString;
|
|
144
|
+
}, z.core.$loose>;
|
|
145
|
+
timestamp: z.ZodNumber;
|
|
146
|
+
}, z.core.$strict>;
|
|
147
|
+
export declare const pendingMutationRecordSchema: z.ZodObject<{
|
|
148
|
+
storageVersion: z.ZodLiteral<2>;
|
|
149
|
+
scope: z.ZodObject<{
|
|
150
|
+
organizationId: z.ZodString;
|
|
151
|
+
participantId: z.ZodString;
|
|
152
|
+
namespace: z.ZodString;
|
|
153
|
+
}, z.core.$strict>;
|
|
154
|
+
id: z.ZodString;
|
|
155
|
+
type: z.ZodLiteral<"pending_mutation">;
|
|
156
|
+
mutation: z.ZodObject<{
|
|
157
|
+
type: z.ZodEnum<{
|
|
158
|
+
update: "update";
|
|
159
|
+
create: "create";
|
|
160
|
+
delete: "delete";
|
|
161
|
+
archive: "archive";
|
|
162
|
+
}>;
|
|
163
|
+
modelData: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
164
|
+
modelName: z.ZodString;
|
|
165
|
+
timestamp: z.ZodString;
|
|
166
|
+
capturedChanges: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
167
|
+
writeOptions: z.ZodOptional<z.ZodObject<{
|
|
168
|
+
readAt: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
169
|
+
onStale: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
|
|
170
|
+
reject: "reject";
|
|
171
|
+
overwrite: "overwrite";
|
|
172
|
+
notify: "notify";
|
|
173
|
+
}>>>;
|
|
174
|
+
idempotencyKey: z.ZodOptional<z.ZodString>;
|
|
175
|
+
label: z.ZodOptional<z.ZodString>;
|
|
176
|
+
}, z.core.$loose>>;
|
|
177
|
+
mutationId: z.ZodString;
|
|
178
|
+
}, z.core.$loose>;
|
|
179
|
+
timestamp: z.ZodNumber;
|
|
180
|
+
}, z.core.$strict>;
|
|
181
|
+
export type PendingMutationRecord = z.infer<typeof pendingMutationRecordSchema>;
|
|
182
|
+
export declare function pendingMutationRecordId(mutationId: string): string;
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The validation boundary for replaying persisted transactions after a restart.
|
|
3
|
+
*
|
|
4
|
+
* Rows read back from the on-disk transaction store may have been written by an
|
|
5
|
+
* earlier run — possibly by an older version of this package, possibly
|
|
6
|
+
* corrupted. Rather than trust them, the schemas here validate exactly the
|
|
7
|
+
* fields the transaction queue and the offline-mutation restore read during
|
|
8
|
+
* replay. A row that fails to parse is dropped and reported, never replayed as
|
|
9
|
+
* a malformed commit.
|
|
10
|
+
*
|
|
11
|
+
* The same store also holds two kinds of rows that are not replayable
|
|
12
|
+
* transactions — the offline mutation queue (`type: 'queue'`) and delta-await
|
|
13
|
+
* markers (`type: 'awaiting_delta'`), each owned by another part of the client.
|
|
14
|
+
* {@link isNonReplayablePersistedRow} recognizes them so they are skipped
|
|
15
|
+
* quietly rather than flagged as corruption.
|
|
16
|
+
*/
|
|
17
|
+
import { z } from 'zod';
|
|
18
|
+
import { computePriorityScore, normalizeModelKey } from './commitPayload.js';
|
|
19
|
+
import { commitEnvelopeMemberSchema, commitOutboxScopeSchema, } from './commitEnvelope.js';
|
|
20
|
+
/** The subset of a write's options that is stored with each transaction or queued mutation. */
|
|
21
|
+
const persistedWriteOptionsSchema = z
|
|
22
|
+
.object({
|
|
23
|
+
readAt: z.number().nullable().optional(),
|
|
24
|
+
onStale: z.enum(['reject', 'overwrite', 'notify']).nullable().optional(),
|
|
25
|
+
idempotencyKey: z.string().optional(),
|
|
26
|
+
label: z.string().optional(),
|
|
27
|
+
})
|
|
28
|
+
.loose();
|
|
29
|
+
/**
|
|
30
|
+
* The shape of a persisted transaction that can be replayed: the fields the
|
|
31
|
+
* transaction queue reads when it re-enqueues the row — its id, operation type,
|
|
32
|
+
* model addressing, payload, and identity context. Any remaining bookkeeping is
|
|
33
|
+
* filled in with defaults when the row is rehydrated by
|
|
34
|
+
* {@link deserializePersistedTransaction}.
|
|
35
|
+
*/
|
|
36
|
+
export const persistedTransactionSchema = z
|
|
37
|
+
.object({
|
|
38
|
+
id: z.string().min(1),
|
|
39
|
+
type: z.enum(['create', 'update', 'delete', 'archive', 'unarchive']),
|
|
40
|
+
modelName: z.string().min(1),
|
|
41
|
+
modelId: z.string().min(1),
|
|
42
|
+
modelKey: z.string().min(1).optional(),
|
|
43
|
+
data: z.record(z.string(), z.unknown()).optional(),
|
|
44
|
+
previousData: z.record(z.string(), z.unknown()).nullable().optional(),
|
|
45
|
+
context: z.object({
|
|
46
|
+
userId: z.string().min(1),
|
|
47
|
+
organizationId: z.string().min(1),
|
|
48
|
+
role: z.string().optional(),
|
|
49
|
+
teamIds: z.array(z.string()).optional(),
|
|
50
|
+
}),
|
|
51
|
+
createdAt: z.number().optional(),
|
|
52
|
+
batchId: z.string().optional(),
|
|
53
|
+
commitEnvelope: commitEnvelopeMemberSchema.optional(),
|
|
54
|
+
sourceMutationIds: z.array(z.string().min(1)).optional(),
|
|
55
|
+
writeOptions: persistedWriteOptionsSchema.optional(),
|
|
56
|
+
localOnly: z.boolean().optional(),
|
|
57
|
+
})
|
|
58
|
+
.loose();
|
|
59
|
+
/** The `type` values of stored rows that belong to other parts of the client and are not replayable transactions. */
|
|
60
|
+
const NON_REPLAYABLE_TYPES = new Set([
|
|
61
|
+
'queue',
|
|
62
|
+
'awaiting_delta',
|
|
63
|
+
'pending_mutation',
|
|
64
|
+
'commit_envelope',
|
|
65
|
+
'http_commit_envelope',
|
|
66
|
+
]);
|
|
67
|
+
/**
|
|
68
|
+
* Reports whether a stored row is one of the non-transaction kinds, so callers
|
|
69
|
+
* skip it instead of treating it as a corrupt transaction.
|
|
70
|
+
*/
|
|
71
|
+
export function isNonReplayablePersistedRow(row) {
|
|
72
|
+
return (typeof row === 'object' &&
|
|
73
|
+
row !== null &&
|
|
74
|
+
typeof row.type === 'string' &&
|
|
75
|
+
NON_REPLAYABLE_TYPES.has(row.type));
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Validates one stored row and rehydrates it into a {@link Transaction} ready
|
|
79
|
+
* to replay, or returns `null` when the row fails validation. Bookkeeping
|
|
80
|
+
* fields the stored row lacks — status, attempts, priority, timestamp — are
|
|
81
|
+
* re-derived the same way a freshly staged transaction derives them.
|
|
82
|
+
*/
|
|
83
|
+
export function deserializePersistedTransaction(row) {
|
|
84
|
+
const parsed = persistedTransactionSchema.safeParse(row);
|
|
85
|
+
if (!parsed.success)
|
|
86
|
+
return null;
|
|
87
|
+
const tx = parsed.data;
|
|
88
|
+
return {
|
|
89
|
+
id: tx.id,
|
|
90
|
+
type: tx.type,
|
|
91
|
+
modelName: tx.modelName,
|
|
92
|
+
modelId: tx.modelId,
|
|
93
|
+
modelKey: tx.modelKey ?? normalizeModelKey(tx.modelName),
|
|
94
|
+
...(tx.data !== undefined ? { data: tx.data } : {}),
|
|
95
|
+
...(tx.previousData !== undefined ? { previousData: tx.previousData } : {}),
|
|
96
|
+
context: tx.context,
|
|
97
|
+
status: 'pending',
|
|
98
|
+
createdAt: tx.createdAt ?? Date.now(),
|
|
99
|
+
attempts: 0,
|
|
100
|
+
priority: 'normal',
|
|
101
|
+
priorityScore: computePriorityScore(tx.type, tx.modelName),
|
|
102
|
+
...(tx.batchId !== undefined ? { batchId: tx.batchId } : {}),
|
|
103
|
+
...(tx.commitEnvelope !== undefined
|
|
104
|
+
? { commitEnvelope: tx.commitEnvelope }
|
|
105
|
+
: {}),
|
|
106
|
+
...(tx.sourceMutationIds !== undefined
|
|
107
|
+
? { sourceMutationIds: tx.sourceMutationIds }
|
|
108
|
+
: {}),
|
|
109
|
+
...(tx.writeOptions !== undefined ? { writeOptions: tx.writeOptions } : {}),
|
|
110
|
+
...(tx.localOnly !== undefined ? { localOnly: tx.localOnly } : {}),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* The shape of one entry in the persisted offline mutation queue — an item of
|
|
115
|
+
* the `'queue'` row's `mutations` array, carrying the fields read when the
|
|
116
|
+
* queue is restored on reconnect.
|
|
117
|
+
*/
|
|
118
|
+
export const persistedMutationSchema = z
|
|
119
|
+
.object({
|
|
120
|
+
mutationId: z.string().min(1).optional(),
|
|
121
|
+
type: z.enum(['create', 'update', 'delete', 'archive']),
|
|
122
|
+
modelData: z.record(z.string(), z.unknown()),
|
|
123
|
+
modelName: z.string().min(1),
|
|
124
|
+
timestamp: z.string(),
|
|
125
|
+
capturedChanges: z.record(z.string(), z.unknown()).optional(),
|
|
126
|
+
writeOptions: persistedWriteOptionsSchema.optional(),
|
|
127
|
+
})
|
|
128
|
+
.loose();
|
|
129
|
+
export const PENDING_MUTATION_RECORD_PREFIX = 'pending-mutation:';
|
|
130
|
+
/**
|
|
131
|
+
* Stay one hour inside the server's 24-hour idempotency retention window.
|
|
132
|
+
* A journaled write older than this can no longer be deduplicated by the
|
|
133
|
+
* server, so restore holds it for review instead of replaying it.
|
|
134
|
+
*/
|
|
135
|
+
export const PENDING_MUTATION_REPLAY_WINDOW_MS = 23 * 60 * 60 * 1000;
|
|
136
|
+
const pendingMutationRecordBaseShape = {
|
|
137
|
+
id: z.string().startsWith(PENDING_MUTATION_RECORD_PREFIX),
|
|
138
|
+
type: z.literal('pending_mutation'),
|
|
139
|
+
mutation: persistedMutationSchema.extend({
|
|
140
|
+
mutationId: z.string().min(1),
|
|
141
|
+
}),
|
|
142
|
+
timestamp: z.number().int().nonnegative(),
|
|
143
|
+
};
|
|
144
|
+
/** Scope-less records written by the first aggregate-journal release. */
|
|
145
|
+
export const legacyPendingMutationRecordSchema = z.strictObject({
|
|
146
|
+
...pendingMutationRecordBaseShape,
|
|
147
|
+
storageVersion: z.literal(1),
|
|
148
|
+
});
|
|
149
|
+
export const pendingMutationRecordSchema = z.strictObject({
|
|
150
|
+
...pendingMutationRecordBaseShape,
|
|
151
|
+
storageVersion: z.literal(2),
|
|
152
|
+
scope: commitOutboxScopeSchema,
|
|
153
|
+
});
|
|
154
|
+
export function pendingMutationRecordId(mutationId) {
|
|
155
|
+
return `${PENDING_MUTATION_RECORD_PREFIX}${mutationId}`;
|
|
156
|
+
}
|
package/dist/types/global.d.ts
CHANGED
|
@@ -1,23 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* The single place where you tell the SDK about your application's types.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* `useQuery`, `useOne`, `usePresence`, `useClaim` — reads its types from
|
|
7
|
-
*
|
|
4
|
+
* You register your Schema, Presence, Claims, and UserMeta once by augmenting
|
|
5
|
+
* the {@link Register} interface. From then on every SDK hook — `useAblo`,
|
|
6
|
+
* `useQuery`, `useOne`, `usePresence`, `useClaim` — reads its types from that
|
|
7
|
+
* registration, so you never pass a generic or a `schema` argument at a call
|
|
8
|
+
* site.
|
|
8
9
|
*
|
|
9
|
-
* Registration
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
10
|
+
* Registration uses TypeScript module augmentation: any file in your project
|
|
11
|
+
* can add an `interface Register` to a `declare module '@abloatai/ablo'`
|
|
12
|
+
* block, and every resolver below picks it up. Because the name is scoped to
|
|
13
|
+
* this module, the interface is simply `Register` — not a global and not
|
|
14
|
+
* prefixed.
|
|
14
15
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* `.d.ts`: the top-level `import type { schema }` makes the
|
|
18
|
-
* block
|
|
19
|
-
*
|
|
20
|
-
*
|
|
16
|
+
* The `npx ablo init` command scaffolds this file as `ablo/register.ts`, next
|
|
17
|
+
* to `ablo/schema.ts`. Write it as a normal `.ts` module, not a hand-authored
|
|
18
|
+
* `.d.ts`: the top-level `import type { schema }` is what makes the
|
|
19
|
+
* `declare module` block merge into this interface rather than collide with it.
|
|
20
|
+
* Any `.ts` file covered by your `tsconfig` works, and it never needs to be
|
|
21
|
+
* imported anywhere.
|
|
21
22
|
*
|
|
22
23
|
* ```ts
|
|
23
24
|
* // ablo/register.ts
|
|
@@ -34,15 +35,15 @@
|
|
|
34
35
|
* export {};
|
|
35
36
|
* ```
|
|
36
37
|
*
|
|
37
|
-
*
|
|
38
|
-
* {@link DefaultSyncShape} — a loose shape that keeps
|
|
39
|
-
* without typed
|
|
38
|
+
* When `Register` is never augmented, every resolver falls back to
|
|
39
|
+
* {@link DefaultSyncShape} — a loose shape that keeps your code compiling
|
|
40
|
+
* without typed results until you opt in.
|
|
40
41
|
*/
|
|
41
42
|
/**
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
43
|
+
* The fallback shapes the resolvers use when {@link Register} has not been
|
|
44
|
+
* augmented. `DefaultSyncShape.Schema` is deliberately structural — it carries
|
|
45
|
+
* `{ models: Record<string, unknown> }` so hooks can still check a model-key
|
|
46
|
+
* argument against something, just without a typed entity shape behind it.
|
|
46
47
|
*/
|
|
47
48
|
export interface DefaultSyncShape {
|
|
48
49
|
readonly Schema: {
|
|
@@ -55,20 +56,21 @@ export interface DefaultSyncShape {
|
|
|
55
56
|
};
|
|
56
57
|
}
|
|
57
58
|
/**
|
|
58
|
-
* The registration interface
|
|
59
|
-
* `declare module '@abloatai/ablo'
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
* augmentation merges into this declaration.
|
|
59
|
+
* The registration interface you augment to declare your application's types.
|
|
60
|
+
* Add keys inside a `declare module '@abloatai/ablo'` block — for example
|
|
61
|
+
* `interface Register { Schema: ...; Presence: ...; }`. It is empty by default,
|
|
62
|
+
* so any key you omit falls back to {@link DefaultSyncShape}. It is exported
|
|
63
|
+
* from the package root so your augmentation merges into this declaration.
|
|
63
64
|
*
|
|
64
|
-
* The `Schema`
|
|
65
|
-
*
|
|
65
|
+
* The `Schema` key holds the type returned by `defineSchema`, and
|
|
66
|
+
* {@link ResolveSchema} reads it back out.
|
|
66
67
|
*/
|
|
67
68
|
export interface Register {
|
|
68
69
|
}
|
|
69
70
|
/**
|
|
70
|
-
*
|
|
71
|
-
* to type their model-key argument and infer the entity type
|
|
71
|
+
* Your registered schema, or the default shape when none is registered. Hooks
|
|
72
|
+
* read this to type their model-key argument and to infer the entity type they
|
|
73
|
+
* return.
|
|
72
74
|
*/
|
|
73
75
|
export type ResolveSchema = Register extends {
|
|
74
76
|
Schema: infer S;
|
|
@@ -76,30 +78,33 @@ export type ResolveSchema = Register extends {
|
|
|
76
78
|
models: Record<string, unknown>;
|
|
77
79
|
} ? S : DefaultSyncShape['Schema'] : DefaultSyncShape['Schema'];
|
|
78
80
|
/**
|
|
79
|
-
*
|
|
80
|
-
* `usePresence
|
|
81
|
+
* Your registered presence shape, or the default when none is registered.
|
|
82
|
+
* `usePresence` reads it. The shape is free-form — any JSON-serializable value
|
|
83
|
+
* you broadcast per session.
|
|
81
84
|
*/
|
|
82
85
|
export type ResolvePresence = Register extends {
|
|
83
86
|
Presence: infer P;
|
|
84
87
|
} ? P : DefaultSyncShape['Presence'];
|
|
85
88
|
/**
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
* `useClaim(claimName)
|
|
89
|
+
* Your registered claim vocabulary, or the default when none is registered.
|
|
90
|
+
* Each key is a claim name and its value is that claim's payload.
|
|
91
|
+
* `useClaim(claimName)` reads it.
|
|
89
92
|
*/
|
|
90
93
|
export type ResolveClaims = Register extends {
|
|
91
94
|
Claims: infer I;
|
|
92
95
|
} ? I : DefaultSyncShape['Claims'];
|
|
93
96
|
/**
|
|
94
|
-
*
|
|
95
|
-
* identity
|
|
97
|
+
* Your registered user-metadata shape, or the default when none is registered.
|
|
98
|
+
* It carries identity information you trust from your own auth layer; the SDK
|
|
99
|
+
* does not validate it.
|
|
96
100
|
*/
|
|
97
101
|
export type ResolveUserMeta = Register extends {
|
|
98
102
|
UserMeta: infer U;
|
|
99
103
|
} ? U : DefaultSyncShape['UserMeta'];
|
|
100
104
|
/**
|
|
101
|
-
* The
|
|
102
|
-
* first argument to this union, so unknown
|
|
105
|
+
* The union of your schema's model names. `useQuery(modelKey)` narrows its
|
|
106
|
+
* first argument to this union, so a misspelled or unknown model name fails at
|
|
107
|
+
* compile time.
|
|
103
108
|
*/
|
|
104
109
|
export type ResolveModelKey = ResolveSchema extends {
|
|
105
110
|
models: infer M;
|
package/dist/types/global.js
CHANGED
|
@@ -1,23 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* The single place where you tell the SDK about your application's types.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* `useQuery`, `useOne`, `usePresence`, `useClaim` — reads its types from
|
|
7
|
-
*
|
|
4
|
+
* You register your Schema, Presence, Claims, and UserMeta once by augmenting
|
|
5
|
+
* the {@link Register} interface. From then on every SDK hook — `useAblo`,
|
|
6
|
+
* `useQuery`, `useOne`, `usePresence`, `useClaim` — reads its types from that
|
|
7
|
+
* registration, so you never pass a generic or a `schema` argument at a call
|
|
8
|
+
* site.
|
|
8
9
|
*
|
|
9
|
-
* Registration
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
10
|
+
* Registration uses TypeScript module augmentation: any file in your project
|
|
11
|
+
* can add an `interface Register` to a `declare module '@abloatai/ablo'`
|
|
12
|
+
* block, and every resolver below picks it up. Because the name is scoped to
|
|
13
|
+
* this module, the interface is simply `Register` — not a global and not
|
|
14
|
+
* prefixed.
|
|
14
15
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* `.d.ts`: the top-level `import type { schema }` makes the
|
|
18
|
-
* block
|
|
19
|
-
*
|
|
20
|
-
*
|
|
16
|
+
* The `npx ablo init` command scaffolds this file as `ablo/register.ts`, next
|
|
17
|
+
* to `ablo/schema.ts`. Write it as a normal `.ts` module, not a hand-authored
|
|
18
|
+
* `.d.ts`: the top-level `import type { schema }` is what makes the
|
|
19
|
+
* `declare module` block merge into this interface rather than collide with it.
|
|
20
|
+
* Any `.ts` file covered by your `tsconfig` works, and it never needs to be
|
|
21
|
+
* imported anywhere.
|
|
21
22
|
*
|
|
22
23
|
* ```ts
|
|
23
24
|
* // ablo/register.ts
|
|
@@ -34,8 +35,8 @@
|
|
|
34
35
|
* export {};
|
|
35
36
|
* ```
|
|
36
37
|
*
|
|
37
|
-
*
|
|
38
|
-
* {@link DefaultSyncShape} — a loose shape that keeps
|
|
39
|
-
* without typed
|
|
38
|
+
* When `Register` is never augmented, every resolver falls back to
|
|
39
|
+
* {@link DefaultSyncShape} — a loose shape that keeps your code compiling
|
|
40
|
+
* without typed results until you opt in.
|
|
40
41
|
*/
|
|
41
42
|
export {};
|