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
JavaScript
;
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