Skip to content

Commit

Permalink
fix(core): Ensure task runner server closes websocket connection corr…
Browse files Browse the repository at this point in the history
…ectly (#11633)
  • Loading branch information
ivov authored Nov 8, 2024
1 parent 0db658c commit b496bf3
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 1 deletion.
67 changes: 67 additions & 0 deletions packages/cli/src/runners/__tests__/task-runner-server.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import type { GlobalConfig } from '@n8n/config';
import { mock } from 'jest-mock-extended';
import { ServerResponse } from 'node:http';
import type WebSocket from 'ws';

import type { TaskRunnerAuthController } from '@/runners/auth/task-runner-auth.controller';
import { TaskRunnerServer } from '@/runners/task-runner-server';

import type { TaskRunnerServerInitRequest } from '../runner-types';

describe('TaskRunnerServer', () => {
describe('handleUpgradeRequest', () => {
it('should close WebSocket when response status code is > 200', () => {
const ws = mock<WebSocket>();
const request = mock<TaskRunnerServerInitRequest>({
url: '/runners/_ws',
ws,
});

const server = new TaskRunnerServer(
mock(),
mock<GlobalConfig>({ taskRunners: { path: '/runners' } }),
mock<TaskRunnerAuthController>(),
mock(),
);

// @ts-expect-error Private property
server.handleUpgradeRequest(request, mock(), Buffer.from(''));

const response = new ServerResponse(request);
response.writeHead = (statusCode) => {
if (statusCode > 200) ws.close();
return response;
};

response.writeHead(401);
expect(ws.close).toHaveBeenCalledWith(); // no args
});

it('should not close WebSocket when response status code is 200', () => {
const ws = mock<WebSocket>();
const request = mock<TaskRunnerServerInitRequest>({
url: '/runners/_ws',
ws,
});

const server = new TaskRunnerServer(
mock(),
mock<GlobalConfig>({ taskRunners: { path: '/runners' } }),
mock<TaskRunnerAuthController>(),
mock(),
);

// @ts-expect-error Private property
server.handleUpgradeRequest(request, mock(), Buffer.from(''));

const response = new ServerResponse(request);
response.writeHead = (statusCode) => {
if (statusCode > 200) ws.close();
return response;
};

response.writeHead(200);
expect(ws.close).not.toHaveBeenCalled();
});
});
});
2 changes: 1 addition & 1 deletion packages/cli/src/runners/task-runner-server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ export class TaskRunnerServer {

const response = new ServerResponse(request);
response.writeHead = (statusCode) => {
if (statusCode > 200) ws.close(100);
if (statusCode > 200) ws.close();
return response;
};

Expand Down

0 comments on commit b496bf3

Please sign in to comment.