n8n
Version:
n8n Workflow Automation Tool
141 lines • 6.68 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.Webhook = void 0;
const n8n_core_1 = require("n8n-core");
const command_1 = require("@oclif/command");
const Redis = require("ioredis");
const n8n_workflow_1 = require("n8n-workflow");
const config = require("../config");
const src_1 = require("../src");
const Logger_1 = require("../src/Logger");
let activeWorkflowRunner;
let processExistCode = 0;
class Webhook extends command_1.Command {
static async stopProcess() {
n8n_workflow_1.LoggerProxy.info(`\nStopping n8n...`);
try {
const externalHooks = src_1.ExternalHooks();
await externalHooks.run('n8n.stop', []);
setTimeout(() => {
process.exit(processExistCode);
}, 30000);
const activeExecutionsInstance = src_1.ActiveExecutions.getInstance();
let executingWorkflows = activeExecutionsInstance.getActiveExecutions();
let count = 0;
while (executingWorkflows.length !== 0) {
if (count++ % 4 === 0) {
n8n_workflow_1.LoggerProxy.info(`Waiting for ${executingWorkflows.length} active executions to finish...`);
}
await new Promise((resolve) => {
setTimeout(resolve, 500);
});
executingWorkflows = activeExecutionsInstance.getActiveExecutions();
}
}
catch (error) {
n8n_workflow_1.LoggerProxy.error('There was an error shutting down n8n.', error);
}
process.exit(processExistCode);
}
async run() {
const logger = Logger_1.getLogger();
n8n_workflow_1.LoggerProxy.init(logger);
process.on('SIGTERM', Webhook.stopProcess);
process.on('SIGINT', Webhook.stopProcess);
const { flags } = this.parse(Webhook);
await (async () => {
if (config.get('executions.mode') !== 'queue') {
this.error('Webhook processes can only run with execution mode as queue.');
}
try {
const startDbInitPromise = src_1.Db.init().catch((error) => {
logger.error(`There was an error initializing DB: "${error.message}"`);
processExistCode = 1;
process.emit('SIGINT');
process.exit(1);
});
const userSettings = await n8n_core_1.UserSettings.prepareUserSettings();
const loadNodesAndCredentials = src_1.LoadNodesAndCredentials();
await loadNodesAndCredentials.init();
const credentialsOverwrites = src_1.CredentialsOverwrites();
await credentialsOverwrites.init();
const externalHooks = src_1.ExternalHooks();
await externalHooks.init();
const nodeTypes = src_1.NodeTypes();
await nodeTypes.init(loadNodesAndCredentials.nodeTypes);
const credentialTypes = src_1.CredentialTypes();
await credentialTypes.init(loadNodesAndCredentials.credentialTypes);
await startDbInitPromise;
const instanceId = await n8n_core_1.UserSettings.getInstanceId();
src_1.InternalHooksManager.init(instanceId);
if (config.get('executions.mode') === 'queue') {
const redisHost = config.get('queue.bull.redis.host');
const redisPassword = config.get('queue.bull.redis.password');
const redisPort = config.get('queue.bull.redis.port');
const redisDB = config.get('queue.bull.redis.db');
const redisConnectionTimeoutLimit = config.get('queue.bull.redis.timeoutThreshold');
let lastTimer = 0;
let cumulativeTimeout = 0;
const settings = {
retryStrategy: (times) => {
const now = Date.now();
if (now - lastTimer > 30000) {
lastTimer = now;
cumulativeTimeout = 0;
}
else {
cumulativeTimeout += now - lastTimer;
lastTimer = now;
if (cumulativeTimeout > redisConnectionTimeoutLimit) {
logger.error(`Unable to connect to Redis after ${redisConnectionTimeoutLimit}. Exiting process.`);
process.exit(1);
}
}
return 500;
},
};
if (redisHost) {
settings.host = redisHost;
}
if (redisPassword) {
settings.password = redisPassword;
}
if (redisPort) {
settings.port = redisPort;
}
if (redisDB) {
settings.db = redisDB;
}
const redis = new Redis(settings);
redis.on('error', (error) => {
if (error.toString().includes('ECONNREFUSED') === true) {
logger.warn('Redis unavailable - trying to reconnect...');
}
else {
logger.warn('Error with Redis: ', error);
}
});
}
await src_1.WebhookServer.start();
activeWorkflowRunner = src_1.ActiveWorkflowRunner.getInstance();
await activeWorkflowRunner.initWebhooks();
const editorUrl = src_1.GenericHelpers.getBaseUrl();
console.info('Webhook listener waiting for requests.');
}
catch (error) {
console.error('Exiting due to error. See log message for details.');
logger.error(`Webhook process cannot continue. "${error.message}"`);
processExistCode = 1;
process.emit('SIGINT');
process.exit(1);
}
})();
}
}
exports.Webhook = Webhook;
Webhook.description = 'Starts n8n webhook process. Intercepts only production URLs.';
Webhook.examples = [`$ n8n webhook`];
Webhook.flags = {
help: command_1.flags.help({ char: 'h' }),
};
//# sourceMappingURL=webhook.js.map
;