refactor(javascript): own application node merging in the graph domain

This commit is contained in:
morluto
2026-10-22 11:11:42 +08:00
parent 63fe0eb5db
commit 51e0df97e9
4 changed files with 112 additions and 94 deletions
@@ -502,6 +502,51 @@ export const createJavaScriptApplicationNode = (
});
};
/** Merge authenticated entities, retaining every distinct observation. */
export const mergeJavaScriptApplicationNodes = (
nodes: readonly ApplicationNode[],
): ApplicationNode[] => {
const groups = new Map<
string,
{
node: ApplicationNode;
observations: Map<string, ApplicationNode["observations"][number]>;
}
>();
for (const node of nodes) {
const group = groups.get(node.node_id);
if (group === undefined) {
groups.set(node.node_id, {
node,
observations: new Map(
node.observations.map((observation) => [
observation.observation_id,
observation,
]),
),
});
continue;
}
if (
node.kind !== group.node.kind ||
canonicalJson(node.identity) !== canonicalJson(group.node.identity)
)
throw new TypeError("Colliding JAG node identifiers disagree");
for (const observation of node.observations)
group.observations.set(observation.observation_id, observation);
}
return [...groups.values()].map(({ node, observations }) =>
createJavaScriptApplicationNode({
kind: node.kind,
identity: node.identity,
observations: [...observations.values()].map(
({ observation_id: _id, identifier_strategy: _strategy, ...value }) =>
value,
),
}),
);
};
/** Build one normalized directed relationship and derive its semantic ID. */
export const createJavaScriptApplicationEdge = (
input: unknown,