2024-10-02 07:14:57 -07:00
|
|
|
import { ApplicationError, ensureError } from 'n8n-workflow';
|
2024-10-02 06:38:42 -07:00
|
|
|
|
2024-10-08 02:24:10 -07:00
|
|
|
import { JsTaskRunner } from './js-task-runner/js-task-runner';
|
2024-10-02 01:31:56 -07:00
|
|
|
|
2024-10-07 02:23:14 -07:00
|
|
|
let runner: JsTaskRunner | undefined;
|
|
|
|
let isShuttingDown = false;
|
|
|
|
|
2024-10-02 01:31:56 -07:00
|
|
|
type Config = {
|
|
|
|
n8nUri: string;
|
2024-10-22 06:23:59 -07:00
|
|
|
grantToken: string;
|
2024-10-02 01:31:56 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
function readAndParseConfig(): Config {
|
2024-10-02 05:16:02 -07:00
|
|
|
const grantToken = process.env.N8N_RUNNERS_GRANT_TOKEN;
|
2024-10-22 06:23:59 -07:00
|
|
|
if (!grantToken) {
|
|
|
|
throw new ApplicationError('Missing N8N_RUNNERS_GRANT_TOKEN environment variable');
|
2024-10-02 05:16:02 -07:00
|
|
|
}
|
2024-10-02 01:31:56 -07:00
|
|
|
|
|
|
|
return {
|
2024-10-07 03:28:33 -07:00
|
|
|
n8nUri: process.env.N8N_RUNNERS_N8N_URI ?? '127.0.0.1:5679',
|
2024-10-02 05:16:02 -07:00
|
|
|
grantToken,
|
2024-10-02 01:31:56 -07:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2024-10-07 02:23:14 -07:00
|
|
|
function createSignalHandler(signal: string) {
|
|
|
|
return async function onSignal() {
|
|
|
|
if (isShuttingDown) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
console.log(`Received ${signal} signal, shutting down...`);
|
|
|
|
|
|
|
|
isShuttingDown = true;
|
|
|
|
try {
|
|
|
|
if (runner) {
|
|
|
|
await runner.stop();
|
|
|
|
runner = undefined;
|
|
|
|
}
|
|
|
|
} catch (e) {
|
|
|
|
const error = ensureError(e);
|
|
|
|
console.error('Error stopping task runner', { error });
|
|
|
|
} finally {
|
|
|
|
process.exit(0);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2024-10-02 01:31:56 -07:00
|
|
|
void (async function start() {
|
|
|
|
const config = readAndParseConfig();
|
|
|
|
|
2024-10-02 06:38:42 -07:00
|
|
|
const wsUrl = `ws://${config.n8nUri}/runners/_ws`;
|
2024-10-10 02:44:02 -07:00
|
|
|
runner = new JsTaskRunner({
|
|
|
|
wsUrl,
|
2024-10-22 06:23:59 -07:00
|
|
|
grantToken: config.grantToken,
|
2024-10-10 02:44:02 -07:00
|
|
|
maxConcurrency: 5,
|
|
|
|
allowedBuiltInModules: process.env.NODE_FUNCTION_ALLOW_BUILTIN,
|
|
|
|
allowedExternalModules: process.env.NODE_FUNCTION_ALLOW_EXTERNAL,
|
|
|
|
});
|
2024-10-07 02:23:14 -07:00
|
|
|
|
|
|
|
process.on('SIGINT', createSignalHandler('SIGINT'));
|
|
|
|
process.on('SIGTERM', createSignalHandler('SIGTERM'));
|
2024-10-02 06:38:42 -07:00
|
|
|
})().catch((e) => {
|
|
|
|
const error = ensureError(e);
|
|
|
|
console.error('Task runner failed to start', { error });
|
|
|
|
process.exit(1);
|
|
|
|
});
|