@party-stack/ontology 0.19.1 → 0.21.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/README.md +31 -0
- package/lib/OntologyPullConfig.d.ts +4 -17
- package/lib/OntologyPullConfig.d.ts.map +1 -1
- package/lib/authentication.d.ts +1068 -0
- package/lib/authentication.d.ts.map +1 -0
- package/lib/authentication.js +55 -0
- package/lib/authentication.js.map +1 -0
- package/lib/cli/index.js +19 -45
- package/lib/cli/index.js.map +1 -1
- package/lib/cli/pull.d.ts.map +1 -1
- package/lib/cli/pull.js +16 -29
- package/lib/cli/pull.js.map +1 -1
- package/lib/client.d.ts +11 -0
- package/lib/client.d.ts.map +1 -0
- package/lib/client.js +21 -0
- package/lib/client.js.map +1 -0
- package/lib/examples/blog.d.ts +2 -387
- package/lib/examples/blog.js +1 -353
- package/lib/examples/blog.live-queries.d.ts +1 -1
- package/lib/examples/blog.live-queries.d.ts.map +1 -1
- package/lib/examples/blog.live-queries.js +1 -1
- package/lib/examples/blog.live-queries.js.map +1 -1
- package/lib/examples/generated/collections.d.ts +7 -0
- package/lib/examples/generated/collections.d.ts.map +1 -0
- package/lib/examples/generated/collections.js +12 -0
- package/lib/examples/generated/collections.js.map +1 -0
- package/lib/examples/generated/live.d.ts +2 -2
- package/lib/examples/generated/live.d.ts.map +1 -1
- package/lib/examples/generated/live.js.map +1 -1
- package/lib/http.d.ts +13 -0
- package/lib/http.d.ts.map +1 -0
- package/lib/http.js +29 -0
- package/lib/http.js.map +1 -0
- package/lib/index.d.ts +19 -25
- package/lib/index.js +9 -15
- package/lib/json/index.d.ts +1 -16
- package/lib/json/index.js +2 -132
- package/lib/live/LiveOntology.d.ts +114 -50
- package/lib/live/LiveOntology.d.ts.map +1 -1
- package/lib/live/LiveOntology.js +23 -103
- package/lib/live/LiveOntology.js.map +1 -1
- package/lib/live/actions/createLiveOntologyAction.d.ts +15 -16
- package/lib/live/actions/createLiveOntologyAction.d.ts.map +1 -1
- package/lib/live/actions/createLiveOntologyAction.js +3 -11
- package/lib/live/actions/createLiveOntologyAction.js.map +1 -1
- package/lib/live/actions/types.d.ts +21 -0
- package/lib/live/actions/types.d.ts.map +1 -0
- package/lib/live/attachments/createLiveOntologyAttachments.d.ts +30 -19
- package/lib/live/attachments/createLiveOntologyAttachments.d.ts.map +1 -1
- package/lib/live/attachments/createLiveOntologyAttachments.js +43 -60
- package/lib/live/attachments/createLiveOntologyAttachments.js.map +1 -1
- package/lib/live/attachments/types.d.ts +4 -3
- package/lib/live/index.d.ts +10 -10
- package/lib/live/index.js +5 -6
- package/lib/live/mutators/createReadTx.d.ts +5 -0
- package/lib/live/mutators/createReadTx.d.ts.map +1 -0
- package/lib/live/mutators/createReadTx.js +19 -0
- package/lib/live/mutators/createReadTx.js.map +1 -0
- package/lib/live/mutators/types.d.ts +7 -2
- package/lib/live/mutators/types.d.ts.map +1 -1
- package/lib/live/objects/types.d.ts +6 -0
- package/lib/live/objects/types.d.ts.map +1 -0
- package/lib/live/outbox/types.d.ts +24 -15
- package/lib/live/outbox/types.d.ts.map +1 -1
- package/lib/live/outbox/types.js +1 -11
- package/lib/live/pins.d.ts +51 -0
- package/lib/live/pins.d.ts.map +1 -0
- package/lib/live/pins.js +113 -0
- package/lib/live/pins.js.map +1 -0
- package/lib/live/storageBackend.d.ts +50 -0
- package/lib/live/storageBackend.d.ts.map +1 -0
- package/lib/live/storageBackend.js +42 -0
- package/lib/live/storageBackend.js.map +1 -0
- package/lib/local.d.ts +15 -0
- package/lib/local.d.ts.map +1 -0
- package/lib/local.js +19 -0
- package/lib/local.js.map +1 -0
- package/lib/meta/generated/collections.d.ts +7 -0
- package/lib/meta/generated/collections.d.ts.map +1 -0
- package/lib/meta/generated/collections.js +15 -0
- package/lib/meta/generated/collections.js.map +1 -0
- package/lib/meta/generated/live.d.ts +3 -3
- package/lib/meta/generated/live.d.ts.map +1 -1
- package/lib/meta/generated/live.js +2 -2
- package/lib/meta/generated/live.js.map +1 -1
- package/lib/meta/pull.d.ts +5 -9
- package/lib/meta/pull.d.ts.map +1 -1
- package/lib/meta/pull.js +5 -43
- package/lib/meta/pull.js.map +1 -1
- package/lib/query.d.ts +1 -0
- package/lib/query.js +2 -0
- package/lib/runtime/host.d.ts +35 -0
- package/lib/runtime/host.d.ts.map +1 -0
- package/lib/runtime/host.js +39 -0
- package/lib/runtime/host.js.map +1 -0
- package/lib/runtime/index.d.ts +2 -0
- package/lib/runtime/index.js +1 -0
- package/lib/runtime/live.d.ts +25 -0
- package/lib/runtime/live.d.ts.map +1 -0
- package/lib/runtime/live.js +31 -0
- package/lib/runtime/live.js.map +1 -0
- package/lib/runtime/resource.d.ts +24 -0
- package/lib/runtime/resource.d.ts.map +1 -0
- package/lib/runtime/resource.js +127 -0
- package/lib/runtime/resource.js.map +1 -0
- package/lib/runtime/transactions.d.ts +27 -0
- package/lib/runtime/transactions.d.ts.map +1 -0
- package/lib/runtime/transactions.js +188 -0
- package/lib/runtime/transactions.js.map +1 -0
- package/lib/runtime/view.d.ts +25 -0
- package/lib/runtime/view.d.ts.map +1 -0
- package/lib/runtime/view.js +256 -0
- package/lib/runtime/view.js.map +1 -0
- package/lib/tanstack/collections.d.ts +73 -0
- package/lib/tanstack/collections.d.ts.map +1 -0
- package/lib/tanstack/collections.js +495 -0
- package/lib/tanstack/collections.js.map +1 -0
- package/lib/tanstack/createLocalCollection.d.ts +14 -0
- package/lib/tanstack/createLocalCollection.d.ts.map +1 -0
- package/lib/tanstack/createLocalCollection.js +9 -0
- package/lib/tanstack/createLocalCollection.js.map +1 -0
- package/lib/tanstack/descriptors.d.ts +33 -0
- package/lib/tanstack/descriptors.d.ts.map +1 -0
- package/lib/tanstack/descriptors.js +38 -0
- package/lib/tanstack/descriptors.js.map +1 -0
- package/lib/tanstack/diagnostics.d.ts +23 -0
- package/lib/tanstack/diagnostics.d.ts.map +1 -0
- package/lib/tanstack/diagnostics.js +14 -0
- package/lib/tanstack/diagnostics.js.map +1 -0
- package/lib/tanstack/index.d.ts +6 -0
- package/lib/tanstack/index.js +6 -0
- package/lib/tanstack/localCollection.d.ts +14 -0
- package/lib/tanstack/localCollection.d.ts.map +1 -0
- package/lib/tanstack/localCollection.js +73 -0
- package/lib/tanstack/localCollection.js.map +1 -0
- package/lib/tanstack/subset.d.ts +28 -0
- package/lib/tanstack/subset.d.ts.map +1 -0
- package/lib/tanstack/subset.js +290 -0
- package/lib/tanstack/subset.js.map +1 -0
- package/lib/testing/sqlite.d.ts +40 -0
- package/lib/testing/sqlite.d.ts.map +1 -0
- package/lib/testing/sqlite.js +409 -0
- package/lib/testing/sqlite.js.map +1 -0
- package/lib/testing/sqliteBackend.d.ts +68 -0
- package/lib/testing/sqliteBackend.d.ts.map +1 -0
- package/lib/testing/sqliteBackend.js +34 -0
- package/lib/testing/sqliteBackend.js.map +1 -0
- package/lib/utils/index.d.ts +1 -8
- package/lib/utils/index.js +2 -5
- package/lib/utils/values.d.ts +1 -33
- package/lib/worker.d.ts +19 -0
- package/lib/worker.d.ts.map +1 -0
- package/lib/worker.js +46 -0
- package/lib/worker.js.map +1 -0
- package/package.json +54 -19
- package/lib/_virtual/_rolldown/runtime.js +0 -13
- package/lib/cli/format.d.ts +0 -4
- package/lib/cli/format.d.ts.map +0 -1
- package/lib/cli/format.js +0 -19
- package/lib/cli/format.js.map +0 -1
- package/lib/cli/generate.d.ts +0 -10
- package/lib/cli/generate.d.ts.map +0 -1
- package/lib/cli/generate.js +0 -108
- package/lib/cli/generate.js.map +0 -1
- package/lib/examples/blog.d.ts.map +0 -1
- package/lib/examples/blog.js.map +0 -1
- package/lib/generate/builders.d.ts +0 -12
- package/lib/generate/builders.d.ts.map +0 -1
- package/lib/generate/builders.js +0 -58
- package/lib/generate/builders.js.map +0 -1
- package/lib/generate/constants.d.ts +0 -5
- package/lib/generate/constants.d.ts.map +0 -1
- package/lib/generate/constants.js +0 -28
- package/lib/generate/constants.js.map +0 -1
- package/lib/generate/index.d.ts +0 -6
- package/lib/generate/index.js +0 -6
- package/lib/generate/live.d.ts +0 -12
- package/lib/generate/live.d.ts.map +0 -1
- package/lib/generate/live.js +0 -48
- package/lib/generate/live.js.map +0 -1
- package/lib/generate/ontology.d.ts +0 -8
- package/lib/generate/ontology.d.ts.map +0 -1
- package/lib/generate/ontology.js +0 -501
- package/lib/generate/ontology.js.map +0 -1
- package/lib/generate/types.d.ts +0 -17
- package/lib/generate/types.d.ts.map +0 -1
- package/lib/generate/types.js +0 -216
- package/lib/generate/types.js.map +0 -1
- package/lib/generate/utils/buildJsDocs.d.ts +0 -10
- package/lib/generate/utils/buildJsDocs.d.ts.map +0 -1
- package/lib/generate/utils/buildJsDocs.js +0 -16
- package/lib/generate/utils/buildJsDocs.js.map +0 -1
- package/lib/infer.d.ts +0 -222
- package/lib/infer.d.ts.map +0 -1
- package/lib/infer.js +0 -14
- package/lib/infer.js.map +0 -1
- package/lib/installation/createMetaOntologyConfiguration.d.ts +0 -10
- package/lib/installation/createMetaOntologyConfiguration.d.ts.map +0 -1
- package/lib/installation/createMetaOntologyConfiguration.js +0 -16
- package/lib/installation/createMetaOntologyConfiguration.js.map +0 -1
- package/lib/installation/createOntologyBackendInstallation.d.ts +0 -5
- package/lib/installation/createOntologyBackendInstallation.d.ts.map +0 -1
- package/lib/installation/createOntologyBackendInstallation.js +0 -221
- package/lib/installation/createOntologyBackendInstallation.js.map +0 -1
- package/lib/installation/index.d.ts +0 -4
- package/lib/installation/index.js +0 -3
- package/lib/installation/types.d.ts +0 -94
- package/lib/installation/types.d.ts.map +0 -1
- package/lib/ir/generated/builders.d.ts +0 -380
- package/lib/ir/generated/builders.d.ts.map +0 -1
- package/lib/ir/generated/builders.js +0 -186
- package/lib/ir/generated/builders.js.map +0 -1
- package/lib/ir/generated/constants.d.ts +0 -265
- package/lib/ir/generated/constants.d.ts.map +0 -1
- package/lib/ir/generated/constants.js +0 -165
- package/lib/ir/generated/constants.js.map +0 -1
- package/lib/ir/generated/types.d.ts +0 -416
- package/lib/ir/generated/types.d.ts.map +0 -1
- package/lib/ir/index.d.ts +0 -4
- package/lib/ir/index.js +0 -3
- package/lib/ir/schema.d.ts +0 -2246
- package/lib/ir/schema.d.ts.map +0 -1
- package/lib/ir/schema.js +0 -1187
- package/lib/ir/schema.js.map +0 -1
- package/lib/ir/validate.d.ts +0 -8
- package/lib/ir/validate.d.ts.map +0 -1
- package/lib/ir/validate.js +0 -623
- package/lib/ir/validate.js.map +0 -1
- package/lib/json/index.d.ts.map +0 -1
- package/lib/json/index.js.map +0 -1
- package/lib/lenses.d.ts +0 -21
- package/lib/lenses.d.ts.map +0 -1
- package/lib/lenses.js +0 -110
- package/lib/lenses.js.map +0 -1
- package/lib/live/OntologyBackendAdapter.d.ts +0 -100
- package/lib/live/OntologyBackendAdapter.d.ts.map +0 -1
- package/lib/live/OntologyBackendAdapter.js +0 -1
- package/lib/live/actions/createLiveOntologyActions.d.ts +0 -28
- package/lib/live/actions/createLiveOntologyActions.d.ts.map +0 -1
- package/lib/live/actions/createLiveOntologyActions.js +0 -139
- package/lib/live/actions/createLiveOntologyActions.js.map +0 -1
- package/lib/live/actions/prepareActionParameters.d.ts +0 -19
- package/lib/live/actions/prepareActionParameters.d.ts.map +0 -1
- package/lib/live/actions/prepareActionParameters.js +0 -213
- package/lib/live/actions/prepareActionParameters.js.map +0 -1
- package/lib/live/attachments/attachmentSources.d.ts +0 -10
- package/lib/live/attachments/attachmentSources.d.ts.map +0 -1
- package/lib/live/attachments/attachmentSources.js +0 -64
- package/lib/live/attachments/attachmentSources.js.map +0 -1
- package/lib/live/attachments/unsupportedOntologyAttachmentsAdapter.d.ts +0 -5
- package/lib/live/attachments/unsupportedOntologyAttachmentsAdapter.d.ts.map +0 -1
- package/lib/live/attachments/unsupportedOntologyAttachmentsAdapter.js +0 -6
- package/lib/live/attachments/unsupportedOntologyAttachmentsAdapter.js.map +0 -1
- package/lib/live/expression.d.ts +0 -23
- package/lib/live/expression.d.ts.map +0 -1
- package/lib/live/expression.js +0 -160
- package/lib/live/expression.js.map +0 -1
- package/lib/live/mutators/OntologyEdits.d.ts +0 -15
- package/lib/live/mutators/OntologyEdits.d.ts.map +0 -1
- package/lib/live/mutators/OntologyEdits.js +0 -65
- package/lib/live/mutators/OntologyEdits.js.map +0 -1
- package/lib/live/mutators/createMutatorTx.d.ts +0 -11
- package/lib/live/mutators/createMutatorTx.d.ts.map +0 -1
- package/lib/live/mutators/createMutatorTx.js +0 -61
- package/lib/live/mutators/createMutatorTx.js.map +0 -1
- package/lib/live/mutators/runOptimisticAction.d.ts +0 -19
- package/lib/live/mutators/runOptimisticAction.d.ts.map +0 -1
- package/lib/live/mutators/runOptimisticAction.js +0 -30
- package/lib/live/mutators/runOptimisticAction.js.map +0 -1
- package/lib/live/objects/OntologyObject.d.ts +0 -4
- package/lib/live/objects/OntologyObject.d.ts.map +0 -1
- package/lib/live/objects/OntologyObject.js +0 -1
- package/lib/live/objects/createLiveOntologyObjectCollection.d.ts +0 -17
- package/lib/live/objects/createLiveOntologyObjectCollection.d.ts.map +0 -1
- package/lib/live/objects/createLiveOntologyObjectCollection.js +0 -55
- package/lib/live/objects/createLiveOntologyObjectCollection.js.map +0 -1
- package/lib/live/objects/ontologyObjectCollectionId.d.ts +0 -4
- package/lib/live/objects/ontologyObjectCollectionId.d.ts.map +0 -1
- package/lib/live/objects/ontologyObjectCollectionId.js +0 -8
- package/lib/live/objects/ontologyObjectCollectionId.js.map +0 -1
- package/lib/live/outbox/createOntologyOutbox.d.ts +0 -23
- package/lib/live/outbox/createOntologyOutbox.d.ts.map +0 -1
- package/lib/live/outbox/createOntologyOutbox.js +0 -292
- package/lib/live/outbox/createOntologyOutbox.js.map +0 -1
- package/lib/live/outbox/leaderExecutor.d.ts +0 -20
- package/lib/live/outbox/leaderExecutor.d.ts.map +0 -1
- package/lib/live/outbox/leaderExecutor.js +0 -130
- package/lib/live/outbox/leaderExecutor.js.map +0 -1
- package/lib/live/outbox/outboxService.d.ts +0 -7
- package/lib/live/outbox/outboxService.d.ts.map +0 -1
- package/lib/live/outbox/outboxService.js +0 -68
- package/lib/live/outbox/outboxService.js.map +0 -1
- package/lib/live/outbox/projectionManager.d.ts +0 -31
- package/lib/live/outbox/projectionManager.d.ts.map +0 -1
- package/lib/live/outbox/projectionManager.js +0 -127
- package/lib/live/outbox/projectionManager.js.map +0 -1
- package/lib/live/outbox/repository.d.ts +0 -31
- package/lib/live/outbox/repository.d.ts.map +0 -1
- package/lib/live/outbox/repository.js +0 -196
- package/lib/live/outbox/repository.js.map +0 -1
- package/lib/live/outbox/service.d.ts +0 -61
- package/lib/live/outbox/service.d.ts.map +0 -1
- package/lib/live/outbox/service.js +0 -6
- package/lib/live/outbox/service.js.map +0 -1
- package/lib/live/outbox/types.js.map +0 -1
- package/lib/live/waitForCollectionReady.d.ts +0 -5
- package/lib/live/waitForCollectionReady.d.ts.map +0 -1
- package/lib/live/waitForCollectionReady.js +0 -49
- package/lib/live/waitForCollectionReady.js.map +0 -1
- package/lib/meta/createLocalMetaOntologyBackendAdapter.d.ts +0 -7
- package/lib/meta/createLocalMetaOntologyBackendAdapter.d.ts.map +0 -1
- package/lib/meta/createLocalMetaOntologyBackendAdapter.js +0 -44
- package/lib/meta/createLocalMetaOntologyBackendAdapter.js.map +0 -1
- package/lib/meta/generated/constants.d.ts +0 -265
- package/lib/meta/generated/constants.d.ts.map +0 -1
- package/lib/meta/generated/constants.js +0 -165
- package/lib/meta/generated/constants.js.map +0 -1
- package/lib/meta/generated/types.d.ts +0 -417
- package/lib/meta/generated/types.d.ts.map +0 -1
- package/lib/meta/generated/types.js +0 -1
- package/lib/meta/ontology.d.ts +0 -26
- package/lib/meta/ontology.d.ts.map +0 -1
- package/lib/meta/ontology.js +0 -111
- package/lib/meta/ontology.js.map +0 -1
- package/lib/utils/links.d.ts +0 -49
- package/lib/utils/links.d.ts.map +0 -1
- package/lib/utils/links.js +0 -13
- package/lib/utils/links.js.map +0 -1
- package/lib/utils/paths.d.ts +0 -6
- package/lib/utils/paths.d.ts.map +0 -1
- package/lib/utils/paths.js +0 -42
- package/lib/utils/paths.js.map +0 -1
- package/lib/utils/provide.d.ts +0 -4
- package/lib/utils/provide.d.ts.map +0 -1
- package/lib/utils/provide.js +0 -9
- package/lib/utils/provide.js.map +0 -1
- package/lib/utils/targets.d.ts +0 -37
- package/lib/utils/targets.d.ts.map +0 -1
- package/lib/utils/targets.js +0 -1
- package/lib/utils/typeNames.d.ts +0 -28
- package/lib/utils/typeNames.d.ts.map +0 -1
- package/lib/utils/typeNames.js +0 -1
- package/lib/utils/types.d.ts +0 -12
- package/lib/utils/types.d.ts.map +0 -1
- package/lib/utils/types.js +0 -48
- package/lib/utils/types.js.map +0 -1
- package/lib/utils/uncertain.d.ts +0 -11
- package/lib/utils/uncertain.d.ts.map +0 -1
- package/lib/utils/uncertain.js +0 -14
- package/lib/utils/uncertain.js.map +0 -1
- package/lib/utils/validation.d.ts +0 -7
- package/lib/utils/validation.d.ts.map +0 -1
- package/lib/utils/validation.js +0 -1
- package/lib/utils/values.d.ts.map +0 -1
- /package/lib/{installation → live/actions}/types.js +0 -0
- /package/lib/{ir/generated → live/objects}/types.js +0 -0
package/lib/json/index.js
CHANGED
|
@@ -1,132 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import { Temporal } from "temporal-polyfill";
|
|
4
|
-
//#region src/json/index.ts
|
|
5
|
-
function assertRecord(value) {
|
|
6
|
-
invariant(typeof value === "object" && value !== null && !Array.isArray(value), "Expected JSON object.");
|
|
7
|
-
}
|
|
8
|
-
function assertArray(value) {
|
|
9
|
-
invariant(Array.isArray(value), "Expected JSON array.");
|
|
10
|
-
}
|
|
11
|
-
function getNamedType(ir, name) {
|
|
12
|
-
const namedType = ir.types.find((candidate) => candidate.name === name);
|
|
13
|
-
invariant(namedType, `Unknown ontology type "${name}".`);
|
|
14
|
-
return namedType.type;
|
|
15
|
-
}
|
|
16
|
-
function getObjectType(ir, name) {
|
|
17
|
-
const objectType = ir.objectTypes.find((candidate) => candidate.name === name);
|
|
18
|
-
invariant(objectType, `Unknown object type "${name}".`);
|
|
19
|
-
return objectType;
|
|
20
|
-
}
|
|
21
|
-
function getActionType(ir, name) {
|
|
22
|
-
const actionType = ir.actionTypes.find((candidate) => candidate.name === name);
|
|
23
|
-
invariant(actionType, `Unknown action type "${name}".`);
|
|
24
|
-
return actionType;
|
|
25
|
-
}
|
|
26
|
-
function getQueryFunctionType(ir, name) {
|
|
27
|
-
const queryFunctionType = ir.queryFunctionTypes.find((candidate) => candidate.name === name);
|
|
28
|
-
invariant(queryFunctionType, `Unknown query function type "${name}".`);
|
|
29
|
-
return queryFunctionType;
|
|
30
|
-
}
|
|
31
|
-
function resolveTargetType(ir, target) {
|
|
32
|
-
switch (target.kind) {
|
|
33
|
-
case "type": return getNamedType(ir, target.name);
|
|
34
|
-
case "object":
|
|
35
|
-
case "actionParameters":
|
|
36
|
-
case "queryFunctionParameters": return;
|
|
37
|
-
case "queryFunctionReturn": return getQueryFunctionType(ir, target.queryFunctionType).returnType;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
function decodeValue(ir, type, value, normalizeOptionalNull = false) {
|
|
41
|
-
const resolvedType = resolveType(ir, type);
|
|
42
|
-
if (value === void 0) return void 0;
|
|
43
|
-
if (value === null) return normalizeOptionalNull && resolvedType.kind === "optional" ? void 0 : null;
|
|
44
|
-
switch (resolvedType.kind) {
|
|
45
|
-
case "timestamp": return typeof value === "string" ? Temporal.Instant.from(value) : value;
|
|
46
|
-
case "date": return typeof value === "string" ? Temporal.PlainDate.from(value) : value;
|
|
47
|
-
case "optional": return decodeValue(ir, resolvedType.value.type, value, normalizeOptionalNull);
|
|
48
|
-
case "list":
|
|
49
|
-
assertArray(value);
|
|
50
|
-
return value.map((item) => decodeValue(ir, resolvedType.value.elementType, item, normalizeOptionalNull));
|
|
51
|
-
case "map":
|
|
52
|
-
assertRecord(value);
|
|
53
|
-
return Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, decodeValue(ir, resolvedType.value.valueType, entry, normalizeOptionalNull)]));
|
|
54
|
-
case "struct":
|
|
55
|
-
assertRecord(value);
|
|
56
|
-
return Object.fromEntries(Object.entries(value).map(([key, entry]) => {
|
|
57
|
-
const field = resolvedType.value.fields.find((candidate) => candidate.name === key);
|
|
58
|
-
return [key, field ? decodeValue(ir, field.type, entry, normalizeOptionalNull) : entry];
|
|
59
|
-
}));
|
|
60
|
-
default: return value;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
function encodeValue(ir, type, value) {
|
|
64
|
-
if (value === void 0 || value === null) return value;
|
|
65
|
-
const resolvedType = resolveType(ir, type);
|
|
66
|
-
switch (resolvedType.kind) {
|
|
67
|
-
case "timestamp":
|
|
68
|
-
case "date":
|
|
69
|
-
invariant(typeof value === "object" && value !== null && typeof value.toString === "function", `Expected ${resolvedType.kind} value.`);
|
|
70
|
-
return value.toString();
|
|
71
|
-
case "optional": return encodeValue(ir, resolvedType.value.type, value);
|
|
72
|
-
case "list":
|
|
73
|
-
assertArray(value);
|
|
74
|
-
return value.map((item) => encodeValue(ir, resolvedType.value.elementType, item));
|
|
75
|
-
case "map":
|
|
76
|
-
assertRecord(value);
|
|
77
|
-
return Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, encodeValue(ir, resolvedType.value.valueType, entry)]));
|
|
78
|
-
case "struct":
|
|
79
|
-
assertRecord(value);
|
|
80
|
-
return Object.fromEntries(Object.entries(value).map(([key, entry]) => {
|
|
81
|
-
const field = resolvedType.value.fields.find((candidate) => candidate.name === key);
|
|
82
|
-
return [key, field ? encodeValue(ir, field.type, entry) : entry];
|
|
83
|
-
}));
|
|
84
|
-
default: return value;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
function decodeObject(ir, objectTypeName, value) {
|
|
88
|
-
assertRecord(value);
|
|
89
|
-
const objectType = getObjectType(ir, objectTypeName);
|
|
90
|
-
return Object.fromEntries(Object.entries(value).map(([key, entry]) => {
|
|
91
|
-
const property = objectType.properties.find((candidate) => candidate.name === key);
|
|
92
|
-
return [key, property ? decodeValue(ir, property.type, entry, true) : entry];
|
|
93
|
-
}));
|
|
94
|
-
}
|
|
95
|
-
function encodeObject(ir, objectTypeName, value) {
|
|
96
|
-
assertRecord(value);
|
|
97
|
-
const objectType = getObjectType(ir, objectTypeName);
|
|
98
|
-
return Object.fromEntries(Object.entries(value).map(([key, entry]) => {
|
|
99
|
-
const property = objectType.properties.find((candidate) => candidate.name === key);
|
|
100
|
-
return [key, property ? encodeValue(ir, property.type, entry) : entry];
|
|
101
|
-
}));
|
|
102
|
-
}
|
|
103
|
-
function decodeParameters(ir, parameters, value) {
|
|
104
|
-
assertRecord(value);
|
|
105
|
-
return Object.fromEntries(Object.entries(value).map(([key, entry]) => {
|
|
106
|
-
const parameter = parameters.find((candidate) => candidate.name === key);
|
|
107
|
-
return [key, parameter ? decodeValue(ir, parameter.type, entry) : entry];
|
|
108
|
-
}));
|
|
109
|
-
}
|
|
110
|
-
function encodeParameters(ir, parameters, value) {
|
|
111
|
-
assertRecord(value);
|
|
112
|
-
return Object.fromEntries(Object.entries(value).map(([key, entry]) => {
|
|
113
|
-
const parameter = parameters.find((candidate) => candidate.name === key);
|
|
114
|
-
return [key, parameter ? encodeValue(ir, parameter.type, entry) : entry];
|
|
115
|
-
}));
|
|
116
|
-
}
|
|
117
|
-
function decode(opts) {
|
|
118
|
-
if (opts.target.kind === "object") return decodeObject(opts.ir, opts.target.name, opts.value);
|
|
119
|
-
if (opts.target.kind === "actionParameters") return decodeParameters(opts.ir, getActionType(opts.ir, opts.target.actionType).parameters, opts.value);
|
|
120
|
-
if (opts.target.kind === "queryFunctionParameters") return decodeParameters(opts.ir, getQueryFunctionType(opts.ir, opts.target.queryFunctionType).parameters, opts.value);
|
|
121
|
-
return decodeValue(opts.ir, resolveTargetType(opts.ir, opts.target), opts.value, opts.target.kind === "queryFunctionReturn");
|
|
122
|
-
}
|
|
123
|
-
function encode(opts) {
|
|
124
|
-
if (opts.target.kind === "object") return encodeObject(opts.ir, opts.target.name, opts.value);
|
|
125
|
-
if (opts.target.kind === "actionParameters") return encodeParameters(opts.ir, getActionType(opts.ir, opts.target.actionType).parameters, opts.value);
|
|
126
|
-
if (opts.target.kind === "queryFunctionParameters") return encodeParameters(opts.ir, getQueryFunctionType(opts.ir, opts.target.queryFunctionType).parameters, opts.value);
|
|
127
|
-
return encodeValue(opts.ir, resolveTargetType(opts.ir, opts.target), opts.value);
|
|
128
|
-
}
|
|
129
|
-
//#endregion
|
|
130
|
-
export { decode, encode };
|
|
131
|
-
|
|
132
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
export * from "@party-stack/ontology-spec/json";
|
|
2
|
+
export {};
|
|
@@ -1,78 +1,142 @@
|
|
|
1
|
-
import { OntologyIR } from "../ir/generated/types.js";
|
|
2
|
-
import "../ir/index.js";
|
|
3
|
-
import { OntologyBackendAdapterProvider } from "./OntologyBackendAdapter.js";
|
|
4
|
-
import { LiveOntologyAttachments } from "./attachments/createLiveOntologyAttachments.js";
|
|
5
|
-
import { OntologyObject } from "./objects/OntologyObject.js";
|
|
6
|
-
import { OntologyCollection } from "./objects/createLiveOntologyObjectCollection.js";
|
|
7
1
|
import { OntologyOutbox } from "./outbox/types.js";
|
|
8
2
|
import { LiveOntologyAction, LiveOntologyActionOptions } from "./actions/createLiveOntologyAction.js";
|
|
3
|
+
import { LiveOntologyAttachments } from "./attachments/createLiveOntologyAttachments.js";
|
|
9
4
|
import { OntologyMutatorRegistry } from "./mutators/types.js";
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
5
|
+
import { OntologyCollection } from "./objects/types.js";
|
|
6
|
+
import { OntologyPins } from "./pins.js";
|
|
7
|
+
import { ConnectionMonitor } from "@party-stack/connect";
|
|
8
|
+
import { BackendError, OntologyBackendService } from "@party-stack/ontology-backend";
|
|
9
|
+
import { Runtime, Runtimes, RuntimesLayer } from "@party-stack/runtime";
|
|
10
|
+
import { Effect, Scope } from "effect";
|
|
11
|
+
import { DbClient } from "@tanstack/db";
|
|
12
|
+
import { OntologyDefinition, OntologyDefinition as OntologyDefinition$1, OntologyIR, QueryDocument } from "@party-stack/ontology-spec";
|
|
13
|
+
import { TraceRecordingMode, TraceStore } from "@party-stack/runtime/tracing";
|
|
14
|
+
import { DemandPolicy, PinGraph, PinOptions, PinOptions as PinOptions$1, PinStatus, PinStatus as PinStatus$1, ReplicaConfiguration, ReplicaMonitor, ReplicaOptions, ReplicaService } from "@party-stack/ontology-replica";
|
|
15
|
+
import { OntologyClient, OntologyServerClient } from "@party-stack/ontology-server/rpc";
|
|
16
|
+
import { Encrypted } from "@party-stack/ontology-spec/values";
|
|
12
17
|
//#region src/live/LiveOntology.d.ts
|
|
13
|
-
export type LiveOntologyWriteMode = "direct" | "outbox";
|
|
14
18
|
export type LiveOntologyWriteVisibility = "confirmed" | "optimistic";
|
|
15
19
|
export type LiveOntologyOutboxFailureStrategy = "pause" | "discard-all";
|
|
16
|
-
export
|
|
17
|
-
failureStrategy?: LiveOntologyOutboxFailureStrategy;
|
|
18
|
-
maxRetries?: number;
|
|
19
|
-
}
|
|
20
|
+
export type LiveOntologyOutboxOptions = NonNullable<ReplicaConfiguration["outbox"]>;
|
|
20
21
|
export interface LiveOntologyWrites {
|
|
21
|
-
defaultMode?: LiveOntologyWriteMode;
|
|
22
22
|
defaultVisibility?: LiveOntologyWriteVisibility;
|
|
23
23
|
mutators?: OntologyMutatorRegistry;
|
|
24
24
|
outbox?: LiveOntologyOutboxOptions;
|
|
25
25
|
}
|
|
26
|
-
|
|
27
|
-
context?: Record<string, unknown>;
|
|
28
|
-
objectTypes: Record<string, OntologyObject>;
|
|
29
|
-
actionTypes: Record<string, {
|
|
30
|
-
parameters: Record<string, unknown>;
|
|
31
|
-
}>;
|
|
32
|
-
queryFunctionTypes: Record<string, {
|
|
33
|
-
parameters: Record<string, unknown>;
|
|
34
|
-
returnType: unknown;
|
|
35
|
-
}>;
|
|
36
|
-
}
|
|
37
|
-
type OntologyContext<Ontology extends OntologyDefinition> = Ontology extends {
|
|
26
|
+
type OntologyContext<Ontology extends OntologyDefinition$1> = Ontology extends {
|
|
38
27
|
context: infer Context extends Record<string, unknown>;
|
|
39
28
|
} ? Context : Record<string, unknown>;
|
|
40
29
|
export type LiveOntologyQueryFunction<Parameters extends Record<string, unknown> = Record<string, unknown>, Return = unknown> = (parameters: Parameters) => Promise<Return>;
|
|
41
|
-
export type LiveOntologyObjects<ObjectTypes extends OntologyDefinition["objectTypes"] = OntologyDefinition["objectTypes"]> = { [ObjectTypeName in keyof ObjectTypes]: OntologyCollection<ObjectTypes[ObjectTypeName]>; };
|
|
42
|
-
export type LiveOntologyActions<ActionTypes extends OntologyDefinition["actionTypes"]> = { [ActionTypeName in keyof ActionTypes]: LiveOntologyAction<ActionTypes[ActionTypeName]["parameters"]
|
|
43
|
-
|
|
44
|
-
|
|
30
|
+
export type LiveOntologyObjects<ObjectTypes extends OntologyDefinition$1["objectTypes"] = OntologyDefinition$1["objectTypes"]> = { readonly [ObjectTypeName in keyof ObjectTypes]: OntologyCollection<ObjectTypes[ObjectTypeName]>; };
|
|
31
|
+
export type LiveOntologyActions<ActionTypes extends OntologyDefinition$1["actionTypes"]> = { [ActionTypeName in keyof ActionTypes]: LiveOntologyAction<ActionTypes[ActionTypeName]["parameters"], ActionTypes[ActionTypeName] extends {
|
|
32
|
+
returnType: infer Return;
|
|
33
|
+
} ? Return : unknown, ActionTypes[ActionTypeName] extends {
|
|
34
|
+
inputParameters: infer Input extends Record<string, unknown>;
|
|
35
|
+
} ? Input : ActionTypes[ActionTypeName]["parameters"]>; };
|
|
36
|
+
export type LiveOntologyQueryFunctions<QueryFunctionTypes extends OntologyDefinition$1["queryFunctionTypes"]> = { [QueryFunctionTypeName in keyof QueryFunctionTypes]: LiveOntologyQueryFunction<QueryFunctionTypes[QueryFunctionTypeName]["parameters"], QueryFunctionTypes[QueryFunctionTypeName]["returnType"]>; };
|
|
37
|
+
export interface OntologyDiagnostics {
|
|
38
|
+
readonly label?: string;
|
|
39
|
+
readonly role?: "host" | "replica";
|
|
40
|
+
readonly location?: string;
|
|
41
|
+
readonly replica: ReplicaMonitor;
|
|
42
|
+
readonly traces?: TraceStore;
|
|
43
|
+
readonly parent?: OntologyDiagnostics;
|
|
44
|
+
}
|
|
45
|
+
export interface DecryptOptions {
|
|
46
|
+
/** Default false: bypass the persistent decrypted-value cache. True permits a device-encrypted
|
|
47
|
+
* copy when the response is bound to this ciphertext (see the documented Foundry assumption).
|
|
48
|
+
* Cached device copies are removed with their replica rows.
|
|
49
|
+
*/
|
|
50
|
+
readonly cache?: boolean;
|
|
51
|
+
readonly signal?: AbortSignal;
|
|
52
|
+
}
|
|
53
|
+
export type LiveOntologyDecrypt = <A>(value: Encrypted<A>, options?: DecryptOptions) => Promise<A>;
|
|
54
|
+
export interface LiveOntologyPins extends OntologyPins {
|
|
55
|
+
/** The application's current offline graph, including its readiness. */
|
|
56
|
+
get(): Promise<PinStatus$1 | undefined>;
|
|
57
|
+
/** Replace the offline graph, retaining the previous graph until the replacement is ready.
|
|
58
|
+
* Server-backed clients target the parent's persistent replica, including from a memory tab.
|
|
59
|
+
* Standalone clients target their own replica. Attachments default to "none".
|
|
60
|
+
*/
|
|
61
|
+
set(query: QueryDocument, options?: PinOptions$1): Promise<void>;
|
|
62
|
+
clear(name?: string): Promise<void>;
|
|
63
|
+
/** Receives the current pin and subsequent updates. Unsubscribe releases its stream.
|
|
64
|
+
* Native pin failures appear on status.error; transport failures call onError.
|
|
65
|
+
*/
|
|
66
|
+
subscribe(listener: (status: PinStatus$1 | undefined) => void, onError?: (cause: unknown) => void): () => void;
|
|
67
|
+
}
|
|
68
|
+
export interface LiveOntology<Ontology extends OntologyDefinition$1 = OntologyDefinition$1> {
|
|
69
|
+
/** Scoped source-collection and query-identity owner. Supply to React's DbProvider or query options.
|
|
70
|
+
* The current TanStack release does not register browser hook queries for client cleanup.
|
|
71
|
+
*/
|
|
72
|
+
readonly dbClient: DbClient;
|
|
45
73
|
readonly ir: OntologyIR;
|
|
46
74
|
readonly context: OntologyContext<Ontology>;
|
|
47
|
-
/**
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
75
|
+
/** Lazy typed collections. Consuming queries acquire upstream subset demand. */
|
|
76
|
+
readonly objects: LiveOntologyObjects<Ontology["objectTypes"]>;
|
|
77
|
+
/** Lazy cache inspection. These collections retain/observe local visible rows without upstream demand. */
|
|
78
|
+
readonly cachedObjects: LiveOntologyObjects<Ontology["objectTypes"]>;
|
|
79
|
+
traces?: TraceStore;
|
|
80
|
+
diagnostics?: OntologyDiagnostics;
|
|
81
|
+
readonly replica: ReplicaService;
|
|
53
82
|
actions: LiveOntologyActions<Ontology["actionTypes"]>;
|
|
54
83
|
queryFunctions: LiveOntologyQueryFunctions<Ontology["queryFunctionTypes"]>;
|
|
55
84
|
attachments: LiveOntologyAttachments<Ontology>;
|
|
85
|
+
/** Explicit decryption of a top-level encrypted property handle. Ordinary queries never decrypt.
|
|
86
|
+
* A provider that only decrypts the property's current value may return a newer value than this
|
|
87
|
+
* handle; without identity evidence that response is never cached, even with cache:true.
|
|
88
|
+
*/
|
|
89
|
+
decrypt: LiveOntologyDecrypt;
|
|
56
90
|
outbox: OntologyOutbox;
|
|
91
|
+
readonly pins: LiveOntologyPins;
|
|
57
92
|
cleanup: () => Promise<void>;
|
|
58
|
-
destroy: () => Promise<void>;
|
|
59
93
|
}
|
|
60
|
-
|
|
94
|
+
interface LiveOntologySettings<Context extends Record<string, unknown>> {
|
|
61
95
|
id?: string;
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
96
|
+
live?: boolean;
|
|
97
|
+
/** Opt-in devtools trace history or a live-only diagnostic feed. */
|
|
98
|
+
traceRecording?: TraceRecordingMode;
|
|
99
|
+
demand?: DemandPolicy;
|
|
100
|
+
cache?: ReplicaOptions["cache"];
|
|
66
101
|
writes?: LiveOntologyWrites;
|
|
67
102
|
context?: Context;
|
|
68
|
-
|
|
103
|
+
authentication?: ConnectionMonitor;
|
|
104
|
+
label?: string;
|
|
105
|
+
/** Attach parent diagnostics, including for committed-only clients.
|
|
106
|
+
* The endpoint must permit internal diagnostics for this caller.
|
|
107
|
+
*/
|
|
108
|
+
parent?: {
|
|
109
|
+
readonly label?: string;
|
|
110
|
+
readonly location?: string;
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
interface BackendOntologyOptions<Context extends Record<string, unknown>> extends LiveOntologySettings<Context> {
|
|
114
|
+
ir: OntologyIR;
|
|
115
|
+
/** Borrow an acquired backend, or acquire one in the view's Scope with its Runtime. */
|
|
116
|
+
backend: OntologyBackendService | Effect.Effect<OntologyBackendService, BackendError, Scope.Scope | Runtime | Runtimes>;
|
|
117
|
+
client?: never;
|
|
118
|
+
ontology?: never;
|
|
119
|
+
}
|
|
120
|
+
interface ClientOntologyOptions<Context extends Record<string, unknown>> extends LiveOntologySettings<Context> {
|
|
121
|
+
/** Defaults to the authenticated server definition. Supply IR to verify it matches this client. */
|
|
122
|
+
ir?: OntologyIR;
|
|
123
|
+
client: OntologyServerClient | Effect.Effect<OntologyClient | OntologyServerClient, BackendError, Scope.Scope>;
|
|
124
|
+
/** Select a target on a shared server client; omission selects a single-ontology endpoint. */
|
|
125
|
+
ontology?: string;
|
|
126
|
+
backend?: never;
|
|
69
127
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
export
|
|
128
|
+
export type LiveOntologyOptions<Context extends Record<string, unknown> = Record<string, unknown>> = BackendOntologyOptions<Context> | ClientOntologyOptions<Context>;
|
|
129
|
+
export type CreateLiveOntologyOpts<Context extends Record<string, unknown> = Record<string, unknown>> = LiveOntologyOptions<Context> & {
|
|
130
|
+
runtime?: RuntimesLayer;
|
|
131
|
+
};
|
|
132
|
+
/** Generated factories supply their IR while preserving the backend/client choice. */
|
|
133
|
+
export type LiveOntologyFactoryOptions<Context extends Record<string, unknown> = Record<string, unknown>> = (Omit<BackendOntologyOptions<Context>, "ir"> | Omit<ClientOntologyOptions<Context>, "ir">) & {
|
|
134
|
+
runtime?: RuntimesLayer;
|
|
135
|
+
};
|
|
136
|
+
/** SDK acquisition materializes collections only for callers requesting a view. */
|
|
137
|
+
export declare const makeLiveOntology: <Ontology extends OntologyDefinition$1 = OntologyDefinition$1, Context extends Record<string, unknown> = Record<string, unknown>>(opts: LiveOntologyOptions<Context>) => Effect.Effect<LiveOntology<Ontology>, BackendError<"Conflict" | "Forbidden" | "HistoryExpired" | "Internal" | "InvalidConfiguration" | "InvalidRequest" | "InvalidResponse" | "NotFound" | "NotImplemented" | "RateLimited" | "ResultExpired" | "SchemaMismatch" | "SessionExpired" | "SessionReplaced" | "SourceMismatch" | "Unauthenticated" | "Unavailable" | "ValidationFailed" | "ViewReplaced"> | import("@party-stack/runtime").RuntimeAcquisitionError, Runtimes | Scope.Scope>;
|
|
138
|
+
/** UI/SDK boundary; the native service above owns all implementation and cleanup. */
|
|
139
|
+
export declare function createLiveOntology<Ontology extends OntologyDefinition$1 = OntologyDefinition$1, Context extends Record<string, unknown> = Record<string, unknown>>(opts: CreateLiveOntologyOpts<Context>): Promise<LiveOntology<Ontology>>;
|
|
76
140
|
//#endregion
|
|
77
|
-
export type { LiveOntologyAction, LiveOntologyActionOptions, LiveOntologyAttachments, OntologyCollection };
|
|
141
|
+
export type { LiveOntologyAction, LiveOntologyActionOptions, LiveOntologyAttachments, OntologyCollection, OntologyDefinition, PinGraph, PinOptions, PinStatus };
|
|
78
142
|
//# sourceMappingURL=LiveOntology.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LiveOntology.d.ts","names":[],"sources":["../../src/live/LiveOntology.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"LiveOntology.d.ts","names":["OntologyDefinition","PinStatus","PinOptions"],"sources":["../../src/live/LiveOntology.ts"],"mappings":";;;;;;;;;;;;;;;;;YAmCY;YAEA;YAEA,4BAA4B,YAAY;iBAEnC;EACb,oBAAoB;EACpB,WAAW;EACX,SAAS;;KAGR,gBAAgB,iBAAiBA,wBAAsB;EACxD,eAAe,gBAAgB;IAE7B,UACA;YAEM,0BACR,mBAAmB,0BAA0B,yBAC7C,qBACC,YAAY,eAAe,QAAQ;YAE5B,oBACR,oBAAoBA,sCAAoCA,mDAE9C,wBAAwB,cAAc,mBAAmB,YAAY;YAGvE,oBAAoB,oBAAoBA,0CAC/C,wBAAwB,cAAc,mBACnC,YAAY,+BACZ,YAAY;EAA0B,kBAAkB;IAAW,kBACnE,YAAY;EAA0B,uBAAuB,cAAc;IACrE,QACA,YAAY;YAId,2BAA2B,2BAA2BA,iDAEzD,+BAA+B,qBAAqB,0BACjD,mBAAmB,sCACnB,mBAAmB;iBAId;WACJ;WACA;WACA;WACA,SAAS;WACT,SAAS;WACT,SAAS;;iBAGL;;;;;WAKJ;WACA,SAAS;;YAEV,uBAAuB,GAAG,OAAO,UAAU,IAAI,UAAU,mBAAmB,QAAQ;iBAE/E,yBAAyB;;EAEtC,OAAO,QAAQC;;;;;EAKf,IAAI,OAAO,eAAe,UAAUC,eAAa;EACjD,MAAM,gBAAgB;;;;EAItB,UACI,WAAW,QAAQD,kCACnB,WAAW;;iBAIF,aAAa,iBAAiBD,uBAAqBA;;;;WAIvD,UAAU;WACV,IAAI;WACJ,SAAS,gBAAgB;;WAEzB,SAAS,oBAAoB;;WAE7B,eAAe,oBAAoB;EAC5C,SAAS;EACT,cAAc;WACL,SAAS;EAClB,SAAS,oBAAoB;EAC7B,gBAAgB,2BAA2B;EAC3C,aAAa,wBAAwB;;;;;EAKrC,SAAS;EACT,QAAQ;WACC,MAAM;EACf,eAAe;;UAGT,qBAAqB,gBAAgB;EAC3C;EACA;;EAEA,iBAAiB;EACjB,SAAS;EACT,QAAQ;EACR,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB;;;;EAIA;aAAoB;aAAyB;;;UAGvC,uBACN,gBAAgB,iCACV,qBAAqB;EAC3B,IAAI;;EAEJ,SACM,yBACA,OAAO,OAAO,wBAAwB,cAAc,MAAM,QAAQ,UAAU;EAClF;EACA;;UAEM,sBACN,gBAAgB,iCACV,qBAAqB;;EAE3B,KAAK;EACL,QACM,uBACA,OAAO,OAAO,iBAAiB,sBAAsB,cAAc,MAAM;;EAE/E;EACA;;YAEQ,oBAAoB,gBAAgB,0BAA0B,2BACpE,uBAAuB,WACvB,sBAAsB;YAEhB,uBAAuB,gBAAgB,0BAA0B,2BACzE,oBAAoB;EAAa,UAAU;;;YAGnC,2BAA2B,gBAAgB,0BAA0B,4BAC3E,KAAK,uBAAuB,kBAC5B,KAAK,sBAAsB;EAC3B,UAAU;;;qBAGH,mBACT,iBAAiBA,uBAAkBA,sBACnC,gBAAgB,0BAAuB,yBAAA,MAAA,oBAAA,aAAA,OAAA,OAAA,aAAA,WAAA,iYAAA,yBAAA,WAAA,MAAA;;wBAOrB,mBAClB,iBAAiBA,uBAAqBA,sBACtC,gBAAgB,0BAA0B,yBAC5C,MAAM,uBAAuB,WAAW,QAAQ,aAAa"}
|
package/lib/live/LiveOntology.js
CHANGED
|
@@ -1,109 +1,29 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { unsupportedOntologyAttachmentsAdapter } from "./attachments/unsupportedOntologyAttachmentsAdapter.js";
|
|
5
|
-
import { createLiveOntologyObjectCollection } from "./objects/createLiveOntologyObjectCollection.js";
|
|
6
|
-
import { waitForCollectionsReady } from "./waitForCollectionReady.js";
|
|
7
|
-
import { createBlobManager } from "@party-stack/blobs";
|
|
8
|
-
import { createDefaultRuntime } from "@party-stack/runtime";
|
|
1
|
+
import { makeOntologyResource } from "../runtime/resource.js";
|
|
2
|
+
import { MemoryRuntime, Runtimes } from "@party-stack/runtime";
|
|
3
|
+
import { Effect, Exit, Layer, Scope } from "effect";
|
|
9
4
|
//#region src/live/LiveOntology.ts
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
* Starts on-demand object collection sync without loading subsets.
|
|
16
|
-
*/
|
|
17
|
-
async function waitForLiveOntologyReady(ontology) {
|
|
18
|
-
await ontology.ready;
|
|
19
|
-
await waitForCollectionsReady(Object.values(ontology.objects));
|
|
20
|
-
}
|
|
5
|
+
/** SDK acquisition materializes collections only for callers requesting a view. */
|
|
6
|
+
const makeLiveOntology = Effect.fn("Ontology.make")(function* (opts) {
|
|
7
|
+
return yield* (yield* makeOntologyResource(opts)).view;
|
|
8
|
+
});
|
|
9
|
+
/** UI/SDK boundary; the native service above owns all implementation and cleanup. */
|
|
21
10
|
async function createLiveOntology(opts) {
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
"size",
|
|
37
|
-
"type",
|
|
38
|
-
"name"
|
|
39
|
-
]) : void 0
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
const attachments = createLiveOntologyAttachments({
|
|
43
|
-
ir: opts.ir,
|
|
44
|
-
attachmentsAdapter,
|
|
45
|
-
blobManager
|
|
46
|
-
});
|
|
47
|
-
const objects = Object.fromEntries(opts.ir.objectTypes.map((objectType) => [objectType.name, createLiveOntologyObjectCollection({
|
|
48
|
-
ir: opts.ir,
|
|
49
|
-
objectType,
|
|
50
|
-
backendAdapter,
|
|
51
|
-
runtime,
|
|
52
|
-
persistObjects: opts.persistObjects ?? false
|
|
53
|
-
})]));
|
|
54
|
-
const actionsSubsystem = createLiveOntologyActions({
|
|
55
|
-
ir: opts.ir,
|
|
56
|
-
backendAdapter,
|
|
57
|
-
runtime,
|
|
58
|
-
context,
|
|
59
|
-
objects,
|
|
60
|
-
blobManager,
|
|
61
|
-
writes: opts.writes,
|
|
62
|
-
connection: opts.connection
|
|
63
|
-
});
|
|
64
|
-
const queryFunctions = Object.fromEntries(opts.ir.queryFunctionTypes.map((queryFunctionType) => [queryFunctionType.name, (parameters) => backendAdapter.runQueryFunction(queryFunctionType.name, parameters, {
|
|
65
|
-
objects,
|
|
66
|
-
context
|
|
67
|
-
})]));
|
|
68
|
-
const ready = Promise.all([actionsSubsystem.outbox.ready, blobManager.ready]).then(() => void 0);
|
|
69
|
-
ready.catch(() => void 0);
|
|
70
|
-
let cleanupPromise;
|
|
71
|
-
const cleanup = () => {
|
|
72
|
-
cleanupPromise ??= (async () => {
|
|
73
|
-
await Promise.allSettled([ready]);
|
|
74
|
-
await actionsSubsystem.outbox.cleanup();
|
|
75
|
-
await Promise.all(Object.values(objects).map(async (collection) => {
|
|
76
|
-
const status = collection.status;
|
|
77
|
-
if (status === "cleaned-up") return;
|
|
78
|
-
if (status === "loading") await Promise.allSettled([collection.preload()]);
|
|
79
|
-
try {
|
|
80
|
-
await collection.cleanup();
|
|
81
|
-
} catch {}
|
|
82
|
-
}));
|
|
83
|
-
await Promise.all([blobManager.cleanup(), backendAdapter.cleanup?.()]);
|
|
84
|
-
await runtime.cleanup?.();
|
|
85
|
-
})();
|
|
86
|
-
return cleanupPromise;
|
|
87
|
-
};
|
|
88
|
-
let destroyPromise;
|
|
89
|
-
const destroy = () => {
|
|
90
|
-
destroyPromise ??= cleanup().then(() => runtime.destroy?.()).then(() => void 0);
|
|
91
|
-
return destroyPromise;
|
|
92
|
-
};
|
|
93
|
-
return {
|
|
94
|
-
ir: opts.ir,
|
|
95
|
-
context,
|
|
96
|
-
ready,
|
|
97
|
-
objects,
|
|
98
|
-
actions: actionsSubsystem.actions,
|
|
99
|
-
queryFunctions,
|
|
100
|
-
attachments,
|
|
101
|
-
outbox: actionsSubsystem.outbox,
|
|
102
|
-
destroy,
|
|
103
|
-
cleanup
|
|
104
|
-
};
|
|
11
|
+
const scope = Effect.runSync(Scope.make());
|
|
12
|
+
try {
|
|
13
|
+
const context = await Effect.runPromise(Layer.buildWithScope(opts.runtime ?? Runtimes.layer(MemoryRuntime.layer), scope));
|
|
14
|
+
const live = await Effect.runPromise(Scope.provide(makeLiveOntology(opts).pipe(Effect.provideContext(context)), scope));
|
|
15
|
+
let closing;
|
|
16
|
+
const cleanup = () => closing ??= Effect.runPromise(Scope.close(scope, Exit.void));
|
|
17
|
+
return {
|
|
18
|
+
...live,
|
|
19
|
+
cleanup
|
|
20
|
+
};
|
|
21
|
+
} catch (cause) {
|
|
22
|
+
await Effect.runPromise(Scope.close(scope, Exit.fail(cause)));
|
|
23
|
+
throw cause;
|
|
24
|
+
}
|
|
105
25
|
}
|
|
106
26
|
//#endregion
|
|
107
|
-
export { createLiveOntology,
|
|
27
|
+
export { createLiveOntology, makeLiveOntology };
|
|
108
28
|
|
|
109
29
|
//# sourceMappingURL=LiveOntology.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LiveOntology.js","names":[],"sources":["../../src/live/LiveOntology.ts"],"sourcesContent":["import { createBlobManager, type BlobManager } from \"@party-stack/blobs\";\nimport { createDefaultRuntime, type RuntimeAdapterProvider } from \"@party-stack/runtime\";\nimport { type Collection } from \"@tanstack/db\";\nimport { provide } from \"../utils/provide.js\";\nimport { createLiveOntologyActions } from \"./actions/createLiveOntologyActions.js\";\nimport {\n createLiveOntologyAttachments,\n type LiveOntologyAttachments,\n} from \"./attachments/createLiveOntologyAttachments.js\";\nimport { unsupportedOntologyAttachmentsAdapter } from \"./attachments/unsupportedOntologyAttachmentsAdapter.js\";\nimport { createLiveOntologyObjectCollection } from \"./objects/createLiveOntologyObjectCollection.js\";\nimport { waitForCollectionsReady } from \"./waitForCollectionReady.js\";\nimport type { OntologyIR } from \"../ir/index.js\";\nimport type { attachment } from \"../utils/values.js\";\nimport type { LiveOntologyAction } from \"./actions/createLiveOntologyAction.js\";\nimport type { OntologyMutatorRegistry } from \"./mutators/types.js\";\nimport type { OntologyCollection } from \"./objects/createLiveOntologyObjectCollection.js\";\nimport type { OntologyObject } from \"./objects/OntologyObject.js\";\nimport type { OntologyBackendAdapter, OntologyBackendAdapterProvider } from \"./OntologyBackendAdapter.js\";\nimport type { OntologyOutbox } from \"./outbox/types.js\";\nimport type { ConnectionMonitor } from \"@party-stack/connections\";\n\nexport type { LiveOntologyAction, LiveOntologyActionOptions } from \"./actions/createLiveOntologyAction.js\";\nexport type { LiveOntologyAttachments } from \"./attachments/createLiveOntologyAttachments.js\";\nexport type { OntologyCollection } from \"./objects/createLiveOntologyObjectCollection.js\";\n\nexport type LiveOntologyWriteMode = \"direct\" | \"outbox\";\n\nexport type LiveOntologyWriteVisibility = \"confirmed\" | \"optimistic\";\n\nexport type LiveOntologyOutboxFailureStrategy = \"pause\" | \"discard-all\";\n\nexport interface LiveOntologyOutboxOptions {\n failureStrategy?: LiveOntologyOutboxFailureStrategy;\n maxRetries?: number;\n}\n\nexport interface LiveOntologyWrites {\n defaultMode?: LiveOntologyWriteMode;\n defaultVisibility?: LiveOntologyWriteVisibility;\n mutators?: OntologyMutatorRegistry;\n outbox?: LiveOntologyOutboxOptions;\n}\n\nexport interface OntologyDefinition {\n context?: Record<string, unknown>;\n objectTypes: Record<string, OntologyObject>;\n actionTypes: Record<\n string,\n {\n parameters: Record<string, unknown>;\n }\n >;\n queryFunctionTypes: Record<\n string,\n {\n parameters: Record<string, unknown>;\n returnType: unknown;\n }\n >;\n}\n\ntype OntologyContext<Ontology extends OntologyDefinition> = Ontology extends {\n context: infer Context extends Record<string, unknown>;\n}\n ? Context\n : Record<string, unknown>;\n\nexport type LiveOntologyQueryFunction<\n Parameters extends Record<string, unknown> = Record<string, unknown>,\n Return = unknown,\n> = (parameters: Parameters) => Promise<Return>;\n\nexport type LiveOntologyObjects<\n ObjectTypes extends OntologyDefinition[\"objectTypes\"] = OntologyDefinition[\"objectTypes\"],\n> = {\n [ObjectTypeName in keyof ObjectTypes]: OntologyCollection<ObjectTypes[ObjectTypeName]>;\n};\n\nexport type LiveOntologyActions<ActionTypes extends OntologyDefinition[\"actionTypes\"]> = {\n [ActionTypeName in keyof ActionTypes]: LiveOntologyAction<ActionTypes[ActionTypeName][\"parameters\"]>;\n};\n\nexport type LiveOntologyQueryFunctions<QueryFunctionTypes extends OntologyDefinition[\"queryFunctionTypes\"]> =\n {\n [QueryFunctionTypeName in keyof QueryFunctionTypes]: LiveOntologyQueryFunction<\n QueryFunctionTypes[QueryFunctionTypeName][\"parameters\"],\n QueryFunctionTypes[QueryFunctionTypeName][\"returnType\"]\n >;\n };\n\nexport interface LiveOntology<Ontology extends OntologyDefinition = OntologyDefinition> {\n readonly ir: OntologyIR;\n readonly context: OntologyContext<Ontology>;\n /**\n * Resolves once outbox and blob metadata subsystems have finished starting.\n * Object collections remain on-demand unless explicitly preloaded.\n */\n readonly ready: Promise<void>;\n objects: LiveOntologyObjects<Ontology[\"objectTypes\"]>;\n actions: LiveOntologyActions<Ontology[\"actionTypes\"]>;\n queryFunctions: LiveOntologyQueryFunctions<Ontology[\"queryFunctionTypes\"]>;\n attachments: LiveOntologyAttachments<Ontology>;\n outbox: OntologyOutbox;\n cleanup: () => Promise<void>;\n destroy: () => Promise<void>;\n}\n\nexport interface CreateLiveOntologyOpts<Context extends Record<string, unknown> = Record<string, unknown>> {\n id?: string;\n ir: OntologyIR;\n backend: OntologyBackendAdapterProvider<NoInfer<Context>>;\n runtime?: RuntimeAdapterProvider;\n persistObjects?: boolean;\n writes?: LiveOntologyWrites;\n context?: Context;\n connection?: ConnectionMonitor;\n}\n\nfunction getContextUserId(context: Record<string, unknown>): string | undefined {\n return typeof context.user === \"string\" ? context.user : undefined;\n}\n\n/**\n * Waits for LiveOntology subsystems required before safe use.\n * Starts on-demand object collection sync without loading subsets.\n */\nexport async function waitForLiveOntologyReady(ontology: LiveOntology): Promise<void> {\n await ontology.ready;\n await waitForCollectionsReady(\n Object.values(ontology.objects) as Collection<Record<string, unknown>, string | number>[]\n );\n}\n\nexport async function createLiveOntology<\n Ontology extends OntologyDefinition = OntologyDefinition,\n Context extends Record<string, unknown> = Record<string, unknown>,\n>(opts: CreateLiveOntologyOpts<Context>): Promise<LiveOntology<Ontology>> {\n const ontologyId = opts.id ?? \"default\";\n const context = (opts.context ?? {}) as Context;\n const owner = getContextUserId(context) ?? \"anonymous\";\n // TODO(errors): Decorate backend operations and collection options so\n // normalized errors (especially UnauthenticatedError) are reported through\n // the ConnectionMonitor. Promise-based calls can be wrapped directly;\n // long-running sync handlers need a lifecycle-aware supervisor that pauses\n // on needs-auth and restarts from a checkpoint after reconnection.\n const backendAdapter: OntologyBackendAdapter = await provide(opts.backend, opts.ir, context);\n const runtime = await provide(opts.runtime ?? createDefaultRuntime, owner, ontologyId);\n const attachmentsAdapter = backendAdapter.attachments ?? unsupportedOntologyAttachmentsAdapter;\n const blobManager: BlobManager = createBlobManager({\n runtime,\n remote: {\n read: (id, readOptions) => {\n const attachmentValue = readOptions?.meta?.attachment as attachment | undefined;\n return attachmentsAdapter.getAttachmentContent(attachmentValue ?? { id });\n },\n metadata: attachmentsAdapter.getAttachmentMetadata\n ? (id, readOptions) =>\n attachmentsAdapter.getAttachmentMetadata!(\n (readOptions?.meta?.attachment as attachment | undefined) ?? { id },\n readOptions?.select ?? [\"size\", \"type\", \"name\"]\n )\n : undefined,\n },\n });\n const attachments = createLiveOntologyAttachments<Ontology>({\n ir: opts.ir,\n attachmentsAdapter,\n blobManager,\n });\n const objects = Object.fromEntries(\n opts.ir.objectTypes.map((objectType) => [\n objectType.name,\n createLiveOntologyObjectCollection({\n ir: opts.ir,\n objectType,\n backendAdapter,\n runtime,\n persistObjects: opts.persistObjects ?? false,\n }),\n ])\n ) as Record<string, OntologyCollection<OntologyObject>>;\n const actionsSubsystem = createLiveOntologyActions({\n ir: opts.ir,\n backendAdapter,\n runtime,\n context,\n objects,\n blobManager,\n writes: opts.writes,\n connection: opts.connection,\n });\n const queryFunctions = Object.fromEntries(\n opts.ir.queryFunctionTypes.map((queryFunctionType) => [\n queryFunctionType.name,\n (parameters: Record<string, unknown>) =>\n backendAdapter.runQueryFunction(queryFunctionType.name, parameters, {\n objects: objects,\n context,\n }),\n ])\n );\n const ready = Promise.all([actionsSubsystem.outbox.ready, blobManager.ready]).then(() => undefined);\n void ready.catch(() => undefined);\n\n let cleanupPromise: Promise<void> | undefined;\n const cleanup = (): Promise<void> => {\n cleanupPromise ??= (async () => {\n // Settle subsystem startups before tearing down persistence.\n await Promise.allSettled([ready]);\n await actionsSubsystem.outbox.cleanup();\n await Promise.all(\n Object.values(objects).map(async (collection) => {\n const status = collection.status;\n if (status === \"cleaned-up\") {\n return;\n }\n // Settle in-flight startup only; ready/idle need no preload.\n if (status === \"loading\") {\n await Promise.allSettled([collection.preload()]);\n }\n try {\n await collection.cleanup();\n } catch {\n // Idempotent: already cleaned up during preload race.\n }\n })\n );\n await Promise.all([blobManager.cleanup(), backendAdapter.cleanup?.()]);\n await runtime.cleanup?.();\n })();\n return cleanupPromise;\n };\n let destroyPromise: Promise<void> | undefined;\n const destroy = (): Promise<void> => {\n destroyPromise ??= cleanup()\n .then(() => runtime.destroy?.())\n .then(() => undefined);\n return destroyPromise;\n };\n\n return {\n ir: opts.ir,\n context: context as unknown as OntologyContext<Ontology>,\n ready,\n objects: objects as unknown as LiveOntologyObjects<Ontology[\"objectTypes\"]>,\n actions: actionsSubsystem.actions as unknown as LiveOntologyActions<Ontology[\"actionTypes\"]>,\n queryFunctions: queryFunctions as unknown as LiveOntologyQueryFunctions<\n Ontology[\"queryFunctionTypes\"]\n >,\n attachments,\n outbox: actionsSubsystem.outbox,\n destroy,\n cleanup,\n };\n}\n"],"mappings":";;;;;;;;;AAuHA,SAAS,iBAAiB,SAAsD;CAC5E,OAAO,OAAO,QAAQ,SAAS,WAAW,QAAQ,OAAO,KAAA;AAC7D;;;;;AAMA,eAAsB,yBAAyB,UAAuC;CAClF,MAAM,SAAS;CACf,MAAM,wBACF,OAAO,OAAO,SAAS,OAAO,CAClC;AACJ;AAEA,eAAsB,mBAGpB,MAAwE;CACtE,MAAM,aAAa,KAAK,MAAM;CAC9B,MAAM,UAAW,KAAK,WAAW,CAAC;CAClC,MAAM,QAAQ,iBAAiB,OAAO,KAAK;CAM3C,MAAM,iBAAyC,MAAM,QAAQ,KAAK,SAAS,KAAK,IAAI,OAAO;CAC3F,MAAM,UAAU,MAAM,QAAQ,KAAK,WAAW,sBAAsB,OAAO,UAAU;CACrF,MAAM,qBAAqB,eAAe,eAAe;CACzD,MAAM,cAA2B,kBAAkB;EAC/C;EACA,QAAQ;GACJ,OAAO,IAAI,gBAAgB;IACvB,MAAM,kBAAkB,aAAa,MAAM;IAC3C,OAAO,mBAAmB,qBAAqB,mBAAmB,EAAE,GAAG,CAAC;GAC5E;GACA,UAAU,mBAAmB,yBACtB,IAAI,gBACD,mBAAmB,sBACd,aAAa,MAAM,cAAyC,EAAE,GAAG,GAClE,aAAa,UAAU;IAAC;IAAQ;IAAQ;GAAM,CAClD,IACJ,KAAA;EACV;CACJ,CAAC;CACD,MAAM,cAAc,8BAAwC;EACxD,IAAI,KAAK;EACT;EACA;CACJ,CAAC;CACD,MAAM,UAAU,OAAO,YACnB,KAAK,GAAG,YAAY,KAAK,eAAe,CACpC,WAAW,MACX,mCAAmC;EAC/B,IAAI,KAAK;EACT;EACA;EACA;EACA,gBAAgB,KAAK,kBAAkB;CAC3C,CAAC,CACL,CAAC,CACL;CACA,MAAM,mBAAmB,0BAA0B;EAC/C,IAAI,KAAK;EACT;EACA;EACA;EACA;EACA;EACA,QAAQ,KAAK;EACb,YAAY,KAAK;CACrB,CAAC;CACD,MAAM,iBAAiB,OAAO,YAC1B,KAAK,GAAG,mBAAmB,KAAK,sBAAsB,CAClD,kBAAkB,OACjB,eACG,eAAe,iBAAiB,kBAAkB,MAAM,YAAY;EACvD;EACT;CACJ,CAAC,CACT,CAAC,CACL;CACA,MAAM,QAAQ,QAAQ,IAAI,CAAC,iBAAiB,OAAO,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,WAAW,KAAA,CAAS;CAClG,MAAW,YAAY,KAAA,CAAS;CAEhC,IAAI;CACJ,MAAM,gBAA+B;EACjC,oBAAoB,YAAY;GAE5B,MAAM,QAAQ,WAAW,CAAC,KAAK,CAAC;GAChC,MAAM,iBAAiB,OAAO,QAAQ;GACtC,MAAM,QAAQ,IACV,OAAO,OAAO,OAAO,CAAC,CAAC,IAAI,OAAO,eAAe;IAC7C,MAAM,SAAS,WAAW;IAC1B,IAAI,WAAW,cACX;IAGJ,IAAI,WAAW,WACX,MAAM,QAAQ,WAAW,CAAC,WAAW,QAAQ,CAAC,CAAC;IAEnD,IAAI;KACA,MAAM,WAAW,QAAQ;IAC7B,QAAQ,CAER;GACJ,CAAC,CACL;GACA,MAAM,QAAQ,IAAI,CAAC,YAAY,QAAQ,GAAG,eAAe,UAAU,CAAC,CAAC;GACrE,MAAM,QAAQ,UAAU;EAC5B,EAAA,CAAG;EACH,OAAO;CACX;CACA,IAAI;CACJ,MAAM,gBAA+B;EACjC,mBAAmB,QAAQ,CAAC,CACvB,WAAW,QAAQ,UAAU,CAAC,CAAC,CAC/B,WAAW,KAAA,CAAS;EACzB,OAAO;CACX;CAEA,OAAO;EACH,IAAI,KAAK;EACA;EACT;EACS;EACT,SAAS,iBAAiB;EACV;EAGhB;EACA,QAAQ,iBAAiB;EACzB;EACA;CACJ;AACJ"}
|
|
1
|
+
{"version":3,"file":"LiveOntology.js","names":[],"sources":["../../src/live/LiveOntology.ts"],"sourcesContent":["import type { ReplicaService } from \"@party-stack/ontology-replica\";\nimport type {\n ReplicaConfiguration,\n ReplicaOptions,\n DemandPolicy,\n ReplicaMonitor,\n PinOptions,\n PinStatus,\n} from \"@party-stack/ontology-replica\";\nimport type { OntologyDefinition } from \"@party-stack/ontology-spec\";\nimport type { Encrypted } from \"@party-stack/ontology-spec/values\";\nimport type { TraceStore, TraceRecordingMode } from \"@party-stack/runtime/tracing\";\nimport type { DbClient } from \"@tanstack/db\";\nexport type { OntologyDefinition } from \"@party-stack/ontology-spec\";\nexport type { PinOptions, PinStatus, PinGraph } from \"@party-stack/ontology-replica\";\nimport { MemoryRuntime, Runtimes, type RuntimesLayer } from \"@party-stack/runtime\";\nimport { Effect, Exit, Scope, Layer } from \"effect\";\nimport { makeOntologyResource } from \"../runtime/resource.js\";\nimport type { LiveOntologyAction } from \"./actions/createLiveOntologyAction.js\";\nimport type { LiveOntologyAttachments } from \"./attachments/createLiveOntologyAttachments.js\";\nimport type { OntologyMutatorRegistry } from \"./mutators/types.js\";\nimport type { OntologyCollection } from \"./objects/types.js\";\nimport type { OntologyOutbox } from \"./outbox/types.js\";\nimport type { OntologyPins } from \"./pins.js\";\nimport type { ConnectionMonitor } from \"@party-stack/connect\";\nimport type { OntologyBackendService } from \"@party-stack/ontology-backend\";\nimport type { BackendError } from \"@party-stack/ontology-backend\";\nimport type { OntologyClient, OntologyServerClient } from \"@party-stack/ontology-server/rpc\";\nimport type { OntologyIR, QueryDocument } from \"@party-stack/ontology-spec\";\nimport type { Runtime } from \"@party-stack/runtime\";\n\nexport type { LiveOntologyAction, LiveOntologyActionOptions } from \"./actions/createLiveOntologyAction.js\";\nexport type { LiveOntologyAttachments } from \"./attachments/createLiveOntologyAttachments.js\";\nexport type { OntologyCollection } from \"./objects/types.js\";\n\nexport type LiveOntologyWriteVisibility = \"confirmed\" | \"optimistic\";\n\nexport type LiveOntologyOutboxFailureStrategy = \"pause\" | \"discard-all\";\n\nexport type LiveOntologyOutboxOptions = NonNullable<ReplicaConfiguration[\"outbox\"]>;\n\nexport interface LiveOntologyWrites {\n defaultVisibility?: LiveOntologyWriteVisibility;\n mutators?: OntologyMutatorRegistry;\n outbox?: LiveOntologyOutboxOptions;\n}\n\ntype OntologyContext<Ontology extends OntologyDefinition> = Ontology extends {\n context: infer Context extends Record<string, unknown>;\n}\n ? Context\n : Record<string, unknown>;\n\nexport type LiveOntologyQueryFunction<\n Parameters extends Record<string, unknown> = Record<string, unknown>,\n Return = unknown,\n> = (parameters: Parameters) => Promise<Return>;\n\nexport type LiveOntologyObjects<\n ObjectTypes extends OntologyDefinition[\"objectTypes\"] = OntologyDefinition[\"objectTypes\"],\n> = {\n readonly [ObjectTypeName in keyof ObjectTypes]: OntologyCollection<ObjectTypes[ObjectTypeName]>;\n};\n\nexport type LiveOntologyActions<ActionTypes extends OntologyDefinition[\"actionTypes\"]> = {\n [ActionTypeName in keyof ActionTypes]: LiveOntologyAction<\n ActionTypes[ActionTypeName][\"parameters\"],\n ActionTypes[ActionTypeName] extends { returnType: infer Return } ? Return : unknown,\n ActionTypes[ActionTypeName] extends { inputParameters: infer Input extends Record<string, unknown> }\n ? Input\n : ActionTypes[ActionTypeName][\"parameters\"]\n >;\n};\n\nexport type LiveOntologyQueryFunctions<QueryFunctionTypes extends OntologyDefinition[\"queryFunctionTypes\"]> =\n {\n [QueryFunctionTypeName in keyof QueryFunctionTypes]: LiveOntologyQueryFunction<\n QueryFunctionTypes[QueryFunctionTypeName][\"parameters\"],\n QueryFunctionTypes[QueryFunctionTypeName][\"returnType\"]\n >;\n };\n\nexport interface OntologyDiagnostics {\n readonly label?: string;\n readonly role?: \"host\" | \"replica\";\n readonly location?: string;\n readonly replica: ReplicaMonitor;\n readonly traces?: TraceStore;\n readonly parent?: OntologyDiagnostics;\n}\n\nexport interface DecryptOptions {\n /** Default false: bypass the persistent decrypted-value cache. True permits a device-encrypted\n * copy when the response is bound to this ciphertext (see the documented Foundry assumption).\n * Cached device copies are removed with their replica rows.\n */\n readonly cache?: boolean;\n readonly signal?: AbortSignal;\n}\nexport type LiveOntologyDecrypt = <A>(value: Encrypted<A>, options?: DecryptOptions) => Promise<A>;\n\nexport interface LiveOntologyPins extends OntologyPins {\n /** The application's current offline graph, including its readiness. */\n get(): Promise<PinStatus | undefined>;\n /** Replace the offline graph, retaining the previous graph until the replacement is ready.\n * Server-backed clients target the parent's persistent replica, including from a memory tab.\n * Standalone clients target their own replica. Attachments default to \"none\".\n */\n set(query: QueryDocument, options?: PinOptions): Promise<void>;\n clear(name?: string): Promise<void>;\n /** Receives the current pin and subsequent updates. Unsubscribe releases its stream.\n * Native pin failures appear on status.error; transport failures call onError.\n */\n subscribe(\n listener: (status: PinStatus | undefined) => void,\n onError?: (cause: unknown) => void\n ): () => void;\n}\n\nexport interface LiveOntology<Ontology extends OntologyDefinition = OntologyDefinition> {\n /** Scoped source-collection and query-identity owner. Supply to React's DbProvider or query options.\n * The current TanStack release does not register browser hook queries for client cleanup.\n */\n readonly dbClient: DbClient;\n readonly ir: OntologyIR;\n readonly context: OntologyContext<Ontology>;\n /** Lazy typed collections. Consuming queries acquire upstream subset demand. */\n readonly objects: LiveOntologyObjects<Ontology[\"objectTypes\"]>;\n /** Lazy cache inspection. These collections retain/observe local visible rows without upstream demand. */\n readonly cachedObjects: LiveOntologyObjects<Ontology[\"objectTypes\"]>;\n traces?: TraceStore;\n diagnostics?: OntologyDiagnostics;\n readonly replica: ReplicaService;\n actions: LiveOntologyActions<Ontology[\"actionTypes\"]>;\n queryFunctions: LiveOntologyQueryFunctions<Ontology[\"queryFunctionTypes\"]>;\n attachments: LiveOntologyAttachments<Ontology>;\n /** Explicit decryption of a top-level encrypted property handle. Ordinary queries never decrypt.\n * A provider that only decrypts the property's current value may return a newer value than this\n * handle; without identity evidence that response is never cached, even with cache:true.\n */\n decrypt: LiveOntologyDecrypt;\n outbox: OntologyOutbox;\n readonly pins: LiveOntologyPins;\n cleanup: () => Promise<void>;\n}\n\ninterface LiveOntologySettings<Context extends Record<string, unknown>> {\n id?: string;\n live?: boolean;\n /** Opt-in devtools trace history or a live-only diagnostic feed. */\n traceRecording?: TraceRecordingMode;\n demand?: DemandPolicy;\n cache?: ReplicaOptions[\"cache\"];\n writes?: LiveOntologyWrites;\n context?: Context;\n authentication?: ConnectionMonitor;\n label?: string;\n /** Attach parent diagnostics, including for committed-only clients.\n * The endpoint must permit internal diagnostics for this caller.\n */\n parent?: { readonly label?: string; readonly location?: string };\n}\n\ninterface BackendOntologyOptions<\n Context extends Record<string, unknown>,\n> extends LiveOntologySettings<Context> {\n ir: OntologyIR;\n /** Borrow an acquired backend, or acquire one in the view's Scope with its Runtime. */\n backend:\n | OntologyBackendService\n | Effect.Effect<OntologyBackendService, BackendError, Scope.Scope | Runtime | Runtimes>;\n client?: never;\n ontology?: never;\n}\ninterface ClientOntologyOptions<\n Context extends Record<string, unknown>,\n> extends LiveOntologySettings<Context> {\n /** Defaults to the authenticated server definition. Supply IR to verify it matches this client. */\n ir?: OntologyIR;\n client:\n | OntologyServerClient\n | Effect.Effect<OntologyClient | OntologyServerClient, BackendError, Scope.Scope>;\n /** Select a target on a shared server client; omission selects a single-ontology endpoint. */\n ontology?: string;\n backend?: never;\n}\nexport type LiveOntologyOptions<Context extends Record<string, unknown> = Record<string, unknown>> =\n | BackendOntologyOptions<Context>\n | ClientOntologyOptions<Context>;\n\nexport type CreateLiveOntologyOpts<Context extends Record<string, unknown> = Record<string, unknown>> =\n LiveOntologyOptions<Context> & { runtime?: RuntimesLayer };\n\n/** Generated factories supply their IR while preserving the backend/client choice. */\nexport type LiveOntologyFactoryOptions<Context extends Record<string, unknown> = Record<string, unknown>> = (\n | Omit<BackendOntologyOptions<Context>, \"ir\">\n | Omit<ClientOntologyOptions<Context>, \"ir\">\n) & { runtime?: RuntimesLayer };\n\n/** SDK acquisition materializes collections only for callers requesting a view. */\nexport const makeLiveOntology = Effect.fn(\"Ontology.make\")(function* <\n Ontology extends OntologyDefinition = OntologyDefinition,\n Context extends Record<string, unknown> = Record<string, unknown>,\n>(opts: LiveOntologyOptions<Context>) {\n const resource = yield* makeOntologyResource<Ontology, Context>(opts);\n return yield* resource.view;\n});\n\n/** UI/SDK boundary; the native service above owns all implementation and cleanup. */\nexport async function createLiveOntology<\n Ontology extends OntologyDefinition = OntologyDefinition,\n Context extends Record<string, unknown> = Record<string, unknown>,\n>(opts: CreateLiveOntologyOpts<Context>): Promise<LiveOntology<Ontology>> {\n const scope = Effect.runSync(Scope.make());\n try {\n const context = await Effect.runPromise(\n Layer.buildWithScope(opts.runtime ?? Runtimes.layer(MemoryRuntime.layer), scope)\n );\n const live = await Effect.runPromise(\n Scope.provide(\n makeLiveOntology<Ontology, Context>(opts).pipe(Effect.provideContext(context)),\n scope\n )\n );\n let closing: Promise<void> | undefined;\n const cleanup = () => (closing ??= Effect.runPromise(Scope.close(scope, Exit.void)));\n return {\n ...live,\n cleanup,\n };\n } catch (cause) {\n await Effect.runPromise(Scope.close(scope, Exit.fail(cause)));\n throw cause;\n }\n}\n"],"mappings":";;;;;AAwMA,MAAa,mBAAmB,OAAO,GAAG,eAAe,CAAC,CAAC,WAGzD,MAAoC;CAElC,OAAO,QAAO,OADU,qBAAwC,IAAI,EAAA,CAC7C;AAC3B,CAAC;;AAGD,eAAsB,mBAGpB,MAAwE;CACtE,MAAM,QAAQ,OAAO,QAAQ,MAAM,KAAK,CAAC;CACzC,IAAI;EACA,MAAM,UAAU,MAAM,OAAO,WACzB,MAAM,eAAe,KAAK,WAAW,SAAS,MAAM,cAAc,KAAK,GAAG,KAAK,CACnF;EACA,MAAM,OAAO,MAAM,OAAO,WACtB,MAAM,QACF,iBAAoC,IAAI,CAAC,CAAC,KAAK,OAAO,eAAe,OAAO,CAAC,GAC7E,KACJ,CACJ;EACA,IAAI;EACJ,MAAM,gBAAiB,YAAY,OAAO,WAAW,MAAM,MAAM,OAAO,KAAK,IAAI,CAAC;EAClF,OAAO;GACH,GAAG;GACH;EACJ;CACJ,SAAS,OAAO;EACZ,MAAM,OAAO,WAAW,MAAM,MAAM,OAAO,KAAK,KAAK,KAAK,CAAC,CAAC;EAC5D,MAAM;CACV;AACJ"}
|
|
@@ -1,34 +1,33 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { OntologyIR } from "../../ir/generated/types.js";
|
|
3
|
-
import { ValidationIssue } from "../../utils/validation.js";
|
|
4
|
-
import "../../ir/index.js";
|
|
5
|
-
import { Uncertain } from "../../utils/uncertain.js";
|
|
6
|
-
import { OntologyApplyActionResult } from "../OntologyBackendAdapter.js";
|
|
7
|
-
import { OntologyObject } from "../objects/OntologyObject.js";
|
|
8
|
-
import { OntologyCollection } from "../objects/createLiveOntologyObjectCollection.js";
|
|
1
|
+
import { OntologyApplyActionResult } from "./types.js";
|
|
9
2
|
import { OntologyActionRequest } from "../outbox/types.js";
|
|
10
|
-
import {
|
|
3
|
+
import { LiveOntologyWriteVisibility } from "../LiveOntology.js";
|
|
4
|
+
import { ActionRequest } from "@party-stack/ontology-backend";
|
|
5
|
+
import { OntologyIR } from "@party-stack/ontology-spec";
|
|
6
|
+
import { Uncertain, ValidationIssue } from "@party-stack/ontology-spec/utils";
|
|
7
|
+
import { Result } from "@party-stack/ontology-spec/values";
|
|
11
8
|
//#region src/live/actions/createLiveOntologyAction.d.ts
|
|
12
9
|
export interface LiveOntologyActionOptions {
|
|
13
10
|
idempotencyKey?: string;
|
|
14
|
-
|
|
11
|
+
/** Portable inputs supplied by a forwarding ontology. */
|
|
12
|
+
replay?: NonNullable<ActionRequest["replay"]>;
|
|
15
13
|
visibility?: LiveOntologyWriteVisibility;
|
|
16
14
|
}
|
|
17
15
|
export interface LiveOntologyActionDraftValidationOptions<Parameters extends Record<string, unknown>> {
|
|
18
16
|
knownParameters?: readonly (keyof Parameters)[];
|
|
19
17
|
}
|
|
20
|
-
export type LiveOntologyAction<Parameters extends Record<string, unknown> = Record<string, unknown
|
|
21
|
-
|
|
18
|
+
export type LiveOntologyAction<Parameters extends Record<string, unknown> = Record<string, unknown>, Return = unknown, Input extends Record<string, unknown> = Parameters> = {
|
|
19
|
+
/** Queue in the replica's outbox, including offline. Visibility controls prediction;
|
|
20
|
+
* the Promise resolves after authoritative confirmation and local reconciliation.
|
|
21
|
+
*/
|
|
22
|
+
(parameters: Input, options?: LiveOntologyActionOptions): Promise<OntologyApplyActionResult<Return>>;
|
|
22
23
|
resolveParameters(parameters: Partial<Parameters>): Promise<Partial<Parameters>>;
|
|
23
24
|
validate(parameters: Parameters): Promise<Uncertain<Result<void, readonly ValidationIssue[]>>>;
|
|
24
25
|
validateDraft(parameters: Partial<Parameters>, options?: LiveOntologyActionDraftValidationOptions<Parameters>): Promise<Uncertain<Result<void, readonly ValidationIssue[]>>>;
|
|
25
26
|
};
|
|
26
27
|
export declare function createLiveOntologyAction(options: {
|
|
27
|
-
ir: OntologyIR;
|
|
28
28
|
action: OntologyIR["actionTypes"][number];
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
submit(request: OntologyActionRequest, options?: LiveOntologyActionOptions): Promise<OntologyApplyActionResult | void>;
|
|
29
|
+
resolveParameters: (name: string, parameters: Record<string, unknown>) => Promise<Record<string, unknown>>;
|
|
30
|
+
submit(request: OntologyActionRequest, options?: LiveOntologyActionOptions): Promise<OntologyApplyActionResult>;
|
|
32
31
|
validate(actionTypeName: string, parameters: Record<string, unknown>): Promise<Uncertain<Result<void, readonly ValidationIssue[]>>>;
|
|
33
32
|
validateDraft(actionTypeName: string, parameters: Record<string, unknown>, validationOptions?: LiveOntologyActionDraftValidationOptions<Record<string, unknown>>): Promise<Uncertain<Result<void, readonly ValidationIssue[]>>>;
|
|
34
33
|
}): LiveOntologyAction;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createLiveOntologyAction.d.ts","names":[],"sources":["../../../src/live/actions/createLiveOntologyAction.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"createLiveOntologyAction.d.ts","names":[],"sources":["../../../src/live/actions/createLiveOntologyAction.ts"],"mappings":";;;;;;;;iBASiB;EACb;;EAEA,SAAS,YAAY;EACrB,aAAa;;iBAGA,yCAAyC,mBAAmB;EACzE,kCAAkC;;YAG1B,mBACR,mBAAmB,0BAA0B,yBAC7C,kBACA,cAAc,0BAA0B;;;;GAKvC,YAAY,OAAO,UAAU,4BAA4B,QAAQ,0BAA0B;EAC5F,kBAAkB,YAAY,QAAQ,cAAc,QAAQ,QAAQ;EACpE,SAAS,YAAY,aAAa,QAAQ,UAAU,sBAAsB;EAC1E,cACI,YAAY,QAAQ,aACpB,UAAU,yCAAyC,cACpD,QAAQ,UAAU,sBAAsB;;wBAG/B,yBAAyB;EACrC,QAAQ;EACR,oBACI,cACA,YAAY,4BACX,QAAQ;EACb,OACI,SAAS,uBACT,UAAU,4BACX,QAAQ;EACX,SACI,wBACA,YAAY,0BACb,QAAQ,UAAU,sBAAsB;EAC3C,cACI,wBACA,YAAY,yBACZ,oBAAoB,yCAAyC,2BAC9D,QAAQ,UAAU,sBAAsB;IAC3C"}
|
|
@@ -1,24 +1,16 @@
|
|
|
1
|
-
import { resolveActionParameters } from "../expression.js";
|
|
2
|
-
import { createReadTx } from "../mutators/createMutatorTx.js";
|
|
3
1
|
//#region src/live/actions/createLiveOntologyAction.ts
|
|
4
2
|
function createLiveOntologyAction(options) {
|
|
5
|
-
const resolveParameters = (providedParameters) => resolveActionParameters({
|
|
6
|
-
ir: options.ir,
|
|
7
|
-
actionTypeName: options.action.name,
|
|
8
|
-
initialParameters: providedParameters,
|
|
9
|
-
context: options.context ?? {},
|
|
10
|
-
tx: createReadTx(options.objects)
|
|
11
|
-
});
|
|
12
3
|
const apply = async (providedParameters, executionOptions) => {
|
|
13
4
|
const idempotencyKey = executionOptions?.idempotencyKey ?? crypto.randomUUID();
|
|
14
5
|
return options.submit({
|
|
15
6
|
actionTypeName: options.action.name,
|
|
16
7
|
parameters: providedParameters,
|
|
17
|
-
idempotencyKey
|
|
8
|
+
idempotencyKey,
|
|
9
|
+
replay: executionOptions?.replay
|
|
18
10
|
}, executionOptions);
|
|
19
11
|
};
|
|
20
12
|
apply.validate = async (providedParameters) => options.validate(options.action.name, providedParameters);
|
|
21
|
-
apply.resolveParameters = resolveParameters;
|
|
13
|
+
apply.resolveParameters = (parameters) => options.resolveParameters(options.action.name, parameters);
|
|
22
14
|
apply.validateDraft = async (parameters, validationOptions) => options.validateDraft(options.action.name, parameters, validationOptions);
|
|
23
15
|
return apply;
|
|
24
16
|
}
|