Фреймворк надає гнучкі системи плагінів і повідомлень, які дають змогу розширювати функціональні можливості різних компонентів і керувати їхньою поведінкою. Цього можна досягти за допомогою пайпів для певних типів повідомлень.
Валідація буде реалізовано для додавання вузлів, де вузли певного типу будуть заборонені, доки не буде додано початковий вузол
editor.addPipe(context => {
if (context.type === 'nodecreate') {
if (context.data instanceof EndNode) {
const hasBeginNode = editor.getNodes().some(n => n instanceof BeginNode)
if (!hasBeginNode) {
alert('неможливо додати EndNode, доки не буде додано BeginNode')
return
}
}
}
return context
})
де EndNode
і BeginNode
це класи, що розширюють ClassicPreset.Node
.
У цьому конкретному випадку використовувався метод запобігання розповсюдженню повідомлення шляхом return
без значення. Ця техніка підходить для таких типів, як nodecreate
, noderemove
, connectioncreate
і connectionremove
.
Той самий принцип можна використовувати для запобігання повідомлень типу connectioncreate
.
editor.addPipe((context) => {
if (context.type === "connectioncreate") {
if (!canCreateConnection(editor, context.data)) {
alert("Сокети не сумісні");
return;
}
}
return context;
});
де canCreateConnection
— будь-яка функція, яка приймає екземпляр з’єднання context.data
і повертає boolean.
Давайте візьмемо приклад Чат-бот, зокрема модулі chatbot/utils.ts
і chatbot/sockets.ts
, і застосуємо той самий підхід до нашої функції canCreateConnection
. Спочатку ми реалізуємо розширені сокети:
import { ClassicPreset } from "rete";
export class ActionSocket extends ClassicPreset.Socket {
constructor() {
super("Action");
}
isCompatibleWith(socket: ClassicPreset.Socket) {
return socket instanceof ActionSocket;
}
}
export class TextSocket extends ClassicPreset.Socket {
constructor() {
super("Text");
}
isCompatibleWith(socket: ClassicPreset.Socket) {
return socket instanceof TextSocket;
}
}
за допомогою методу isCompatibleWith
типи сокетів можуть вказувати, з якими іншими типами сокетів вони сумісні.
Після цього ми реалізуємо нашу функцію, яка приймає з’єднання як аргумент, повертає відповідні сокети з вузлів і перевіряє їх на сумісність.
export function canCreateConnection(editor: NodeEditor<Schemes>, connection: Schemes["Connection"]) {
const { source, target } = getConnectionSockets(editor, connection);
return source && target && source.isCompatibleWith(target)
}
де функція getConnectionSockets
була взята з вищезгаданого прикладу.