n8n 1.104.1 → 1.105.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/dist/abstract-server.js +7 -1
  2. package/dist/abstract-server.js.map +1 -1
  3. package/dist/build.tsbuildinfo +1 -1
  4. package/dist/chat/chat-execution-manager.d.ts +21 -0
  5. package/dist/chat/chat-execution-manager.js +162 -0
  6. package/dist/chat/chat-execution-manager.js.map +1 -0
  7. package/dist/chat/chat-server.d.ts +11 -0
  8. package/dist/chat/chat-server.js +62 -0
  9. package/dist/chat/chat-server.js.map +1 -0
  10. package/dist/chat/chat-service.d.ts +25 -0
  11. package/dist/chat/chat-service.js +283 -0
  12. package/dist/chat/chat-service.js.map +1 -0
  13. package/dist/chat/chat-service.types.d.ts +59 -0
  14. package/dist/chat/chat-service.types.js +17 -0
  15. package/dist/chat/chat-service.types.js.map +1 -0
  16. package/dist/chat/utils.d.ts +5 -0
  17. package/dist/chat/utils.js +34 -0
  18. package/dist/chat/utils.js.map +1 -0
  19. package/dist/commands/start.js +1 -1
  20. package/dist/commands/start.js.map +1 -1
  21. package/dist/config/index.d.ts +0 -4
  22. package/dist/config/schema.d.ts +0 -16
  23. package/dist/config/schema.js +1 -17
  24. package/dist/config/schema.js.map +1 -1
  25. package/dist/controllers/e2e.controller.js +1 -0
  26. package/dist/controllers/e2e.controller.js.map +1 -1
  27. package/dist/controllers/folder.controller.js +8 -0
  28. package/dist/controllers/folder.controller.js.map +1 -1
  29. package/dist/controllers/telemetry.controller.d.ts +12 -0
  30. package/dist/controllers/telemetry.controller.js +85 -0
  31. package/dist/controllers/telemetry.controller.js.map +1 -0
  32. package/dist/evaluation.ee/test-runner/test-runner.service.ee.d.ts +4 -0
  33. package/dist/evaluation.ee/test-runner/test-runner.service.ee.js +22 -4
  34. package/dist/evaluation.ee/test-runner/test-runner.service.ee.js.map +1 -1
  35. package/dist/eventbus/event-bus.controller.js +2 -1
  36. package/dist/eventbus/event-bus.controller.js.map +1 -1
  37. package/dist/eventbus/message-event-bus/message-event-bus.d.ts +2 -1
  38. package/dist/eventbus/message-event-bus/message-event-bus.js +5 -3
  39. package/dist/eventbus/message-event-bus/message-event-bus.js.map +1 -1
  40. package/dist/middlewares/cors.js +1 -1
  41. package/dist/middlewares/cors.js.map +1 -1
  42. package/dist/scaling/multi-main-setup.ee.js +1 -5
  43. package/dist/scaling/multi-main-setup.ee.js.map +1 -1
  44. package/dist/server.js +6 -1
  45. package/dist/server.js.map +1 -1
  46. package/dist/services/cache/cache.service.js +1 -1
  47. package/dist/services/cache/cache.service.js.map +1 -1
  48. package/dist/services/frontend.service.js +3 -1
  49. package/dist/services/frontend.service.js.map +1 -1
  50. package/dist/webhooks/webhook-helpers.d.ts +1 -0
  51. package/dist/webhooks/webhook-helpers.js +25 -1
  52. package/dist/webhooks/webhook-helpers.js.map +1 -1
  53. package/dist/workflow-runner.js +4 -6
  54. package/dist/workflow-runner.js.map +1 -1
  55. package/package.json +23 -22
