n8n/packages/testing/playwright/utils/benchmark/workflow-builder.ts
Declan Carroll fbccfbc7f5
test(benchmark): Add Kafka and webhook benchmark framework (no-changelog) (#26761)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 15:29:50 +00:00

65 lines
1.6 KiB
TypeScript

import { workflow, node } from '@n8n/workflow-sdk';
import type { IWorkflowBase } from 'n8n-workflow';
import { nanoid } from 'nanoid';
import type { NodeOutputSize } from './types';
import { OUTPUT_SIZE_BYTES } from './types';
type TriggerNode = Parameters<ReturnType<typeof workflow>['add']>[0];
export function createChainNode(index: number, outputSize: NodeOutputSize) {
if (outputSize === 'noop') {
return node({
type: 'n8n-nodes-base.noOp',
version: 1,
config: { name: `NoOp ${index}` },
});
}
return node({
type: 'n8n-nodes-base.set',
version: 3.4,
config: {
name: `Set ${index}`,
parameters: {
assignments: {
assignments: [
{
id: 'payload',
name: 'payload',
value: `={{ 'x'.repeat(${OUTPUT_SIZE_BYTES[outputSize]}) }}`,
type: 'string',
},
],
},
includeOtherFields: true,
options: {},
},
},
});
}
/**
* Builds a workflow: triggerNode → N chained nodes.
* The trigger can be any node type — Kafka, Webhook, Cron, etc.
*/
export function buildChainedWorkflow(
name: string,
triggerNode: TriggerNode,
nodeCount: number,
nodeOutputSize: NodeOutputSize = 'noop',
): Partial<IWorkflowBase> {
if (nodeCount <= 0) throw new Error(`nodeCount must be > 0, got ${nodeCount}`);
const [first, ...rest] = Array.from({ length: nodeCount }, (_, i) =>
createChainNode(i + 1, nodeOutputSize),
);
const wf = workflow(nanoid(), name);
wf.add(
rest.reduce((chain, n) => chain.to(n), (triggerNode as ReturnType<typeof node>).to(first)),
);
return wf.toJSON() as Partial<IWorkflowBase>;
}