n8n 2.33.2 → 2.33.4
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.
- package/dist/build.tsbuildinfo +1 -1
- package/dist/controllers/oauth/oauth2-credential.controller.js +4 -1
- package/dist/controllers/oauth/oauth2-credential.controller.js.map +1 -1
- package/dist/controllers/role.controller.d.ts +1 -0
- package/dist/controllers/role.controller.js +10 -1
- package/dist/controllers/role.controller.js.map +1 -1
- package/dist/events/maps/relay.event-map.d.ts +4 -0
- package/dist/events/relays/telemetry.event-relay.d.ts +1 -0
- package/dist/events/relays/telemetry.event-relay.js +5 -0
- package/dist/events/relays/telemetry.event-relay.js.map +1 -1
- package/dist/modules/agents/agent-runtime-reconstruction.service.js +2 -0
- package/dist/modules/agents/agent-runtime-reconstruction.service.js.map +1 -1
- package/dist/modules/agents/builder/get-resource-locator-options.tool.d.ts +2 -2
- package/dist/modules/agents/json-config/from-json-config.d.ts +1 -0
- package/dist/modules/agents/json-config/from-json-config.js +3 -3
- package/dist/modules/agents/json-config/from-json-config.js.map +1 -1
- package/dist/modules/mcp/tools/workflow-builder/credential-validation.js +4 -0
- package/dist/modules/mcp/tools/workflow-builder/credential-validation.js.map +1 -1
- package/dist/modules/sso-oidc/oidc.controller.ee.d.ts +1 -1
- package/dist/modules/sso-oidc/oidc.service.ee.d.ts +2 -1
- package/dist/modules/sso-oidc/oidc.service.ee.js +9 -0
- package/dist/modules/sso-oidc/oidc.service.ee.js.map +1 -1
- package/dist/oauth/oauth.service.d.ts +4 -1
- package/dist/oauth/oauth.service.js +10 -3
- package/dist/oauth/oauth.service.js.map +1 -1
- package/dist/public-api/v1/handlers/sso-oidc/sso-oidc.mapper.d.ts +5 -0
- package/dist/public-api/v1/handlers/sso-oidc/sso-oidc.mapper.js +13 -0
- package/dist/public-api/v1/handlers/sso-oidc/sso-oidc.mapper.js.map +1 -0
- package/dist/security-audit/security-audit.service.js +1 -1
- package/dist/security-audit/security-audit.service.js.map +1 -1
- package/dist/task-runners/errors/task-request-timeout.error.d.ts +2 -2
- package/dist/task-runners/errors/task-request-timeout.error.js +3 -3
- package/dist/task-runners/errors/task-request-timeout.error.js.map +1 -1
- package/dist/task-runners/task-broker/errors/task-requester-accept-timeout.error.d.ts +4 -0
- package/dist/task-runners/task-broker/errors/task-requester-accept-timeout.error.js +11 -0
- package/dist/task-runners/task-broker/errors/task-requester-accept-timeout.error.js.map +1 -0
- package/dist/task-runners/task-broker/errors/task-runner-unreachable.error.d.ts +4 -0
- package/dist/task-runners/task-broker/errors/task-runner-unreachable.error.js +11 -0
- package/dist/task-runners/task-broker/errors/task-runner-unreachable.error.js.map +1 -0
- package/dist/task-runners/task-broker/task-broker-types.d.ts +1 -1
- package/dist/task-runners/task-broker/task-broker-ws-server.d.ts +13 -2
- package/dist/task-runners/task-broker/task-broker-ws-server.js +77 -33
- package/dist/task-runners/task-broker/task-broker-ws-server.js.map +1 -1
- package/dist/task-runners/task-broker/task-broker.service.d.ts +23 -1
- package/dist/task-runners/task-broker/task-broker.service.js +182 -64
- package/dist/task-runners/task-broker/task-broker.service.js.map +1 -1
- package/dist/task-runners/task-managers/task-requester.d.ts +1 -0
- package/dist/task-runners/task-managers/task-requester.js +4 -1
- package/dist/task-runners/task-managers/task-requester.js.map +1 -1
- package/dist/task-runners/task-runner-lifecycle-events.d.ts +8 -3
- package/dist/task-runners/task-runner-lifecycle-events.js.map +1 -1
- package/dist/task-runners/task-runner-process-base.d.ts +8 -3
- package/dist/task-runners/task-runner-process-base.js +84 -25
- package/dist/task-runners/task-runner-process-base.js.map +1 -1
- package/dist/task-runners/task-runner-process-js.d.ts +3 -7
- package/dist/task-runners/task-runner-process-js.js +4 -8
- package/dist/task-runners/task-runner-process-js.js.map +1 -1
- package/dist/task-runners/task-runner-process-py.d.ts +2 -6
- package/dist/task-runners/task-runner-process-py.js +3 -7
- package/dist/task-runners/task-runner-process-py.js.map +1 -1
- package/dist/utils/ai-proxy-fetch.d.ts +1 -0
- package/dist/utils/ai-proxy-fetch.js +9 -0
- package/dist/utils/ai-proxy-fetch.js.map +1 -1
- package/dist/workflows/workflow.service.ee.d.ts +1 -1
- package/dist/workflows/workflow.service.ee.js +14 -20
- package/dist/workflows/workflow.service.ee.js.map +1 -1
- package/package.json +31 -31
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-requester-accept-timeout.error.js","sourceRoot":"","sources":["../../../../src/task-runners/task-broker/errors/task-requester-accept-timeout.error.ts"],"names":[],"mappings":";;;AAAA,+CAAgD;AAEhD,qCAA6C,SAAQ,+BAAgB;IACpE,YAAY,MAAc,EAAE,WAAmB;QAC9C,KAAK,CAAC,cAAc,WAAW,wCAAwC,MAAM,GAAG,CAAC,CAAC;IACnF,CAAC;CACD"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TaskRunnerUnreachableError = void 0;
|
|
4
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
|
5
|
+
class TaskRunnerUnreachableError extends n8n_workflow_1.OperationalError {
|
|
6
|
+
constructor(taskId, runnerId) {
|
|
7
|
+
super(`Runner (${runnerId}) became unreachable while processing task (${taskId})`);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.TaskRunnerUnreachableError = TaskRunnerUnreachableError;
|
|
11
|
+
//# sourceMappingURL=task-runner-unreachable.error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-runner-unreachable.error.js","sourceRoot":"","sources":["../../../../src/task-runners/task-broker/errors/task-runner-unreachable.error.ts"],"names":[],"mappings":";;;AAAA,+CAAgD;AAEhD,gCAAwC,SAAQ,+BAAgB;IAC/D,YAAY,MAAc,EAAE,QAAgB;QAC3C,KAAK,CAAC,WAAW,QAAQ,+CAA+C,MAAM,GAAG,CAAC,CAAC;IACpF,CAAC;CACD"}
|
|
@@ -15,7 +15,7 @@ export interface TaskBrokerServerInitRequest extends AuthlessRequest<{}, {}, {},
|
|
|
15
15
|
export type TaskBrokerServerInitResponse = Response & {
|
|
16
16
|
req: TaskBrokerServerInitRequest;
|
|
17
17
|
};
|
|
18
|
-
export type DisconnectReason = 'shutting-down' | 'failed-heartbeat-check' | 'unknown';
|
|
18
|
+
export type DisconnectReason = 'shutting-down' | 'failed-heartbeat-check' | 'runner-unresponsive' | 'unknown';
|
|
19
19
|
export type DisconnectErrorOptions = {
|
|
20
20
|
runnerId?: TaskRunner['id'];
|
|
21
21
|
reason?: DisconnectReason;
|
|
@@ -3,11 +3,17 @@ import { GlobalConfig, TaskRunnersConfig } from '@n8n/config';
|
|
|
3
3
|
import type { BrokerMessage } from '@n8n/task-runner';
|
|
4
4
|
import type WebSocket from 'ws';
|
|
5
5
|
import { WsStatusCodes } from '../../constants';
|
|
6
|
+
import { EventService } from '../../events/event.service';
|
|
6
7
|
import { DefaultTaskRunnerDisconnectAnalyzer } from '../../task-runners/default-task-runner-disconnect-analyzer';
|
|
7
8
|
import type { DisconnectAnalyzer, DisconnectReason, TaskBrokerServerInitRequest, TaskBrokerServerInitResponse } from '../../task-runners/task-broker/task-broker-types';
|
|
8
9
|
import { TaskRunnerLifecycleEvents } from '../../task-runners/task-runner-lifecycle-events';
|
|
9
10
|
import { TaskBroker, type TaskRunner } from './task-broker.service';
|
|
10
11
|
type WsStatusCode = (typeof WsStatusCodes)[keyof typeof WsStatusCodes];
|
|
12
|
+
type RemoveConnectionOptions = {
|
|
13
|
+
reason?: DisconnectReason;
|
|
14
|
+
code?: WsStatusCode;
|
|
15
|
+
expectedConnection?: WebSocket;
|
|
16
|
+
};
|
|
11
17
|
export declare class TaskBrokerWsServer {
|
|
12
18
|
private readonly logger;
|
|
13
19
|
private readonly taskBroker;
|
|
@@ -15,18 +21,23 @@ export declare class TaskBrokerWsServer {
|
|
|
15
21
|
private readonly taskRunnersConfig;
|
|
16
22
|
private readonly runnerLifecycleEvents;
|
|
17
23
|
private readonly globalConfig;
|
|
24
|
+
private readonly eventService;
|
|
18
25
|
runnerConnections: Map<TaskRunner['id'], WebSocket>;
|
|
19
26
|
private heartbeatTimer;
|
|
20
|
-
constructor(logger: Logger, taskBroker: TaskBroker, disconnectAnalyzer: DefaultTaskRunnerDisconnectAnalyzer, taskRunnersConfig: TaskRunnersConfig, runnerLifecycleEvents: TaskRunnerLifecycleEvents, globalConfig: GlobalConfig);
|
|
27
|
+
constructor(logger: Logger, taskBroker: TaskBroker, disconnectAnalyzer: DefaultTaskRunnerDisconnectAnalyzer, taskRunnersConfig: TaskRunnersConfig, runnerLifecycleEvents: TaskRunnerLifecycleEvents, globalConfig: GlobalConfig, eventService: EventService);
|
|
21
28
|
start(): void;
|
|
29
|
+
private readonly onRunnerUnresponsive;
|
|
22
30
|
private startHeartbeatChecks;
|
|
31
|
+
private checkConnectionLiveness;
|
|
23
32
|
stop(): Promise<void>;
|
|
24
33
|
setDisconnectAnalyzer(disconnectAnalyzer: DisconnectAnalyzer): void;
|
|
25
34
|
getDisconnectAnalyzer(): DefaultTaskRunnerDisconnectAnalyzer;
|
|
26
35
|
sendMessage(id: TaskRunner['id'], message: BrokerMessage.ToRunner.All): void;
|
|
27
36
|
add(id: TaskRunner['id'], connection: WebSocket): void;
|
|
28
|
-
removeConnection(id: TaskRunner['id'], reason
|
|
37
|
+
removeConnection(id: TaskRunner['id'], { reason, code, expectedConnection, }?: RemoveConnectionOptions): Promise<void>;
|
|
29
38
|
handleRequest(req: TaskBrokerServerInitRequest, _res: TaskBrokerServerInitResponse): void;
|
|
39
|
+
private isCurrentConnection;
|
|
40
|
+
private isRunnerReachable;
|
|
30
41
|
private stopConnectedRunners;
|
|
31
42
|
private drainActiveTasks;
|
|
32
43
|
}
|
|
@@ -16,6 +16,7 @@ const constants_1 = require("@n8n/constants");
|
|
|
16
16
|
const di_1 = require("@n8n/di");
|
|
17
17
|
const n8n_workflow_1 = require("n8n-workflow");
|
|
18
18
|
const constants_2 = require("../../constants");
|
|
19
|
+
const event_service_1 = require("../../events/event.service");
|
|
19
20
|
const default_task_runner_disconnect_analyzer_1 = require("../../task-runners/default-task-runner-disconnect-analyzer");
|
|
20
21
|
const task_runner_lifecycle_events_1 = require("../../task-runners/task-runner-lifecycle-events");
|
|
21
22
|
const task_broker_service_1 = require("./task-broker.service");
|
|
@@ -23,36 +24,55 @@ function heartbeat() {
|
|
|
23
24
|
this.isAlive = true;
|
|
24
25
|
}
|
|
25
26
|
let TaskBrokerWsServer = class TaskBrokerWsServer {
|
|
26
|
-
constructor(logger, taskBroker, disconnectAnalyzer, taskRunnersConfig, runnerLifecycleEvents, globalConfig) {
|
|
27
|
+
constructor(logger, taskBroker, disconnectAnalyzer, taskRunnersConfig, runnerLifecycleEvents, globalConfig, eventService) {
|
|
27
28
|
this.logger = logger;
|
|
28
29
|
this.taskBroker = taskBroker;
|
|
29
30
|
this.disconnectAnalyzer = disconnectAnalyzer;
|
|
30
31
|
this.taskRunnersConfig = taskRunnersConfig;
|
|
31
32
|
this.runnerLifecycleEvents = runnerLifecycleEvents;
|
|
32
33
|
this.globalConfig = globalConfig;
|
|
34
|
+
this.eventService = eventService;
|
|
33
35
|
this.runnerConnections = new Map();
|
|
36
|
+
this.onRunnerUnresponsive = ({ runnerId, }) => {
|
|
37
|
+
void this.removeConnection(runnerId, {
|
|
38
|
+
reason: 'runner-unresponsive',
|
|
39
|
+
code: constants_2.WsStatusCodes.CloseProtocolError,
|
|
40
|
+
});
|
|
41
|
+
};
|
|
34
42
|
}
|
|
35
43
|
start() {
|
|
36
44
|
this.startHeartbeatChecks();
|
|
45
|
+
this.runnerLifecycleEvents.on('runner:unresponsive', this.onRunnerUnresponsive);
|
|
37
46
|
}
|
|
38
47
|
startHeartbeatChecks() {
|
|
39
48
|
const { heartbeatInterval } = this.taskRunnersConfig;
|
|
40
49
|
if (heartbeatInterval <= 0) {
|
|
41
50
|
throw new n8n_workflow_1.UserError('Heartbeat interval must be greater than 0');
|
|
42
51
|
}
|
|
43
|
-
this.heartbeatTimer = setInterval(() =>
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
52
|
+
this.heartbeatTimer = setInterval(() => this.checkConnectionLiveness(), heartbeatInterval * constants_1.Time.seconds.toMilliseconds);
|
|
53
|
+
}
|
|
54
|
+
checkConnectionLiveness() {
|
|
55
|
+
for (const [runnerId, connection] of this.runnerConnections) {
|
|
56
|
+
if (connection.isAlive) {
|
|
50
57
|
connection.isAlive = false;
|
|
51
58
|
connection.ping();
|
|
52
59
|
}
|
|
53
|
-
|
|
60
|
+
else {
|
|
61
|
+
const taskTypes = this.taskBroker.getKnownRunners().get(runnerId)?.runner.taskTypes ?? [];
|
|
62
|
+
void this.removeConnection(runnerId, {
|
|
63
|
+
reason: 'failed-heartbeat-check',
|
|
64
|
+
code: constants_2.WsStatusCodes.CloseProtocolError,
|
|
65
|
+
expectedConnection: connection,
|
|
66
|
+
});
|
|
67
|
+
this.runnerLifecycleEvents.emit('runner:failed-heartbeat-check', {
|
|
68
|
+
runnerId,
|
|
69
|
+
taskTypes,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
54
73
|
}
|
|
55
74
|
async stop() {
|
|
75
|
+
this.runnerLifecycleEvents.off('runner:unresponsive', this.onRunnerUnresponsive);
|
|
56
76
|
if (this.heartbeatTimer) {
|
|
57
77
|
clearInterval(this.heartbeatTimer);
|
|
58
78
|
this.heartbeatTimer = undefined;
|
|
@@ -80,23 +100,23 @@ let TaskBrokerWsServer = class TaskBrokerWsServer {
|
|
|
80
100
|
? Buffer.from(data)
|
|
81
101
|
: data;
|
|
82
102
|
const message = JSON.parse(buffer.toString('utf8'));
|
|
83
|
-
if (!isConnected
|
|
84
|
-
|
|
103
|
+
if (!isConnected) {
|
|
104
|
+
if (message.type === 'runner:info') {
|
|
105
|
+
await this.removeConnection(id);
|
|
106
|
+
isConnected = true;
|
|
107
|
+
this.runnerConnections.set(id, connection);
|
|
108
|
+
this.taskBroker.registerRunner({
|
|
109
|
+
id,
|
|
110
|
+
taskTypes: message.types,
|
|
111
|
+
lastSeen: new Date(),
|
|
112
|
+
name: message.name,
|
|
113
|
+
}, this.sendMessage.bind(this, id), () => this.isRunnerReachable(id, connection));
|
|
114
|
+
this.logger.info(`Registered runner "${message.name}" (${id}) `);
|
|
115
|
+
}
|
|
85
116
|
}
|
|
86
|
-
else if (
|
|
87
|
-
|
|
88
|
-
isConnected = true;
|
|
89
|
-
this.runnerConnections.set(id, connection);
|
|
90
|
-
this.taskBroker.registerRunner({
|
|
91
|
-
id,
|
|
92
|
-
taskTypes: message.types,
|
|
93
|
-
lastSeen: new Date(),
|
|
94
|
-
name: message.name,
|
|
95
|
-
}, this.sendMessage.bind(this, id));
|
|
96
|
-
this.logger.info(`Registered runner "${message.name}" (${id}) `);
|
|
97
|
-
return;
|
|
117
|
+
else if (this.isCurrentConnection(id, connection)) {
|
|
118
|
+
void this.taskBroker.onRunnerMessage(id, message);
|
|
98
119
|
}
|
|
99
|
-
void this.taskBroker.onRunnerMessage(id, message);
|
|
100
120
|
}
|
|
101
121
|
catch (error) {
|
|
102
122
|
this.logger.error(`Couldn't parse message from runner "${id}"`, {
|
|
@@ -109,31 +129,55 @@ let TaskBrokerWsServer = class TaskBrokerWsServer {
|
|
|
109
129
|
connection.once('close', async () => {
|
|
110
130
|
connection.off('pong', heartbeat);
|
|
111
131
|
connection.off('message', onMessage);
|
|
112
|
-
await this.removeConnection(id);
|
|
132
|
+
await this.removeConnection(id, { expectedConnection: connection });
|
|
113
133
|
});
|
|
114
134
|
connection.on('message', onMessage);
|
|
115
135
|
connection.send(JSON.stringify({ type: 'broker:inforequest' }));
|
|
116
136
|
}
|
|
117
|
-
async removeConnection(id, reason = 'unknown', code = constants_2.WsStatusCodes.CloseNormal) {
|
|
137
|
+
async removeConnection(id, { reason = 'unknown', code = constants_2.WsStatusCodes.CloseNormal, expectedConnection, } = {}) {
|
|
118
138
|
const connection = this.runnerConnections.get(id);
|
|
119
|
-
|
|
139
|
+
const isStaleRemoval = expectedConnection !== undefined && !this.isCurrentConnection(id, expectedConnection);
|
|
140
|
+
if (connection && !isStaleRemoval) {
|
|
141
|
+
this.runnerConnections.delete(id);
|
|
142
|
+
connection.close(code);
|
|
143
|
+
if (reason === 'failed-heartbeat-check' || reason === 'runner-unresponsive') {
|
|
144
|
+
this.eventService.emit('runner-disconnected', {
|
|
145
|
+
reason,
|
|
146
|
+
mode: this.taskRunnersConfig.mode,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
const inFlightTaskIds = this.taskBroker.getInFlightTaskIds(id);
|
|
120
150
|
const disconnectError = await this.disconnectAnalyzer.toDisconnectError({
|
|
121
151
|
runnerId: id,
|
|
122
152
|
reason,
|
|
123
153
|
heartbeatInterval: this.taskRunnersConfig.heartbeatInterval,
|
|
124
154
|
});
|
|
125
|
-
this.
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
155
|
+
const hasReconnected = this.runnerConnections.has(id);
|
|
156
|
+
if (hasReconnected) {
|
|
157
|
+
this.taskBroker.failTasks(inFlightTaskIds, disconnectError);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
this.taskBroker.deregisterRunner(id, disconnectError);
|
|
161
|
+
this.logger.debug(`Deregistered runner "${id}"`);
|
|
162
|
+
}
|
|
129
163
|
}
|
|
130
164
|
}
|
|
131
165
|
handleRequest(req, _res) {
|
|
132
166
|
this.add(req.query.id, req.ws);
|
|
133
167
|
}
|
|
168
|
+
isCurrentConnection(id, connection) {
|
|
169
|
+
return this.runnerConnections.get(id) === connection;
|
|
170
|
+
}
|
|
171
|
+
isRunnerReachable(id, connection) {
|
|
172
|
+
return this.isCurrentConnection(id, connection) && connection.readyState === connection.OPEN;
|
|
173
|
+
}
|
|
134
174
|
async stopConnectedRunners() {
|
|
135
175
|
await this.drainActiveTasks();
|
|
136
|
-
await Promise.all(Array.from(this.runnerConnections.
|
|
176
|
+
await Promise.all(Array.from(this.runnerConnections.entries()).map(async ([id, connection]) => await this.removeConnection(id, {
|
|
177
|
+
reason: 'shutting-down',
|
|
178
|
+
code: constants_2.WsStatusCodes.CloseGoingAway,
|
|
179
|
+
expectedConnection: connection,
|
|
180
|
+
})));
|
|
137
181
|
}
|
|
138
182
|
async drainActiveTasks() {
|
|
139
183
|
const drainTimeout = Math.floor(this.globalConfig.generic.gracefulShutdownTimeout * 0.8);
|
|
@@ -158,6 +202,6 @@ let TaskBrokerWsServer = class TaskBrokerWsServer {
|
|
|
158
202
|
exports.TaskBrokerWsServer = TaskBrokerWsServer;
|
|
159
203
|
exports.TaskBrokerWsServer = TaskBrokerWsServer = __decorate([
|
|
160
204
|
(0, di_1.Service)(),
|
|
161
|
-
__metadata("design:paramtypes", [backend_common_1.Logger, task_broker_service_1.TaskBroker, default_task_runner_disconnect_analyzer_1.DefaultTaskRunnerDisconnectAnalyzer, config_1.TaskRunnersConfig, task_runner_lifecycle_events_1.TaskRunnerLifecycleEvents, config_1.GlobalConfig])
|
|
205
|
+
__metadata("design:paramtypes", [backend_common_1.Logger, task_broker_service_1.TaskBroker, default_task_runner_disconnect_analyzer_1.DefaultTaskRunnerDisconnectAnalyzer, config_1.TaskRunnersConfig, task_runner_lifecycle_events_1.TaskRunnerLifecycleEvents, config_1.GlobalConfig, event_service_1.EventService])
|
|
162
206
|
], TaskBrokerWsServer);
|
|
163
207
|
//# sourceMappingURL=task-broker-ws-server.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-broker-ws-server.js","sourceRoot":"","sources":["../../../src/task-runners/task-broker/task-broker-ws-server.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wDAA6C;AAC7C,wCAA8D;AAC9D,8CAAsC;AACtC,gCAAkC;AAElC,+CAA+D;AAG/D,2CAA4C;AAC5C,oHAA6G;AAO7G,
|
|
1
|
+
{"version":3,"file":"task-broker-ws-server.js","sourceRoot":"","sources":["../../../src/task-runners/task-broker/task-broker-ws-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,11 +30,14 @@ export interface TaskRequest {
|
|
|
30
30
|
taskType: string;
|
|
31
31
|
timeout?: NodeJS.Timeout;
|
|
32
32
|
acceptInProgress?: boolean;
|
|
33
|
+
timeoutRefreshes?: number;
|
|
33
34
|
}
|
|
34
35
|
export type MessageCallback = (message: BrokerMessage.ToRunner.All) => Promise<void> | void;
|
|
35
36
|
export type RequesterMessageCallback = (message: BrokerMessage.ToRequester.All) => Promise<void> | void;
|
|
36
37
|
type RunnerAcceptCallback = () => void;
|
|
38
|
+
type RequesterAcceptCallback = (settings: RequesterMessage.ToBroker.TaskSettings['settings']) => void;
|
|
37
39
|
type TaskRejectCallback = (reason: TaskRejectError | TaskDeferredError) => void;
|
|
40
|
+
export type RunnerReachabilityCheck = () => boolean;
|
|
38
41
|
export declare class TaskBroker {
|
|
39
42
|
private readonly logger;
|
|
40
43
|
private readonly taskRunnersConfig;
|
|
@@ -46,15 +49,22 @@ export declare class TaskBroker {
|
|
|
46
49
|
private isDraining;
|
|
47
50
|
private runnerAcceptRejects;
|
|
48
51
|
private requesterAcceptRejects;
|
|
52
|
+
private consecutiveAcceptTimeouts;
|
|
49
53
|
private pendingTaskOffers;
|
|
50
54
|
private pendingTaskRequests;
|
|
51
55
|
private mismatchWarned;
|
|
52
56
|
constructor(logger: Logger, taskRunnersConfig: TaskRunnersConfig, taskRunnerLifecycleEvents: TaskRunnerLifecycleEvents, globalConfig: GlobalConfig);
|
|
53
57
|
private createRequestTimeout;
|
|
58
|
+
private refreshRequestTimeout;
|
|
54
59
|
private handleRequestTimeout;
|
|
60
|
+
private discardOffers;
|
|
55
61
|
expireTasks(): void;
|
|
56
|
-
|
|
62
|
+
private discardOffersFrom;
|
|
63
|
+
private discardOffersFromUnreachableRunners;
|
|
64
|
+
registerRunner(runner: TaskRunner, messageCallback: MessageCallback, isRunnerReachable?: RunnerReachabilityCheck): void;
|
|
57
65
|
deregisterRunner(runnerId: string, error: Error): void;
|
|
66
|
+
getInFlightTaskIds(runnerId: TaskRunner['id']): Array<Task['id']>;
|
|
67
|
+
failTasks(taskIds: Array<Task['id']>, error: Error): void;
|
|
58
68
|
registerRequester(requesterId: string, messageCallback: RequesterMessageCallback): void;
|
|
59
69
|
deregisterRequester(requesterId: string): void;
|
|
60
70
|
private messageRunner;
|
|
@@ -73,6 +83,7 @@ export declare class TaskBroker {
|
|
|
73
83
|
handleRequesterNodeTypesResponse(taskId: Task['id'], requestId: RequesterMessage.ToBroker.NodeTypesResponse['requestId'], nodeTypes: RequesterMessage.ToBroker.NodeTypesResponse['nodeTypes']): Promise<void>;
|
|
74
84
|
handleRequesterAccept(taskId: Task['id'], settings: RequesterMessage.ToBroker.TaskSettings['settings']): void;
|
|
75
85
|
handleRequesterReject(taskId: Task['id'], reason: string): void;
|
|
86
|
+
private untrackTask;
|
|
76
87
|
private cancelTask;
|
|
77
88
|
private failTask;
|
|
78
89
|
private getRunnerOrFailTask;
|
|
@@ -81,6 +92,10 @@ export declare class TaskBroker {
|
|
|
81
92
|
taskDoneHandler(taskId: Task['id'], data: TaskResultData): Promise<void>;
|
|
82
93
|
taskErrorHandler(taskId: Task['id'], error: unknown): Promise<void>;
|
|
83
94
|
acceptOffer(offer: TaskOffer, request: TaskRequest): Promise<void>;
|
|
95
|
+
private flagRunnerIfUnresponsive;
|
|
96
|
+
private flagSilentRunners;
|
|
97
|
+
private reportUnresponsive;
|
|
98
|
+
private isSilent;
|
|
84
99
|
settleTasks(): void;
|
|
85
100
|
private warnOnTaskTypeMismatch;
|
|
86
101
|
taskRequested(request: TaskRequest): void;
|
|
@@ -94,11 +109,17 @@ export declare class TaskBroker {
|
|
|
94
109
|
getKnownRunners(): Map<string, {
|
|
95
110
|
runner: TaskRunner;
|
|
96
111
|
messageCallback: MessageCallback;
|
|
112
|
+
isRunnerReachable: RunnerReachabilityCheck;
|
|
97
113
|
}>;
|
|
98
114
|
getKnownRequesters(): Map<string, RequesterMessageCallback>;
|
|
99
115
|
getRunnerAcceptRejects(): Map<string, {
|
|
100
116
|
accept: RunnerAcceptCallback;
|
|
101
117
|
reject: TaskRejectCallback;
|
|
118
|
+
runnerId: TaskRunner['id'];
|
|
119
|
+
}>;
|
|
120
|
+
getRequesterAcceptRejects(): Map<string, {
|
|
121
|
+
accept: RequesterAcceptCallback;
|
|
122
|
+
reject: TaskRejectCallback;
|
|
102
123
|
}>;
|
|
103
124
|
setTasks(tasks: Record<string, Task>): void;
|
|
104
125
|
setPendingTaskOffers(pendingTaskOffers: TaskOffer[]): void;
|
|
@@ -106,6 +127,7 @@ export declare class TaskBroker {
|
|
|
106
127
|
setRunnerAcceptRejects(runnerAcceptRejects: Record<string, {
|
|
107
128
|
accept: RunnerAcceptCallback;
|
|
108
129
|
reject: TaskRejectCallback;
|
|
130
|
+
runnerId: TaskRunner['id'];
|
|
109
131
|
}>): void;
|
|
110
132
|
}
|
|
111
133
|
export {};
|