@@ -0,0 +1,21 @@
1
+ import { ExecutionRepository } from '@n8n/db';
2
+ import type { IExecutionResponse } from '@n8n/db';
3
+ import { WorkflowRunner } from '../workflow-runner';
4
+ import type { ChatMessage } from './chat-service.types';
5
+ import { NodeTypes } from '../node-types';
6
+ import { OwnershipService } from '../services/ownership.service';
7
+ export declare class ChatExecutionManager {
8
+ private readonly executionRepository;
9
+ private readonly workflowRunner;
10
+ private readonly ownershipService;
11
+ private readonly nodeTypes;
12
+ constructor(executionRepository: ExecutionRepository, workflowRunner: WorkflowRunner, ownershipService: OwnershipService, nodeTypes: NodeTypes);
13
+ runWorkflow(execution: IExecutionResponse, message: ChatMessage): Promise<void>;
14
+ cancelExecution(executionId: string): Promise<void>;
15
+ findExecution(executionId: string): Promise<IExecutionResponse | undefined>;
16
+ checkIfExecutionExists(executionId: string): Promise<IExecutionResponse | undefined>;
17
+ private getWorkflow;
18
+ private mapFilesToBinaryData;
19
+ private runNode;
20
+ private getRunData;
21
+ }
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.ChatExecutionManager = void 0;
46
+ const db_1 = require("@n8n/db");
47
+ const di_1 = require("@n8n/di");
48
+ const n8n_core_1 = require("n8n-core");
49
+ const n8n_workflow_1 = require("n8n-workflow");
50
+ const not_found_error_1 = require("../errors/response-errors/not-found.error");
51
+ const WorkflowExecuteAdditionalData = __importStar(require("../workflow-execute-additional-data"));
52
+ const workflow_runner_1 = require("../workflow-runner");
53
+ const node_types_1 = require("../node-types");
54
+ const ownership_service_1 = require("../services/ownership.service");
55
+ let ChatExecutionManager = class ChatExecutionManager {
56
+ constructor(executionRepository, workflowRunner, ownershipService, nodeTypes) {
57
+ this.executionRepository = executionRepository;
58
+ this.workflowRunner = workflowRunner;
59
+ this.ownershipService = ownershipService;
60
+ this.nodeTypes = nodeTypes;
61
+ }
62
+ async runWorkflow(execution, message) {
63
+ await this.workflowRunner.run(await this.getRunData(execution, message), true, true, execution.id);
64
+ }
65
+ async cancelExecution(executionId) {
66
+ const execution = await this.executionRepository.findSingleExecution(executionId, {
67
+ includeData: true,
68
+ unflattenData: true,
69
+ });
70
+ if (!execution)
71
+ return;
72
+ if (['running', 'waiting', 'unknown'].includes(execution.status)) {
73
+ await this.executionRepository.update({ id: executionId }, { status: 'canceled' });
74
+ }
75
+ }
76
+ async findExecution(executionId) {
77
+ return await this.executionRepository.findSingleExecution(executionId, {
78
+ includeData: true,
79
+ unflattenData: true,
80
+ });
81
+ }
82
+ async checkIfExecutionExists(executionId) {
83
+ return await this.executionRepository.findSingleExecution(executionId);
84
+ }
85
+ getWorkflow(execution) {
86
+ const { workflowData } = execution;
87
+ return new n8n_workflow_1.Workflow({
88
+ id: workflowData.id,
89
+ name: workflowData.name,
90
+ nodes: workflowData.nodes,
91
+ connections: workflowData.connections,
92
+ active: workflowData.active,
93
+ nodeTypes: this.nodeTypes,
94
+ staticData: workflowData.staticData,
95
+ settings: workflowData.settings,
96
+ });
97
+ }
98
+ async mapFilesToBinaryData(context, files) {
99
+ if (!files)
100
+ return;
101
+ const binary = {};
102
+ for (const [index, file] of files.entries()) {
103
+ const base64 = file.data;
104
+ const buffer = Buffer.from(base64, n8n_workflow_1.BINARY_ENCODING);
105
+ const binaryData = await context.helpers.prepareBinaryData(buffer, file.name, file.type);
106
+ binary[`data_${index}`] = binaryData;
107
+ }
108
+ return binary;
109
+ }
110
+ async runNode(execution, message) {
111
+ const workflow = this.getWorkflow(execution);
112
+ const lastNodeExecuted = execution.data.resultData.lastNodeExecuted;
113
+ const node = workflow.getNode(lastNodeExecuted);
114
+ const additionalData = await WorkflowExecuteAdditionalData.getBase();
115
+ const executionData = execution.data.executionData?.nodeExecutionStack[0];
116
+ if (!node || !executionData)
117
+ return null;
118
+ const inputData = executionData.data;
119
+ const connectionInputData = executionData.data.main[0];
120
+ const nodeType = workflow.nodeTypes.getByNameAndVersion(node.type, node.typeVersion);
121
+ const context = new n8n_core_1.ExecuteContext(workflow, node, additionalData, 'manual', execution.data, 0, connectionInputData ?? [], inputData, executionData, []);
122
+ const { sessionId, action, chatInput, files } = message;
123
+ const binary = await this.mapFilesToBinaryData(context, files);
124
+ const nodeExecutionData = { json: { sessionId, action, chatInput } };
125
+ if (binary && Object.keys(binary).length > 0) {
126
+ nodeExecutionData.binary = binary;
127
+ }
128
+ if (nodeType.onMessage) {
129
+ return await nodeType.onMessage(context, nodeExecutionData);
130
+ }
131
+ return [[nodeExecutionData]];
132
+ }
133
+ async getRunData(execution, message) {
134
+ const { workflowData, mode: executionMode, data: runExecutionData } = execution;
135
+ runExecutionData.executionData.nodeExecutionStack[0].data.main = (await this.runNode(execution, message)) ?? [[{ json: message }]];
136
+ let project = undefined;
137
+ try {
138
+ project = await this.ownershipService.getWorkflowProjectCached(workflowData.id);
139
+ }
140
+ catch (error) {
141
+ throw new not_found_error_1.NotFoundError('Cannot find workflow');
142
+ }
143
+ const runData = {
144
+ executionMode,
145
+ executionData: runExecutionData,
146
+ pushRef: runExecutionData.pushRef,
147
+ workflowData,
148
+ pinData: runExecutionData.resultData.pinData,
149
+ projectId: project?.id,
150
+ };
151
+ return runData;
152
+ }
153
+ };
154
+ exports.ChatExecutionManager = ChatExecutionManager;
155
+ exports.ChatExecutionManager = ChatExecutionManager = __decorate([
156
+ (0, di_1.Service)(),
157
+ __metadata("design:paramtypes", [db_1.ExecutionRepository,
158
+ workflow_runner_1.WorkflowRunner,
159
+ ownership_service_1.OwnershipService,
160
+ node_types_1.NodeTypes])
161
+ ], ChatExecutionManager);
162
+ //# sourceMappingURL=chat-execution-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-execution-manager.js","sourceRoot":"","sources":["../../src/chat/chat-execution-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Application } from 'express';
2
+ import type { Server as HttpServer } from 'http';
3
+ import { ChatService } from './chat-service';
4
+ export declare class ChatServer {
5
+ private readonly chatService;
6
+ private readonly wsServer;
7
+ constructor(chatService: ChatService);
8
+ setup(server: HttpServer, app: Application): void;
9
+ private attachToApp;
10
+ shutdown(): void;
11
+ }
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ChatServer = void 0;
13
+ const di_1 = require("@n8n/di");
14
+ const decorators_1 = require("@n8n/decorators");
15
+ const http_1 = require("http");
16
+ const url_1 = require("url");
17
+ const ws_1 = require("ws");
18
+ const chat_service_1 = require("./chat-service");
19
+ let ChatServer = class ChatServer {
20
+ constructor(chatService) {
21
+ this.chatService = chatService;
22
+ this.wsServer = new ws_1.Server({ noServer: true });
23
+ }
24
+ setup(server, app) {
25
+ server.on('upgrade', (req, socket, head) => {
26
+ const parsedUrl = (0, url_1.parse)(req.url ?? '');
27
+ if (parsedUrl.pathname?.startsWith('/chat')) {
28
+ this.wsServer.handleUpgrade(req, socket, head, (ws) => {
29
+ this.attachToApp(req, ws, app);
30
+ });
31
+ }
32
+ });
33
+ app.use('/chat', async (req) => {
34
+ await this.chatService.startSession(req);
35
+ });
36
+ }
37
+ attachToApp(req, ws, app) {
38
+ req.ws = ws;
39
+ const res = new http_1.ServerResponse(req);
40
+ res.writeHead = (statusCode) => {
41
+ if (statusCode > 200)
42
+ ws.close();
43
+ return res;
44
+ };
45
+ app.handle(req, res);
46
+ }
47
+ shutdown() {
48
+ this.wsServer.close();
49
+ }
50
+ };
51
+ exports.ChatServer = ChatServer;
52
+ __decorate([
53
+ (0, decorators_1.OnShutdown)(),
54
+ __metadata("design:type", Function),
55
+ __metadata("design:paramtypes", []),
56
+ __metadata("design:returntype", void 0)
57
+ ], ChatServer.prototype, "shutdown", null);
58
+ exports.ChatServer = ChatServer = __decorate([
59
+ (0, di_1.Service)(),
60
+ __metadata("design:paramtypes", [chat_service_1.ChatService])
61
+ ], ChatServer);
62
+ //# sourceMappingURL=chat-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-server.js","sourceRoot":"","sources":["../../src/chat/chat-server.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,gCAAkC;AAClC,gDAA6C;AAG7C,+BAAsC;AACtC,6BAAwC;AAExC,2BAA+C;AAE/C,iDAA6C;AAQtC,IAAM,UAAU,GAAhB,MAAM,UAAU;IAGtB,YAA6B,WAAwB;QAAxB,gBAAW,GAAX,WAAW,CAAa;QAFpC,aAAQ,GAAG,IAAI,WAAe,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAEZ,CAAC;IAEzD,KAAK,CAAC,MAAkB,EAAE,GAAgB;QACzC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YACvD,MAAM,SAAS,GAAG,IAAA,WAAQ,EAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;YAE1C,IAAI,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7C,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE;oBACrD,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,EAAE,GAAyB,CAAC,CAAC;gBACtD,CAAC,CAAC,CAAC;YACJ,CAAC;QACF,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAgB,EAAE,EAAE;YAC3C,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACJ,CAAC;IAEO,WAAW,CAAC,GAAgB,EAAE,EAAa,EAAE,GAAuB;QAC3E,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,IAAI,qBAAc,CAAC,GAAG,CAAC,CAAC;QACpC,GAAG,CAAC,SAAS,GAAG,CAAC,UAAU,EAAE,EAAE;YAC9B,IAAI,UAAU,GAAG,GAAG;gBAAE,EAAE,CAAC,KAAK,EAAE,CAAC;YACjC,OAAO,GAAG,CAAC;QACZ,CAAC,CAAC;QAEF,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACtB,CAAC;IAGD,QAAQ;QACP,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACD,CAAA;AApCY,gCAAU;AAiCtB;IADC,IAAA,uBAAU,GAAE;;;;0CAGZ;qBAnCW,UAAU;IADtB,IAAA,YAAO,GAAE;qCAIiC,0BAAW;GAHzC,UAAU,CAoCtB"}
@@ -0,0 +1,25 @@
1
+ import { Logger } from '@n8n/backend-common';
2
+ import { ChatExecutionManager } from './chat-execution-manager';
3
+ import { type ChatRequest } from './chat-service.types';
4
+ import { ErrorReporter } from 'n8n-core';
5
+ export declare class ChatService {
6
+ private readonly executionManager;
7
+ private readonly logger;
8
+ private readonly errorReporter;
9
+ private readonly sessions;
10
+ private heartbeatIntervalId;
11
+ constructor(executionManager: ChatExecutionManager, logger: Logger, errorReporter: ErrorReporter);
12
+ startSession(req: ChatRequest): Promise<void>;
13
+ private processWaitingExecution;
14
+ private processSuccessExecution;
15
+ private waitForChatResponseOrContinue;
16
+ private pollAndProcessChatResponses;
17
+ private incomingMessageHandler;
18
+ private resumeExecution;
19
+ private getExecutionOrCleanupSession;
20
+ private stringifyRawData;
21
+ private cleanupSession;
22
+ private parseChatMessage;
23
+ private checkHeartbeats;
24
+ shutdown(): void;
25
+ }
@@ -0,0 +1,283 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ChatService = void 0;
13
+ const backend_common_1 = require("@n8n/backend-common");
14
+ const di_1 = require("@n8n/di");
15
+ const decorators_1 = require("@n8n/decorators");
16
+ const n8n_workflow_1 = require("n8n-workflow");
17
+ const ws_1 = require("ws");
18
+ const zod_1 = require("zod");
19
+ const chat_execution_manager_1 = require("./chat-execution-manager");
20
+ const chat_service_types_1 = require("./chat-service.types");
21
+ const utils_1 = require("./utils");
22
+ const n8n_core_1 = require("n8n-core");
23
+ const CHECK_FOR_RESPONSE_INTERVAL = 3000;
24
+ const DRAIN_TIMEOUT = 50;
25
+ const HEARTBEAT_INTERVAL = 30 * 1000;
26
+ const HEARTBEAT_TIMEOUT = 60 * 1000;
27
+ const N8N_CONTINUE = 'n8n|continue';
28
+ const N8N_HEARTBEAT = 'n8n|heartbeat';
29
+ const N8N_HEARTBEAT_ACK = 'n8n|heartbeat-ack';
30
+ function closeConnection(ws) {
31
+ if (ws.readyState !== ws_1.WebSocket.OPEN)
32
+ return;
33
+ ws.once('drain', () => {
34
+ ws.close();
35
+ });
36
+ setTimeout(() => {
37
+ if (ws.readyState === ws_1.WebSocket.OPEN) {
38
+ ws.close();
39
+ }
40
+ }, DRAIN_TIMEOUT);
41
+ }
42
+ let ChatService = class ChatService {
43
+ constructor(executionManager, logger, errorReporter) {
44
+ this.executionManager = executionManager;
45
+ this.logger = logger;
46
+ this.errorReporter = errorReporter;
47
+ this.sessions = new Map();
48
+ this.heartbeatIntervalId = setInterval(async () => await this.checkHeartbeats(), HEARTBEAT_INTERVAL);
49
+ }
50
+ async startSession(req) {
51
+ const { ws, query: { sessionId, executionId, isPublic }, } = req;
52
+ if (!ws) {
53
+ throw new n8n_workflow_1.UnexpectedError('WebSocket connection is missing');
54
+ }
55
+ if (!sessionId || !executionId) {
56
+ ws.close(1008);
57
+ return;
58
+ }
59
+ const execution = await this.executionManager.checkIfExecutionExists(executionId);
60
+ if (!execution) {
61
+ ws.send(`Execution with id "${executionId}" does not exist`);
62
+ ws.close(1008);
63
+ return;
64
+ }
65
+ ws.isAlive = true;
66
+ const key = `${sessionId}|${executionId}|${isPublic ? 'public' : 'integrated'}`;
67
+ const existingSession = this.sessions.get(key);
68
+ if (existingSession) {
69
+ this.cleanupSession(existingSession, key);
70
+ }
71
+ const onMessage = this.incomingMessageHandler(key);
72
+ const respondToChat = this.pollAndProcessChatResponses(key);
73
+ const intervalId = setInterval(async () => await respondToChat(), CHECK_FOR_RESPONSE_INTERVAL);
74
+ ws.once('close', () => {
75
+ ws.off('message', onMessage);
76
+ clearInterval(intervalId);
77
+ this.sessions.delete(key);
78
+ });
79
+ ws.on('message', onMessage);
80
+ const session = {
81
+ connection: ws,
82
+ executionId,
83
+ sessionId,
84
+ intervalId,
85
+ isPublic: isPublic ?? false,
86
+ isProcessing: false,
87
+ lastHeartbeat: Date.now(),
88
+ };
89
+ this.sessions.set(key, session);
90
+ ws.send(N8N_HEARTBEAT);
91
+ }
92
+ async processWaitingExecution(execution, session, sessionKey) {
93
+ const message = (0, utils_1.getMessage)(execution);
94
+ if (message === undefined)
95
+ return;
96
+ session.connection.send(message);
97
+ const lastNode = (0, utils_1.getLastNodeExecuted)(execution);
98
+ if (lastNode && (0, utils_1.shouldResumeImmediately)(lastNode)) {
99
+ session.connection.send(N8N_CONTINUE);
100
+ const data = {
101
+ action: 'sendMessage',
102
+ chatInput: '',
103
+ sessionId: session.sessionId,
104
+ };
105
+ await this.resumeExecution(session.executionId, data, sessionKey);
106
+ session.nodeWaitingForChatResponse = undefined;
107
+ }
108
+ else {
109
+ session.nodeWaitingForChatResponse = lastNode?.name;
110
+ }
111
+ }
112
+ processSuccessExecution(session) {
113
+ closeConnection(session.connection);
114
+ return;
115
+ }
116
+ waitForChatResponseOrContinue(execution, session) {
117
+ const lastNode = (0, utils_1.getLastNodeExecuted)(execution);
118
+ if (execution.status === 'waiting' && lastNode?.name !== session.nodeWaitingForChatResponse) {
119
+ session.connection.send(N8N_CONTINUE);
120
+ session.nodeWaitingForChatResponse = undefined;
121
+ }
122
+ }
123
+ pollAndProcessChatResponses(sessionKey) {
124
+ return async () => {
125
+ const session = this.sessions.get(sessionKey);
126
+ if (!session)
127
+ return;
128
+ if (session.isProcessing)
129
+ return;
130
+ try {
131
+ session.isProcessing = true;
132
+ if (!session.executionId || !session.connection)
133
+ return;
134
+ const execution = await this.getExecutionOrCleanupSession(session.executionId, sessionKey);
135
+ if (!execution)
136
+ return;
137
+ if (session.nodeWaitingForChatResponse) {
138
+ this.waitForChatResponseOrContinue(execution, session);
139
+ return;
140
+ }
141
+ if (execution.status === 'waiting') {
142
+ await this.processWaitingExecution(execution, session, sessionKey);
143
+ return;
144
+ }
145
+ if (execution.status === 'success') {
146
+ this.processSuccessExecution(session);
147
+ return;
148
+ }
149
+ }
150
+ catch (e) {
151
+ const error = (0, n8n_workflow_1.ensureError)(e);
152
+ this.errorReporter.error(error);
153
+ this.logger.error(`Error sending message to chat in session ${sessionKey}: ${error.message}`);
154
+ }
155
+ finally {
156
+ const activeSession = this.sessions.get(sessionKey);
157
+ if (activeSession) {
158
+ activeSession.isProcessing = false;
159
+ }
160
+ }
161
+ };
162
+ }
163
+ incomingMessageHandler(sessionKey) {
164
+ return async (data) => {
165
+ try {
166
+ const session = this.sessions.get(sessionKey);
167
+ if (!session)
168
+ return;
169
+ const message = this.stringifyRawData(data);
170
+ if (message === N8N_HEARTBEAT_ACK) {
171
+ session.lastHeartbeat = Date.now();
172
+ return;
173
+ }
174
+ const executionId = session.executionId;
175
+ await this.resumeExecution(executionId, this.parseChatMessage(message), sessionKey);
176
+ session.nodeWaitingForChatResponse = undefined;
177
+ }
178
+ catch (e) {
179
+ const error = (0, n8n_workflow_1.ensureError)(e);
180
+ this.errorReporter.error(error);
181
+ this.logger.error(`Error processing message from chat in session ${sessionKey}: ${error.message}`);
182
+ }
183
+ };
184
+ }
185
+ async resumeExecution(executionId, message, sessionKey) {
186
+ const execution = await this.getExecutionOrCleanupSession(executionId, sessionKey);
187
+ if (!execution || execution.status !== 'waiting')
188
+ return;
189
+ await this.executionManager.runWorkflow(execution, message);
190
+ }
191
+ async getExecutionOrCleanupSession(executionId, sessionKey) {
192
+ const execution = await this.executionManager.findExecution(executionId);
193
+ if (!execution || ['error', 'canceled', 'crashed'].includes(execution.status)) {
194
+ const session = this.sessions.get(sessionKey);
195
+ if (!session)
196
+ return null;
197
+ this.cleanupSession(session, sessionKey);
198
+ return null;
199
+ }
200
+ if (execution.status === 'running')
201
+ return null;
202
+ return execution;
203
+ }
204
+ stringifyRawData(data) {
205
+ const buffer = Array.isArray(data)
206
+ ? Buffer.concat(data.map((chunk) => Buffer.from(chunk)))
207
+ : Buffer.from(data);
208
+ return buffer.toString('utf8');
209
+ }
210
+ cleanupSession(session, sessionKey) {
211
+ session.connection.terminate();
212
+ clearInterval(session.intervalId);
213
+ if (sessionKey)
214
+ this.sessions.delete(sessionKey);
215
+ }
216
+ parseChatMessage(message) {
217
+ try {
218
+ const parsedMessage = chat_service_types_1.chatMessageSchema.parse((0, n8n_workflow_1.jsonParse)(message));
219
+ if (parsedMessage.files) {
220
+ parsedMessage.files = parsedMessage.files.map((file) => ({
221
+ ...file,
222
+ data: file.data.includes('base64,') ? file.data.split('base64,')[1] : file.data,
223
+ }));
224
+ }
225
+ return parsedMessage;
226
+ }
227
+ catch (error) {
228
+ if (error instanceof zod_1.z.ZodError) {
229
+ throw new n8n_workflow_1.UnexpectedError(`Chat message validation error: ${error.errors.map((error) => error.message).join(', ')}`);
230
+ }
231
+ throw error;
232
+ }
233
+ }
234
+ async checkHeartbeats() {
235
+ try {
236
+ const now = Date.now();
237
+ for (const [key, session] of this.sessions.entries()) {
238
+ const timeSinceLastHeartbeat = now - (session.lastHeartbeat ?? 0);
239
+ if (timeSinceLastHeartbeat > HEARTBEAT_TIMEOUT) {
240
+ await this.executionManager.cancelExecution(session.executionId);
241
+ this.cleanupSession(session, key);
242
+ }
243
+ else {
244
+ try {
245
+ session.connection.send(N8N_HEARTBEAT);
246
+ }
247
+ catch (e) {
248
+ this.cleanupSession(session, key);
249
+ const error = (0, n8n_workflow_1.ensureError)(e);
250
+ this.errorReporter.error(error);
251
+ this.logger.error(`Error sending heartbeat to session ${key}: ${error.message}`);
252
+ }
253
+ }
254
+ }
255
+ }
256
+ catch (e) {
257
+ const error = (0, n8n_workflow_1.ensureError)(e);
258
+ this.errorReporter.error(error);
259
+ this.logger.error(`Error checking heartbeats: ${error.message}`);
260
+ }
261
+ }
262
+ shutdown() {
263
+ for (const [key, session] of this.sessions.entries()) {
264
+ this.cleanupSession(session, key);
265
+ }
266
+ this.sessions.clear();
267
+ clearInterval(this.heartbeatIntervalId);
268
+ }
269
+ };
270
+ exports.ChatService = ChatService;
271
+ __decorate([
272
+ (0, decorators_1.OnShutdown)(),
273
+ __metadata("design:type", Function),
274
+ __metadata("design:paramtypes", []),
275
+ __metadata("design:returntype", void 0)
276
+ ], ChatService.prototype, "shutdown", null);
277
+ exports.ChatService = ChatService = __decorate([
278
+ (0, di_1.Service)(),
279
+ __metadata("design:paramtypes", [chat_execution_manager_1.ChatExecutionManager,
280
+ backend_common_1.Logger,
281
+ n8n_core_1.ErrorReporter])
282
+ ], ChatService);
283
+ //# sourceMappingURL=chat-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-service.js","sourceRoot":"","sources":["../../src/chat/chat-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import type { IncomingMessage } from 'http';
2
+ import type { WebSocket } from 'ws';
3
+ import { z } from 'zod';
4
+ export interface ChatRequest extends IncomingMessage {
5
+ url: string;
6
+ query: {
7
+ sessionId: string;
8
+ executionId: string;
9
+ isPublic?: boolean;
10
+ };
11
+ ws: WebSocket;
12
+ }
13
+ export type Session = {
14
+ connection: WebSocket;
15
+ executionId: string;
16
+ sessionId: string;
17
+ intervalId: NodeJS.Timeout;
18
+ nodeWaitingForChatResponse?: string;
19
+ isPublic: boolean;
20
+ isProcessing: boolean;
21
+ lastHeartbeat?: number;
22
+ };
23
+ export declare const chatMessageSchema: z.ZodObject<{
24
+ sessionId: z.ZodString;
25
+ action: z.ZodLiteral<"sendMessage">;
26
+ chatInput: z.ZodString;
27
+ files: z.ZodOptional<z.ZodArray<z.ZodObject<{
28
+ name: z.ZodString;
29
+ type: z.ZodString;
30
+ data: z.ZodString;
31
+ }, "strip", z.ZodTypeAny, {
32
+ data: string;
33
+ name: string;
34
+ type: string;
35
+ }, {
36
+ data: string;
37
+ name: string;
38
+ type: string;
39
+ }>, "many">>;
40
+ }, "strip", z.ZodTypeAny, {
41
+ action: "sendMessage";
42
+ sessionId: string;
43
+ chatInput: string;
44
+ files?: {
45
+ data: string;
46
+ name: string;
47
+ type: string;
48
+ }[] | undefined;
49
+ }, {
50
+ action: "sendMessage";
51
+ sessionId: string;
52
+ chatInput: string;
53
+ files?: {
54
+ data: string;
55
+ name: string;
56
+ type: string;
57
+ }[] | undefined;
58
+ }>;
59
+ export type ChatMessage = z.infer<typeof chatMessageSchema>;