import { DropdownState, DynamicPropsValue, PieceMetadata, } from '@tonyshark/framework' import { ActivepiecesError, BeginExecuteFlowOperation, EngineResponseStatus, ErrorCode, ExecuteActionResponse, ExecuteExtractPieceMetadata, ExecutePropsOptions, ExecuteStepOperation, ExecuteToolOperation, ExecuteTriggerOperation, ExecuteTriggerResponse, ExecuteValidateAuthOperation, ExecuteValidateAuthResponse, FlowRunResponse, FlowVersionState, ResumeExecuteFlowOperation, SourceCode, TriggerHookType } from '@tonyshark/shared' import chalk from 'chalk' import { FastifyBaseLogger } from 'fastify' type EngineConstants = 'publicApiUrl' | 'internalApiUrl' | 'engineToken' export type CodeArtifact = { name: string sourceCode: SourceCode flowVersionId: string flowVersionState: FlowVersionState } export type EngineHelperFlowResult = Pick export type EngineHelperTriggerResult< T extends TriggerHookType = TriggerHookType, > = ExecuteTriggerResponse export type EngineHelperPropResult = { type: 'dropdown' options: DropdownState } | { type: 'dynamicproperties' options: Record } export type EngineHelperActionResult = ExecuteActionResponse export type EngineHelperValidateAuthResult = ExecuteValidateAuthResponse export type EngineHelperCodeResult = ExecuteActionResponse export type EngineHelperExtractPieceInformation = PieceMetadata export type EngineHelperResult = | EngineHelperFlowResult | EngineHelperTriggerResult | EngineHelperPropResult | EngineHelperCodeResult | EngineHelperExtractPieceInformation | EngineHelperActionResult | EngineHelperValidateAuthResult export type EngineHelperResponse = { status: EngineResponseStatus result: Result standardError: string standardOutput: string } export type ExecuteSandboxResult = { output: unknown timeInSeconds: number verdict: EngineResponseStatus standardOutput: string standardError: string } export type EngineRunner = { executeFlow( engineToken: string, operation: | Omit | Omit, ): Promise> executeTrigger( engineToken: string, operation: Omit, EngineConstants>, ): Promise>> extractPieceMetadata( engineToken: string, operation: ExecuteExtractPieceMetadata, ): Promise> executeValidateAuth( engineToken: string, operation: Omit, ): Promise> executeAction( engineToken: string, operation: Omit, ): Promise> excuteTool( engineToken: string, operation: Omit, ): Promise> executeProp( engineToken: string, operation: Omit, ): Promise> } export const engineRunnerUtils = (log: FastifyBaseLogger) => ({ async readResults(sandboxResponse: ExecuteSandboxResult): Promise> { sandboxResponse.standardOutput.split('\n').forEach((f) => { if (f.trim().length > 0) log.debug({}, chalk.yellow(f)) }) sandboxResponse.standardError.split('\n').forEach((f) => { if (f.trim().length > 0) log.debug({}, chalk.red(f)) }) if (sandboxResponse.verdict === EngineResponseStatus.TIMEOUT) { throw new ActivepiecesError({ code: ErrorCode.EXECUTION_TIMEOUT, params: {}, }) } if (sandboxResponse.verdict === EngineResponseStatus.MEMORY_ISSUE) { throw new ActivepiecesError({ code: ErrorCode.MEMORY_ISSUE, params: {}, }) } const result = tryParseJson(sandboxResponse.output) as EngineHelperFlowResult const response = { status: sandboxResponse.verdict, result: result as Result, standardError: sandboxResponse.standardError, standardOutput: sandboxResponse.standardOutput, } log.trace(response, '[EngineHelper#response] response') return response }, }) function tryParseJson(value: unknown): unknown { try { return JSON.parse(value as string) } catch (e) { return value } }