转载:netflix-conductor-json-tree-查看文章

转载:netflix-conductor-json-tree

发表于:2022-11-09 10:08:38 分类:开发杂记 阅读:223次

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var function_1 = require("./function");
/**
 * construct
 * 将提供的节点/边信息,构造成可供Netflix Conductor服务编排框架的JSON树
 * @param source
 * @param config
 */
function construct(source, config) {
    var nodes = source.nodes; // 节点
    var edges = source.edges; // 边
    // 中间层节点构造函数
    var MiddleLayerNode = function (id) {
        var node = nodes.find(function (item) {
            return item.id === id;
        });
        this.id = node.id;
        this.label = node.label;
        // 出入
        this.out = [];
        this.in = [];
    };
    /**
     * 一、for of 循环遍历边,寻找边的源节点与目标节点,构造一个统计节点上下游的集合,是一个中间层节点数组
     *
     * 如果存在,则 直接获取 并告诉它它的上一个节点和下一个节点是谁,记录在 in 和 out
     * 如果不存在,则 创建后 再告诉它它的上一个节点和下一个节点是谁,记录在 in 和 out
     *
     * 整个循环下来,我们可以知道所有节点的上一个节点和下一个节点是谁
     * 其中上一个节点是谁记录在in,下一个节点是谁记录在ouyt,类似链表
     */
    var nodeMap = {};
    for (var _i = 0, edges_1 = edges; _i < edges_1.length; _i++) {
        var edge = edges_1[_i];
        var sourceNodeId = edge.source; // 源节点ID
        var targetNodeId = edge.target; // 目标节点ID
        var sourceNode = // 记录边的源节点
         void 0; // 记录边的源节点
        var targetNode = // 记录边的源节点
         void 0; // 记录边的源节点
        // 先判断集合中是否已存在当前边的源节点/目标节点,
        // 存在,则直接取
        // 不存在,则实例化一个中间层节点,并放入集合中,以便后续遍历匹配时可直接取
        if (nodeMap[sourceNodeId]) {
            sourceNode = nodeMap[sourceNodeId];
        }
        else {
            // sourceNode = new MiddleLayerNode(sourceNodeId);
            nodeMap[sourceNodeId] = sourceNode = new MiddleLayerNode(sourceNodeId);
        }
        if (nodeMap[targetNodeId]) {
            targetNode = nodeMap[targetNodeId];
        }
        else {
            // targetNode = new MiddleLayerNode(targetNodeId);
            nodeMap[targetNodeId] = targetNode = new MiddleLayerNode(targetNodeId);
        }
        // 边联系源节点和目标节点,说明源节点的下游输出是目标节点、目标节点的上游输入是源节点
        // 以此记录节点上下游,遍历结束则完成构造一个统计节点上下游的集合
        sourceNode.out.push({
            edge: edge,
            target: targetNode
        });
        targetNode.in.push({
            edge: edge,
            source: sourceNode
        });
    }
    /**
     * 二、寻找开始节点和结束节点
     *
     * 如果无上一节点,则说明是开始节点
     * 如果无下一节点,则说明是结束节点
     */
    var startNode = null;
    var endNode = null;
    for (var _a = 0, _b = Object.keys(nodeMap); _a < _b.length; _a++) {
        var item = _b[_a];
        // 开始节点(无上游输入)
        if (nodeMap[item].in.length === 0) {
            startNode = nodeMap[item];
        }
        // 结束节点(无下游输出)
        if (nodeMap[item].out.length === 0) {
            endNode = nodeMap[item];
        }
    }
    /**
     * 三、定义输出结果结构
     */
    var result = {
        // 开始节点信息
        label: "",
        // 执行步骤
        steps: [],
        // 结束节点信息(输出参数)
        outputParams: {}
    };
    result.label = startNode.label;
    result.steps = [];
    // 开始组装
    for (var _c = 0, _d = startNode.out; _c < _d.length; _c++) {
        var item = _d[_c];
        if (item.target.out.length === 1) {
            // 服务节点
            function_1.serviceNodeHandle(item.target, result.steps);
        }
        else if (item.target.out.length > 1) {
            // 条件节点
            result.steps.push(function_1.conditionNodeHandle(item.target));
        }
    }
    return result;
}
exports.construct = construct;
// 拆解
function destruct() { }
exports.destruct = destruct;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
/**
 * 服务节点处理函数
 * @param node    节点
 * @param context 上下文
 */
function serviceNodeHandle(node, context) {
    var res = {
        label: node.label,
        type: "service"
    };
    context.push(res);
    var nextNode = node.out[0].target;
    // 服务节点
    if (nextNode.out.length === 1) {
        serviceNodeHandle(nextNode, context);
    }
    // 条件节点
    if (nextNode.out.length > 1) {
        context.push(conditionNodeHandle(nextNode));
    }
}
exports.serviceNodeHandle = serviceNodeHandle;
/**
 * 条件节点处理函数
 * @param node
 */
function conditionNodeHandle(node) {
    var res = {
        label: node.label,
        type: "condition",
        decisionCases: {}
    };
    for (var _i = 0, _a = node.out; _i < _a.length; _i++) {
        var next = _a[_i];
        res.decisionCases[next.edge.label] = [];
        // 服务节点
        if (next.target.out.length === 1) {
            serviceNodeHandle(next.target, res.decisionCases[next.edge.label]);
        }
        // 条件节点
        if (next.target.out.length > 1) {
            res.decisionCases[next.edge.label].push(conditionNodeHandle(next.target));
        }
    }
    return res;
}
exports.conditionNodeHandle = conditionNodeHandle;


关键词:js


验证码: