Dataflow3D ConfiguratorAllmatterPlugin
npm i rete rete-engine
Let's take a look at a simplified example of a graph with two node types: NumberNode
and AddNode
. These nodes are built exclusively for processing (on the server-side, e.g.) and don't have any integrations with the user interface. You can find a link to the complete example with the UI at the end of the article.
const socket = new ClassicPreset.Socket("socket");
class NumberNode extends ClassicPreset.Node {
constructor(public value: number) {
super("Number");
this.addOutput("value", new ClassicPreset.Output(socket, "Number"));
}
data(): { value: number } {
return { value: this.value };
}
}
class AddNode extends ClassicPreset.Node {
constructor() {
super("Add");
this.addInput("left", new ClassicPreset.Input(socket, "Left"));
this.addInput("right", new ClassicPreset.Input(socket, "Right"));
this.addOutput("value", new ClassicPreset.Output(socket, "Number"));
}
data(inputs: { left?: number[]; right?: number[] }): { value: number } {
const { left, right } = inputs;
const value = (left && left[0] || 0) + (right && right[0] || 0)
return { value };
}
}
class Connection<
A extends Node,
B extends Node
> extends ClassicPreset.Connection<A, B> {}
type Node = NumberNode | AddNode;
type ConnProps = Connection<NumberNode, AddNode> | Connection<AddNode, AddNode>;
type Schemes = GetSchemes<Node, ConnProps>;
import { DataflowEngine } from "rete-engine";
import { NodeEditor } from "rete";
const editor = new NodeEditor<Schemes>();
const engine = new DataflowEngine<Schemes>();
editor.use(engine);
const a = new NumberNode(1);
const b = new NumberNode(1);
const sum = new AddNode();
const con1 = new Connection(a, "value", c, "left");
const con2 = new Connection(b, "value", c, "right");
await editor.addNode(a);
await editor.addNode(b);
await editor.addNode(sum);
await editor.addConnection(con1);
await editor.addConnection(con2);
Retrieve output data from the sum
node.
const result = await engine.fetch(sum.id)
The value of result
will be { value: 2 }
, which is the sum of the initial input values of the sum
node.
If you want to modify a.value
or b.value
, you need to clear the cache before processing the graph again. The output values of nodes are cached to avoid repetitive node execution.
engine.reset() // reset all nodes
// or specific nodes
engine.reset(a.id)
engine.reset(b.id)
Additionally, the data
methods can be async. In such cases, the sum
node will wait for the data
methods of its input nodes to complete execution. After all of them have returned a value, the engine will execute the data
method of the sum
node
Check out the complete result on the Dataflow example page.