UNPKG

flowed

Version:

A fast and reliable flow engine for orchestration and more uses in *Node.js*, *Deno* and the browser

109 lines 4.41 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.FlowManager = void 0; const fs_1 = require("fs"); const http = require("http"); const https = require("https"); const flow_1 = require("./flow"); class FlowManager { static run(flowSpec, params = {}, expectedResults = [], resolvers = {}, context = {}, options = {}) { const flow = new flow_1.Flow(flowSpec); return flow.start(params, expectedResults, resolvers, context, options); } static runFromString(flowSpecJson, params = {}, expectedResults = [], resolvers = {}, context = {}, options = {}) { return new Promise((resolveFlow, reject) => { try { const flowSpec = JSON.parse(flowSpecJson); FlowManager.run(flowSpec, params, expectedResults, resolvers, context, options).then(resolveFlow, reject); } catch (error) { reject(error); } }); } static runFromFile(flowSpecFilepath, params = {}, expectedResults = [], resolvers = {}, context = {}, options = {}) { return new Promise((resolveFlow, reject) => { (0, fs_1.readFile)(flowSpecFilepath, 'utf8', (err, fileContents) => { if (err) { reject(err); } else { FlowManager.runFromString(fileContents, params, expectedResults, resolvers, context, options).then(resolveFlow, reject); } }); }); } static runFromUrl(flowSpecUrl, params = {}, expectedResults = [], resolvers = {}, context = {}, options = {}) { let client = null; if (flowSpecUrl.startsWith('http://')) { client = http; } else if (flowSpecUrl.startsWith('https://')) { client = https; } if (client === null) { let actualProtocol = null; const matchResult = flowSpecUrl.match(/^([a-zA-Z]+):/); if (Array.isArray(matchResult) && matchResult.length === 2) { actualProtocol = matchResult[1]; return Promise.reject(new Error(`Protocol not supported: ${actualProtocol}. Supported protocols are: [http, https]`)); } else { return Promise.reject(new Error(`Invalid URL: ${flowSpecUrl}`)); } } return new Promise((resolveFlow, reject) => { client .get(flowSpecUrl, { agent: false }, (res) => { var _a; const { statusCode } = res; const contentType = (_a = res.headers['content-type']) !== null && _a !== void 0 ? _a : 'application/json'; let error; if (statusCode !== 200) { error = new Error(`Request failed with status code: ${statusCode}`); } else if (!(contentType.startsWith('application/json') || contentType.startsWith('text/plain'))) { error = new Error(`Invalid content-type: Expected 'application/json' or 'text/plain' but received '${contentType}'`); } if (error) { reject(error); } else { res.setEncoding('utf8'); let rawData = ''; res.on('data', (chunk) => { rawData += chunk; }); res.on('end', () => { FlowManager.runFromString(rawData, params, expectedResults, resolvers, context, options).then(resolveFlow, reject); }); } }) .on('error', (error) => { reject(error); }); }); } static installPlugin(plugin) { if (plugin.resolverLibrary) { for (const [name, resolver] of Object.entries(plugin.resolverLibrary)) { this.plugins.resolvers[name] = resolver; } } } static installLogger(logger) { this.logger = logger; } static log(entry) { if (FlowManager.logger === null) { return; } FlowManager.logger.log(entry); } } exports.FlowManager = FlowManager; FlowManager.plugins = { resolvers: {}, }; FlowManager.logger = null; //# sourceMappingURL=flow-manager.js.map