From b8922fc447abe96c2fb6fa63a1fd8b62ef795d0a 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 11:57:33 +0200 Subject: [PATCH 1/3] feat(core): Add support for ready hooks, and credentials overwrite endpoint in workers --- packages/cli/src/commands/worker.ts | 54 +++++++++++++++++++++++------ 1 file changed, 43 insertions(+), 11 deletions(-) diff --git a/packages/cli/src/commands/worker.ts b/packages/cli/src/commands/worker.ts index 432b741eba1f3..1c271e2010e65 100644 --- a/packages/cli/src/commands/worker.ts +++ b/packages/cli/src/commands/worker.ts @@ -24,8 +24,8 @@ import { BaseCommand } from './BaseCommand'; import { ExecutionRepository } from '@db/repositories'; import { OwnershipService } from '@/services/ownership.service'; import { generateHostInstanceId } from '@/databases/utils/generators'; -// eslint-disable-next-line import/no-extraneous-dependencies -import { IConfig } from '@oclif/config'; +import type { ICredentialsOverwrite } from '@/Interfaces'; +import { CredentialsOverwrites } from '@/CredentialsOverwrites'; export class Worker extends BaseCommand { static description = '\nStarts a n8n worker'; @@ -46,12 +46,7 @@ export class Worker extends BaseCommand { static jobQueue: JobQueue; - readonly uniqueInstanceId: string; - - constructor(argv: string[], cmdConfig: IConfig) { - super(argv, cmdConfig); - this.uniqueInstanceId = generateHostInstanceId('worker'); - } + readonly uniqueInstanceId = generateHostInstanceId('worker'); /** * Stop n8n in a graceful way. @@ -360,9 +355,42 @@ 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}`, + async (req: express.Request, res: express.Response) => { + if (!presetCredentialsLoaded) { + const body = req.body as ICredentialsOverwrite; + + if (req.contentType !== '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); + + await this.loadNodesAndCredentials.generateTypesForFrontend(); + + 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') { @@ -372,6 +400,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 From 859395dbd17036c1957d61cce4d2adac14a5947f 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:09:10 +0200 Subject: [PATCH 2/3] workers don't need to generate frontend types --- packages/cli/src/commands/worker.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/cli/src/commands/worker.ts b/packages/cli/src/commands/worker.ts index 1c271e2010e65..64eba7cce81cb 100644 --- a/packages/cli/src/commands/worker.ts +++ b/packages/cli/src/commands/worker.ts @@ -376,11 +376,7 @@ export class Worker extends BaseCommand { } CredentialsOverwrites().setData(body); - - await this.loadNodesAndCredentials.generateTypesForFrontend(); - presetCredentialsLoaded = true; - ResponseHelper.sendSuccessResponse(res, { success: true }, true, 200); } else { ResponseHelper.sendErrorResponse( From a6501e77b84c94a899313f33514d24747d230c9d 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:34:17 +0200 Subject: [PATCH 3/3] add bodyParser --- packages/cli/src/commands/worker.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/cli/src/commands/worker.ts b/packages/cli/src/commands/worker.ts index 64eba7cce81cb..5702dc2d35339 100644 --- a/packages/cli/src/commands/worker.ts +++ b/packages/cli/src/commands/worker.ts @@ -26,6 +26,7 @@ import { OwnershipService } from '@/services/ownership.service'; import { generateHostInstanceId } from '@/databases/utils/generators'; import type { ICredentialsOverwrite } from '@/Interfaces'; import { CredentialsOverwrites } from '@/CredentialsOverwrites'; +import { rawBodyReader, bodyParser } from '@/middlewares'; export class Worker extends BaseCommand { static description = '\nStarts a n8n worker'; @@ -361,6 +362,8 @@ export class Worker extends BaseCommand { // POST endpoint to set preset credentials app.post( `/${endpointPresetCredentials}`, + rawBodyReader, + bodyParser, async (req: express.Request, res: express.Response) => { if (!presetCredentialsLoaded) { const body = req.body as ICredentialsOverwrite;