From e5986c55a3d2b3c672530328e8284afadcd3b45a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E0=A4=95=E0=A4=BE=E0=A4=B0=E0=A4=A4=E0=A5=8B=E0=A4=AB?= =?UTF-8?q?=E0=A5=8D=E0=A4=AB=E0=A5=87=E0=A4=B2=E0=A4=B8=E0=A5=8D=E0=A4=95?= =?UTF-8?q?=E0=A5=8D=E0=A4=B0=E0=A4=BF=E0=A4=AA=E0=A5=8D=E0=A4=9F=E2=84=A2?= Date: Thu, 17 Aug 2023 12:44:34 +0200 Subject: [PATCH] feat(core): Add support for ready hooks, and credentials overwrite endpoint in workers (#6954) --- packages/cli/src/commands/worker.ts | 43 +++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/packages/cli/src/commands/worker.ts b/packages/cli/src/commands/worker.ts index f346277cbd..890c6c753d 100644 --- a/packages/cli/src/commands/worker.ts +++ b/packages/cli/src/commands/worker.ts @@ -23,6 +23,9 @@ import { generateFailedExecutionFromError } from '@/WorkflowHelpers'; import { N8N_VERSION } from '@/constants'; import { BaseCommand } from './BaseCommand'; import { ExecutionRepository } from '@/databases/repositories'; +import bodyParser from 'body-parser'; +import { ICredentialsOverwrite } from '@/Interfaces'; +import { CredentialsOverwrites } from '@/CredentialsOverwrites'; export class Worker extends BaseCommand { static description = '\nStarts a n8n worker'; @@ -350,9 +353,39 @@ export class Worker extends BaseCommand { }, ); - server.listen(port, () => { - this.logger.info(`\nn8n worker health check via, port ${port}`); - }); + let presetCredentialsLoaded = false; + const endpointPresetCredentials = config.getEnv('credentials.overwrite.endpoint'); + if (endpointPresetCredentials !== '') { + // POST endpoint to set preset credentials + app.post( + `/${endpointPresetCredentials}`, + bodyParser.json(), + async (req: express.Request, res: express.Response) => { + if (!presetCredentialsLoaded) { + const body = req.body as ICredentialsOverwrite; + + if (req.headers['content-type'] !== 'application/json') { + ResponseHelper.sendErrorResponse( + res, + new Error( + 'Body must be a valid JSON, make sure the content-type is application/json', + ), + ); + return; + } + + CredentialsOverwrites().setData(body); + presetCredentialsLoaded = true; + ResponseHelper.sendSuccessResponse(res, { success: true }, true, 200); + } else { + ResponseHelper.sendErrorResponse( + res, + new Error('Preset credentials can be set once'), + ); + } + }, + ); + } server.on('error', (error: Error & { code: string }) => { if (error.code === 'EADDRINUSE') { @@ -362,6 +395,10 @@ export class Worker extends BaseCommand { process.exit(1); } }); + + await new Promise((resolve) => server.listen(port, () => resolve())); + await this.externalHooks.run('worker.ready'); + this.logger.info(`\nn8n worker health check via, port ${port}`); } // Make sure that the process does not close