Build the packaged local-first reader and cross-package task application
This commit is contained in:
@@ -1,6 +1,9 @@
|
|||||||
import { hexDigest, type ExecutionPlan } from "../execution-world/plan.js";
|
import { hexDigest, type ExecutionPlan } from "../execution-world/plan.js";
|
||||||
import { resultInterfaces } from "../execution-world/projections.js";
|
import { resultInterfaces } from "../execution-world/projections.js";
|
||||||
import { portableValueSchema, tsType, PortableBindingError } from "./portable.js";
|
import { portableValueSchema, tsType, PortableBindingError } from "./portable.js";
|
||||||
|
import type { QuerySelection } from "../query/types.js";
|
||||||
|
const conditional = (selections: readonly QuerySelection[]): boolean =>
|
||||||
|
selections.some((selection) => selection.conditions.length > 0 || conditional(selection.selection));
|
||||||
/** Closed-world app descriptors. Handler bindings and application acquisition share the same public identities. */
|
/** Closed-world app descriptors. Handler bindings and application acquisition share the same public identities. */
|
||||||
export function generatePortableClientBindings(
|
export function generatePortableClientBindings(
|
||||||
plan: ExecutionPlan,
|
plan: ExecutionPlan,
|
||||||
@@ -50,6 +53,7 @@ export function generatePortableClientBindings(
|
|||||||
}
|
}
|
||||||
const queries = new Map<string, string[]>();
|
const queries = new Map<string, string[]>();
|
||||||
const views = new Map<string, string[]>();
|
const views = new Map<string, string[]>();
|
||||||
|
const results = new Map<string, string[]>();
|
||||||
for (const query of plan.definition.queries) {
|
for (const query of plan.definition.queries) {
|
||||||
const declaration = query.query.checked.declaration;
|
const declaration = query.query.checked.declaration;
|
||||||
if (!declaration.placement) continue;
|
if (!declaration.placement) continue;
|
||||||
@@ -63,6 +67,15 @@ export function generatePortableClientBindings(
|
|||||||
`${JSON.stringify(declaration.displayName)}: ${JSON.stringify({ id: query.id, plan: plan.digest, source: JSON.stringify([query.query.packageRevisionId, declaration.placement.sourceQueryId]) })} as const satisfies LocalQueryDescriptor`,
|
`${JSON.stringify(declaration.displayName)}: ${JSON.stringify({ id: query.id, plan: plan.digest, source: JSON.stringify([query.query.packageRevisionId, declaration.placement.sourceQueryId]) })} as const satisfies LocalQueryDescriptor`,
|
||||||
);
|
);
|
||||||
views.set(pkg.displayName, list);
|
views.set(pkg.displayName, list);
|
||||||
|
if (conditional(query.query.checked.selection)) {
|
||||||
|
unavailable.push({ key: query.id, reason: "CONDITIONAL_RESULT_DECODER_UNSUPPORTED" });
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const decoders = results.get(pkg.displayName) ?? [];
|
||||||
|
decoders.push(
|
||||||
|
`${JSON.stringify(declaration.displayName)}: (data: Json): ${tsType(query.query.checked.output)} => decodeArgument(${JSON.stringify(portableValueSchema(query.query.checked.output))}, { codec: "camino-value-v1", usage: "argument", value: data }, { workspace: workspaceId(${JSON.stringify(workspace.workspaceId)}), limits: { bytes: ${declaration.budgets.resultBytes + 128}, nodes: 100000, depth: 64 } }) as ${tsType(query.query.checked.output)}`,
|
||||||
|
);
|
||||||
|
results.set(pkg.displayName, decoders);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
const list = queries.get(pkg.displayName) ?? [];
|
const list = queries.get(pkg.displayName) ?? [];
|
||||||
@@ -73,5 +86,5 @@ export function generatePortableClientBindings(
|
|||||||
}
|
}
|
||||||
const groups = (entries: Map<string, string[]>) =>
|
const groups = (entries: Map<string, string[]>) =>
|
||||||
[...entries].map(([name, values]) => `${JSON.stringify(name)}: {${values.join(",\n")}}`).join(",\n");
|
[...entries].map(([name, values]) => `${JSON.stringify(name)}: {${values.join(",\n")}}`).join(",\n");
|
||||||
return `// Generated application descriptors. Regenerate; do not edit.\nimport { defineOperationDescriptor, type PreparedChange, type ManagedReference, type ReplicaProjection, type LocalQueryDescriptor } from ${JSON.stringify(options.runtimeModule ?? "@quixos/camino-replica-core")};\nexport const planDigest = ${JSON.stringify(plan.digest)};\nexport const operations = {${groups(atoms)}} as const;\nexport const queries = {${groups(queries)}} as const;\nexport const views = {${groups(views)}} as const;\nexport const unavailable = ${JSON.stringify(unavailable)} as const;\n`;
|
return `// Generated application descriptors. Regenerate; do not edit.\nimport { defineOperationDescriptor, decodeArgument, workspaceId, type Json, type PreparedChange, type ManagedReference, type ReplicaProjection, type LocalQueryDescriptor } from ${JSON.stringify(options.runtimeModule ?? "@quixos/camino-replica-core")};\nexport const planDigest = ${JSON.stringify(plan.digest)};\nexport const operations = {${groups(atoms)}} as const;\nexport const queries = {${groups(queries)}} as const;\nexport const views = {${groups(views)}} as const;\nexport const results = {${groups(results)}} as const;\nexport const unavailable = ${JSON.stringify(unavailable)} as const;\n`;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user