File size: 2,998 Bytes
aec3094 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | import type { DataRequestResponse, PartialAdditionalData, TaskData } from '@n8n/task-runner';
import type {
IRunExecutionData,
IWorkflowExecuteAdditionalData,
Workflow,
WorkflowParameters,
} from 'n8n-workflow';
/**
* Transforms TaskData to DataRequestResponse. The main purpose of the
* transformation is to make sure there is no duplication in the data
* (e.g. connectionInputData and executeData.data can be derived from
* inputData).
*/
export class DataRequestResponseBuilder {
buildFromTaskData(taskData: TaskData): DataRequestResponse {
return {
workflow: this.buildWorkflow(taskData.workflow),
inputData: taskData.inputData,
connectionInputSource: taskData.executeData?.source ?? null,
itemIndex: taskData.itemIndex,
activeNodeName: taskData.activeNodeName,
contextNodeName: taskData.contextNodeName,
defaultReturnRunIndex: taskData.defaultReturnRunIndex,
mode: taskData.mode,
envProviderState: taskData.envProviderState,
node: taskData.node,
runExecutionData: this.buildRunExecutionData(taskData.runExecutionData),
runIndex: taskData.runIndex,
selfData: taskData.selfData,
siblingParameters: taskData.siblingParameters,
additionalData: this.buildAdditionalData(taskData.additionalData),
};
}
private buildAdditionalData(
additionalData: IWorkflowExecuteAdditionalData,
): PartialAdditionalData {
return {
formWaitingBaseUrl: additionalData.formWaitingBaseUrl,
instanceBaseUrl: additionalData.instanceBaseUrl,
restApiUrl: additionalData.restApiUrl,
variables: additionalData.variables,
webhookBaseUrl: additionalData.webhookBaseUrl,
webhookTestBaseUrl: additionalData.webhookTestBaseUrl,
webhookWaitingBaseUrl: additionalData.webhookWaitingBaseUrl,
currentNodeParameters: additionalData.currentNodeParameters,
executionId: additionalData.executionId,
executionTimeoutTimestamp: additionalData.executionTimeoutTimestamp,
restartExecutionId: additionalData.restartExecutionId,
userId: additionalData.userId,
};
}
private buildWorkflow(workflow: Workflow): Omit<WorkflowParameters, 'nodeTypes'> {
return {
id: workflow.id,
name: workflow.name,
active: workflow.active,
connections: workflow.connectionsBySourceNode,
nodes: Object.values(workflow.nodes),
pinData: workflow.pinData,
settings: workflow.settings,
staticData: workflow.staticData,
};
}
private buildRunExecutionData(runExecutionData: IRunExecutionData) {
return {
startData: runExecutionData.startData,
resultData: runExecutionData.resultData,
executionData: runExecutionData.executionData
? {
contextData: runExecutionData.executionData.contextData,
metadata: runExecutionData.executionData.metadata,
// These are related to workflow execution and are not something
// that are accessible by nodes, so we always omit them
nodeExecutionStack: [],
waitingExecution: {},
waitingExecutionSource: null,
}
: undefined,
};
}
}
|