mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-17 18:12:04 +00:00
refactor(core): Rename some runners files and classes for clarity (#12410)
This commit is contained in:
@@ -225,7 +225,7 @@ export class Start extends BaseCommand {
|
|||||||
|
|
||||||
const { taskRunners: taskRunnerConfig } = this.globalConfig;
|
const { taskRunners: taskRunnerConfig } = this.globalConfig;
|
||||||
if (taskRunnerConfig.enabled) {
|
if (taskRunnerConfig.enabled) {
|
||||||
const { TaskRunnerModule } = await import('@/runners/task-runner-module');
|
const { TaskRunnerModule } = await import('@/task-runners/task-runner-module');
|
||||||
const taskRunnerModule = Container.get(TaskRunnerModule);
|
const taskRunnerModule = Container.get(TaskRunnerModule);
|
||||||
await taskRunnerModule.start();
|
await taskRunnerModule.start();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ export class Worker extends BaseCommand {
|
|||||||
|
|
||||||
const { taskRunners: taskRunnerConfig } = this.globalConfig;
|
const { taskRunners: taskRunnerConfig } = this.globalConfig;
|
||||||
if (taskRunnerConfig.enabled) {
|
if (taskRunnerConfig.enabled) {
|
||||||
const { TaskRunnerModule } = await import('@/runners/task-runner-module');
|
const { TaskRunnerModule } = await import('@/task-runners/task-runner-module');
|
||||||
const taskRunnerModule = Container.get(TaskRunnerModule);
|
const taskRunnerModule = Container.get(TaskRunnerModule);
|
||||||
await taskRunnerModule.start();
|
await taskRunnerModule.start();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,9 +7,9 @@ import { Time } from '@/constants';
|
|||||||
|
|
||||||
import { TaskRejectError } from '../errors';
|
import { TaskRejectError } from '../errors';
|
||||||
import { TaskRunnerTimeoutError } from '../errors/task-runner-timeout.error';
|
import { TaskRunnerTimeoutError } from '../errors/task-runner-timeout.error';
|
||||||
import type { RunnerLifecycleEvents } from '../runner-lifecycle-events';
|
|
||||||
import { TaskBroker } from '../task-broker.service';
|
import { TaskBroker } from '../task-broker.service';
|
||||||
import type { TaskOffer, TaskRequest, TaskRunner } from '../task-broker.service';
|
import type { TaskOffer, TaskRequest, TaskRunner } from '../task-broker.service';
|
||||||
|
import type { TaskRunnerLifecycleEvents } from '../task-runner-lifecycle-events';
|
||||||
|
|
||||||
const createValidUntil = (ms: number) => process.hrtime.bigint() + BigInt(ms * 1_000_000);
|
const createValidUntil = (ms: number) => process.hrtime.bigint() + BigInt(ms * 1_000_000);
|
||||||
|
|
||||||
@@ -718,7 +718,7 @@ describe('TaskBroker', () => {
|
|||||||
describe('task timeouts', () => {
|
describe('task timeouts', () => {
|
||||||
let taskBroker: TaskBroker;
|
let taskBroker: TaskBroker;
|
||||||
let config: TaskRunnersConfig;
|
let config: TaskRunnersConfig;
|
||||||
let runnerLifecycleEvents = mock<RunnerLifecycleEvents>();
|
let runnerLifecycleEvents = mock<TaskRunnerLifecycleEvents>();
|
||||||
|
|
||||||
beforeAll(() => {
|
beforeAll(() => {
|
||||||
jest.useFakeTimers();
|
jest.useFakeTimers();
|
||||||
@@ -2,11 +2,11 @@ import { TaskRunnersConfig } from '@n8n/config';
|
|||||||
import { mock } from 'jest-mock-extended';
|
import { mock } from 'jest-mock-extended';
|
||||||
import type { Logger } from 'n8n-core';
|
import type { Logger } from 'n8n-core';
|
||||||
|
|
||||||
import type { TaskRunnerAuthService } from '@/runners/auth/task-runner-auth.service';
|
import type { TaskRunnerAuthService } from '@/task-runners/auth/task-runner-auth.service';
|
||||||
import { TaskRunnerRestartLoopError } from '@/runners/errors/task-runner-restart-loop-error';
|
import { TaskRunnerRestartLoopError } from '@/task-runners/errors/task-runner-restart-loop-error';
|
||||||
import { RunnerLifecycleEvents } from '@/runners/runner-lifecycle-events';
|
import { TaskRunnerLifecycleEvents } from '@/task-runners/task-runner-lifecycle-events';
|
||||||
import { TaskRunnerProcess } from '@/runners/task-runner-process';
|
import { TaskRunnerProcess } from '@/task-runners/task-runner-process';
|
||||||
import { TaskRunnerProcessRestartLoopDetector } from '@/runners/task-runner-process-restart-loop-detector';
|
import { TaskRunnerProcessRestartLoopDetector } from '@/task-runners/task-runner-process-restart-loop-detector';
|
||||||
|
|
||||||
describe('TaskRunnerProcessRestartLoopDetector', () => {
|
describe('TaskRunnerProcessRestartLoopDetector', () => {
|
||||||
const mockLogger = mock<Logger>();
|
const mockLogger = mock<Logger>();
|
||||||
@@ -16,7 +16,7 @@ describe('TaskRunnerProcessRestartLoopDetector', () => {
|
|||||||
mockLogger,
|
mockLogger,
|
||||||
runnerConfig,
|
runnerConfig,
|
||||||
mockAuthService,
|
mockAuthService,
|
||||||
new RunnerLifecycleEvents(),
|
new TaskRunnerLifecycleEvents(),
|
||||||
);
|
);
|
||||||
|
|
||||||
it('should detect a restart loop if process exits 5 times within 5s', () => {
|
it('should detect a restart loop if process exits 5 times within 5s', () => {
|
||||||
@@ -3,11 +3,11 @@ import { mock } from 'jest-mock-extended';
|
|||||||
import { Logger } from 'n8n-core';
|
import { Logger } from 'n8n-core';
|
||||||
import type { ChildProcess, SpawnOptions } from 'node:child_process';
|
import type { ChildProcess, SpawnOptions } from 'node:child_process';
|
||||||
|
|
||||||
import type { TaskRunnerAuthService } from '@/runners/auth/task-runner-auth.service';
|
import type { TaskRunnerAuthService } from '@/task-runners/auth/task-runner-auth.service';
|
||||||
import { TaskRunnerProcess } from '@/runners/task-runner-process';
|
import { TaskRunnerProcess } from '@/task-runners/task-runner-process';
|
||||||
import { mockInstance } from '@test/mocking';
|
import { mockInstance } from '@test/mocking';
|
||||||
|
|
||||||
import type { RunnerLifecycleEvents } from '../runner-lifecycle-events';
|
import type { TaskRunnerLifecycleEvents } from '../task-runner-lifecycle-events';
|
||||||
|
|
||||||
const spawnMock = jest.fn(() =>
|
const spawnMock = jest.fn(() =>
|
||||||
mock<ChildProcess>({
|
mock<ChildProcess>({
|
||||||
@@ -43,7 +43,7 @@ describe('TaskRunnerProcess', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should register listener for `runner:failed-heartbeat-check` event', () => {
|
it('should register listener for `runner:failed-heartbeat-check` event', () => {
|
||||||
const runnerLifecycleEvents = mock<RunnerLifecycleEvents>();
|
const runnerLifecycleEvents = mock<TaskRunnerLifecycleEvents>();
|
||||||
new TaskRunnerProcess(logger, runnerConfig, authService, runnerLifecycleEvents);
|
new TaskRunnerProcess(logger, runnerConfig, authService, runnerLifecycleEvents);
|
||||||
|
|
||||||
expect(runnerLifecycleEvents.on).toHaveBeenCalledWith(
|
expect(runnerLifecycleEvents.on).toHaveBeenCalledWith(
|
||||||
@@ -53,7 +53,7 @@ describe('TaskRunnerProcess', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should register listener for `runner:timed-out-during-task` event', () => {
|
it('should register listener for `runner:timed-out-during-task` event', () => {
|
||||||
const runnerLifecycleEvents = mock<RunnerLifecycleEvents>();
|
const runnerLifecycleEvents = mock<TaskRunnerLifecycleEvents>();
|
||||||
new TaskRunnerProcess(logger, runnerConfig, authService, runnerLifecycleEvents);
|
new TaskRunnerProcess(logger, runnerConfig, authService, runnerLifecycleEvents);
|
||||||
|
|
||||||
expect(runnerLifecycleEvents.on).toHaveBeenCalledWith(
|
expect(runnerLifecycleEvents.on).toHaveBeenCalledWith(
|
||||||
@@ -3,10 +3,10 @@ import { mock } from 'jest-mock-extended';
|
|||||||
import { ServerResponse } from 'node:http';
|
import { ServerResponse } from 'node:http';
|
||||||
import type WebSocket from 'ws';
|
import type WebSocket from 'ws';
|
||||||
|
|
||||||
import type { TaskRunnerAuthController } from '@/runners/auth/task-runner-auth.controller';
|
import type { TaskRunnerAuthController } from '@/task-runners/auth/task-runner-auth.controller';
|
||||||
import { TaskRunnerServer } from '@/runners/task-runner-server';
|
import { TaskRunnerServer } from '@/task-runners/task-runner-server';
|
||||||
|
|
||||||
import type { TaskRunnerServerInitRequest } from '../runner-types';
|
import type { TaskRunnerServerInitRequest } from '../task-runner-types';
|
||||||
|
|
||||||
describe('TaskRunnerServer', () => {
|
describe('TaskRunnerServer', () => {
|
||||||
describe('handleUpgradeRequest', () => {
|
describe('handleUpgradeRequest', () => {
|
||||||
@@ -3,7 +3,7 @@ import { mock } from 'jest-mock-extended';
|
|||||||
import type WebSocket from 'ws';
|
import type WebSocket from 'ws';
|
||||||
|
|
||||||
import { Time, WsStatusCodes } from '@/constants';
|
import { Time, WsStatusCodes } from '@/constants';
|
||||||
import { TaskRunnerWsServer } from '@/runners/runner-ws-server';
|
import { TaskRunnerWsServer } from '@/task-runners/task-runner-ws-server';
|
||||||
|
|
||||||
describe('TaskRunnerWsServer', () => {
|
describe('TaskRunnerWsServer', () => {
|
||||||
describe('removeConnection', () => {
|
describe('removeConnection', () => {
|
||||||
@@ -8,7 +8,7 @@ import { mockInstance } from '@test/mocking';
|
|||||||
import { BadRequestError } from '../../../errors/response-errors/bad-request.error';
|
import { BadRequestError } from '../../../errors/response-errors/bad-request.error';
|
||||||
import { ForbiddenError } from '../../../errors/response-errors/forbidden.error';
|
import { ForbiddenError } from '../../../errors/response-errors/forbidden.error';
|
||||||
import type { AuthlessRequest } from '../../../requests';
|
import type { AuthlessRequest } from '../../../requests';
|
||||||
import type { TaskRunnerServerInitRequest } from '../../runner-types';
|
import type { TaskRunnerServerInitRequest } from '../../task-runner-types';
|
||||||
import { TaskRunnerAuthController } from '../task-runner-auth.controller';
|
import { TaskRunnerAuthController } from '../task-runner-auth.controller';
|
||||||
import { TaskRunnerAuthService } from '../task-runner-auth.service';
|
import { TaskRunnerAuthService } from '../task-runner-auth.service';
|
||||||
|
|
||||||
@@ -7,7 +7,7 @@ import { taskRunnerAuthRequestBodySchema } from './task-runner-auth.schema';
|
|||||||
import { TaskRunnerAuthService } from './task-runner-auth.service';
|
import { TaskRunnerAuthService } from './task-runner-auth.service';
|
||||||
import { BadRequestError } from '../../errors/response-errors/bad-request.error';
|
import { BadRequestError } from '../../errors/response-errors/bad-request.error';
|
||||||
import { ForbiddenError } from '../../errors/response-errors/forbidden.error';
|
import { ForbiddenError } from '../../errors/response-errors/forbidden.error';
|
||||||
import type { TaskRunnerServerInitRequest } from '../runner-types';
|
import type { TaskRunnerServerInitRequest } from '../task-runner-types';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Controller responsible for authenticating Task Runner connections
|
* Controller responsible for authenticating Task Runner connections
|
||||||
@@ -4,7 +4,7 @@ import config from '@/config';
|
|||||||
|
|
||||||
import { TaskRunnerDisconnectedError } from './errors/task-runner-disconnected-error';
|
import { TaskRunnerDisconnectedError } from './errors/task-runner-disconnected-error';
|
||||||
import { TaskRunnerFailedHeartbeatError } from './errors/task-runner-failed-heartbeat.error';
|
import { TaskRunnerFailedHeartbeatError } from './errors/task-runner-failed-heartbeat.error';
|
||||||
import type { DisconnectAnalyzer, DisconnectErrorOptions } from './runner-types';
|
import type { DisconnectAnalyzer, DisconnectErrorOptions } from './task-runner-types';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Analyzes the disconnect reason of a task runner to provide a more
|
* Analyzes the disconnect reason of a task runner to provide a more
|
||||||
@@ -3,10 +3,10 @@ import { Service } from 'typedi';
|
|||||||
|
|
||||||
import { DefaultTaskRunnerDisconnectAnalyzer } from './default-task-runner-disconnect-analyzer';
|
import { DefaultTaskRunnerDisconnectAnalyzer } from './default-task-runner-disconnect-analyzer';
|
||||||
import { TaskRunnerOomError } from './errors/task-runner-oom-error';
|
import { TaskRunnerOomError } from './errors/task-runner-oom-error';
|
||||||
import type { DisconnectErrorOptions } from './runner-types';
|
|
||||||
import { SlidingWindowSignal } from './sliding-window-signal';
|
import { SlidingWindowSignal } from './sliding-window-signal';
|
||||||
import type { ExitReason, TaskRunnerProcessEventMap } from './task-runner-process';
|
import type { ExitReason, TaskRunnerProcessEventMap } from './task-runner-process';
|
||||||
import { TaskRunnerProcess } from './task-runner-process';
|
import { TaskRunnerProcess } from './task-runner-process';
|
||||||
|
import type { DisconnectErrorOptions } from './task-runner-types';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Analyzes the disconnect reason of a task runner process to provide a more
|
* Analyzes the disconnect reason of a task runner process to provide a more
|
||||||
@@ -15,7 +15,7 @@ import { Time } from '@/constants';
|
|||||||
|
|
||||||
import { TaskDeferredError, TaskRejectError } from './errors';
|
import { TaskDeferredError, TaskRejectError } from './errors';
|
||||||
import { TaskRunnerTimeoutError } from './errors/task-runner-timeout.error';
|
import { TaskRunnerTimeoutError } from './errors/task-runner-timeout.error';
|
||||||
import { RunnerLifecycleEvents } from './runner-lifecycle-events';
|
import { TaskRunnerLifecycleEvents } from './task-runner-lifecycle-events';
|
||||||
|
|
||||||
export interface TaskRunner {
|
export interface TaskRunner {
|
||||||
id: string;
|
id: string;
|
||||||
@@ -89,7 +89,7 @@ export class TaskBroker {
|
|||||||
constructor(
|
constructor(
|
||||||
private readonly logger: Logger,
|
private readonly logger: Logger,
|
||||||
private readonly taskRunnersConfig: TaskRunnersConfig,
|
private readonly taskRunnersConfig: TaskRunnersConfig,
|
||||||
private readonly runnerLifecycleEvents: RunnerLifecycleEvents,
|
private readonly taskRunnerLifecycleEvents: TaskRunnerLifecycleEvents,
|
||||||
) {
|
) {
|
||||||
if (this.taskRunnersConfig.taskTimeout <= 0) {
|
if (this.taskRunnersConfig.taskTimeout <= 0) {
|
||||||
throw new ApplicationError('Task timeout must be greater than 0');
|
throw new ApplicationError('Task timeout must be greater than 0');
|
||||||
@@ -460,7 +460,7 @@ export class TaskBroker {
|
|||||||
if (!task) return;
|
if (!task) return;
|
||||||
|
|
||||||
if (this.taskRunnersConfig.mode === 'internal') {
|
if (this.taskRunnersConfig.mode === 'internal') {
|
||||||
this.runnerLifecycleEvents.emit('runner:timed-out-during-task');
|
this.taskRunnerLifecycleEvents.emit('runner:timed-out-during-task');
|
||||||
} else if (this.taskRunnersConfig.mode === 'external') {
|
} else if (this.taskRunnersConfig.mode === 'external') {
|
||||||
await this.messageRunner(task.runnerId, {
|
await this.messageRunner(task.runnerId, {
|
||||||
type: 'broker:taskcancel',
|
type: 'broker:taskcancel',
|
||||||
@@ -2,10 +2,10 @@ import { mock } from 'jest-mock-extended';
|
|||||||
import { get, set } from 'lodash';
|
import { get, set } from 'lodash';
|
||||||
|
|
||||||
import type { NodeTypes } from '@/node-types';
|
import type { NodeTypes } from '@/node-types';
|
||||||
import type { Task } from '@/runners/task-managers/task-manager';
|
import type { Task } from '@/task-runners/task-managers/task-requester';
|
||||||
import { TaskManager } from '@/runners/task-managers/task-manager';
|
import { TaskRequester } from '@/task-runners/task-managers/task-requester';
|
||||||
|
|
||||||
class TestTaskManager extends TaskManager {
|
class TestTaskRequester extends TaskRequester {
|
||||||
sentMessages: unknown[] = [];
|
sentMessages: unknown[] = [];
|
||||||
|
|
||||||
sendMessage(message: unknown) {
|
sendMessage(message: unknown) {
|
||||||
@@ -13,12 +13,12 @@ class TestTaskManager extends TaskManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
describe('TaskManager', () => {
|
describe('TaskRequester', () => {
|
||||||
let instance: TestTaskManager;
|
let instance: TestTaskRequester;
|
||||||
const mockNodeTypes = mock<NodeTypes>();
|
const mockNodeTypes = mock<NodeTypes>();
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
instance = new TestTaskManager(mockNodeTypes);
|
instance = new TestTaskRequester(mockNodeTypes);
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('handleRpc', () => {
|
describe('handleRpc', () => {
|
||||||
@@ -3,15 +3,15 @@ import Container, { Service } from 'typedi';
|
|||||||
|
|
||||||
import { NodeTypes } from '@/node-types';
|
import { NodeTypes } from '@/node-types';
|
||||||
|
|
||||||
import { TaskManager } from './task-manager';
|
import { TaskRequester } from './task-requester';
|
||||||
import type { RequesterMessageCallback } from '../task-broker.service';
|
import type { RequesterMessageCallback } from '../task-broker.service';
|
||||||
import { TaskBroker } from '../task-broker.service';
|
import { TaskBroker } from '../task-broker.service';
|
||||||
|
|
||||||
@Service()
|
@Service()
|
||||||
export class LocalTaskManager extends TaskManager {
|
export class LocalTaskRequester extends TaskRequester {
|
||||||
taskBroker: TaskBroker;
|
taskBroker: TaskBroker;
|
||||||
|
|
||||||
id: string = 'single-main';
|
id = 'local-task-requester';
|
||||||
|
|
||||||
constructor(nodeTypes: NodeTypes) {
|
constructor(nodeTypes: NodeTypes) {
|
||||||
super(nodeTypes);
|
super(nodeTypes);
|
||||||
@@ -49,7 +49,7 @@ interface ExecuteFunctionObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Service()
|
@Service()
|
||||||
export abstract class TaskManager {
|
export abstract class TaskRequester {
|
||||||
requestAcceptRejects: Map<string, { accept: RequestAccept; reject: RequestReject }> = new Map();
|
requestAcceptRejects: Map<string, { accept: RequestAccept; reject: RequestReject }> = new Map();
|
||||||
|
|
||||||
taskAcceptRejects: Map<string, { accept: TaskAccept; reject: TaskReject }> = new Map();
|
taskAcceptRejects: Map<string, { accept: TaskAccept; reject: TaskReject }> = new Map();
|
||||||
@@ -2,10 +2,10 @@ import { Service } from 'typedi';
|
|||||||
|
|
||||||
import { TypedEmitter } from '@/typed-emitter';
|
import { TypedEmitter } from '@/typed-emitter';
|
||||||
|
|
||||||
type RunnerLifecycleEventMap = {
|
type TaskRunnerLifecycleEventMap = {
|
||||||
'runner:failed-heartbeat-check': never;
|
'runner:failed-heartbeat-check': never;
|
||||||
'runner:timed-out-during-task': never;
|
'runner:timed-out-during-task': never;
|
||||||
};
|
};
|
||||||
|
|
||||||
@Service()
|
@Service()
|
||||||
export class RunnerLifecycleEvents extends TypedEmitter<RunnerLifecycleEventMap> {}
|
export class TaskRunnerLifecycleEvents extends TypedEmitter<TaskRunnerLifecycleEventMap> {}
|
||||||
@@ -5,14 +5,14 @@ import * as a from 'node:assert/strict';
|
|||||||
import Container, { Service } from 'typedi';
|
import Container, { Service } from 'typedi';
|
||||||
|
|
||||||
import { OnShutdown } from '@/decorators/on-shutdown';
|
import { OnShutdown } from '@/decorators/on-shutdown';
|
||||||
import type { TaskRunnerRestartLoopError } from '@/runners/errors/task-runner-restart-loop-error';
|
import type { TaskRunnerRestartLoopError } from '@/task-runners/errors/task-runner-restart-loop-error';
|
||||||
import type { TaskRunnerProcess } from '@/runners/task-runner-process';
|
import type { TaskRunnerProcess } from '@/task-runners/task-runner-process';
|
||||||
import { TaskRunnerProcessRestartLoopDetector } from '@/runners/task-runner-process-restart-loop-detector';
|
import { TaskRunnerProcessRestartLoopDetector } from '@/task-runners/task-runner-process-restart-loop-detector';
|
||||||
|
|
||||||
import { MissingAuthTokenError } from './errors/missing-auth-token.error';
|
import { MissingAuthTokenError } from './errors/missing-auth-token.error';
|
||||||
import { TaskRunnerWsServer } from './runner-ws-server';
|
import type { LocalTaskRequester } from './task-managers/local-task-requester';
|
||||||
import type { LocalTaskManager } from './task-managers/local-task-manager';
|
|
||||||
import type { TaskRunnerServer } from './task-runner-server';
|
import type { TaskRunnerServer } from './task-runner-server';
|
||||||
|
import { TaskRunnerWsServer } from './task-runner-ws-server';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Module responsible for loading and starting task runner. Task runner can be
|
* Module responsible for loading and starting task runner. Task runner can be
|
||||||
@@ -25,7 +25,7 @@ export class TaskRunnerModule {
|
|||||||
|
|
||||||
private taskRunnerWsServer: TaskRunnerWsServer | undefined;
|
private taskRunnerWsServer: TaskRunnerWsServer | undefined;
|
||||||
|
|
||||||
private taskManager: LocalTaskManager | undefined;
|
private taskRequester: LocalTaskRequester | undefined;
|
||||||
|
|
||||||
private taskRunnerProcess: TaskRunnerProcess | undefined;
|
private taskRunnerProcess: TaskRunnerProcess | undefined;
|
||||||
|
|
||||||
@@ -46,7 +46,7 @@ export class TaskRunnerModule {
|
|||||||
|
|
||||||
if (mode === 'external' && !authToken) throw new MissingAuthTokenError();
|
if (mode === 'external' && !authToken) throw new MissingAuthTokenError();
|
||||||
|
|
||||||
await this.loadTaskManager();
|
await this.loadTaskRequester();
|
||||||
await this.loadTaskRunnerServer();
|
await this.loadTaskRunnerServer();
|
||||||
|
|
||||||
if (mode === 'internal') {
|
if (mode === 'internal') {
|
||||||
@@ -73,17 +73,19 @@ export class TaskRunnerModule {
|
|||||||
await Promise.all([stopRunnerProcessTask, stopRunnerServerTask]);
|
await Promise.all([stopRunnerProcessTask, stopRunnerServerTask]);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async loadTaskManager() {
|
private async loadTaskRequester() {
|
||||||
const { TaskManager } = await import('@/runners/task-managers/task-manager');
|
const { TaskRequester } = await import('@/task-runners/task-managers/task-requester');
|
||||||
const { LocalTaskManager } = await import('@/runners/task-managers/local-task-manager');
|
const { LocalTaskRequester } = await import(
|
||||||
this.taskManager = Container.get(LocalTaskManager);
|
'@/task-runners/task-managers/local-task-requester'
|
||||||
Container.set(TaskManager, this.taskManager);
|
);
|
||||||
|
this.taskRequester = Container.get(LocalTaskRequester);
|
||||||
|
Container.set(TaskRequester, this.taskRequester);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async loadTaskRunnerServer() {
|
private async loadTaskRunnerServer() {
|
||||||
// These are imported dynamically because we need to set the task manager
|
// These are imported dynamically because we need to set the task manager
|
||||||
// instance before importing them
|
// instance before importing them
|
||||||
const { TaskRunnerServer } = await import('@/runners/task-runner-server');
|
const { TaskRunnerServer } = await import('@/task-runners/task-runner-server');
|
||||||
this.taskRunnerHttpServer = Container.get(TaskRunnerServer);
|
this.taskRunnerHttpServer = Container.get(TaskRunnerServer);
|
||||||
this.taskRunnerWsServer = Container.get(TaskRunnerWsServer);
|
this.taskRunnerWsServer = Container.get(TaskRunnerWsServer);
|
||||||
|
|
||||||
@@ -93,7 +95,7 @@ export class TaskRunnerModule {
|
|||||||
private async startInternalTaskRunner() {
|
private async startInternalTaskRunner() {
|
||||||
a.ok(this.taskRunnerWsServer, 'Task Runner WS Server not loaded');
|
a.ok(this.taskRunnerWsServer, 'Task Runner WS Server not loaded');
|
||||||
|
|
||||||
const { TaskRunnerProcess } = await import('@/runners/task-runner-process');
|
const { TaskRunnerProcess } = await import('@/task-runners/task-runner-process');
|
||||||
this.taskRunnerProcess = Container.get(TaskRunnerProcess);
|
this.taskRunnerProcess = Container.get(TaskRunnerProcess);
|
||||||
this.taskRunnerProcessRestartLoopDetector = new TaskRunnerProcessRestartLoopDetector(
|
this.taskRunnerProcessRestartLoopDetector = new TaskRunnerProcessRestartLoopDetector(
|
||||||
this.taskRunnerProcess,
|
this.taskRunnerProcess,
|
||||||
@@ -106,7 +108,7 @@ export class TaskRunnerModule {
|
|||||||
await this.taskRunnerProcess.start();
|
await this.taskRunnerProcess.start();
|
||||||
|
|
||||||
const { InternalTaskRunnerDisconnectAnalyzer } = await import(
|
const { InternalTaskRunnerDisconnectAnalyzer } = await import(
|
||||||
'@/runners/internal-task-runner-disconnect-analyzer'
|
'@/task-runners/internal-task-runner-disconnect-analyzer'
|
||||||
);
|
);
|
||||||
this.taskRunnerWsServer.setDisconnectAnalyzer(
|
this.taskRunnerWsServer.setDisconnectAnalyzer(
|
||||||
Container.get(InternalTaskRunnerDisconnectAnalyzer),
|
Container.get(InternalTaskRunnerDisconnectAnalyzer),
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Time } from '@/constants';
|
import { Time } from '@/constants';
|
||||||
import { TaskRunnerRestartLoopError } from '@/runners/errors/task-runner-restart-loop-error';
|
import { TaskRunnerRestartLoopError } from '@/task-runners/errors/task-runner-restart-loop-error';
|
||||||
import type { TaskRunnerProcess } from '@/runners/task-runner-process';
|
import type { TaskRunnerProcess } from '@/task-runners/task-runner-process';
|
||||||
import { TypedEmitter } from '@/typed-emitter';
|
import { TypedEmitter } from '@/typed-emitter';
|
||||||
|
|
||||||
const MAX_RESTARTS = 5;
|
const MAX_RESTARTS = 5;
|
||||||
@@ -10,7 +10,7 @@ import { OnShutdown } from '@/decorators/on-shutdown';
|
|||||||
import { TaskRunnerAuthService } from './auth/task-runner-auth.service';
|
import { TaskRunnerAuthService } from './auth/task-runner-auth.service';
|
||||||
import { forwardToLogger } from './forward-to-logger';
|
import { forwardToLogger } from './forward-to-logger';
|
||||||
import { NodeProcessOomDetector } from './node-process-oom-detector';
|
import { NodeProcessOomDetector } from './node-process-oom-detector';
|
||||||
import { RunnerLifecycleEvents } from './runner-lifecycle-events';
|
import { TaskRunnerLifecycleEvents } from './task-runner-lifecycle-events';
|
||||||
import { TypedEmitter } from '../typed-emitter';
|
import { TypedEmitter } from '../typed-emitter';
|
||||||
|
|
||||||
type ChildProcess = ReturnType<typeof spawn>;
|
type ChildProcess = ReturnType<typeof spawn>;
|
||||||
@@ -68,7 +68,7 @@ export class TaskRunnerProcess extends TypedEmitter<TaskRunnerProcessEventMap> {
|
|||||||
logger: Logger,
|
logger: Logger,
|
||||||
private readonly runnerConfig: TaskRunnersConfig,
|
private readonly runnerConfig: TaskRunnersConfig,
|
||||||
private readonly authService: TaskRunnerAuthService,
|
private readonly authService: TaskRunnerAuthService,
|
||||||
private readonly runnerLifecycleEvents: RunnerLifecycleEvents,
|
private readonly runnerLifecycleEvents: TaskRunnerLifecycleEvents,
|
||||||
) {
|
) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
@@ -13,12 +13,12 @@ import { Server as WSServer } from 'ws';
|
|||||||
import { inTest } from '@/constants';
|
import { inTest } from '@/constants';
|
||||||
import { bodyParser, rawBodyReader } from '@/middlewares';
|
import { bodyParser, rawBodyReader } from '@/middlewares';
|
||||||
import { send } from '@/response-helper';
|
import { send } from '@/response-helper';
|
||||||
import { TaskRunnerAuthController } from '@/runners/auth/task-runner-auth.controller';
|
import { TaskRunnerAuthController } from '@/task-runners/auth/task-runner-auth.controller';
|
||||||
import type {
|
import type {
|
||||||
TaskRunnerServerInitRequest,
|
TaskRunnerServerInitRequest,
|
||||||
TaskRunnerServerInitResponse,
|
TaskRunnerServerInitResponse,
|
||||||
} from '@/runners/runner-types';
|
} from '@/task-runners/task-runner-types';
|
||||||
import { TaskRunnerWsServer } from '@/runners/runner-ws-server';
|
import { TaskRunnerWsServer } from '@/task-runners/task-runner-ws-server';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Task Runner HTTP & WS server
|
* Task Runner HTTP & WS server
|
||||||
@@ -8,14 +8,14 @@ import type WebSocket from 'ws';
|
|||||||
import { Time, WsStatusCodes } from '@/constants';
|
import { Time, WsStatusCodes } from '@/constants';
|
||||||
|
|
||||||
import { DefaultTaskRunnerDisconnectAnalyzer } from './default-task-runner-disconnect-analyzer';
|
import { DefaultTaskRunnerDisconnectAnalyzer } from './default-task-runner-disconnect-analyzer';
|
||||||
import { RunnerLifecycleEvents } from './runner-lifecycle-events';
|
import { TaskBroker, type MessageCallback, type TaskRunner } from './task-broker.service';
|
||||||
|
import { TaskRunnerLifecycleEvents } from './task-runner-lifecycle-events';
|
||||||
import type {
|
import type {
|
||||||
DisconnectAnalyzer,
|
DisconnectAnalyzer,
|
||||||
DisconnectReason,
|
DisconnectReason,
|
||||||
TaskRunnerServerInitRequest,
|
TaskRunnerServerInitRequest,
|
||||||
TaskRunnerServerInitResponse,
|
TaskRunnerServerInitResponse,
|
||||||
} from './runner-types';
|
} from './task-runner-types';
|
||||||
import { TaskBroker, type MessageCallback, type TaskRunner } from './task-broker.service';
|
|
||||||
|
|
||||||
function heartbeat(this: WebSocket) {
|
function heartbeat(this: WebSocket) {
|
||||||
this.isAlive = true;
|
this.isAlive = true;
|
||||||
@@ -34,7 +34,7 @@ export class TaskRunnerWsServer {
|
|||||||
private readonly taskBroker: TaskBroker,
|
private readonly taskBroker: TaskBroker,
|
||||||
private disconnectAnalyzer: DefaultTaskRunnerDisconnectAnalyzer,
|
private disconnectAnalyzer: DefaultTaskRunnerDisconnectAnalyzer,
|
||||||
private readonly taskTunnersConfig: TaskRunnersConfig,
|
private readonly taskTunnersConfig: TaskRunnersConfig,
|
||||||
private readonly runnerLifecycleEvents: RunnerLifecycleEvents,
|
private readonly runnerLifecycleEvents: TaskRunnerLifecycleEvents,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
start() {
|
start() {
|
||||||
@@ -58,11 +58,11 @@ import {
|
|||||||
updateExistingExecution,
|
updateExistingExecution,
|
||||||
} from './execution-lifecycle-hooks/shared/shared-hook-functions';
|
} from './execution-lifecycle-hooks/shared/shared-hook-functions';
|
||||||
import { toSaveSettings } from './execution-lifecycle-hooks/to-save-settings';
|
import { toSaveSettings } from './execution-lifecycle-hooks/to-save-settings';
|
||||||
import { TaskManager } from './runners/task-managers/task-manager';
|
|
||||||
import { SecretsHelper } from './secrets-helpers.ee';
|
import { SecretsHelper } from './secrets-helpers.ee';
|
||||||
import { OwnershipService } from './services/ownership.service';
|
import { OwnershipService } from './services/ownership.service';
|
||||||
import { UrlService } from './services/url.service';
|
import { UrlService } from './services/url.service';
|
||||||
import { SubworkflowPolicyChecker } from './subworkflows/subworkflow-policy-checker.service';
|
import { SubworkflowPolicyChecker } from './subworkflows/subworkflow-policy-checker.service';
|
||||||
|
import { TaskRequester } from './task-runners/task-managers/task-requester';
|
||||||
import { PermissionChecker } from './user-management/permission-checker';
|
import { PermissionChecker } from './user-management/permission-checker';
|
||||||
import { WorkflowExecutionService } from './workflows/workflow-execution.service';
|
import { WorkflowExecutionService } from './workflows/workflow-execution.service';
|
||||||
import { WorkflowStaticDataService } from './workflows/workflow-static-data.service';
|
import { WorkflowStaticDataService } from './workflows/workflow-static-data.service';
|
||||||
@@ -1015,7 +1015,7 @@ export async function getBase(
|
|||||||
setExecutionStatus,
|
setExecutionStatus,
|
||||||
variables,
|
variables,
|
||||||
secretsHelpers: Container.get(SecretsHelper),
|
secretsHelpers: Container.get(SecretsHelper),
|
||||||
async startAgentJob(
|
async startRunnerTask(
|
||||||
additionalData: IWorkflowExecuteAdditionalData,
|
additionalData: IWorkflowExecuteAdditionalData,
|
||||||
jobType: string,
|
jobType: string,
|
||||||
settings: unknown,
|
settings: unknown,
|
||||||
@@ -1033,7 +1033,7 @@ export async function getBase(
|
|||||||
envProviderState: EnvProviderState,
|
envProviderState: EnvProviderState,
|
||||||
executeData?: IExecuteData,
|
executeData?: IExecuteData,
|
||||||
) {
|
) {
|
||||||
return await Container.get(TaskManager).startTask(
|
return await Container.get(TaskRequester).startTask(
|
||||||
additionalData,
|
additionalData,
|
||||||
jobType,
|
jobType,
|
||||||
settings,
|
settings,
|
||||||
|
|||||||
@@ -13,12 +13,12 @@ import { ExternalSecretsManager } from '@/external-secrets.ee/external-secrets-m
|
|||||||
import { License } from '@/license';
|
import { License } from '@/license';
|
||||||
import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials';
|
import { LoadNodesAndCredentials } from '@/load-nodes-and-credentials';
|
||||||
import { Push } from '@/push';
|
import { Push } from '@/push';
|
||||||
import { TaskRunnerProcess } from '@/runners/task-runner-process';
|
|
||||||
import { TaskRunnerServer } from '@/runners/task-runner-server';
|
|
||||||
import { Publisher } from '@/scaling/pubsub/publisher.service';
|
import { Publisher } from '@/scaling/pubsub/publisher.service';
|
||||||
import { Subscriber } from '@/scaling/pubsub/subscriber.service';
|
import { Subscriber } from '@/scaling/pubsub/subscriber.service';
|
||||||
import { ScalingService } from '@/scaling/scaling.service';
|
import { ScalingService } from '@/scaling/scaling.service';
|
||||||
import { OrchestrationService } from '@/services/orchestration.service';
|
import { OrchestrationService } from '@/services/orchestration.service';
|
||||||
|
import { TaskRunnerProcess } from '@/task-runners/task-runner-process';
|
||||||
|
import { TaskRunnerServer } from '@/task-runners/task-runner-server';
|
||||||
import { Telemetry } from '@/telemetry';
|
import { Telemetry } from '@/telemetry';
|
||||||
import { setupTestCommand } from '@test-integration/utils/test-command';
|
import { setupTestCommand } from '@test-integration/utils/test-command';
|
||||||
|
|
||||||
|
|||||||
@@ -2,11 +2,11 @@ import { TaskRunnersConfig } from '@n8n/config';
|
|||||||
import { mock } from 'jest-mock-extended';
|
import { mock } from 'jest-mock-extended';
|
||||||
import Container from 'typedi';
|
import Container from 'typedi';
|
||||||
|
|
||||||
import { MissingAuthTokenError } from '@/runners/errors/missing-auth-token.error';
|
import { MissingAuthTokenError } from '@/task-runners/errors/missing-auth-token.error';
|
||||||
import { TaskRunnerModule } from '@/runners/task-runner-module';
|
import { TaskRunnerModule } from '@/task-runners/task-runner-module';
|
||||||
|
|
||||||
import { DefaultTaskRunnerDisconnectAnalyzer } from '../../../src/runners/default-task-runner-disconnect-analyzer';
|
import { DefaultTaskRunnerDisconnectAnalyzer } from '../../../src/task-runners/default-task-runner-disconnect-analyzer';
|
||||||
import { TaskRunnerWsServer } from '../../../src/runners/runner-ws-server';
|
import { TaskRunnerWsServer } from '../../../src/task-runners/task-runner-ws-server';
|
||||||
|
|
||||||
describe('TaskRunnerModule in external mode', () => {
|
describe('TaskRunnerModule in external mode', () => {
|
||||||
const runnerConfig = Container.get(TaskRunnersConfig);
|
const runnerConfig = Container.get(TaskRunnersConfig);
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import { TaskRunnersConfig } from '@n8n/config';
|
import { TaskRunnersConfig } from '@n8n/config';
|
||||||
import Container from 'typedi';
|
import Container from 'typedi';
|
||||||
|
|
||||||
import { TaskRunnerModule } from '@/runners/task-runner-module';
|
import { TaskRunnerModule } from '@/task-runners/task-runner-module';
|
||||||
|
|
||||||
import { InternalTaskRunnerDisconnectAnalyzer } from '../../../src/runners/internal-task-runner-disconnect-analyzer';
|
import { InternalTaskRunnerDisconnectAnalyzer } from '../../../src/task-runners/internal-task-runner-disconnect-analyzer';
|
||||||
import { TaskRunnerWsServer } from '../../../src/runners/runner-ws-server';
|
import { TaskRunnerWsServer } from '../../../src/task-runners/task-runner-ws-server';
|
||||||
|
|
||||||
describe('TaskRunnerModule in internal mode', () => {
|
describe('TaskRunnerModule in internal mode', () => {
|
||||||
const runnerConfig = Container.get(TaskRunnersConfig);
|
const runnerConfig = Container.get(TaskRunnersConfig);
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import Container from 'typedi';
|
import Container from 'typedi';
|
||||||
|
|
||||||
import { TaskRunnerWsServer } from '@/runners/runner-ws-server';
|
import { TaskBroker } from '@/task-runners/task-broker.service';
|
||||||
import { TaskBroker } from '@/runners/task-broker.service';
|
import { TaskRunnerProcess } from '@/task-runners/task-runner-process';
|
||||||
import { TaskRunnerProcess } from '@/runners/task-runner-process';
|
import { TaskRunnerProcessRestartLoopDetector } from '@/task-runners/task-runner-process-restart-loop-detector';
|
||||||
import { TaskRunnerProcessRestartLoopDetector } from '@/runners/task-runner-process-restart-loop-detector';
|
import { TaskRunnerWsServer } from '@/task-runners/task-runner-ws-server';
|
||||||
import { retryUntil } from '@test-integration/retry-until';
|
import { retryUntil } from '@test-integration/retry-until';
|
||||||
import { setupBrokerTestServer } from '@test-integration/utils/task-broker-test-server';
|
import { setupBrokerTestServer } from '@test-integration/utils/task-broker-test-server';
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import request from 'supertest';
|
|||||||
import type TestAgent from 'supertest/lib/agent';
|
import type TestAgent from 'supertest/lib/agent';
|
||||||
import Container from 'typedi';
|
import Container from 'typedi';
|
||||||
|
|
||||||
import { TaskRunnerServer } from '@/runners/task-runner-server';
|
import { TaskRunnerServer } from '@/task-runners/task-runner-server';
|
||||||
|
|
||||||
export interface TestTaskBrokerServer {
|
export interface TestTaskBrokerServer {
|
||||||
server: TaskRunnerServer;
|
server: TaskRunnerServer;
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ export class ExecuteContext extends BaseExecuteContext implements IExecuteFuncti
|
|||||||
settings: unknown,
|
settings: unknown,
|
||||||
itemIndex: number,
|
itemIndex: number,
|
||||||
): Promise<Result<T, E>> {
|
): Promise<Result<T, E>> {
|
||||||
return await this.additionalData.startAgentJob<T, E>(
|
return await this.additionalData.startRunnerTask<T, E>(
|
||||||
this.additionalData,
|
this.additionalData,
|
||||||
jobType,
|
jobType,
|
||||||
settings,
|
settings,
|
||||||
|
|||||||
@@ -2350,7 +2350,7 @@ export interface IWorkflowExecuteAdditionalData {
|
|||||||
secretsHelpers: SecretsHelpersBase;
|
secretsHelpers: SecretsHelpersBase;
|
||||||
logAiEvent: (eventName: AiEvent, payload: AiEventPayload) => void;
|
logAiEvent: (eventName: AiEvent, payload: AiEventPayload) => void;
|
||||||
parentCallbackManager?: CallbackManager;
|
parentCallbackManager?: CallbackManager;
|
||||||
startAgentJob<T, E = unknown>(
|
startRunnerTask<T, E = unknown>(
|
||||||
additionalData: IWorkflowExecuteAdditionalData,
|
additionalData: IWorkflowExecuteAdditionalData,
|
||||||
jobType: string,
|
jobType: string,
|
||||||
settings: unknown,
|
settings: unknown,
|
||||||
|
|||||||
Reference in New Issue
Block a user