Skip to content

Commit

Permalink
refactor: migrate socketErrorHandler to separate module
Browse files Browse the repository at this point in the history
  • Loading branch information
drazisil committed Sep 28, 2024
1 parent f7ed2c2 commit cc3d025
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 44 deletions.
45 changes: 1 addition & 44 deletions packages/gateway/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,49 +29,7 @@ import { getGatewayServer } from "./GatewayServer.js";
import { getPortMessageType, UserStatusManager } from "rusty-motors-nps";
import { BasePacket } from "rusty-motors-shared-packets";
import * as Sentry from "@sentry/node";

/**
* @typedef {object} OnDataHandlerArgs
* @property {object} args
* @property {string} args.connectionId The connection id of the socket that
* received the data.
* @property {module:packages/shared/RawMessage} args.message The data that was received.
* @property {module:shared/log.ServerLogger} [args.log=getServerLogger({ name: "gateway" })] The logger to use.
* response
* to the
* data.
*/

/**
* @typedef {function} OnDataHandler
* @param {OnDataHandlerArgs} args The arguments for the handler.
* @returns {ServiceResponse} The
* response
* to the
* data.
*/

/**
* Handle socket errors
*/
export function socketErrorHandler({
connectionId,
error,
log = getServerLogger({
name: "socketErrorHandler",
}),
}: {
connectionId: string;
error: NodeJS.ErrnoException;
log?: ServerLogger;
}) {
// Handle socket errors
if (error.code == "ECONNRESET") {
log.debug(`Connection ${connectionId} reset`);
return;
}
throw Error(`Socket error: ${error.message} on connection ${connectionId}`);
}
import { socketErrorHandler } from "./socketErrorHandler.js";

Check warning on line 32 in packages/gateway/src/index.ts

View check run for this annotation

Codecov / codecov/patch

packages/gateway/src/index.ts#L32

Added line #L32 was not covered by tests

/**
* Handle the end of a socket connection
Expand Down Expand Up @@ -179,7 +137,6 @@ export function onSocketConnection({
incomingSocket.on(
"data",
function socketDataHandler(incomingDataAsBuffer: Buffer) {

log.trace(
`Incoming data on port ${localPort}: ${incomingDataAsBuffer.toString(
"hex",
Expand Down
38 changes: 38 additions & 0 deletions packages/gateway/src/socketErrorHandler.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { describe, it, expect, vi } from "vitest";
import { socketErrorHandler } from "./socketErrorHandler.js";
import { type ServerLogger } from "rusty-motors-shared";

describe("socketErrorHandler", () => {

it("should log a debug message when error code is ECONNRESET", () => {
const connectionId = "12345";
const error = { code: "ECONNRESET" } as NodeJS.ErrnoException;
const mockLogger = {
debug: vi.fn(),
} as unknown as ServerLogger;


socketErrorHandler({ connectionId, error, log: mockLogger });

expect(mockLogger.debug).toHaveBeenCalledWith(
`Connection ${connectionId} reset`,
);
});

it("should throw an error when error code is not handled", () => {
const connectionId = "12345";
const error = {
code: "EUNKNOWN",
message: "Unknown error",
} as NodeJS.ErrnoException;
const mockLogger = {
debug: vi.fn(),
} as unknown as ServerLogger;


expect(() =>
socketErrorHandler({ connectionId, error, log: mockLogger }),
).toThrow(`Socket error: ${error.message} on connection ${connectionId}`);
});

});
30 changes: 30 additions & 0 deletions packages/gateway/src/socketErrorHandler.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { getServerLogger, type ServerLogger } from "rusty-motors-shared";

/**
* Handles socket errors by logging specific error codes or throwing an error.
*
* @param {Object} params - The parameters for the socket error handler.
* @param {string} params.connectionId - The ID of the connection where the error occurred.
* @param {NodeJS.ErrnoException} params.error - The error object containing details of the socket error.
* @param {ServerLogger} [params.log] - Optional logger instance for logging error details. Defaults to a server logger named "socketErrorHandler".
*
* @throws {Error} Throws an error if the socket error code is not handled.
*/
export function socketErrorHandler({
connectionId,
error,
log = getServerLogger({
name: "socketErrorHandler",
}),
}: {
connectionId: string;
error: NodeJS.ErrnoException;
log?: ServerLogger;
}) {
// Handle socket errors
if (error.code == "ECONNRESET") {
log.debug(`Connection ${connectionId} reset`);
return;
}
throw Error(`Socket error: ${error.message} on connection ${connectionId}`);
}

0 comments on commit cc3d025

Please sign in to comment.