Introduce persisted Web Studio component capabilities

This commit is contained in:
2026-09-04 21:03:09 -07:00
parent 16b344c0ad
commit 04614be2c9
3 changed files with 93 additions and 26 deletions
+10 -8
View File
@@ -174,20 +174,21 @@ export const createRuntimeContext = (
switch (dependency.binding.case) {
case "stateSlotId": {
const slotId = dependency.binding.value;
const dependencyObjectId = dependency.objectId || request.objectId;
const state: StatePort = {
slotId,
async get() {
await recordDependency({ kind: "state", objectId: request.objectId, attachmentId: slotId });
return protoValueToJs((await camino.readState({ objectId: request.objectId, slotId })).value);
await recordDependency({ kind: "state", objectId: dependencyObjectId, attachmentId: slotId });
return protoValueToJs((await camino.readState({ objectId: dependencyObjectId, slotId })).value);
},
async live() {
await recordDependency({ kind: "state", objectId: request.objectId, attachmentId: slotId });
const value = await camino.readState({ objectId: request.objectId, slotId });
await recordDependency({ kind: "state", objectId: dependencyObjectId, attachmentId: slotId });
const value = await camino.readState({ objectId: dependencyObjectId, slotId });
if (!value.value) throw new Error(`State ${slotId} returned no value`);
return liveValue(value.value);
},
async set(value) {
await camino.writeState({ objectId: request.objectId, slotId, value: jsToProtoValue(value) });
await camino.writeState({ objectId: dependencyObjectId, slotId, value: jsToProtoValue(value) });
},
};
ports.set(dependency.portId, state);
@@ -195,16 +196,17 @@ export const createRuntimeContext = (
}
case "edge": {
const { edgeTypeId, projectionId } = dependency.binding.value;
const dependencyObjectId = dependency.objectId || request.objectId;
const edge: EdgePort = {
edgeTypeId,
projectionId,
async resolve() {
await recordDependency({ kind: "edge", objectId: request.objectId, attachmentId: edgeTypeId, projectionId });
const result = await camino.resolveEdge({ objectId: request.objectId, edgeTypeId, projectionId });
await recordDependency({ kind: "edge", objectId: dependencyObjectId, attachmentId: edgeTypeId, projectionId });
const result = await camino.resolveEdge({ objectId: dependencyObjectId, edgeTypeId, projectionId });
return result.edges.map((entry) => targetForEdge(entry, projectionId));
},
async connect(targetObjectId) {
await camino.connectEdge({ objectId: request.objectId, edgeTypeId, projectionId, targetObjectId });
await camino.connectEdge({ objectId: dependencyObjectId, edgeTypeId, projectionId, targetObjectId });
},
};
ports.set(dependency.portId, edge);