123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- import browser from 'webextension-polyfill';
- import { isWhitespace, parseJSON } from '@/utils/helper';
- import decryptFlow, { getWorkflowPass } from '@/utils/decryptFlow';
- import convertWorkflowData from '@/utils/convertWorkflowData';
- import WorkflowEngine from '../WorkflowEngine';
- function workflowListener(workflow, options) {
- return new Promise((resolve, reject) => {
- if (workflow.isProtected) {
- const flow = parseJSON(workflow.drawflow, null);
- if (!flow) {
- const pass = getWorkflowPass(workflow.pass);
- workflow.drawflow = decryptFlow(workflow, pass);
- }
- }
- const engine = new WorkflowEngine(workflow, options);
- engine.init();
- engine.on('destroyed', ({ id, status, message }) => {
- console.log(engine.referenceData.table, engine.referenceData.variables);
- options.events.onDestroyed(engine);
- if (status === 'error') {
- const error = new Error(message);
- error.data = { logId: id };
- reject(error);
- return;
- }
- resolve({ id, status, message });
- });
- options.events.onInit(engine);
- });
- }
- function findWorkflow(workflows, workflowId) {
- const workflow = Array.isArray(workflows)
- ? workflows.find(({ id }) => id === workflowId)
- : workflows[workflowId];
- return workflow;
- }
- async function executeWorkflow({ id: blockId, data }) {
- if (data.workflowId === '') throw new Error('empty-workflow');
- const { workflows, teamWorkflows } = await browser.storage.local.get([
- 'workflows',
- 'teamWorkflows',
- ]);
- let workflow = null;
- if (data.workflowId.startsWith('team')) {
- const teamWorkflowsArr = Object.values(
- Object.values(teamWorkflows || {})[0] ?? {}
- );
- workflow = findWorkflow(teamWorkflowsArr, data.workflowId);
- } else {
- workflow = findWorkflow(workflows, data.workflowId);
- }
- if (!workflow) {
- const errorInstance = new Error('no-workflow');
- errorInstance.data = { workflowId: data.workflowId };
- throw errorInstance;
- }
- workflow = convertWorkflowData(workflow);
- const optionsParams = { variables: {} };
- if (!isWhitespace(data.globalData))
- optionsParams.globalData = data.globalData;
- if (data.insertAllVars) {
- optionsParams.variables = JSON.parse(
- JSON.stringify(this.engine.referenceData.variables)
- );
- } else if (data.insertVars) {
- const varsName = data.insertVars.split(',');
- varsName.forEach((name) => {
- const varName = name.trim();
- const value = this.engine.referenceData.variables[varName];
- if (!value && typeof value !== 'boolean') return;
- optionsParams.variables[varName] = value;
- });
- }
- const options = {
- options: {
- data: optionsParams,
- parentWorkflow: {
- id: this.engine.id,
- name: this.engine.workflow.name,
- },
- },
- events: {
- onInit: (engine) => {
- this.childWorkflowId = engine.id;
- },
- onDestroyed: (engine) => {
- if (data.executeId) {
- const { variables, table } = engine.referenceData;
- this.engine.referenceData.workflow[data.executeId] = {
- table,
- variables,
- };
- }
- },
- },
- states: this.engine.states,
- logger: this.engine.logger,
- blocksHandler: this.engine.blocksHandler,
- };
- const isWorkflowIncluded = workflow.drawflow.nodes.some(
- (node) =>
- node.label === 'execute-workflow' &&
- node.data.workflowId === this.engine.workflow.id
- );
- if (isWorkflowIncluded) {
- throw new Error('workflow-infinite-loop');
- }
- const result = await workflowListener(workflow, options);
- return {
- data: '',
- logId: result.id,
- nextBlockId: this.getBlockConnections(blockId),
- };
- }
- export default executeWorkflow;
|