Низкоуровневое ядро
Большая часть кода приложения должна использовать сторы, события, эффекты, реакции и владельцев.
Низкоуровневый kernel нужен интеграциям, которым требуются прямые ноды графа или собственный контекст выполнения.
createNode и run
ts
import { createNode, run, scope } from "@virentia/core";
const appScope = scope();
const logNode = createNode((ctx) => {
console.log(ctx.value);
});
await run({
unit: logNode,
payload: "hello",
scope: appScope,
});Ноды могут передавать значения дальше по графу.
ts
const second = createNode((ctx) => {
console.log(ctx.value); // "next"
});
const first = createNode({
run: () => "next",
next: [second],
});
await run({ unit: first, scope: appScope });Нода может явно поставить в очередь другую ветку. ctx.launch сохраняет текущий scope, contexts, metadata и batch key, но дает ноде выбрать, какой юнит получит следующее значение.
ts
const gate = createNode((ctx) => {
ctx.stop();
ctx.launch(second, "next");
});Kernel contexts
Kernel contexts передают метаданные выполнения вдоль цепочки run.
ts
const requestId = createContext<string>();
const node = createNode((ctx) => {
console.log(ctx.getContext(requestId));
});
await run({
unit: node,
scope: appScope,
contexts: [requestId.setup("request-42")],
});Для состояния приложения используйте сторы. Kernel contexts нужны для метаданных, которые относятся к одному запуску.