diff --git a/libs/@rustymotors/binary/src/lib/Bytable.ts b/libs/@rustymotors/binary/src/lib/Bytable.ts index ff2603f0f..a473c5828 100644 --- a/libs/@rustymotors/binary/src/lib/Bytable.ts +++ b/libs/@rustymotors/binary/src/lib/Bytable.ts @@ -60,7 +60,7 @@ export class Bytable extends BytableBase implements BytableObject { } } -export function validateBuffer(buf: DataView | ArrayBufferLike, direction: string) { +export function validateBuffer(buf: DataView | ArrayBufferLike | Buffer, direction: string) { if (typeof buf === 'undefined') { throw new Error(`Cannot ${direction} undefined buffer`); } diff --git a/libs/@rustymotors/binary/src/lib/BytableHeader.ts b/libs/@rustymotors/binary/src/lib/BytableHeader.ts index c9c4241a6..779358277 100644 --- a/libs/@rustymotors/binary/src/lib/BytableHeader.ts +++ b/libs/@rustymotors/binary/src/lib/BytableHeader.ts @@ -46,7 +46,9 @@ export class BytableHeader extends Bytable { return this.messageId_; } - /** @deprecated Use `id` instead. */ + /** + * @deprecated Use `id` instead. // TODO: Remove depreciated method + * */ get messageId() { return this.id; } diff --git a/libs/@rustymotors/binary/src/lib/BytableMessage.ts b/libs/@rustymotors/binary/src/lib/BytableMessage.ts index e2bd35ec6..1cf6c5a0f 100644 --- a/libs/@rustymotors/binary/src/lib/BytableMessage.ts +++ b/libs/@rustymotors/binary/src/lib/BytableMessage.ts @@ -8,8 +8,11 @@ import { BytableData } from './BytableData.js'; import { BytableDword } from './BytableDword.js'; import { BytableHeader } from './BytableHeader.js'; import { BytableWord } from './BytableWord.js'; -import { BytableObject } from './types.js'; -import { getServerLogger, RawMessage } from 'rusty-motors-shared'; +import { BytableObject, IBytableMessage } from './types.js'; +import { + getServerLogger, + RawMessage, +} from 'rusty-motors-shared'; export class BytableStructure extends BytableBase implements BytableObject { protected fields_: Array = []; @@ -152,7 +155,8 @@ export const BytableFieldTypes = { Buffer: BytableBuffer, CString: BytableCString, }; -export class BytableMessage extends Bytable { + +export class BytableMessage extends Bytable implements IBytableMessage { protected header_: BytableHeader = new BytableHeader(); protected fields_: Array = []; protected serializeOrder_: Array<{ @@ -428,3 +432,5 @@ export function createGameMessage(buffer?: Buffer) { return message; } + + diff --git a/libs/@rustymotors/binary/src/lib/binary.ts b/libs/@rustymotors/binary/src/lib/binary.ts index 970a2b1a5..5dd6292ff 100644 --- a/libs/@rustymotors/binary/src/lib/binary.ts +++ b/libs/@rustymotors/binary/src/lib/binary.ts @@ -1,4 +1,4 @@ -import { BytableMessage } from "./BytableMessage"; +import { BytableMessage } from "./BytableMessage.js"; import { GamePacket } from "rusty-motors-shared-packets"; export function binary(): string { diff --git a/libs/@rustymotors/binary/src/lib/types.ts b/libs/@rustymotors/binary/src/lib/types.ts index c7ab36538..0718b8b1d 100644 --- a/libs/@rustymotors/binary/src/lib/types.ts +++ b/libs/@rustymotors/binary/src/lib/types.ts @@ -1,3 +1,6 @@ +import { BytableHeader } from './BytableHeader.js'; +import { BytableFieldTypes } from './BytableMessage.js'; + /** * A field that can be serialized and deserialized */ @@ -32,3 +35,32 @@ export interface BytableObject { setName(name: string): void; setValue(value: string | number | Buffer): void; } +export interface IBytableMessage { + deserialize(buffer: Buffer): void; + get header(): BytableHeader; + get serializeSize(): number; + serialize(): Buffer; + get json(): { name: string; serializeSize: number; header: { name: string; id: number; len: number; version: 0 | 1; serializeSize: number; }; fields: Record[]; }; + setName(name: string): void; + toString(): string; + setSerializeOrder(serializeOrder: Array<{ + name: string; + field: keyof typeof BytableFieldTypes; + }>): void; + getField(name: string): BytableObject | undefined; + getFieldValueByName(name: string): string | number | Buffer | undefined; + htonl(value: number): Buffer; + coerceValue(value: string | number | Buffer): Buffer; + setFieldValueByName(name: string, value: string | number | Buffer): void; + setVersion(version: 0 | 1): void; + getBody(): Buffer; + setBody(buffer: Buffer): void; + get data(): Buffer; + set data(buffer: Buffer); + toHexString(): string; + _doDeserialize(buf: Buffer): void; + _doSerialize(): Buffer; + get name(): string; + get value(): string | number | Buffer; + setValue(value: string | number | Buffer): void; +} diff --git a/libs/@rustymotors/network/src/network.test.ts b/libs/@rustymotors/network/src/network.test.ts new file mode 100644 index 000000000..b2e935f85 --- /dev/null +++ b/libs/@rustymotors/network/src/network.test.ts @@ -0,0 +1,43 @@ +import { describe, it, expect } from 'vitest'; +import { ClientConnection, newConnection } from './network.js'; +import { createMockTcpSocket, createMockUdpSocket } from 'rusty-motors-shared'; + +describe('ClientConnection', () => { + it('should initialize with TCP socket', () => { + const socket = createMockTcpSocket(); + + const connection = new ClientConnection(socket, 'TCP'); + expect(connection).toBeInstanceOf(ClientConnection); + expect(connection.protocol).toBe('TCP'); + expect(connection.socket).toBe(socket); + expect(connection.encryptionSetup).toBe(false); + expect(connection.encryption).toBeNull(); + }); + + it('should initialize with UDP socket', () => { + const socket = createMockUdpSocket(); + + const connection = new ClientConnection(socket, 'UDP'); + expect(connection).toBeInstanceOf(ClientConnection); + expect(connection.protocol).toBe('UDP'); + expect(connection.socket).toBe(socket); + }); +}); + +describe('newConnection', () => { + it('should create ClientConnection for TCP socket', () => { + const socket = createMockTcpSocket(); + + const connection = newConnection(socket); + expect(connection).toBeInstanceOf(ClientConnection); + expect(connection.protocol).toBe('TCP'); + }); + + it('should create ClientConnection for UDP socket', () => { + const socket = createMockUdpSocket(); + + const connection = newConnection(socket); + expect(connection).toBeInstanceOf(ClientConnection); + expect(connection.protocol).toBe('UDP'); + }); +}); diff --git a/libs/@rustymotors/network/src/network.ts b/libs/@rustymotors/network/src/network.ts index a492c1316..3bf3358c3 100644 --- a/libs/@rustymotors/network/src/network.ts +++ b/libs/@rustymotors/network/src/network.ts @@ -1,12 +1,11 @@ -import { Socket as SocketUDP, type RemoteInfo } from 'node:dgram'; +import { Socket as SocketUDP } from 'node:dgram'; import EventEmitter from 'node:events'; -import { Socket as SocketTCP, type AddressInfo } from 'node:net'; -import type { IClientConnection } from './types.js'; +import { Socket as SocketTCP } from 'node:net'; import type { Cipheriv, Decipheriv } from 'crypto'; + export class ClientConnection extends EventEmitter - implements IClientConnection { personaName: string = ''; personaId: number = 0; @@ -14,43 +13,47 @@ export class ClientConnection port: number; protocol: 'TCP' | 'UDP'; socket: SocketTCP | SocketUDP; - encryptionSetup: false; + encryptionSetup: false = false; encryption: | ({ cmdEnc: Cipheriv; cmdDec: Decipheriv } & { cmdEnc: Cipheriv; cmdDec: Decipheriv; }) - | null; + | null = null; - constructor(socket: SocketTCP | SocketUDP) { + constructor(socket: SocketTCP | SocketUDP, protocol: 'TCP' | 'UDP') { super(); - const remoteAddress = socket.remoteAddress; - const localPort = (socket.address() as AddressInfo).port; + this.socket = socket; + this.protocol = protocol; - if ( - typeof remoteAddress === 'undefined' || - typeof localPort === 'undefined' - ) { - throw new Error('both remoteAddress and localPort must be defined'); + if (protocol === 'TCP' && socket instanceof SocketTCP) { + this.ip = socket.remoteAddress || ''; + this.port = socket.localPort || 0; + } else if (protocol === 'UDP' && socket instanceof SocketUDP) { + // UDP sockets don't have a single remote address/port in the same way, + // but for a connected UDP socket or just initialization we might need to handle it differently. + // For now, initializing with defaults or extracting from address() if possible. + try { + const address = socket.address(); + this.ip = address.address; + this.port = address.port; + } catch (e) { + // Socket might not be bound yet + this.ip = ''; + this.port = 0; + } + } else { + this.ip = ''; + this.port = 0; } } } -export function newConnection(socket: SocketTCP | SocketUDP): ClientConnection; - export function newConnection(socket: SocketTCP | SocketUDP): ClientConnection { if (socket instanceof SocketTCP) { - const connection: ClientConnection = { - personaName: '', - personaId: 0, - ip: remoteAddress, - port: localPort, - protocol: 'TCP', - socket: socket, - encryptionSetup: false, - encryption: null, - }; + return new ClientConnection(socket, 'TCP'); } else if (socket instanceof SocketUDP) { + return new ClientConnection(socket, 'UDP'); } else { throw new Error('socket is not either TCP or UDP'); } diff --git a/libs/@rustymotors/protocol/src/MCOProtocol.ts b/libs/@rustymotors/protocol/src/MCOProtocol.ts index 2c42fe4b8..98d3f6508 100644 --- a/libs/@rustymotors/protocol/src/MCOProtocol.ts +++ b/libs/@rustymotors/protocol/src/MCOProtocol.ts @@ -58,7 +58,7 @@ class MCOProtocol { socket: Socket; log?: ServerLogger; }) { - log.debug( + log.verbose( "Accepting incoming socket", { connectionId, port }, ); @@ -71,7 +71,7 @@ class MCOProtocol { }); socket.on("error", (error) => { if (error.message === "read ECONNRESET") { - log.debug( + log.verbose( "Connection reset by client", { connectionId }, ); @@ -94,7 +94,7 @@ class MCOProtocol { log?: ServerLogger; }) { const incomingPacket = createRawMessage(data); - log.debug( + log.verbose( `Received packet: ${incomingPacket.serialize().toString("hex")}`, { connectionId }, ); @@ -118,7 +118,7 @@ class MCOProtocol { ); } - log.debug( + log.verbose( "Packet processed", { connectionId }, ); diff --git a/libs/@rustymotors/protocol/src/defaultMessageHandler.ts b/libs/@rustymotors/protocol/src/defaultMessageHandler.ts index 047803c7e..c019f2ef7 100644 --- a/libs/@rustymotors/protocol/src/defaultMessageHandler.ts +++ b/libs/@rustymotors/protocol/src/defaultMessageHandler.ts @@ -13,7 +13,7 @@ export async function defaultMessageHandler({ message: BytableMessage | null; }> { const messageId = message.header.messageId; - log.debug( + log.verbose( "Not yet implemented", { connectionId, messageId: messageId.toString(16) }, ); diff --git a/libs/@rustymotors/protocol/src/serverLoginMessageHandler.ts b/libs/@rustymotors/protocol/src/serverLoginMessageHandler.ts index 49a93e250..c16722467 100644 --- a/libs/@rustymotors/protocol/src/serverLoginMessageHandler.ts +++ b/libs/@rustymotors/protocol/src/serverLoginMessageHandler.ts @@ -37,7 +37,7 @@ export async function serverLoginMessageHandler({ ]); inboundMessage.deserialize(message.serialize()); const messageId = inboundMessage.header.messageId; - log.debug( + log.verbose( "Processing server login message", { connectionId, messageId: messageId.toString(16) }, ); @@ -94,7 +94,7 @@ export async function serverLoginMessageHandler({ decrypted: sessionKey, }, ); // 12 bytes - log.fatal( + log.error( `Error decrypting session key: ${(error as Error).message}`, { connectionId, @@ -111,14 +111,14 @@ export async function serverLoginMessageHandler({ throw Error("No session key found"); } - log.debug( + log.verbose( "Session key decrypted", { connectionId, }, ); - log.debug( + log.verbose( "Creating outbound message", { connectionId, @@ -128,7 +128,7 @@ export async function serverLoginMessageHandler({ const responseCode = 0x601; const loginResponseMessage = createRawMessage(); - loginResponseMessage.header.setMessageId(responseCode); + loginResponseMessage.header.setId(responseCode); loginResponseMessage.setSerializeOrder([ { name: "ban", field: "Dword" }, { name: "gag", field: "Dword" }, @@ -156,10 +156,10 @@ export async function serverLoginMessageHandler({ const body = serialize(fields); const responseMessage = createRawMessage(); - responseMessage.header.setMessageId(responseCode); + responseMessage.header.setId(responseCode); responseMessage.setBody(body); - log.debug( + log.verbose( "Outbound message created", { connectionId, diff --git a/libs/@rustymotors/protocol/src/writePacket.ts b/libs/@rustymotors/protocol/src/writePacket.ts index 4b6b443f6..3f40fc43b 100644 --- a/libs/@rustymotors/protocol/src/writePacket.ts +++ b/libs/@rustymotors/protocol/src/writePacket.ts @@ -8,7 +8,7 @@ export function writePacket({ data: Buffer; log?: ServerLogger; }) { - log.debug( + log.verbose( `Writing packet: ${data.toString("hex")}`, { connectionId }, ); diff --git a/packages/cli/test/index.test.ts b/packages/cli/test/index.test.ts index 82ce1b669..fef380492 100644 --- a/packages/cli/test/index.test.ts +++ b/packages/cli/test/index.test.ts @@ -8,9 +8,6 @@ describe("ConsoleThread", () => { info: () => vi.fn(), error: () => vi.fn(), warn: () => vi.fn(), - debug: () => vi.fn(), - trace: () => vi.fn(), - fatal: () => vi.fn(), } as any; const instance = new ConsoleThread({ parentThread, log }); expect(instance).toBeInstanceOf(ConsoleThread); diff --git a/packages/database/src/cache.ts b/packages/database/src/cache.ts index 2ab528d8a..825b5e7f8 100644 --- a/packages/database/src/cache.ts +++ b/packages/database/src/cache.ts @@ -155,7 +155,7 @@ export async function saveVehicle( scrap_value: 0, }; - log.debug(`Saving vehicle part: ${JSON.stringify(vehiclePart)}`, + log.verbose(`Saving vehicle part: ${JSON.stringify(vehiclePart)}`, { vehicleId: vehiclePartTree.vehicleId }); await savePart(vehiclePart).catch((error) => { log.error(`Error saving vehicle part: ${error}`); @@ -173,7 +173,7 @@ export async function saveVehicle( damage_info: vehiclePartTree.damageInfo, }; - log.debug(`Saving vehicle: ${JSON.stringify(newVehicle)}`, { + log.verbose(`Saving vehicle: ${JSON.stringify(newVehicle)}`, { vehicleId: vehiclePartTree.vehicleId }); @@ -345,10 +345,10 @@ export async function buildVehiclePartTreeFromDB( throw new Error(`Vehicle with id ${vehicleId} has no parts`); } - log.debug(`We got parts!`, { + log.verbose(`We got parts!`, { BrandedPart: vehiclePartTree.brandedPartId }); - log.debug( + log.verbose( `There are ${level1Parts.length} level 1 parts in the vehicle assembly`, { BrandedPart: vehiclePartTree.brandedPartId } ); @@ -385,10 +385,10 @@ export async function buildVehiclePartTreeFromDB( throw new Error(`Vehicle with id ${vehicleId} has no level 2 parts`); } - log.debug(`We got parts!`, + log.verbose(`We got parts!`, { BrandedPart: vehiclePartTree.brandedPartId } ); - log.debug( + log.verbose( `There are ${level2Parts.length} level 2 parts in the vehicle assembly`, { BrandedPart: vehiclePartTree.brandedPartId } ); @@ -410,10 +410,10 @@ export async function buildVehiclePartTreeFromDB( vehiclePartTree.partTree.level2.parts.push(newPart); } - log.debug(`Vehicle part tree populated`, + log.verbose(`Vehicle part tree populated`, { BrandedPart: vehiclePartTree.brandedPartId } ); - log.debug(`Vehicle part tree: ${vehiclePartTreeToJSON(vehiclePartTree)}`, { + log.verbose(`Vehicle part tree: ${vehiclePartTreeToJSON(vehiclePartTree)}`, { BrandedPart: vehiclePartTree.brandedPartId }); @@ -555,10 +555,10 @@ export async function buildVehiclePartTree({ } // But we did get parts, right? - log.debug(`We got parts!`, + log.verbose(`We got parts!`, { BrandedPart: brandedPartId } ); - log.debug( + log.verbose( `There are ${vehicleAssembly.length} parts in the vehicle assembly`, { brandedPart: brandedPartId } ); @@ -592,7 +592,7 @@ export async function buildVehiclePartTree({ }, }; - log.debug(`Vehicle part tree created`); + log.verbose(`Vehicle part tree created`); // Populate the vehicle part tree for (const part of vehicleAssembly) { @@ -640,7 +640,7 @@ export async function buildVehiclePartTree({ } } - log.debug(`Vehicle part tree populated`); + log.verbose(`Vehicle part tree populated`); return vehiclePartTree; } diff --git a/packages/database/src/functions/createNewCar.ts b/packages/database/src/functions/createNewCar.ts index cc3cbb57f..923944943 100644 --- a/packages/database/src/functions/createNewCar.ts +++ b/packages/database/src/functions/createNewCar.ts @@ -130,7 +130,7 @@ export async function createNewCar( }); - log.debug( + log.verbose( 'vehicle', { vehicle }, ); @@ -155,7 +155,7 @@ export async function createNewCar( // AttachmentPointId: 0, // }); -// log.debug({ tmpParts }, 'tmpParts after pushing the first part'); +// log.verbose({ tmpParts }, 'tmpParts after pushing the first part'); // // Get the rest of the parts for the vehicle // const part = tmpParts[0]; @@ -179,9 +179,9 @@ export async function createNewCar( // throw new Error('No parts found for the vehicle'); // } -// log.debug(`Found ${restOfTheParts.length} parts for the vehicle`); +// log.verbose(`Found ${restOfTheParts.length} parts for the vehicle`); -// log.debug({ restOfTheParts }, 'restOfTheParts'); +// log.verbose({ restOfTheParts }, 'restOfTheParts'); // for (const part of restOfTheParts) { // tmpParts.push({ @@ -192,7 +192,7 @@ export async function createNewCar( // }); // } -// log.debug({ tmpParts }, 'tmpParts after getting the rest of the parts'); +// log.verbose({ tmpParts }, 'tmpParts after getting the rest of the parts'); // let vehicleId: number | null = null; @@ -204,7 +204,7 @@ export async function createNewCar( // throw new Error('No parts found for the vehicle'); // } -// log.debug({ tmpParts }, 'tmpParts'); +// log.verbose({ tmpParts }, 'tmpParts'); // let parentPartId = null; // let currentPartId = await getNextSq(connection, 'part_partid_seq'); @@ -308,7 +308,7 @@ export type DBPart = { // vehicleId = currentPartId; -// log.debug({ vehicleId }, 'vehicleId'); +// log.verbose({ vehicleId }, 'vehicleId'); // // Update the partid of the part in the tmpParts // if (typeof tmpParts[0] === 'undefined') { @@ -319,7 +319,7 @@ export type DBPart = { // tmpParts[0].partId = currentPartId; // tmpParts[0].parentPartId = parentPartId; -// log.debug({ tmpParts }, 'tmpParts after inserting the first part'); +// log.verbose({ tmpParts }, 'tmpParts after inserting the first part'); // // Now insert the rest of the parts // for (let i = 1; i < tmpParts.length; i++) { @@ -346,7 +346,7 @@ export type DBPart = { // part.parentPartId = parentPartId; // } -// log.debug({ tmpParts }, 'tmpParts after inserting the rest of the parts'); +// log.verbose({ tmpParts }, 'tmpParts after inserting the rest of the parts'); // return { currentPartId, parentPartId, vehicleId }; // } @@ -512,7 +512,7 @@ where v.vehicle_id = ${vehicleId} WHERE p1.part_id = ${vehicleId} OR p1.parent_part_id = ${vehicleId} `); - log.debug({ rawParts }, 'rawParts'); + log.verbose({ rawParts }, 'rawParts'); for (const rawPart of rawParts) { parts.push({ @@ -537,7 +537,7 @@ where v.vehicle_id = ${vehicleId} throw new Error(`No parts found for vehicle with id ${vehicleId}`); } - log.debug({ parts }, 'parts'); + log.verbose({ parts }, 'parts'); vehicle.parts = parts; diff --git a/packages/database/src/functions/purchaseCar.ts b/packages/database/src/functions/purchaseCar.ts index 14b782396..72062d3bd 100644 --- a/packages/database/src/functions/purchaseCar.ts +++ b/packages/database/src/functions/purchaseCar.ts @@ -11,7 +11,7 @@ export async function purchaseCar( tradeInCarId: number, ): Promise { try { - getServerLogger('purchaseCar').debug( + getServerLogger('purchaseCar').verbose( `Player ${playerId} is purchasing car from dealer ${dealerId} with branded part ${brandedPardId} and skin ${skinId} and trading in car ${tradeInCarId}`, ); @@ -32,7 +32,7 @@ try { throw error; }); - getServerLogger('purchaseCar').debug( + getServerLogger('purchaseCar').verbose( `Player ${playerId} purchased car with ID ${newCarId}`, ); @@ -47,7 +47,7 @@ try { ownerID: playerId, }); - getServerLogger('purchaseCar').debug( + getServerLogger('purchaseCar').verbose( `Built vehicle part tree for player ${playerId}`, { parts }, ); diff --git a/packages/gateway/src/GatewayServer.ts b/packages/gateway/src/GatewayServer.ts index 383691872..1b769d933 100644 --- a/packages/gateway/src/GatewayServer.ts +++ b/packages/gateway/src/GatewayServer.ts @@ -46,7 +46,7 @@ export class Gateway { udpListeningPortList = [], socketConnectionHandler = onSocketConnection, }: GatewayOptions) { - log.debug('Creating GatewayServer instance'); + log.verbose('Creating GatewayServer instance'); this.config = config; this.log = log; @@ -102,7 +102,7 @@ export class Gateway { await Promise.all([tcpListeningServers, udpListeningSockets]); - this.log.debug(`All sockets listening`); + this.log.verbose(`All sockets listening`); if (this.webServer === undefined) { throw Error('webServer is undefined'); @@ -204,7 +204,7 @@ export class Gateway { */ async stop(): Promise { // Mark the GatewayServer as stopping - this.log.debug('Marking GatewayServer as stopping'); + this.log.verbose('Marking GatewayServer as stopping'); this.status = 'stopping'; // Stop the servers @@ -216,11 +216,11 @@ export class Gateway { } // Mark the GatewayServer as stopped - this.log.debug('Marking GatewayServer as stopped'); + this.log.verbose('Marking GatewayServer as stopped'); this.status = 'stopped'; // Reset the global state - this.log.debug('Resetting the global state'); + this.log.verbose('Resetting the global state'); createInitialState({}).save(); } diff --git a/packages/gateway/src/index.ts b/packages/gateway/src/index.ts index 92e93b31f..6ea9b8aba 100644 --- a/packages/gateway/src/index.ts +++ b/packages/gateway/src/index.ts @@ -102,7 +102,7 @@ export function onUdpMessage({ return; } - log.debug( + log.verbose( 'New UDP Message', { namespace: 'onUdpMessage', diff --git a/packages/gateway/src/mcotsPortRouter.ts b/packages/gateway/src/mcotsPortRouter.ts index 481ccec5b..286eab0a2 100644 --- a/packages/gateway/src/mcotsPortRouter.ts +++ b/packages/gateway/src/mcotsPortRouter.ts @@ -32,7 +32,7 @@ export async function mcotsPortRouter({ return; } - log.debug(`MCOTS port router started`,{ + log.verbose(`MCOTS port router started`,{ connectionId, port }); @@ -66,7 +66,7 @@ export async function mcotsPortRouter({ socket.on('error', (error) => { if (error.message.includes('ECONNRESET')) { - log.debug(`Connection reset by client`, { + log.verbose(`Connection reset by client`, { connectionId, port: socket.localPort }); @@ -108,7 +108,7 @@ async function processIncomingPackets( try { let inPackets: Buffer[] = []; - log.debug( + log.verbose( `Received data`, { namespace: "processIncommingPacket", connectionId, @@ -133,13 +133,13 @@ async function processIncomingPackets( inPackets.push(packet); } - log.debug(`Received ${inPackets.length} packets`, { + log.verbose(`Received ${inPackets.length} packets`, { connectionId }); inPackets.forEach(async (packet, idx) => { - log.debug(`Processing packet #${idx}`,{ + log.verbose(`Processing packet #${idx}`,{ connectionId, data: packet.toString("hex") }); @@ -192,7 +192,7 @@ async function routeInitialMessage( // Route the initial message to the appropriate handler // Messages may be encrypted, this will be handled by the handler - log.debug(`Routing message for port ${port}: ${initialPacket.msgNo}`); + log.verbose(`Routing message for port ${port}: ${initialPacket.msgNo}`); let responses: MessageNode[] = []; switch (port) { @@ -211,7 +211,7 @@ async function routeInitialMessage( } // Send responses back to the client - log.debug(`[${id}] Sending ${responses.length} responses`); + log.verbose(`[${id}] Sending ${responses.length} responses`); // Serialize the responses const serializedResponses = responses.map((response) => response.serialize()); diff --git a/packages/gateway/src/npsPortRouter.ts b/packages/gateway/src/npsPortRouter.ts index 12b6dc313..69b3cc109 100644 --- a/packages/gateway/src/npsPortRouter.ts +++ b/packages/gateway/src/npsPortRouter.ts @@ -47,7 +47,7 @@ export async function npsPortRouter({ return; } - log.debug(`Receiving packet in queue`); + log.verbose(`Receiving packet in queue`); await processSocketData( item.data, @@ -68,7 +68,7 @@ export async function npsPortRouter({ 10, async (item: messageQueueItem) => { try { - log.debug(`Sending packet in queue`, { + log.verbose(`Sending packet in queue`, { data: item.data.toString("hex"), }); if ('write' in socket) { @@ -91,7 +91,7 @@ export async function npsPortRouter({ // TODO: Document this if (port === 7003) { // Sent ok to login packet - log.debug(`Sending ok to login packet`); + log.verbose(`Sending ok to login packet`); sendQueue.put({ sequenceNo: -1, data: Buffer.from([0x02, 0x30, 0x00, 0x04]), @@ -112,7 +112,7 @@ export async function npsPortRouter({ socket.on('error', (error) => { if (error.message.includes('ECONNRESET')) { - log.debug(`[${connectionId}] Connection reset by client`); + log.verbose(`[${connectionId}] Connection reset by client`); return; } log.error(`[${connectionId}] Socket error: ${error}`); @@ -183,14 +183,14 @@ export async function processSocketData( } try { - log.debug(`[${id}] Received data: ${data.toString('hex')}`); - log.debug(`[${id}] Data length: ${data.length}`); + log.verbose(`[${id}] Received data: ${data.toString('hex')}`); + log.verbose(`[${id}] Data length: ${data.length}`); const separator = Buffer.from([0x11, 0x01]); const packets = splitDataIntoPackets(data, separator, log, id); for (const packet of packets) { - log.debug(`raw packet: ${packet.toString('hex')}`); + log.verbose(`raw packet: ${packet.toString('hex')}`); if (packet.byteLength === 0) { log.warn(`BUG: We recieved an empty packet from the splitter`); continue; @@ -229,7 +229,7 @@ function splitDataIntoPackets( const packetsArray = data.toString('hex').split(separator.toString('hex')); const packetCount = packetsArray.length; let packets: Buffer[]; - log.debug(`[${id}] ${packetCount} packets detected`); + log.verbose(`[${id}] ${packetCount} packets detected`); if (packetCount > 1) { packets = packetsArray.map((packet: string) => { @@ -242,7 +242,7 @@ function splitDataIntoPackets( return Buffer.alloc(0); }); packets = removeEmptyEntries(packets); - log.debug( + log.verbose( `[${id}] Split packets: ${packets.map((p) => p.toString('hex'))}`, ); } else { @@ -362,7 +362,7 @@ async function routeInitialMessage( // Route the initial message to the appropriate handler // Messages may be encrypted, this will be handled by the handler - log.debug( + log.verbose( `Routing message for port ${port}: ${initialPacket.header.id}`, ); @@ -375,7 +375,7 @@ async function routeInitialMessage( if (port >= 9000 && port < 9021) { try { - log.debug( + log.verbose( `[${id}] Passing room packet to lobby handler: ${packet.getMessageId()}`, ); responses = ( @@ -384,7 +384,7 @@ async function routeInitialMessage( message: initialPacket, }) ).messages; - log.debug( + log.verbose( `[${id}] Received ${responses.length} room lobby response packets`, ); wasHandled = true; @@ -398,7 +398,7 @@ async function routeInitialMessage( switch (port) { case 7003: // Handle lobby packet - log.debug( + log.verbose( `[${id}] Passing packet to lobby handler: ${packet.getMessageId()}`, ); responses = ( @@ -407,7 +407,7 @@ async function routeInitialMessage( message: initialPacket, }) ).messages; - log.debug( + log.verbose( `[${id}] Received ${responses.length} lobby response packets`, ); wasHandled = true; @@ -420,39 +420,39 @@ async function routeInitialMessage( message: initialPacket, }) ).messages; - log.debug( + log.verbose( `[${id}] Received ${responses.length} login response packets`, ); wasHandled = true; break; case 8227: // Handle chat packet - log.debug( + log.verbose( `[${id}] Passing packet to chat handler: ${packet.serialize().toString('hex')}`, ); responses = ( await receiveChatData({ connectionId: id, message: packet }) ).messages; - log.debug( + log.verbose( `[${id}] Chat Responses: ${responses.map((r) => r.serialize().toString('hex'))}`, ); break; case 8228: - log.debug( + log.verbose( `[${id}] Passing packet to persona handler: ${packet.serialize().toString('hex')}`, ); // responses =Handle persona packet responses = ( await receivePersonaData({ connectionId: id, message: packet }) ).messages; - log.debug( + log.verbose( `[${id}] Received ${responses.length} persona response packets`, ); wasHandled = true; break; case 10001: try { - log.debug( + log.verbose( `[${id}] Passing race? packet to lobby handler: ${packet.getMessageId()}`, ); responses = ( @@ -461,7 +461,7 @@ async function routeInitialMessage( message: initialPacket, }) ).messages; - log.debug( + log.verbose( `[${id}] Received ${responses.length} race? lobby response packets`, ); wasHandled = true; @@ -483,7 +483,7 @@ async function routeInitialMessage( } // Send responses back to the client - log.debug(`[${id}] Sending ${responses.length} responses`); + log.verbose(`[${id}] Sending ${responses.length} responses`); const sendQueue = getSocketQueue(id, 'send'); diff --git a/packages/gateway/src/socketErrorHandler.ts b/packages/gateway/src/socketErrorHandler.ts index f8138c7ab..eef249a78 100644 --- a/packages/gateway/src/socketErrorHandler.ts +++ b/packages/gateway/src/socketErrorHandler.ts @@ -21,7 +21,7 @@ export function socketErrorHandler({ }) { // Handle socket errors if (error.code == "ECONNRESET") { - log.debug(`Connection ${connectionId} reset`); + log.verbose(`Connection ${connectionId} reset`); return; } throw Error(`Socket error: ${error.message} on connection ${connectionId}`); diff --git a/packages/gateway/src/web.ts b/packages/gateway/src/web.ts index eebfca2d4..df088ffbb 100644 --- a/packages/gateway/src/web.ts +++ b/packages/gateway/src/web.ts @@ -224,7 +224,7 @@ async function handleWebUrl( } } - getServerLogger("gateway.web/getWebURL").debug(`Request for url # ${id}`) + getServerLogger("gateway.web/getWebURL").verbose(`Request for url # ${id}`) if (id === '58') { urlResponse = `101 diff --git a/packages/gateway/test/socketErrorHandler.test.ts b/packages/gateway/test/socketErrorHandler.test.ts index 533f53ca8..bc077ff1e 100644 --- a/packages/gateway/test/socketErrorHandler.test.ts +++ b/packages/gateway/test/socketErrorHandler.test.ts @@ -7,12 +7,12 @@ describe("socketErrorHandler", () => { const connectionId = "12345"; const error = { code: "ECONNRESET" } as NodeJS.ErrnoException; const mockLogger = { - debug: vi.fn(), + verbose: vi.fn(), } as unknown as ServerLogger; socketErrorHandler({ connectionId, error, log: mockLogger }); - expect(mockLogger.debug).toHaveBeenCalledWith( + expect(mockLogger.verbose).toHaveBeenCalledWith( `Connection ${connectionId} reset`, ); }); diff --git a/packages/lobby/src/LoginInfoMessage.ts b/packages/lobby/src/LoginInfoMessage.ts index 8f9a2df28..ebca83b03 100644 --- a/packages/lobby/src/LoginInfoMessage.ts +++ b/packages/lobby/src/LoginInfoMessage.ts @@ -31,7 +31,7 @@ export class LoginInfoMessage extends LegacyMessage { */ override deserialize(buffer: Buffer): this { try { - this._header._doDeserialize(buffer); + this._header.deserialize(buffer); let offset = this._header._size; this._userId = buffer.readUInt32BE(offset); offset += 4; diff --git a/packages/lobby/src/handlers/_handleSendGameServersList.ts b/packages/lobby/src/handlers/_handleSendGameServersList.ts index d66c6adbd..c4b6fa120 100644 --- a/packages/lobby/src/handlers/_handleSendGameServersList.ts +++ b/packages/lobby/src/handlers/_handleSendGameServersList.ts @@ -24,15 +24,15 @@ export async function handleSendGameServersList({ messages: BytableMessage[]; }> { try { - log.debug(`Handling NPS_SEND_GAME_SERVERS_LIST`, { + log.verbose(`Handling NPS_SEND_GAME_SERVERS_LIST`, { connectionId, }); - log.debug(`Received command: ${message.header.id}`, { + log.verbose(`Received command: ${message.header.id}`, { connectionId, }); // l - log.debug(`User requested sendGameServerList`,{ + log.verbose(`User requested sendGameServerList`,{ connectionId, }) @@ -73,7 +73,7 @@ export async function handleSendGameServersList({ outgoingGameMessage.add(gameServer1); - log.debug( + log.verbose( `Sending gameserver response[serialize]: ${JSON.stringify(gameServer1)}`, { connectionId }, ); @@ -84,7 +84,7 @@ export async function handleSendGameServersList({ gameServerListMessage.setVersion(0); gameServerListMessage.deserialize(outgoingGameMessage.serialize()); - log.debug( + log.verbose( `Sending gameserver response[serialize2]: ${gameServerListMessage.serialize().toString('hex')}`, { connectionId }, ); diff --git a/packages/lobby/src/handlers/_setMyUserData.ts b/packages/lobby/src/handlers/_setMyUserData.ts index 927bdf56c..1944974b6 100644 --- a/packages/lobby/src/handlers/_setMyUserData.ts +++ b/packages/lobby/src/handlers/_setMyUserData.ts @@ -17,10 +17,10 @@ export async function _setMyUserData({ log?: ServerLogger; }) { try { - log.debug(`Handling NPS_SET_MY_USER_DATA`, { + log.verbose(`Handling NPS_SET_MY_USER_DATA`, { connectionId, }); - log.debug(`Received command: ${message.header.id}`, { + log.verbose(`Received command: ${message.header.id}`, { connectionId, }); @@ -29,11 +29,11 @@ export async function _setMyUserData({ const userId = incomingMessage.userInfo.userId; - log.debug(`User ID: ${userId}`, { + log.verbose(`User ID: ${userId}`, { connectionId, userId, }); - log.debug( + log.verbose( `UserData: ${JSON.stringify(incomingMessage.userInfo.userData)}`, { connectionId, @@ -73,7 +73,7 @@ export async function _setMyUserData({ outboundMessage.setOpCode(0x204); - log.debug('Sending UserInfo', { + log.verbose('Sending UserInfo', { connectionId, data: message.serialize().toString('hex'), }); diff --git a/packages/lobby/src/handlers/encryptedCommand.ts b/packages/lobby/src/handlers/encryptedCommand.ts index 042cd486d..7b953cd50 100644 --- a/packages/lobby/src/handlers/encryptedCommand.ts +++ b/packages/lobby/src/handlers/encryptedCommand.ts @@ -161,10 +161,10 @@ async function handleCommand({ const command = message.header.id; // What is the command? - log.debug(`Received Command: ${command.toString(16)}`, { + log.verbose(`Received Command: ${command.toString(16)}`, { connectionId, }); - log.debug( + log.verbose( `Received Command message: ${message.serialize().toString('hex')}`, { connectionId }, ); @@ -215,7 +215,7 @@ export async function handleEncryptedNPSCommand({ connectionId: string; messages: SerializedBufferOld[]; }> { - log.debug(`Received encrypted command: ${message.header.id}`, { + log.verbose(`Received encrypted command: ${message.header.id}`, { connectionId, }); @@ -225,7 +225,7 @@ export async function handleEncryptedNPSCommand({ message, }); - log.debug( + log.verbose( `Deciphered command: ${decipheredMessage.message.header.id}`, { connectionId }, ); @@ -236,7 +236,7 @@ export async function handleEncryptedNPSCommand({ }); if (responses.messages === null) { - log.debug(`No response to send`, { connectionId }); + log.verbose(`No response to send`, { connectionId }); return { connectionId, messages: [], @@ -247,7 +247,7 @@ export async function handleEncryptedNPSCommand({ try { const oldMsgId = message.header.id; - log.debug('Message prior to encryption', { + log.verbose('Message prior to encryption', { connectionId, oldMsgId, data: message.serialize().toString('hex'), @@ -262,7 +262,7 @@ export async function handleEncryptedNPSCommand({ const encryptedResponse = result.message; const newMsgId = encryptedResponse.header.id; - log.debug('Message encrypted', { + log.verbose('Message encrypted', { oldMsgId, newMsgId, connectionId, diff --git a/packages/lobby/src/handlers/handleCloseCommChannel.ts b/packages/lobby/src/handlers/handleCloseCommChannel.ts index bd77e8b80..176ec39fa 100644 --- a/packages/lobby/src/handlers/handleCloseCommChannel.ts +++ b/packages/lobby/src/handlers/handleCloseCommChannel.ts @@ -17,8 +17,8 @@ export async function handleCloseCommChannel({ messages: BytableMessage[]; }> { try { - log.debug(`[${connectionId}] Handling NPS_CLOSE_COMM_CHANNEL`); - log.debug( + log.verbose(`[${connectionId}] Handling NPS_CLOSE_COMM_CHANNEL`); + log.verbose( `[${connectionId}] Received command: ${message.header.id}`, ); @@ -30,7 +30,7 @@ export async function handleCloseCommChannel({ const requestedCommId = incomingRequest.getFieldValueByName('commId') ?? -1; - log.debug( + log.verbose( `[${connectionId}] Requested we close channel ${(requestedCommId as Buffer).readInt32BE()}`, ); @@ -48,7 +48,7 @@ export async function handleCloseCommChannel({ outgoingGameMessage.setFieldValueByName('commId', requestedCommId); outgoingGameMessage.setFieldValueByName('port', 7003); - log.debug( + log.verbose( `[${connectionId}] Sending response[string]: ${outgoingGameMessage.toString()}`, ); // Build the packet diff --git a/packages/lobby/src/handlers/handleGetMiniUserList.ts b/packages/lobby/src/handlers/handleGetMiniUserList.ts index 7add3be4c..1bcfe63d9 100644 --- a/packages/lobby/src/handlers/handleGetMiniUserList.ts +++ b/packages/lobby/src/handlers/handleGetMiniUserList.ts @@ -18,11 +18,11 @@ export async function handleGetMiniUserList({ messages: BytableMessage[]; }> { try { - log.debug(`[${connectionId}] Handling NPS_GET_MINI_USER_LIST`); + log.verbose(`[${connectionId}] Handling NPS_GET_MINI_USER_LIST`); const requestedCommId = message.getBody().readUInt32BE(0); - log.debug(`[${connectionId}] Requested commId: ${requestedCommId}`); + log.verbose(`[${connectionId}] Requested commId: ${requestedCommId}`); const commId = 1; const userCount = 2; @@ -35,13 +35,13 @@ export async function handleGetMiniUserList({ user1.setFieldValueByName("userId", 21); user1.setFieldValueByName("userName", "Dr Brown"); - log.debug(`[${connectionId}] User1: ${user1.toString()}`); + log.verbose(`[${connectionId}] User1: ${user1.toString()}`); const user2 = new MiniUserInfo(); user2.setFieldValueByName("userId", 88); user2.setFieldValueByName("userName", "Marty"); - log.debug(`[${connectionId}] User2: ${user2.toString()}`); + log.verbose(`[${connectionId}] User2: ${user2.toString()}`); const realData = Buffer.concat([ channelCountRecord, @@ -66,8 +66,8 @@ export async function handleGetMiniUserList({ ]); packetResult.deserialize(outgoingMessage.serialize()); - log.debug(`[${connectionId}] Sending NPS_MINI_USER_LIST`); - log.debug(`[${connectionId}] Sending response: ${packetResult.serialize().toString("hex")}`); + log.verbose(`[${connectionId}] Sending NPS_MINI_USER_LIST`); + log.verbose(`[${connectionId}] Sending response: ${packetResult.serialize().toString("hex")}`); return { connectionId, diff --git a/packages/lobby/src/handlers/handleGetReadyList.ts b/packages/lobby/src/handlers/handleGetReadyList.ts index 287922e65..e2bef589d 100644 --- a/packages/lobby/src/handlers/handleGetReadyList.ts +++ b/packages/lobby/src/handlers/handleGetReadyList.ts @@ -19,15 +19,15 @@ export async function handleGetReadyList({ connectionId: string; messages: BytableMessage[]; }> { - log.debug('[${connectionId}] Handling NPS_GET_READY_LIST'); - log.debug( + log.verbose('[${connectionId}] Handling NPS_GET_READY_LIST'); + log.verbose( `[${connectionId}] Received command: ${message.header.id}`, ); // l const requestedCommId = message.data.readInt32BE() - log.debug(`Requested player ready list for commId: ${requestedCommId.toString(16)}`, { + log.verbose(`Requested player ready list for commId: ${requestedCommId.toString(16)}`, { connectionId, requestedCommId, }); diff --git a/packages/lobby/src/handlers/handleGetServerInfo.ts b/packages/lobby/src/handlers/handleGetServerInfo.ts index 3cfd15c34..3a3e90a13 100644 --- a/packages/lobby/src/handlers/handleGetServerInfo.ts +++ b/packages/lobby/src/handlers/handleGetServerInfo.ts @@ -15,8 +15,8 @@ export async function handleGetServerInfo({ messages: BytableMessage[]; }> { try { - log.debug(`[${connectionId}] Handling NPS_GET_SERVER_INFO`); - log.debug( + log.verbose(`[${connectionId}] Handling NPS_GET_SERVER_INFO`); + log.verbose( `[${connectionId}] Received command: ${message.header.id}`, ); @@ -30,7 +30,7 @@ export async function handleGetServerInfo({ const cID = (requestedCommId as Buffer).readInt32BE(); - log.debug(`Received commId: ${cID}`, { + log.verbose(`Received commId: ${cID}`, { connectionId, }); @@ -84,7 +84,7 @@ export async function handleGetServerInfo({ packetResult.setVersion(0); packetResult.deserialize(outgoingGameMessage.serialize()); - log.debug( + log.verbose( `Sending response[serialize2]: ${packetResult.serialize().toString('hex')}`, { connectionId }, ); diff --git a/packages/lobby/src/handlers/handleGetUserList.ts b/packages/lobby/src/handlers/handleGetUserList.ts index e75adb165..bba522ba8 100644 --- a/packages/lobby/src/handlers/handleGetUserList.ts +++ b/packages/lobby/src/handlers/handleGetUserList.ts @@ -19,8 +19,8 @@ export async function handleGetUserList({ messages: BytableMessage[]; }> { try { - log.debug(`[${connectionId}] Handling NPS_GET_USER_LIST`); - log.debug( + log.verbose(`[${connectionId}] Handling NPS_GET_USER_LIST`); + log.verbose( `[${connectionId}] Received command: ${message.header.id}`, ); @@ -32,7 +32,7 @@ export async function handleGetUserList({ const requestedCommId = incomingRequest.getFieldValueByName('commId') ?? -1; - log.debug( + log.verbose( `[${connectionId}] Requested we send the user list for channel ${(requestedCommId as Buffer).readInt32BE()}`, ); @@ -55,7 +55,7 @@ export async function handleGetUserList({ const user1 = await databaseManager.getUser(21); if (typeof user1 !== 'undefined') { - log.debug(`Fetched userData: ${JSON.stringify(user1.userData)}`); + log.verbose(`Fetched userData: ${JSON.stringify(user1.userData)}`); userList.push(user1); } @@ -69,7 +69,7 @@ export async function handleGetUserList({ outgoingGameMessage.setFieldValueByName('usersList', users); - log.debug( + log.verbose( `[${connectionId}] Sending response[string]: ${outgoingGameMessage.toString()}`, ); // Build the packet diff --git a/packages/lobby/src/handlers/handleOpenCommChannel.ts b/packages/lobby/src/handlers/handleOpenCommChannel.ts index c1b910fcb..ef873f683 100644 --- a/packages/lobby/src/handlers/handleOpenCommChannel.ts +++ b/packages/lobby/src/handlers/handleOpenCommChannel.ts @@ -21,8 +21,8 @@ export async function handleOpenCommChannel({ messages: BytableMessage[]; }> { try { - log.debug(`[${connectionId}] Handling NPS_OPEN_COMM_CHANNEL`); - log.debug( + log.verbose(`[${connectionId}] Handling NPS_OPEN_COMM_CHANNEL`); + log.verbose( `[${connectionId}] Received command: ${message.header.id}`, ); @@ -42,7 +42,7 @@ export async function handleOpenCommChannel({ incomingRequest.getFieldValueByName('riffName') ?? ''; const requestedCommId = (requestedCommIdBuffer as Buffer).readInt32BE(); - log.debug( + log.verbose( `[${connectionId}] Requested we open a channel on ${requestedRiffName}(${requestedCommId})`, ); @@ -55,7 +55,7 @@ export async function handleOpenCommChannel({ (requestedCommIdBuffer as Buffer).readInt32BE(), port, ); - log.debug( + log.verbose( `[${connectionId}] Sending comm GRANTED: ${JSON.stringify(packetResult)}`, ); @@ -87,7 +87,7 @@ export async function handleOpenCommChannel({ createRawMessage(0x20c, userJoined), ); - log.debug('Outbound user join message', { + log.verbose('Outbound user join message', { connectionId, userId, json: JSON.stringify(userJoinedMessage), diff --git a/packages/lobby/src/handlers/handleSendMiniRiffList.ts b/packages/lobby/src/handlers/handleSendMiniRiffList.ts index 3ea63c2a9..22c453b3c 100644 --- a/packages/lobby/src/handlers/handleSendMiniRiffList.ts +++ b/packages/lobby/src/handlers/handleSendMiniRiffList.ts @@ -16,8 +16,8 @@ export async function handleSendMiniRiffList({ connectionId: string; messages: BytableMessage[]; }> { - log.debug('[${connectionId}] Handling NPS_SEND_MINI_RIFF_LIST'); - log.debug( + log.verbose('[${connectionId}] Handling NPS_SEND_MINI_RIFF_LIST'); + log.verbose( `[${connectionId}] Received command: ${message.header.id}`, ); diff --git a/packages/lobby/src/handlers/handleSendRiffList.ts b/packages/lobby/src/handlers/handleSendRiffList.ts index 59b68fa13..5ba883b6d 100644 --- a/packages/lobby/src/handlers/handleSendRiffList.ts +++ b/packages/lobby/src/handlers/handleSendRiffList.ts @@ -14,8 +14,8 @@ export async function handleSendRiffList({ connectionId: string; messages: BytableMessage[]; }> { - log.debug('[${connectionId}] Handling NPS_SEND_RIFF_LIST'); - log.debug( + log.verbose('[${connectionId}] Handling NPS_SEND_RIFF_LIST'); + log.verbose( `[${connectionId}] Received command: ${message.header.id}`, ); diff --git a/packages/lobby/src/handlers/handleStartGameServer.ts b/packages/lobby/src/handlers/handleStartGameServer.ts index 0023d9b0e..03cbf8e3d 100644 --- a/packages/lobby/src/handlers/handleStartGameServer.ts +++ b/packages/lobby/src/handlers/handleStartGameServer.ts @@ -22,8 +22,8 @@ export async function handleStartGameServer({ }> { const SUPPORTED_MESSAGE = 'NPS_START_GAME_SERVER'; try { - log.debug(`[${connectionId}] Handling ${SUPPORTED_MESSAGE}`); - log.debug( + log.verbose(`[${connectionId}] Handling ${SUPPORTED_MESSAGE}`); + log.verbose( `[${connectionId}] Received command: ${message.header.id}`, ); @@ -32,7 +32,7 @@ export async function handleStartGameServer({ const { commId, bestHost } = startServerLaunchInfo; - log.debug( + log.verbose( `client requested game server launch with comm id ${commId} on IP ${bestHost}`, { connectionId }, ); diff --git a/packages/lobby/src/handlers/handleTrackingPing.ts b/packages/lobby/src/handlers/handleTrackingPing.ts index 83ead2b82..21c8fdffc 100644 --- a/packages/lobby/src/handlers/handleTrackingPing.ts +++ b/packages/lobby/src/handlers/handleTrackingPing.ts @@ -12,7 +12,7 @@ export async function handleTrackingPing({ connectionId: string; messages: SerializedBufferOld[]; }> { - log.debug("npsTrackingPing", { + log.verbose("npsTrackingPing", { connectionId }) const response = new RawMessage() diff --git a/packages/lobby/src/handlers/requestConnectGameServer.ts b/packages/lobby/src/handlers/requestConnectGameServer.ts index 295480f9f..3b2bf78b8 100644 --- a/packages/lobby/src/handlers/requestConnectGameServer.ts +++ b/packages/lobby/src/handlers/requestConnectGameServer.ts @@ -63,7 +63,7 @@ export async function _npsRequestGameConnectServer({ const inboundMessage = new LoginInfoMessage(); inboundMessage.deserialize(message.serialize()); - log.debug(`LoginInfoMessage: ${inboundMessage.toString()}`); + log.verbose(`LoginInfoMessage: ${inboundMessage.toString()}`); const personas = await getPersonaByPersonaId({ personaId: inboundMessage._userId, @@ -97,7 +97,7 @@ export async function _npsRequestGameConnectServer({ responsePacket.header.setId(0x22a); // invalid key // log the packet - log.debug( + log.verbose( `!!! outbound lobby login response packet: ${responsePacket.toString()}`, ); @@ -159,7 +159,7 @@ export async function _npsRequestGameConnectServer({ responsePacket.setFieldValueByName("userData", inboundMessage._userData); // log the packet - log.debug( + log.verbose( `!!! outbound lobby login response packet: ${responsePacket.toString()}`, ); @@ -168,7 +168,7 @@ export async function _npsRequestGameConnectServer({ responsePackets.push(outboundMessage) - log.debug(`[${connectionId}] Returning with ${outboundMessage.toHexString()}`); + log.verbose(`[${connectionId}] Returning with ${outboundMessage.toHexString()}`); return { connectionId, diff --git a/packages/lobby/src/internal.ts b/packages/lobby/src/internal.ts index ffaedb33b..2ea1187ce 100644 --- a/packages/lobby/src/internal.ts +++ b/packages/lobby/src/internal.ts @@ -101,7 +101,7 @@ export async function receiveLobbyData({ messages: SerializedBufferOld[]; }> { const data = message.serialize(); - log.debug('Received Lobby packet', { + log.verbose('Received Lobby packet', { connectionId, data: data.toString('hex'), }); @@ -126,7 +126,7 @@ export async function receiveLobbyData({ connectionId, message, }); - log.debug('Leaving receiveLobbyData'); + log.verbose('Leaving receiveLobbyData'); const sendQueue = getSocketQueue(connectionId, 'send'); result.messages.forEach((response) => diff --git a/packages/login/src/NPSUserStatus.test.ts b/packages/login/src/NPSUserStatus.test.ts index 93aeb1d37..d893cb496 100644 --- a/packages/login/src/NPSUserStatus.test.ts +++ b/packages/login/src/NPSUserStatus.test.ts @@ -16,8 +16,8 @@ describe("NPSUserStatus", () => { config = { privateKeyFile: "path/to/private/key" } as Configuration; log = { debug: vi.fn(), + verbose: vi.fn(), trace: vi.fn(), - fatal: vi.fn(), } as unknown as ServerLogger; packet = Buffer.alloc(100); }); diff --git a/packages/login/src/NPSUserStatus.ts b/packages/login/src/NPSUserStatus.ts index cdf34ee14..c88abc808 100644 --- a/packages/login/src/NPSUserStatus.ts +++ b/packages/login/src/NPSUserStatus.ts @@ -51,8 +51,8 @@ export class NPSUserStatus extends LegacyMessage { super(); this._config = config; this.log = getServerLogger("NPSUserStatus"); - log.debug("Constructing NPSUserStatus"); - this._header._doDeserialize(packet); + log.verbose("Constructing NPSUserStatus"); + this._header.deserialize(packet); this.sessionKey = ""; // Save the NPS opCode @@ -79,7 +79,7 @@ export class NPSUserStatus extends LegacyMessage { * @throws {Error} Throws an error if there is an issue decrypting the session key. */ extractSessionKeyFromPacket(rawPacket: Buffer): void { - this.log.debug("Extracting key"); + this.log.verbose("Extracting key"); const keyLength = rawPacket.readUInt16LE(SESSION_KEY_START); @@ -121,7 +121,7 @@ export class NPSUserStatus extends LegacyMessage { } toJSON() { - this.log.debug("Returning as JSON"); + this.log.verbose("Returning as JSON"); return { msgNo: this._header.id, msgLength: this._header.length, @@ -136,7 +136,7 @@ export class NPSUserStatus extends LegacyMessage { * @return {string} */ dumpPacket(): string { - this.log.debug("Returning as string"); + this.log.verbose("Returning as string"); let message = this._header.toString(); message = message.concat( `NPSUserStatus, diff --git a/packages/login/src/handleLoginData.ts b/packages/login/src/handleLoginData.ts index 75f9be791..acfe22e66 100644 --- a/packages/login/src/handleLoginData.ts +++ b/packages/login/src/handleLoginData.ts @@ -36,7 +36,7 @@ export async function handleLoginData({ }> { // The packet needs to be an NPSMessage const inboundMessage = new NPSMessage(); - inboundMessage._doDeserialize(message.serialize()); + inboundMessage.deserialize(message.serialize()); const supportedHandler = messageHandlers.find((h) => { return h.opCode === inboundMessage._header.id; @@ -54,7 +54,7 @@ export async function handleLoginData({ connectionId, message, }); - log.debug( + log.verbose( `[${connectionId}] Leaving handleLoginData with ${result.messages.length} messages`, ); return result; diff --git a/packages/login/src/login.ts b/packages/login/src/login.ts index 7673942ab..0c5ff71c0 100644 --- a/packages/login/src/login.ts +++ b/packages/login/src/login.ts @@ -38,7 +38,7 @@ export async function login({ const { contextId, sessionKey } = userStatus; - log.debug(`[${connectionId}] Context ID: ${contextId}`); + log.verbose(`[${connectionId}] Context ID: ${contextId}`); userStatus.dumpPacket(); // Load the customer record by contextId @@ -95,7 +95,7 @@ export async function login({ connectionId, messages: [outboundMessage2, outboundMessage2], }; - log.debug( + log.verbose( `[${connectionId}] Leaving login with ${response.messages.length} messages`, ); return response; diff --git a/packages/login/src/receiveLoginData.ts b/packages/login/src/receiveLoginData.ts index f46d9eaec..836e4f80d 100644 --- a/packages/login/src/receiveLoginData.ts +++ b/packages/login/src/receiveLoginData.ts @@ -48,7 +48,7 @@ export async function receiveLoginData({ message, log, }); - log.debug( + log.verbose( `[${connectionId}] Exiting login module ${response.messages.length} messages`, ); diff --git a/packages/nps/gameMessageProcessors/getLobMiniRiffList.ts b/packages/nps/gameMessageProcessors/getLobMiniRiffList.ts index 1be0c6350..291048d18 100644 --- a/packages/nps/gameMessageProcessors/getLobMiniRiffList.ts +++ b/packages/nps/gameMessageProcessors/getLobMiniRiffList.ts @@ -13,7 +13,7 @@ export async function getLobMiniRiffList( _commandId: number, data: Buffer, ): Promise { - defaultLogger.debug("getLobMiniRiffList called"); + defaultLogger.verbose("getLobMiniRiffList called"); defaultLogger.info(`Processing getLobMiniRiffList command: ${getAsHex(data)}`); const riffList = new MiniRiffList(); diff --git a/packages/nps/gameMessageProcessors/getLobMiniUserList.ts b/packages/nps/gameMessageProcessors/getLobMiniUserList.ts index 2c37c9c23..646d21e4a 100644 --- a/packages/nps/gameMessageProcessors/getLobMiniUserList.ts +++ b/packages/nps/gameMessageProcessors/getLobMiniUserList.ts @@ -13,7 +13,7 @@ export async function getLobMiniUserList( _commandId: number, data: Buffer, ): Promise { - defaultLogger.debug("getLobMiniUserList called"); + defaultLogger.verbose("getLobMiniUserList called"); defaultLogger.info(`Processing getLobMiniUserList command: ${getAsHex(data)}`); const miniUserList = new MiniUserList(0); diff --git a/packages/nps/gameMessageProcessors/processDeleteProfile.ts b/packages/nps/gameMessageProcessors/processDeleteProfile.ts index 2d727d222..0df4c32db 100644 --- a/packages/nps/gameMessageProcessors/processDeleteProfile.ts +++ b/packages/nps/gameMessageProcessors/processDeleteProfile.ts @@ -92,7 +92,7 @@ export async function processDeleteProfile( message: GameMessage, socketCallback: GameSocketCallback, ): Promise { - defaultLogger.debug("processDeleteProfile called"); + defaultLogger.verbose("processDeleteProfile called"); // Log the message defaultLogger.info(`Delete profile request: ${message.toString()}`); diff --git a/packages/nps/gameMessageProcessors/processEncryptedGameCommand.ts b/packages/nps/gameMessageProcessors/processEncryptedGameCommand.ts index d15be13a4..09036edb5 100644 --- a/packages/nps/gameMessageProcessors/processEncryptedGameCommand.ts +++ b/packages/nps/gameMessageProcessors/processEncryptedGameCommand.ts @@ -1,6 +1,5 @@ import { GameMessage, - SerializableData, } from "../messageStructs/GameMessage.js"; import { type EncryptionSession, @@ -13,7 +12,7 @@ import type { GameSocketCallback } from "./index.js"; import { lobbyCommandMap } from "./lobbyCommands.js"; import type { UserStatus } from "../messageStructs/UserStatus.js"; -import { getServerLogger } from "rusty-motors-shared"; +import { CBlock, getServerLogger } from "rusty-motors-shared"; const defaultLogger = getServerLogger("nps.processEncryptedGameCommand"); @@ -23,7 +22,7 @@ export async function processEncryptedGameCommand( message: GameMessage, socketCallback: GameSocketCallback, ): Promise { - defaultLogger.debug("processEncryptedGameCommand called"); + defaultLogger.verbose("processEncryptedGameCommand called"); defaultLogger.info(`Attempting to decrypt message: ${message.toString()}`); // Get the encryption session @@ -70,7 +69,7 @@ export async function processEncryptedGameCommand( if (typeof processor === "undefined") { const err = `No processor found for message ID: ${decryptedMessage.header.getId()}`; - defaultLogger.fatal(err); + defaultLogger.error(err); throw Error(err); } @@ -90,7 +89,7 @@ export async function processEncryptedGameCommand( const responsePacket = new GameMessage(0); responsePacket.header.setId(0x1101); - const responseData = new SerializableData(encryptedResponse.length); + const responseData = new CBlock(encryptedResponse.length); responseData.deserialize(encryptedResponse); responsePacket.setData(responseData); diff --git a/packages/nps/gameMessageProcessors/processGameLogin.ts b/packages/nps/gameMessageProcessors/processGameLogin.ts index 11af98812..799a95292 100644 --- a/packages/nps/gameMessageProcessors/processGameLogin.ts +++ b/packages/nps/gameMessageProcessors/processGameLogin.ts @@ -37,7 +37,7 @@ export function unpackUserLoginMessage(message: ISerializable): { gameId: string; contextToken: string; } { - defaultLogger.debug("unpackUserLoginMessage called"); + defaultLogger.verbose("unpackUserLoginMessage called"); defaultLogger.info(`Unpacking user login message: ${getAsHex(message.serialize())}`); // Get the context token @@ -114,7 +114,7 @@ export async function processGameLogin( op: "processLogin", }, () => { - defaultLogger.debug("processGameLogin called"); + defaultLogger.verbose("processGameLogin called"); defaultLogger.info(`Login: ${message.toString()}`); diff --git a/packages/nps/messageStructs/BaseSerializable.ts b/packages/nps/messageStructs/BaseSerializable.ts index 5b1307e56..bbbe7753b 100644 --- a/packages/nps/messageStructs/BaseSerializable.ts +++ b/packages/nps/messageStructs/BaseSerializable.ts @@ -1,16 +1,20 @@ import type { ISerializable } from "../types.js"; export class BaseSerializable implements ISerializable { - serialize(): Buffer { - throw new Error("Method not implemented."); - } - deserialize(_data: Buffer): void { - throw new Error("Method not implemented."); - } - getByteSize(): number { - throw new Error("Method not implemented."); - } - toString(): string { - throw new Error("Method not implemented."); - } + serialize(): Buffer { + throw new Error('Method not implemented.'); + } + deserialize(_data: Buffer): void { + throw new Error('Method not implemented.'); + } + /** @deprecated use sizeOf() instead */ + getByteSize(): number { + throw new Error('Method not implemented.'); + } + get sizeOf(): number { + throw new Error('Method not implemented.'); + } + toString(): string { + throw new Error('Method not implemented.'); + } } diff --git a/packages/nps/messageStructs/GameMessage.ts b/packages/nps/messageStructs/GameMessage.ts index 6ab03454d..076211f57 100644 --- a/packages/nps/messageStructs/GameMessage.ts +++ b/packages/nps/messageStructs/GameMessage.ts @@ -11,15 +11,26 @@ export class MessageHeader implements IMessageHeader { } this.version = version; this.id = id; - this.length = length !== 0 ? length : this.getByteSize(); + this.length = length !== 0 ? length : this.sizeOf; } + toString(): string { + throw new Error("Method not implemented."); + } getDataOffset(): number { return this.getVersion() === 0 ? 4 : 12; } - getByteSize(): number { + /** + * @deprecated use sizeOf instead + * @returns + */ + getByteSize(): number { return this.getVersion() === 0 ? 4 : 12; } + get sizeOf() { + return this.getVersion() === 0 ? 4 : 12; + } + getVersion(): number { return this.version; } @@ -43,7 +54,7 @@ export class MessageHeader implements IMessageHeader { } private serializeV0(): Buffer { - const buffer = Buffer.alloc(this.getByteSize()); + const buffer = Buffer.alloc(this.sizeOf); buffer.writeUInt16BE(this.id, 0); buffer.writeUInt16BE(this.length, 2); @@ -51,7 +62,7 @@ export class MessageHeader implements IMessageHeader { } private serializeV1(): Buffer { - const buffer = Buffer.alloc(this.getByteSize()); + const buffer = Buffer.alloc(this.sizeOf); buffer.writeUInt16BE(this.id, 0); buffer.writeUInt16BE(this.length, 2); buffer.writeUInt16BE(this.version, 4); @@ -116,6 +127,10 @@ export class SerializableData implements ISerializable { return this.data.length; } + get sizeOf() { + return this.data.length; + } + toString(): string { return `EmptyData(length=${this.data.length}, data=${this.data.toString( "hex", @@ -140,19 +155,25 @@ export class GameMessage implements IMessage { return this.data.serialize(); } - /** The message length is the length of the message data, not including the id */ + /** + * @deprecated use sizeOf + * The message length is the length of the message data, not including the id */ getByteSize(): number { return this.header.getLength(); } + + get sizeOf() { + return this.header.getLength(); + } getData(): ISerializable { return this.data; } setData(data: ISerializable): void { this.data = data; - this.header.setLength(data.getByteSize() + this.header.getByteSize()); + this.header.setLength(data.sizeOf + this.header.sizeOf); } serialize(): Buffer { - const buffer = Buffer.alloc(this.getByteSize()); + const buffer = Buffer.alloc(this.sizeOf); const headerData = this.header.serialize(); headerData.copy(buffer, 0); const messageData = this.data.serialize(); diff --git a/packages/nps/messageStructs/MiniRiffList.ts b/packages/nps/messageStructs/MiniRiffList.ts index bf33808c3..0ce9d1c47 100644 --- a/packages/nps/messageStructs/MiniRiffList.ts +++ b/packages/nps/messageStructs/MiniRiffList.ts @@ -71,7 +71,7 @@ export class MiniRiffList extends BaseSerializable { offset += riff.getByteSize(); } - defaultLogger.debug(`MiniRiffList: ${this.toString()} - ${buffer.toString("hex")}`); + defaultLogger.verbose(`MiniRiffList: ${this.toString()} - ${buffer.toString("hex")}`); return buffer; } override toString(): string { diff --git a/packages/nps/messageStructs/SessionKey.ts b/packages/nps/messageStructs/SessionKey.ts index 807ec76e6..0fb0d0a05 100644 --- a/packages/nps/messageStructs/SessionKey.ts +++ b/packages/nps/messageStructs/SessionKey.ts @@ -16,7 +16,7 @@ export class SessionKey extends BaseSerializable { } if (typeof key !== "undefined" && typeof timestamp !== "undefined") { - defaultLogger.debug(`SessionKey: key=${getAsHex(key)}, timestamp=${timestamp}`); + defaultLogger.verbose(`SessionKey: key=${getAsHex(key)}, timestamp=${timestamp}`); this.key = key; this.timestamp = timestamp; this._isSet = true; @@ -33,7 +33,7 @@ export class SessionKey extends BaseSerializable { } static fromBytes(bytes: Buffer): SessionKey { - defaultLogger.debug("SessionKey.fromBytes"); + defaultLogger.verbose("SessionKey.fromBytes"); const keyLength = bytes.readUInt16BE(0); // Set the data offset @@ -41,7 +41,7 @@ export class SessionKey extends BaseSerializable { const key = bytes.subarray(2, dataOffset); - defaultLogger.debug(`SessionKey.fromBytes: key=${getAsHex(key)}`); + defaultLogger.verbose(`SessionKey.fromBytes: key=${getAsHex(key)}`); // Get the timestamp const timestamp = bytes.readUInt32BE(dataOffset); diff --git a/packages/nps/messageStructs/UserStatus.ts b/packages/nps/messageStructs/UserStatus.ts index 8938d9f80..581ad61b2 100644 --- a/packages/nps/messageStructs/UserStatus.ts +++ b/packages/nps/messageStructs/UserStatus.ts @@ -39,6 +39,10 @@ export class UserStatus extends BaseSerializable { return this.getSize(); } + override get sizeOf() { + return this.getSize() + } + getSessionId(): string { return this._sessionId; } diff --git a/packages/nps/types.ts b/packages/nps/types.ts index 953848790..80d51bc8a 100644 --- a/packages/nps/types.ts +++ b/packages/nps/types.ts @@ -1,7 +1,9 @@ export interface ISerializable { serialize(): Buffer; deserialize(data: Buffer): void; - getByteSize(): number; + /** @deprecated use sizeOf */ + getByteSize(): number; + sizeOf: number toString(): string; } diff --git a/packages/persona/src/PersonaMapsMessage.ts b/packages/persona/src/PersonaMapsMessage.ts index e7ce06247..34e3459ce 100644 --- a/packages/persona/src/PersonaMapsMessage.ts +++ b/packages/persona/src/PersonaMapsMessage.ts @@ -287,9 +287,9 @@ export class PersonaMapsMessage extends NPSMessage { * @param {Buffer} buffer * @returns {PersonaMapsMessage} */ - deserialize(buffer: Buffer): PersonaMapsMessage { + override deserialize(buffer: Buffer): PersonaMapsMessage { try { - this._header._doDeserialize(buffer); + this._header.deserialize(buffer); this.setBuffer(buffer.subarray(NPSHeader.size())); this.raw = buffer; return this; diff --git a/packages/persona/src/_gameLogout.ts b/packages/persona/src/_gameLogout.ts index 76ead3809..b8315ee68 100644 --- a/packages/persona/src/_gameLogout.ts +++ b/packages/persona/src/_gameLogout.ts @@ -28,15 +28,15 @@ export async function _gameLogout({ messages: SerializedBufferOld[]; }> { const requestPacket = message; - log.debug(`[${connectionId}] _npsLogoutGameUser request: ${requestPacket.toHexString()}`); + log.verbose(`[${connectionId}] _npsLogoutGameUser request: ${requestPacket.toHexString()}`); // Build the packet const responsePacket = new LegacyMessage(); responsePacket._header.id = 519; - log.debug(`[${connectionId}] _npsLogoutGameUser response: ${responsePacket.toHexString()}`); + log.verbose(`[${connectionId}] _npsLogoutGameUser response: ${responsePacket.toHexString()}`); const outboundMessage = new SerializedBufferOld(); - outboundMessage._doDeserialize(responsePacket._doSerialize()); + outboundMessage.deserialize(responsePacket._doSerialize()); return { connectionId, diff --git a/packages/persona/src/_getFirstBuddy.ts b/packages/persona/src/_getFirstBuddy.ts index 46ed8601a..5dde07e9c 100644 --- a/packages/persona/src/_getFirstBuddy.ts +++ b/packages/persona/src/_getFirstBuddy.ts @@ -20,9 +20,9 @@ export async function _getFirstBuddy({ }> { // This message is a versioned nps message const incomingMessage = new NPSMessage(); - incomingMessage._doDeserialize(message._doSerialize()); + incomingMessage.deserialize(message.serialize()); - log.debug( + log.verbose( `in _getFirstBuddy, incomingMessage: ${incomingMessage .serialize() .toString("hex")}`, @@ -31,7 +31,7 @@ export async function _getFirstBuddy({ // extract the personaId const personaId = incomingMessage.data.readUInt32BE(0); - log.debug(`in _getFirstBuddy, personaId: ${personaId}`); + log.verbose(`in _getFirstBuddy, personaId: ${personaId}`); // TODO: Here we need to look up the buddies for the personaId @@ -40,7 +40,7 @@ export async function _getFirstBuddy({ buddyCountMessage.buddyCount = 0; const outboundMessage1 = new SerializedBufferOld(); - outboundMessage1._doDeserialize(buddyCountMessage.serialize()); + outboundMessage1.deserialize(buddyCountMessage.serialize()); const buddyInfoMessage = new BuddyInfoMessage(); @@ -60,9 +60,9 @@ export async function _getFirstBuddy({ } const outboundMessage = new SerializedBufferOld(); - outboundMessage._doDeserialize(buddyInfoMessage.serialize()); + outboundMessage.deserialize(buddyInfoMessage.serialize()); - log.debug( + log.verbose( `in _getFirstBuddy, outboundMessage: ${outboundMessage1.toString()}`, ); diff --git a/packages/persona/src/_selectGamePersona.ts b/packages/persona/src/_selectGamePersona.ts index e1928a346..c0bd661a5 100644 --- a/packages/persona/src/_selectGamePersona.ts +++ b/packages/persona/src/_selectGamePersona.ts @@ -28,9 +28,9 @@ export async function _selectGamePersona({ connectionId: string; messages: SerializedBufferOld[]; }> { - log.debug("_npsSelectGamePersona..."); + log.verbose("_npsSelectGamePersona..."); const requestPacket = message; - log.debug( + log.verbose( `LegacyMsg request object from _npsSelectGamePersona ${requestPacket ._doSerialize() .toString("hex")}`, @@ -45,7 +45,7 @@ export async function _selectGamePersona({ const responsePacket = new LegacyMessage(); responsePacket._header.id = 519; responsePacket.setBuffer(packetContent); - log.debug( + log.verbose( `LegacyMsg response object from _npsSelectGamePersona ${responsePacket ._doSerialize() .toString("hex")} `, diff --git a/packages/persona/src/handleSelectGamePersona.ts b/packages/persona/src/handleSelectGamePersona.ts index ebd0401df..0100a346c 100644 --- a/packages/persona/src/handleSelectGamePersona.ts +++ b/packages/persona/src/handleSelectGamePersona.ts @@ -26,9 +26,9 @@ export async function handleSelectGamePersona( requestPacket: NPSMessage, log: ServerLogger, ): Promise { - log.debug("_npsSelectGamePersona..."); + log.verbose("_npsSelectGamePersona..."); - log.debug( + log.verbose( `[npsSelectGamePersona] requestPacket's data prior to sending: ${requestPacket.toString()}`, ); @@ -42,7 +42,7 @@ export async function handleSelectGamePersona( responsePacket._header.id = 0x207; responsePacket.setBuffer(packetContent); - log.debug( + log.verbose( `[npsSelectGamePersona] responsePacket's data prior to sending: ${responsePacket.toString()}`, ); return responsePacket; diff --git a/packages/persona/src/handlers/getPersonaInfo.ts b/packages/persona/src/handlers/getPersonaInfo.ts index ecb15ecdd..077f698b6 100644 --- a/packages/persona/src/handlers/getPersonaInfo.ts +++ b/packages/persona/src/handlers/getPersonaInfo.ts @@ -19,17 +19,17 @@ export async function getPersonaInfo({ connectionId: string; messages: SerializedBufferOld[]; }> { - log.debug("getPersonaInfo..."); + log.verbose("getPersonaInfo..."); const requestPacket = new NPSMessage(); - requestPacket._doDeserialize(message.serialize()); + requestPacket.deserialize(message.serialize()); - log.debug( + log.verbose( `LegacyMsg request object from getPersonaInfo ${requestPacket.toString()}`, ); const personaId = requestPacket.data.readUInt32BE(0); - log.debug(`personaId: ${personaId}`); + log.verbose(`personaId: ${personaId}`); const persona = await getPersonaByPersonaId({ personaId, @@ -46,7 +46,7 @@ export async function getPersonaInfo({ } } - log.debug(`Persona found: ${personaToString(persona)}`); + log.verbose(`Persona found: ${personaToString(persona)}`); const profile = createGameProfile(); @@ -60,7 +60,7 @@ export async function getPersonaInfo({ const responsePacket = new LegacyMessage(); responsePacket._header.id = 0x607; responsePacket.setBuffer(profile.serialize()); - log.debug( + log.verbose( `LegacyMsg response object from getPersonaInfo ${responsePacket ._doSerialize() .toString("hex")} `, diff --git a/packages/persona/src/handlers/validatePersonaName.ts b/packages/persona/src/handlers/validatePersonaName.ts index dee95f9a8..873412601 100644 --- a/packages/persona/src/handlers/validatePersonaName.ts +++ b/packages/persona/src/handlers/validatePersonaName.ts @@ -21,9 +21,9 @@ export async function validatePersonaName({ connectionId: string; messages: SerializedBufferOld[]; }> { - log.debug("validatePersonaName called"); + log.verbose("validatePersonaName called"); const requestPacket = message; - log.debug( + log.verbose( `NPSMsg request object from validatePersonaName ${requestPacket.toString()}`, ); @@ -35,7 +35,7 @@ export async function validatePersonaName({ // Build the packet const responsePacket = new RawMessage(); responsePacket.id = responseCodes.NPS_DUP_USER - log.debug( + log.verbose( `NPSMsg response object from validatePersonaName ${JSON.stringify({ NPSMsg: responsePacket.toString(), @@ -43,7 +43,7 @@ export async function validatePersonaName({ ); const outboundMessage = new SerializedBufferOld(); - outboundMessage._doDeserialize(responsePacket.serialize()); + outboundMessage.deserialize(responsePacket.serialize()); return { connectionId, diff --git a/packages/persona/src/internal.ts b/packages/persona/src/internal.ts index 3ef7662fc..753404d42 100644 --- a/packages/persona/src/internal.ts +++ b/packages/persona/src/internal.ts @@ -192,10 +192,10 @@ async function getPersonaMaps({ connectionId: string; messages: SerializedBufferOld[]; }> { - log.debug("_npsGetPersonaMaps..."); + log.verbose("_npsGetPersonaMaps..."); const requestPacket = message; - log.debug( + log.verbose( `NPSMsg request object from _npsGetPersonaMaps ${requestPacket ._doSerialize() .toString("hex")} `, @@ -204,7 +204,7 @@ async function getPersonaMaps({ const customerId = requestPacket.data.readUInt32BE(8); const personas = await getPersonaMapsByCustomerId(customerId); - log.debug(`${personas.length} personas found for ${customerId}`); + log.verbose(`${personas.length} personas found for ${customerId}`); const personaMapsMessage = new PersonaMapsMessage(); @@ -229,7 +229,7 @@ async function getPersonaMaps({ personaList.addPersonaRecord(personaRecord); - log.debug( + log.verbose( `Persona record: ${JSON.stringify({ personaRecord: personaRecord.toJSON(), })}`, @@ -239,7 +239,7 @@ async function getPersonaMaps({ personaMapsMessage._header.id = 0x607; personaMapsMessage._personaRecords = personaList; personaMapsMessage.setBuffer(personaList.serialize()); - log.debug( + log.verbose( `PersonaMapsMessage object from _npsGetPersonaMaps', ${JSON.stringify({ personaMapsMessage: personaMapsMessage @@ -249,7 +249,7 @@ async function getPersonaMaps({ ); const outboundMessage = new SerializedBufferOld(); - outboundMessage._doDeserialize(personaMapsMessage.serialize()); + outboundMessage.deserialize(personaMapsMessage.serialize()); return { connectionId, diff --git a/packages/persona/src/receivePersonaData.ts b/packages/persona/src/receivePersonaData.ts index 51a2b9947..81d850ff0 100644 --- a/packages/persona/src/receivePersonaData.ts +++ b/packages/persona/src/receivePersonaData.ts @@ -54,7 +54,7 @@ export async function receivePersonaData({ message: inboundMessage, log, }); - log.debug( + log.verbose( `[${connectionId}] Returning with ${result.messages.length} messages`, ); return result; diff --git a/packages/shared-packets/src/ServerPacket.ts b/packages/shared-packets/src/ServerPacket.ts index 8a7f7230c..88f4e31fc 100644 --- a/packages/shared-packets/src/ServerPacket.ts +++ b/packages/shared-packets/src/ServerPacket.ts @@ -4,7 +4,7 @@ import { ServerMessagePayload } from "./ServerMessagePayload.js"; import type { SerializableServerMessage } from "./types.js"; /** - * @deprecated + * @deprecated // TODO: Remove depreciated method * * use {@link MessageNode} instead */ diff --git a/packages/shared/index.ts b/packages/shared/index.ts index 45c29d387..703095b27 100644 --- a/packages/shared/index.ts +++ b/packages/shared/index.ts @@ -62,7 +62,9 @@ export { Short, Long, diffObj, + align } from './src/helpers.js'; +export {NPSMessageToBytableMessageAdaptor} from "./src/NPSMessageToBytableMessageAdaptor.js" export { CreateRaceInfo, CreateRaceMessage } from './src/CreateRaceMessage.js'; export { RaceInfo, @@ -73,8 +75,9 @@ export { } from './src/RaceInfo.js'; export { SerializedList } from './src/SerializedList.js'; export { OpenCommChannelRequest } from './src/OpenCommChannelRequest.js'; -export {getServerLogger, type ServerLogger} from "./getServerLogger.js" +export { getServerLogger, type ServerLogger } from './getServerLogger.js'; export * from './src/types.js'; +export * from './src/mocks.js'; // Function to convert ARGB to 32-bit integer export function argbToInt( diff --git a/packages/shared/src/Configuration.test.ts b/packages/shared/src/Configuration.test.ts index a2e26dc6a..7af3f9d6f 100644 --- a/packages/shared/src/Configuration.test.ts +++ b/packages/shared/src/Configuration.test.ts @@ -4,7 +4,7 @@ import { getServerLogger } from "../getServerLogger.js"; vi.mock("../getServerLogger.js", () => ({ getServerLogger: vi.fn().mockReturnValue({ - fatal: vi.fn(), + error: vi.fn(), }), })); @@ -54,7 +54,7 @@ describe("getServerConfiguration", () => { const mockLogger = getServerLogger("core"); expect(() => getServerConfiguration()).toThrow("process.exit called"); - expect(mockLogger.fatal).toHaveBeenCalledWith( + expect(mockLogger.error).toHaveBeenCalledWith( "Missing required environment variable: CERTIFICATE_FILE", ); expect(mockExit).toHaveBeenCalledWith(1); diff --git a/packages/shared/src/Configuration.ts b/packages/shared/src/Configuration.ts index 3573a1734..3c3181861 100644 --- a/packages/shared/src/Configuration.ts +++ b/packages/shared/src/Configuration.ts @@ -1,4 +1,4 @@ -import type { Logger } from "pino"; +import type { Logger } from "winston"; import { getServerLogger } from "../getServerLogger.js"; /** @@ -52,7 +52,8 @@ export class Configuration { this.logLevel = logLevel.toLowerCase(); Configuration.instance = this; } catch (error) { - logger.fatal(`Error in core server: ${String(error)}`); + logger.error(`Error in core server: ${String(error)}`); + process.exit(-1) } } @@ -117,7 +118,7 @@ function getEnvVariable( const value = process.env[name]; if (required && !value) { const coreLogger = getServerLogger("core"); - coreLogger.fatal(`Missing required environment variable: ${name}`); + coreLogger.error(`Missing required environment variable: ${name}`); process.exit(1); } return value || defaultValue || ""; diff --git a/packages/shared/src/LegacyMessage.ts b/packages/shared/src/LegacyMessage.ts index 628a4650a..7a25b1d13 100644 --- a/packages/shared/src/LegacyMessage.ts +++ b/packages/shared/src/LegacyMessage.ts @@ -8,70 +8,79 @@ import { legacyHeader } from "./legacyHeader.js"; */ export class LegacyMessage extends SerializableMixin(AbstractSerializable) { - _header: legacyHeader; - constructor() { - super(); - this._header = new legacyHeader(); - } + _header: legacyHeader; + constructor() { + super(); + this._header = new legacyHeader(); + } - getMessageId() { - return this._header.id; - } + getMessageId() { + return this._header.id; + } - setMessageId(id: number) { - this._header.id = id; - } + setMessageId(id: number) { + this._header.id = id; + } - /** - * Deserializes the given buffer and updates the current instance with the deserialized data. - * - * @param buffer - The buffer containing the serialized data. - * @returns The current instance with the deserialized data. - */ - deserialize(buffer: Buffer) { - this._header.deserialize(buffer); - this.setBuffer(buffer.subarray(this._header._size)); - return this; - } + /** + * Deserializes the given buffer and updates the current instance with the deserialized data. + * + * @param buffer - The buffer containing the serialized data. + * @returns The current instance with the deserialized data. + */ + deserialize(buffer: Buffer) { + this._header.deserialize(buffer); + this.setBuffer(buffer.subarray(this._header._size)); + return this; + } - serialize() { - const buffer = Buffer.alloc(this._header.length); - this._header.serialize().copy(buffer); - super.data.copy(buffer, this._header._size); - return buffer; - } + serialize() { + const buffer = Buffer.alloc(this._header.length); + this._header.serialize().copy(buffer); + super.data.copy(buffer, this._header._size); + return buffer; + } - /** - * @param {Buffer} buffer - */ - override setBuffer(buffer: Buffer) { - super.setBuffer(buffer); - this._header.length = buffer.length + 4; - } + /** + * @param {Buffer} buffer + */ + override setBuffer(buffer: Buffer) { + super.setBuffer(buffer); + this._header.length = buffer.length + 4; + } - asJSON() { - return { - header: this._header, - data: super.data.toString("hex"), - }; - } + asJSON() { + return { + header: this._header, + data: super.data.toString('hex'), + }; + } - override toString() { - return `LegacyMessage: ${JSON.stringify({ - header: this._header.toString(), - data: super.data.toString("hex"), - })}`; - } + override toString() { + return `LegacyMessage: ${JSON.stringify({ + header: this._header.toString(), + data: super.data.toString('hex'), + })}`; + } - toHexString() { - return this.serialize().toString("hex"); - } + toHexString() { + return this.serialize().toString('hex'); + } - override _doDeserialize(_buffer: Buffer): AbstractSerializable { - return this.deserialize(_buffer) - } + /** + * @deprecated use deserialize() // TODO: Remove depreciated method + * @param _buffer + * @returns + */ + _doDeserialize(_buffer: Buffer): AbstractSerializable { + return this.deserialize(_buffer); + } - override _doSerialize() { - return this.serialize() - } + /** + * + * @returns @deprecated use serialize() // TODO: Remove depreciated method + */ + _doSerialize() { + return this.serialize(); + } } \ No newline at end of file diff --git a/packages/shared/src/MessageBufferOld.ts b/packages/shared/src/MessageBufferOld.ts index 02aae27b1..7701b4adc 100644 --- a/packages/shared/src/MessageBufferOld.ts +++ b/packages/shared/src/MessageBufferOld.ts @@ -47,21 +47,21 @@ export class MessageBufferOld extends SerializedBufferOld { this._buffer = Buffer.alloc(buffer.length); this._buffer = buffer; this._header._messageLength = 4 + buffer.length; - // log.debug(`Message length: ${this._header._messageLength}`); - // log.debug(`Buffer length: ${this._buffer.length}`); + // log.verbose(`Message length: ${this._header._messageLength}`); + // log.verbose(`Buffer length: ${this._buffer.length}`); // Pad the buffer to a multiple of 8 bytes // let extraBytes = 0; // const x = (this._buffer.length + 4) % 8; // extraBytes = 8 - x; - // log.debug(`Extra bytes: ${extraBytes}`); + // log.verbose(`Extra bytes: ${extraBytes}`); // if (extraBytes !== 0) { // this._buffer = Buffer.concat([ // this._buffer, // Buffer.alloc(extraBytes), // ]); - // log.debug(`Buffer length: ${this._buffer.length}`); + // log.verbose(`Buffer length: ${this._buffer.length}`); this._header._messageLength = this._buffer.length + 4; - // log.debug(`Message length: ${this._header._messageLength}`); + // log.verbose(`Message length: ${this._header._messageLength}`); // } } diff --git a/packages/shared/src/MessageHeader.ts b/packages/shared/src/MessageHeader.ts index 7929d2be1..5463055d6 100644 --- a/packages/shared/src/MessageHeader.ts +++ b/packages/shared/src/MessageHeader.ts @@ -52,18 +52,6 @@ export class MessageHeader extends SerializedBufferOld { return buffer; } - /** - * @param {Buffer} buffer - * @returns {MessageHeader} - */ - override _doDeserialize(buffer: Buffer): MessageHeader { - return this.deserialize(buffer); - } - - override _doSerialize() { - return this.serialize(); - } - override toString() { return `MessageHeader: ${JSON.stringify({ messageId: this._messageId, diff --git a/packages/shared/src/MessageNode.test.ts b/packages/shared/src/MessageNode.test.ts index b9df219d8..acd8c35f9 100644 --- a/packages/shared/src/MessageNode.test.ts +++ b/packages/shared/src/MessageNode.test.ts @@ -47,10 +47,9 @@ describe("MessageNode", () => { expect(m.isPayloadCompressed()).toBe(false); }); - it("sequence helpers and ensureNonZeroSequence behavior", () => { + it("sequence helpers behavior", () => { const m = new MessageNode(); expect(m.isSequenceSet()).toBe(false); - expect(() => m.ensureNonZeroSequence()).toThrow("please set sequence"); m.sequence = 7; expect(m.isSequenceSet()).toBe(true); @@ -59,14 +58,14 @@ describe("MessageNode", () => { expect(m.seq).toBe(7); }); - it("signature validation and ensureValidSignature behavior", () => { + it("signature validation behavior", () => { const m = new MessageNode(); expect(m.isSignatureValid()).toBe(true); expect(() => m.ensureValidSignature()).not.toThrow(); m.setSignature("BAD!"); expect(m.isSignatureValid()).toBe(false); - expect(() => m.ensureValidSignature()).toThrow("Signature is not valid"); + expect(() => m.ensureValidSignature()).toThrow("invalid signature"); }); it("msgNo getter/setter updates body and serialized bytes", () => { @@ -92,14 +91,8 @@ describe("MessageNode", () => { expect(buf.readInt16LE(11)).toBe(5); }); - it("deprecated helpers produce expected outputs", () => { + it("toString produces expected output", () => { const m = new MessageNode(); - m.sequence = 9; - const header = m.header; - expect(header.mcoSig).toBe(m.signature); - expect(header.length).toBe(m.length); - - expect(m.toHexString()).toBe(m.serialize().toString("hex")); // toString should start with the prefix expect(m.toString().startsWith("MessageNode:")).toBe(true); }); diff --git a/packages/shared/src/MessageNode.ts b/packages/shared/src/MessageNode.ts index e2d342849..eaaa21795 100644 --- a/packages/shared/src/MessageNode.ts +++ b/packages/shared/src/MessageNode.ts @@ -62,7 +62,7 @@ export class MessageNode implements MCOTSMessage { this.msgLength_ = 9 + this.body_.sizeOf; const buf = Buffer.alloc(this.sizeOf); let offset = 0; - buf.writeInt16LE(this.msgLength_, offset); + buf.writeUInt16LE(this.msgLength_, offset); offset = offset + 2; buf.write(this.signature_, offset, 'utf8'); offset = offset + 4; @@ -77,7 +77,7 @@ export class MessageNode implements MCOTSMessage { deserialize(buf: Buffer) { checkMinLength(buf, 11); let offset = 0; - this.msgLength_ = buf.readInt16LE(offset); + this.msgLength_ = buf.readUInt16LE(offset); offset = offset + 2; this.signature_ = sliceBuff(buf, offset, 4).toString('utf8'); offset = offset + 4; @@ -116,6 +116,10 @@ export class MessageNode implements MCOTSMessage { this.sequence_ = val; } + get seq() { + return this.sequence_; + } + isSequenceSet() { return this.sequence_ !== 0; } @@ -171,191 +175,79 @@ export class MessageNode implements MCOTSMessage { return `MessageNode: ${JSON.stringify(this)}`; } - // TODO: change usage of these - - /** - * @deprecated - * - * see {@link signature} and {@link length} - */ - get header() { - return { - mcoSig: this.signature, - length: this.length, - }; - } - - /** - * @deprecated - * - * see {@link sequence} - */ - get seq() { - return this.sequence; + toLogString() { + // Only log essential message node info, mask body if possible + let bodyLog; + if ( + this.body_ && + typeof (this.body_ as any).toLogString === "function" + ) { + bodyLog = (this.body_ as any).toLogString(); + } else { + // fallback: attempt to mask sensitive content + bodyLog = ""; + } + return JSON.stringify({ + sequence: this.sequence, + flags_: this.flags_, + msgLength_: this.msgLength_, + body: bodyLog, + }); } - /** - * @deprecated - * - * see {@link getBody} and {@link setBody} - */ - get data() { + // IServerMessage implementation + get data(): Buffer { return this.body_.serialize(); } - /** - * @deprecated - */ - getDataBuffer() { - return this.body_; - } - - /** - * @deprecated - */ - setDataBuffer(val: Buffer) { - this.body_.deserialize(val); - } - - /** - * @deprecated - */ - getByteSize() { - return 11 + this.body_.sizeOf; - } - - /** - * @deprecated - */ - setSequence(val: number) { - this.sequence_ = val; - } - - /** - * @deprecated - */ - setLength(val: number) { - this.msgLength_ = val; + get sequenceNumber(): number { + return this.sequence_; } - /** - * @deprecated - */ - setSignature(val: string) { - this.signature_ = val; + toHexString(): string { + return this.serialize().toString('hex'); } - /** - * @deprecated - */ - getMessageId() { + // Deprecated methods required by legacy code + getMessageId(): number { return this.msgNo; } - /** - * @deprecated - */ - setMessageId(val: number) { - this.setMessageId(val); - } - - /** - * @deprecated - */ - getLength() { - return this.msgLength_; - } - - /** - * @deprecated - */ - getSignature() { - return this.signature_; - } - - /** - * @deprecated - */ - getSequence() { + getSequence(): number { return this.sequence_; } - /** - * @deprecated - */ - isValidSignature() { - return this.isSignatureValid(); - } - - /** - * @deprecated - */ - ensureValidSignature() { - if (!this.isSignatureValid()) { - throw new Error('Signature is not valid'); - } + getByteSize(): number { + return this.sizeOf; } - /** - * @deprecated - */ + // Deprecated methods restored for compatibility ensureNonZeroSequence() { - if (this.sequence_ === 0) { - throw new Error('please set sequence'); + if (this.sequence === 0) { + throw new Error("please set sequence"); } } - /** - * @deprecated - */ - get messageId() { - return this.msgNo; - } - - /** - * @deprecated - */ - get messageSource() { - return null; + ensureValidSignature() { + if (!this.isSignatureValid()) { + throw new Error("invalid signature"); + } } - /** - * @deprecated - */ - get _data() { - return this.body_; + setSignature(val: string) { + checkSize4(val.length); + this.signature_ = val; } - /** - * @deprecated - */ - _assertEnoughData() { - return false; + get header() { + return { + mcoSig: this.signature, + length: this.length, + sequence: this.sequence, + flags: this.flags, + }; } - /** - * @deprecated - */ - _doDeserialize() {} - /** - * @deprecated - */ - - _doSerialize() {} - - /** - * @deprecated - */ - toHexString() { - return this.serialize().toString('hex'); - } - - /** - * @deprecated - */ - get sequenceNumber() { - return this.sequence_ - } - } +} diff --git a/packages/shared/src/MessageQueue.ts b/packages/shared/src/MessageQueue.ts index c8dd851d9..a6add78f6 100644 --- a/packages/shared/src/MessageQueue.ts +++ b/packages/shared/src/MessageQueue.ts @@ -42,6 +42,10 @@ export class MessageQueue { this._queue.push(item); } + get name() { + return this._name + } + exit() { this._isRunning = false; } diff --git a/packages/shared/src/NPSHeader.ts b/packages/shared/src/NPSHeader.ts index 2812d6e91..7a2c70039 100644 --- a/packages/shared/src/NPSHeader.ts +++ b/packages/shared/src/NPSHeader.ts @@ -12,67 +12,86 @@ import { SerializableMixin, AbstractSerializable } from "./messageFactory.js"; */ export class NPSHeader extends SerializableMixin(AbstractSerializable) { - _size: number; - id: number; // 2 bytes - length: number; // 2 bytes - version: number; // 2 bytes - reserved: number; // 2 bytes - checksum: number; // 4 bytes - constructor() { - super(); - this._size = 12; - this.id = 0; // 2 bytes - this.length = this._size; // 2 bytes - this.version = 257; // 2 bytes (0x0101) - this.reserved = 0; // 2 bytes - this.checksum = 0; // 4 bytes - } + _size: number; + id: number; // 2 bytes + length: number; // 2 bytes + version: number; // 2 bytes + reserved: number; // 2 bytes + checksum: number; // 4 bytes + constructor() { + super(); + this._size = 12; + this.id = 0; // 2 bytes + this.length = this._size; // 2 bytes + this.version = 257; // 2 bytes (0x0101) + this.reserved = 0; // 2 bytes + this.checksum = 0; // 4 bytes + } - /** - * @param {Buffer} buffer - * @returns {NPSHeader} - * @throws {Error} If the buffer is too short - * @throws {Error} If the buffer is malformed - */ - override _doDeserialize(buffer: Buffer): NPSHeader { - if (buffer.length < this._size) { - throw Error(`Buffer length ${buffer.length} is too short to deserialize`); - } + /** + * @deprecated use deserialize() // TODO: Remove depreciated method + * @param buffer + * @returns + */ + _doDeserialize(buffer: Buffer): NPSHeader { + return this.deserialize(buffer); + } - try { - this.id = buffer.readUInt16BE(0); - this.length = buffer.readUInt16BE(2); - } catch (error) { - throw Error(`Error deserializing buffer: ${String(error)}`); - } - return this; - } + /** + * @param {Buffer} buffer + * @returns {NPSHeader} + * @throws {Error} If the buffer is too short + * @throws {Error} If the buffer is malformed + */ + deserialize(buffer: Buffer): NPSHeader { + if (buffer.length < this._size) { + throw Error( + `Buffer length ${buffer.length} is too short to deserialize`, + ); + } - override _doSerialize() { - const buffer = Buffer.alloc(this._size); - buffer.writeUInt16BE(this.id, 0); - buffer.writeUInt16BE(this.length, 2); - buffer.writeUInt16BE(this.version, 4); - buffer.writeUInt16BE(this.reserved, 6); - buffer.writeUInt32BE(this.checksum, 8); - return buffer; - } + try { + this.id = buffer.readUInt16BE(0); + this.length = buffer.readUInt16BE(2); + } catch (error) { + throw Error(`Error deserializing buffer: ${String(error)}`); + } + return this; + } - static size() { - return 12; - } + serialize() { + const buffer = Buffer.alloc(this._size); + buffer.writeUInt16BE(this.id, 0); + buffer.writeUInt16BE(this.length, 2); + buffer.writeUInt16BE(this.version, 4); + buffer.writeUInt16BE(this.reserved, 6); + buffer.writeUInt32BE(this.checksum, 8); + return buffer; + } - static override get Size() { - return 12; - } + /** + * @deprecated use serialize // TODO: Remove depreciated method + * @returns + */ + _doSerialize() { + return this.serialize(); + } - override toString() { - return `NPSHeader: ${JSON.stringify({ - id: this.id, - length: this.length, - version: this.version, - reserved: this.reserved, - checksum: this.checksum, - })}`; - } + static size() { + return 12; + } + + static override get Size() { + return 12; + } + + override toString() { + return `NPSHeader: ${JSON.stringify({ + id: this.id, + length: this.length, + version: this.version, + reserved: this.reserved, + checksum: this.checksum, + })}`; + } } diff --git a/packages/shared/src/NPSMessage.ts b/packages/shared/src/NPSMessage.ts index edf1e9a7a..01a5773f9 100644 --- a/packages/shared/src/NPSMessage.ts +++ b/packages/shared/src/NPSMessage.ts @@ -8,37 +8,37 @@ import { NPSHeader } from "./NPSHeader.js"; */ export class NPSMessage extends SerializableMixin(AbstractSerializable) { - _header: NPSHeader; - constructor() { - super(); - this._header = new NPSHeader(); - } + _header: NPSHeader; + constructor() { + super(); + this._header = new NPSHeader(); + } - /** - * @param {Buffer} buffer - * @returns {NPSMessage} - */ - override _doDeserialize(buffer: Buffer): NPSMessage { - this._header._doDeserialize(buffer); - this.setBuffer(buffer.subarray(this._header._size)); - return this; - } + /** + * @param {Buffer} buffer + * @returns {NPSMessage} + */ + deserialize(buffer: Buffer): NPSMessage { + this._header._doDeserialize(buffer); + this.setBuffer(buffer.subarray(this._header._size)); + return this; + } - serialize() { - const buffer = Buffer.alloc(this._header.length); - this._header._doSerialize().copy(buffer); - this.data.copy(buffer, this._header._size); - return buffer; - } + serialize() { + const buffer = Buffer.alloc(this._header.length); + this._header._doSerialize().copy(buffer); + this.data.copy(buffer, this._header._size); + return buffer; + } - size() { - return this._header.length + this.data.length; - } + size() { + return this._header.length + this.data.length; + } - override toString() { - return `NPSMessage: ${JSON.stringify({ - header: this._header.toString(), - data: this.data.toString("hex"), - })}`; - } + override toString() { + return `NPSMessage: ${JSON.stringify({ + header: this._header.toString(), + data: this.data.toString('hex'), + })}`; + } } diff --git a/packages/shared/src/NPSMessageToBytableMessageAdaptor.test.ts b/packages/shared/src/NPSMessageToBytableMessageAdaptor.test.ts new file mode 100644 index 000000000..5b8c27712 --- /dev/null +++ b/packages/shared/src/NPSMessageToBytableMessageAdaptor.test.ts @@ -0,0 +1,68 @@ +import { describe, it, expect } from 'vitest'; +import { NPSMessageToBytableMessageAdaptor } from './NPSMessageToBytableMessageAdaptor.js'; +import { NPSMessage } from 'rusty-motors-shared'; + +describe('NPSMessageToBytableMessageAdaptor', () => { + it('should initialize correctly', () => { + const adaptor = new NPSMessageToBytableMessageAdaptor(); + expect(adaptor).toBeInstanceOf(NPSMessageToBytableMessageAdaptor); + }); + + it('should throw error for invalid version', () => { + expect(() => new NPSMessageToBytableMessageAdaptor(2 as any)).toThrow(); + }); + + it('should get and set body/data', () => { + const adaptor = new NPSMessageToBytableMessageAdaptor(); + const data = Buffer.from([1, 2, 3]); + + adaptor.setBody(data); + expect(adaptor.getBody()).toEqual(data); + expect(adaptor.data).toEqual(data); + + const newData = Buffer.from([4, 5, 6]); + adaptor.data = newData; + expect(adaptor.getBody()).toEqual(newData); + }); + + it('should delegate serialize/deserialize to NPSMessage', () => { + const adaptor = new NPSMessageToBytableMessageAdaptor(); + const data = Buffer.from([0x01, 0x02]); + adaptor.setBody(data); + + // _doSerialize returns the serialized NPSMessage + const serialized = adaptor._doSerialize(); + expect(Buffer.isBuffer(serialized)).toBe(true); + + const adaptor2 = new NPSMessageToBytableMessageAdaptor(); + adaptor2._doDeserialize(serialized); + expect(adaptor2.getBody()).toEqual(data); + + // Public deserialize + const adaptor3 = new NPSMessageToBytableMessageAdaptor(); + adaptor3.deserialize(serialized); + expect(adaptor3.getBody()).toEqual(data); + }); + + it('should throw for unimplemented methods', () => { + const adaptor = new NPSMessageToBytableMessageAdaptor(); + + expect(() => adaptor.header).toThrow('Method not implemented.'); + expect(() => adaptor.serializeSize).toThrow('Method not implemented.'); + expect(() => adaptor.serialize()).toThrow('Method not implemented.'); + expect(() => adaptor.json).toThrow('Method not implemented.'); + expect(() => adaptor.setName('test')).toThrow('Method not implemented.'); + expect(() => adaptor.toString()).toThrow('Method not implemented.'); + expect(() => adaptor.setSerializeOrder([])).toThrow('Method not implemented.'); + expect(() => adaptor.getField('test')).toThrow('Method not implemented.'); + expect(() => adaptor.getFieldValueByName('test')).toThrow('Method not implemented.'); + expect(() => adaptor.htonl(1)).toThrow('Method not implemented.'); + expect(() => adaptor.coerceValue(1)).toThrow('Method not implemented.'); + expect(() => adaptor.setFieldValueByName('test', 1)).toThrow('Method not implemented.'); + expect(() => adaptor.setVersion(1)).toThrow('Method not implemented.'); + expect(() => adaptor.toHexString()).toThrow('Method not implemented.'); + expect(() => adaptor.name).toThrow('Method not implemented.'); + expect(() => adaptor.value).toThrow('Method not implemented.'); + expect(() => adaptor.setValue(1)).toThrow('Method not implemented.'); + }); +}); diff --git a/packages/shared/src/NPSMessageToBytableMessageAdaptor.ts b/packages/shared/src/NPSMessageToBytableMessageAdaptor.ts new file mode 100644 index 000000000..2541a2913 --- /dev/null +++ b/packages/shared/src/NPSMessageToBytableMessageAdaptor.ts @@ -0,0 +1,169 @@ +import { NPSMessage } from 'rusty-motors-shared'; +import {BytableFieldTypes, BytableHeader, BytableObject, type IBytableMessage} from "@rustymotors/binary" +import assert from 'node:assert'; + +export class NPSMessageToBytableMessageAdaptor implements IBytableMessage { + deserialize(buffer: Buffer): void { + this.npsMessage_.deserialize(buffer); + } + /** + * @deprecated // TODO: Remove depreciated method + * + */ + get header(): BytableHeader { + throw new Error('Method not implemented.'); + } + /** + * @deprecated // TODO: Remove depreciated method + * + */ + get serializeSize(): number { + throw new Error('Method not implemented.'); + } + serialize(): Buffer { + throw new Error('Method not implemented.'); + } + get json(): { + name: string; + serializeSize: number; + header: { + name: string; + id: number; + len: number; + version: 0 | 1; + serializeSize: number; + }; + fields: Record[]; + } { + throw new Error('Method not implemented.'); + } + setName(_name: string): void { + throw new Error('Method not implemented.'); + } + toString(): string { + throw new Error('Method not implemented.'); + } + /** + * @deprecated // TODO: Remove depreciated method + * + */ + setSerializeOrder( + _serializeOrder: Array<{ name: string; field: keyof typeof BytableFieldTypes }>, + ): void { + throw new Error('Method not implemented.'); + } + /** + * @deprecated // TODO: Remove depreciated method + * + */ + getField(_name: string): BytableObject | undefined { + throw new Error('Method not implemented.'); + } + /** + * @deprecated // TODO: Remove depreciated method + * + */ + getFieldValueByName( + _name: string, + ): string | number | Buffer | undefined { + throw new Error('Method not implemented.'); + } + /** + * @deprecated // TODO: Remove depreciated method + * + */ + htonl(_value: number): Buffer { + throw new Error('Method not implemented.'); + } + /** + * @deprecated // TODO: Remove depreciated method + * + */ + coerceValue(_value: string | number | Buffer): Buffer { + throw new Error('Method not implemented.'); + } + /** + * @deprecated // TODO: Remove depreciated method + * + */ + setFieldValueByName(_name: string, _value: string | number | Buffer): void { + throw new Error('Method not implemented.'); + } + /** + * @deprecated // TODO: Remove depreciated method + * + */ + setVersion(_version: 0 | 1): void { + throw new Error('Method not implemented.'); + } + getBody(): Buffer { + return this.npsMessage_.data as Buffer + } + setBody(buffer: Buffer): void { + this.npsMessage_.data = buffer + this.npsMessage_._header.length = this.npsMessage_._header._size + buffer.length + } + /** + * @deprecated // TODO: Remove depreciated method + * + */ + get data(): Buffer { + return this.npsMessage_.data + } + /** + * @deprecated // TODO: Remove depreciated method + * + */ + set data(buffer: Buffer) { + this.npsMessage_.data = buffer + } + /** + * @deprecated // TODO: Remove depreciated method + * + */ + toHexString(): string { + throw new Error('Method not implemented.'); + } + /** + * @deprecated // TODO: Remove depreciated method + * + */ + _doDeserialize(buf: Buffer): void { + this.npsMessage_.deserialize(buf) + } + /** + * @deprecated // TODO: Remove depreciated method + * + */ + _doSerialize(): Buffer { + return this.npsMessage_.serialize() + } + /** + * @deprecated // TODO: Remove depreciated method + * + */ + get name(): string { + throw new Error('Method not implemented.'); + } + /** + * @deprecated // TODO: Remove depreciated method + * + */ + get value(): string | number | Buffer { + throw new Error('Method not implemented.'); + } + + /** + * @deprecated // TODO: Remove depreciated method + * + */ + setValue(_value: string | number | Buffer): void { + throw new Error('Method not implemented.'); + } + private npsMessage_: NPSMessage; + + constructor(version: 1 = 1) { + this.npsMessage_ = new NPSMessage(); + assert(version === 1); + } +} diff --git a/packages/shared/src/OldServerMessage.ts b/packages/shared/src/OldServerMessage.ts index 87cb329c7..abe70bfd8 100644 --- a/packages/shared/src/OldServerMessage.ts +++ b/packages/shared/src/OldServerMessage.ts @@ -8,78 +8,73 @@ import { serverHeader } from "./serverHeader.js"; * A server message is a message that is passed between the server and the client. It has an 11 byte header. @see {@link serverHeader} * * @mixin {SerializableMixin} - * @deprecated + * @deprecated use MessageNode instead // TODO: Remove depreciated method */ export class OldServerMessage extends SerializedBufferOld implements IServerMessage { - _header: serverHeader; - _msgNo: number; - constructor() { - super(); - this._header = new serverHeader(); - this._msgNo = 0; // 2 bytes - } + _header: serverHeader; + _msgNo: number; + constructor() { + super(); + this._header = new serverHeader(); + this._msgNo = 0; // 2 bytes + } - override size(): number { - return this._header.length + this.data.length; - } + override size(): number { + return this._header.length + this.data.length; + } - /** - * @deprecated - * @param {Buffer} buffer - * @returns {OldServerMessage} - */ - override _doDeserialize(buffer: Buffer): OldServerMessage { - this._header._doDeserialize(buffer); - this.setBuffer(buffer.subarray(this._header._size)); - if (this.data.length > 2) { - this._msgNo = this.data.readUInt16LE(0); - } - return this; - } + override deserialize(buffer: Buffer) { + this._header._doDeserialize(buffer); + this.setBuffer(buffer.subarray(this._header._size)); + if (this.data.length > 2) { + this._msgNo = this.data.readUInt16LE(0); + } + return this; + } - /** - * Serializes the current message into a buffer. - * - * This method allocates a new buffer with a size equal to the sum of the header length and 2 bytes. - * It then serializes the header and data into this buffer. - * - * @returns {Buffer} The serialized buffer containing the header and data. - */ - override serialize() { - const buffer = Buffer.alloc(this._header.length + 2); - this._header._doSerialize().copy(buffer); - this.data.copy(buffer, this._header._size); - return buffer; - } + /** + * Serializes the current message into a buffer. + * + * This method allocates a new buffer with a size equal to the sum of the header length and 2 bytes. + * It then serializes the header and data into this buffer. + * + * @returns {Buffer} The serialized buffer containing the header and data. + */ + override serialize(): Buffer { + const buffer = Buffer.alloc(this._header.length + 2); + this._header._doSerialize().copy(buffer); + this.data.copy(buffer, this._header._size); + return buffer; + } - /** - * @deprecated - * @param {Buffer} buffer - */ - override setBuffer(buffer: Buffer) { - super.setBuffer(buffer); - this._header.length = buffer.length + this._header._size - 2; - } + /** + * @deprecated // TODO: Remove depreciated method + * @param {Buffer} buffer + */ + override setBuffer(buffer: Buffer) { + super.setBuffer(buffer); + this._header.length = buffer.length + this._header._size - 2; + } - /** - * @deprecated - */ - updateMsgNo() { - this._msgNo = this.data.readUInt16LE(0); - } + /** + * @deprecated // TODO: Remove depreciated method + */ + updateMsgNo() { + this._msgNo = this.data.readUInt16LE(0); + } - override toString() { - return `ServerMessage: ${JSON.stringify({ - header: this._header.toString(), - data: this.data.toString("hex"), - })}`; - } + override toString() { + return `ServerMessage: ${JSON.stringify({ + header: this._header.toString(), + data: this.data.toString('hex'), + })}`; + } - override toHexString() { - return this.serialize().toString("hex"); - } + override toHexString() { + return this.serialize().toString('hex'); + } - get sequenceNumber(): number { - return this._header.sequence; - } + get sequenceNumber(): number { + return this._header.sequence; + } } diff --git a/packages/shared/src/RaceInfo.test.ts b/packages/shared/src/RaceInfo.test.ts new file mode 100644 index 000000000..45ac448d7 --- /dev/null +++ b/packages/shared/src/RaceInfo.test.ts @@ -0,0 +1,25 @@ +import { describe, it, expect } from 'vitest'; +import { RaceCreatedMessage } from './RaceInfo.js'; + +describe('RaceCreatedMessage', () => { + it('should mask password in logs', () => { + const msg = new RaceCreatedMessage(); + msg.setPassword('secret'); + + const logString = msg.toLogString(); + const logObj = JSON.parse(logString); + + expect(logObj.password).toBe('[REDACTED]'); + expect(logString).not.toContain('secret'); + }); + + it('should handle undefined password', () => { + const msg = new RaceCreatedMessage(); + // Password not set + + const logString = msg.toLogString(); + const logObj = JSON.parse(logString); + + expect(logObj.password).toBeUndefined(); + }); +}); diff --git a/packages/shared/src/RaceInfo.ts b/packages/shared/src/RaceInfo.ts index 0f6096479..2bd200b6a 100644 --- a/packages/shared/src/RaceInfo.ts +++ b/packages/shared/src/RaceInfo.ts @@ -653,6 +653,7 @@ export class RaceCreatedMessage extends MessageNodeBody { return 22 + this._password.sizeOf; } + private _doSerialize(): Buffer { const msgNo = Buffer.alloc(2); msgNo.writeInt16LE(this._msgNo); @@ -725,6 +726,18 @@ export class RaceCreatedMessage extends MessageNodeBody { override toString() { return JSON.stringify(this); } + + toLogString() { + return JSON.stringify({ + msgNo: this._msgNo, + raceId: this._raceId && this._raceId.toString('hex'), + entryFee: this._entryFee && this._entryFee.readInt32LE(0), + perPlayerPurseBonus: this._perPlayerPurseBonus && this._perPlayerPurseBonus.readInt32LE(0), + password: this._password.toString() ? '[REDACTED]' : undefined, + raceHistoryId: this._raceHistoryId && this._raceHistoryId.toString('hex'), + perRacePurseBonus: this._perRacePurseBonus && this._perRacePurseBonus.readInt32LE(0), + }); + } } export class JoinRaceMessage extends MessageNodeBody { @@ -840,6 +853,11 @@ export class RaceJoinedMessage extends MessageNodeBody { } override toString() { - return JSON.stringify(this); + // Do not log password. Only return raceId and msgNo. + return JSON.stringify({ + msgNo: this._msgNo, + raceId: this._raceId?.readInt32LE?.() ?? undefined, + // Do not log password or other sensitive fields + }); } } diff --git a/packages/shared/src/SerializedBufferOld.ts b/packages/shared/src/SerializedBufferOld.ts index f6e8bf283..debc2da94 100644 --- a/packages/shared/src/SerializedBufferOld.ts +++ b/packages/shared/src/SerializedBufferOld.ts @@ -8,43 +8,45 @@ import { SerializableMixin, AbstractSerializable } from "./messageFactory.js"; * @mixin {SerializableMixin} */ -export class SerializedBufferOld extends SerializableMixin( - AbstractSerializable, -) implements SerializableInterface { - constructor() { - super(); - } - - deserialize(data: Buffer): this { - this.setBuffer(data); - return this; - } - - serialize() { - return this.data; - } - - override _doDeserialize(_buffer: Buffer): AbstractSerializable { - return this.deserialize(_buffer) - } - - override _doSerialize(): void { - this.serialize() - } - - override toString() { - return `SerializedBuffer: ${this.serialize().toString("hex")}`; - } - - size() { - return this.data.length; - } - - getByteSize() { - return this.size(); - } - - toHexString() { - return this.data.toString("hex"); - } +export class SerializedBufferOld + extends SerializableMixin(AbstractSerializable) + implements SerializableInterface +{ + constructor() { + super(); + } + + deserialize(data: Buffer): this { + this.setBuffer(data); + return this; + } + + serialize() { + return this.data; + } + + /** + * @deprecated use deserialize() // TODO: Remove depreciated method + * @param _buffer + * @returns + */ + _doDeserialize(_buffer: Buffer): AbstractSerializable { + return this.deserialize(_buffer); + } + + override toString() { + return `SerializedBuffer: ${this.serialize().toString('hex')}`; + } + + size() { + return this.data.length; + } + + getByteSize() { + return this.size(); + } + + toHexString() { + return this.data.toString('hex'); + } } \ No newline at end of file diff --git a/packages/shared/src/ServerMessage.test.ts b/packages/shared/src/ServerMessage.test.ts index 6f976f33c..5d292dd68 100644 --- a/packages/shared/src/ServerMessage.test.ts +++ b/packages/shared/src/ServerMessage.test.ts @@ -20,7 +20,7 @@ describe("ServerMessage", () => { // Act const buffer = testMessage.serialize(); const result = new OldServerMessage(); - result._doDeserialize(buffer); + result.deserialize(buffer); result._msgNo = testMessage._msgNo; // Assert expect(result._header.mcoSig).toEqual(testMessage._header.mcoSig); diff --git a/packages/shared/src/helpers.ts b/packages/shared/src/helpers.ts index b59fd1153..95bc5a9a9 100644 --- a/packages/shared/src/helpers.ts +++ b/packages/shared/src/helpers.ts @@ -7,6 +7,10 @@ export class Short implements Serializable { return 2; } + getByteSize() { + return this.sizeOf; + } + serialize() { const b = Buffer.alloc(4); b.writeInt16BE(this._value); @@ -34,6 +38,10 @@ export class Long implements Serializable { return 4; } + getByteSize() { + return this.sizeOf; + } + serialize() { const b = Buffer.alloc(4); b.writeInt32BE(this._value); @@ -61,6 +69,10 @@ export class NPS_LOGICAL implements Serializable { return 2; } + getByteSize() { + return this.sizeOf; + } + serialize() { const b = Buffer.alloc(2); if (this._value === true) { @@ -96,6 +108,10 @@ export class Bool implements Serializable { return 1; } + getByteSize() { + return this.sizeOf; + } + serialize() { const b = Buffer.alloc(1); if (this._value === true) { @@ -137,6 +153,10 @@ export class CString implements Serializable { return 4 + this._string.byteLength + 1; } + getByteSize() { + return this.sizeOf; + } + serialize() { const len = this._string.byteLength + 1; const lenBuf = Buffer.alloc(4); @@ -188,6 +208,10 @@ export class CBlock implements Serializable { return this._size; } + getByteSize() { + return this.sizeOf; + } + deserialize(buf: Buffer) { doesBufferFit(buf, this._size); buf.copy(this._data, 0, 0, this._size); diff --git a/packages/shared/src/legacyHeader.ts b/packages/shared/src/legacyHeader.ts index 1e00c7ec5..ec866467d 100644 --- a/packages/shared/src/legacyHeader.ts +++ b/packages/shared/src/legacyHeader.ts @@ -9,56 +9,66 @@ import { SerializableMixin, AbstractSerializable } from "./messageFactory.js"; */ export class legacyHeader extends SerializableMixin(AbstractSerializable) { - _size: number; - id: number; - length: number; - constructor() { - super(); - this._size = 4; - this.id = 0; // 2 bytes - this.length = this._size; // 2 bytes - } + _size: number; + id: number; + length: number; + constructor() { + super(); + this._size = 4; + this.id = 0; // 2 bytes + this.length = this._size; // 2 bytes + } - override _doDeserialize(_buffer: Buffer): AbstractSerializable { - return this.deserialize(_buffer) - } + /** + * + * @param _buffer @deprecated use deserialize() // TODO: Remove depreciated method + * @returns + */ + _doDeserialize(_buffer: Buffer): AbstractSerializable { + return this.deserialize(_buffer); + } - override _doSerialize() { - return this.serialize() - } + /** + * + * @returns @deprecated use serialize() // TODO: Remove depreciated method + */ + _doSerialize() { + return this.serialize(); + } + deserialize(buffer: Buffer) { + if (buffer.length < 4) { + throw Error( + `Buffer length ${buffer.length} is too short to deserialize`, + ); + } - deserialize(buffer: Buffer) { - if (buffer.length < 4) { - throw Error(`Buffer length ${buffer.length} is too short to deserialize`); - } - - try { - this.id = buffer.readUInt16BE(0); - this.length = buffer.readUInt16BE(2); - } catch (error) { - const err = Error("Error deserializing buffer"); - err.cause = error; - throw err; - } - return this; - } + try { + this.id = buffer.readUInt16BE(0); + this.length = buffer.readUInt16BE(2); + } catch (error) { + const err = Error('Error deserializing buffer'); + err.cause = error; + throw err; + } + return this; + } - serialize() { - const buffer = Buffer.alloc(this._size); - buffer.writeUInt16BE(this.id, 0); - buffer.writeUInt16BE(this.length, 2); - return buffer; - } + serialize() { + const buffer = Buffer.alloc(this._size); + buffer.writeUInt16BE(this.id, 0); + buffer.writeUInt16BE(this.length, 2); + return buffer; + } - override toString() { - return `LegacyHeader: ${JSON.stringify({ - id: this.id, - length: this.length, - })}`; - } + override toString() { + return `LegacyHeader: ${JSON.stringify({ + id: this.id, + length: this.length, + })}`; + } - static override get Size() { - return 4; - } + static override get Size() { + return 4; + } } \ No newline at end of file diff --git a/packages/shared/src/messageFactory.ts b/packages/shared/src/messageFactory.ts index 341660ebe..7ae5fb1bc 100644 --- a/packages/shared/src/messageFactory.ts +++ b/packages/shared/src/messageFactory.ts @@ -25,19 +25,6 @@ export class AbstractSerializable { this.internalBuffer = Buffer.alloc(0); } - _doSerialize() { - throw Error("Method '_doSerialize()' must be implemented."); - } - - /** - * @param {Buffer} _buffer - * @returns {AbstractSerializable} - */ - // eslint-disable-next-line no-unused-vars - _doDeserialize(_buffer: Buffer): AbstractSerializable { - throw Error("Method '_doDeserialize()' must be implemented."); - } - get data() { return this.internalBuffer; } diff --git a/packages/shared/src/mocks.ts b/packages/shared/src/mocks.ts new file mode 100644 index 000000000..aec838934 --- /dev/null +++ b/packages/shared/src/mocks.ts @@ -0,0 +1,36 @@ +import { Socket as SocketTCP } from 'node:net'; +import { Socket as SocketUDP } from 'node:dgram'; + +export function createMockTcpSocket(options: { remoteAddress?: string; localPort?: number } = {}): SocketTCP { + const socket = new SocketTCP(); + Object.defineProperty(socket, 'remoteAddress', { value: options.remoteAddress || '127.0.0.1' }); + Object.defineProperty(socket, 'localPort', { value: options.localPort || 12345 }); + return socket; +} + +export function createMockUdpSocket(options: { address?: string; port?: number; family?: string } = {}): SocketUDP { + // We can't easily instantiate SocketUDP directly without createSocket, + // but for testing we often just need an object that looks like it or a real one with mocked methods. + // Since we are using real sockets in the tests but mocking properties, let's stick to that pattern + // but wrap it in a factory. + // However, creating a real UDP socket requires 'node:dgram'. + // Let's return a partial mock or a real socket if possible. + // Given the previous test used createSocket('udp4'), we should probably do the same if we want it to be an instance of SocketUDP. + + // Ideally we inject the dependency, but here we are just creating a helper. + // Let's assume the caller might want a real socket but configured. + // Actually, to avoid side effects of real sockets (binding ports etc), + // we might want to return a pure mock if the code under test allows it. + // The code checks `instanceof SocketUDP`. So we must return a real instance or a class that extends it. + + const dgram = require('node:dgram'); + const socket = dgram.createSocket('udp4'); + + socket.address = () => ({ + address: options.address || '127.0.0.1', + port: options.port || 12345, + family: options.family || 'IPv4' + }); + + return socket; +} diff --git a/packages/shared/src/serverHeader.ts b/packages/shared/src/serverHeader.ts index 5fc0137d3..ad535915a 100644 --- a/packages/shared/src/serverHeader.ts +++ b/packages/shared/src/serverHeader.ts @@ -9,60 +9,77 @@ import { SerializableMixin, AbstractSerializable } from "./messageFactory.js"; */ export class serverHeader extends SerializableMixin(AbstractSerializable) { - _size: number; - length: any; - mcoSig: string; - sequence: number; - flags: number; - constructor() { - super(); - this._size = 11; - this.length = this._size; // 2 bytes - this.mcoSig = "TOMC"; // 4 bytes - this.sequence = 0; // 4 bytes - this.flags = 0; // 1 byte - } + _size: number; + length: any; + mcoSig: string; + sequence: number; + flags: number; + constructor() { + super(); + this._size = 11; + this.length = this._size; // 2 bytes + this.mcoSig = 'TOMC'; // 4 bytes + this.sequence = 0; // 4 bytes + this.flags = 0; // 1 byte + } - size() { - return this._size; - } + size() { + return this._size; + } - /** - * @param {Buffer} buffer - * @returns {serverHeader} - * @throws {Error} If the buffer is too short - * @throws {Error} If the buffer is malformed - */ - override _doDeserialize(buffer: Buffer): serverHeader { - if (buffer.length < this._size) { - throw new Error( - `Buffer length ${buffer.length} is too short to deserialize`, - ); - } + /** + * @deprecated use deserialize() // TODO: Remove depreciated method + * @param buffer + * @returns + */ + _doDeserialize(buffer: Buffer): serverHeader { + return this.deserialize(buffer); + } - try { - this.length = buffer.readUInt16LE(0); - this.mcoSig = buffer.toString("utf8", 2, 6); - this.sequence = buffer.readUInt32LE(6); - this.flags = buffer.readUInt8(10); - } catch (error) { - const err = Error("Error deserializing buffer"); - err.cause = error; - throw err; - } - return this; - } + /** + * @param {Buffer} buffer + * @returns {serverHeader} + * @throws {Error} If the buffer is too short + * @throws {Error} If the buffer is malformed + */ + deserialize(buffer: Buffer): serverHeader { + if (buffer.length < this._size) { + throw new Error( + `Buffer length ${buffer.length} is too short to deserialize`, + ); + } - override _doSerialize() { - const buffer = Buffer.alloc(this._size); - buffer.writeUInt16LE(this.length, 0); - buffer.write(this.mcoSig, 2, 6, "utf8"); - buffer.writeUInt32LE(this.sequence, 6); - buffer.writeUInt8(this.flags, 10); - return buffer; - } + try { + this.length = buffer.readUInt16LE(0); + this.mcoSig = buffer.toString('utf8', 2, 6); + this.sequence = buffer.readUInt32LE(6); + this.flags = buffer.readUInt8(10); + } catch (error) { + const err = Error('Error deserializing buffer'); + err.cause = error; + throw err; + } + return this; + } - override toString() { - return `ServerHeader: length=${this.length}, mcoSig=${this.mcoSig}, sequence=${this.sequence}, flags=${this.flags}`; - } + /** + * @deprecated use serialize() // TODO: Remove depreciated method + * @returns + */ + _doSerialize() { + return this.serialize(); + } + + serialize() { + const buffer = Buffer.alloc(this._size); + buffer.writeUInt16LE(this.length, 0); + buffer.write(this.mcoSig, 2, 6, 'utf8'); + buffer.writeUInt32LE(this.sequence, 6); + buffer.writeUInt8(this.flags, 10); + return buffer; + } + + override toString() { + return `ServerHeader: length=${this.length}, mcoSig=${this.mcoSig}, sequence=${this.sequence}, flags=${this.flags}`; + } } diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index 396a141c1..4fd8b41d2 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -141,10 +141,10 @@ export interface Logger { warn: LeveledLogMethod; info: LeveledLogMethod; verbose: LeveledLogMethod; - /** @deprecated Use verbose instead */ - debug: LeveledLogMethod - /** @deprecated Use verbose instead */ - trace: LeveledLogMethod + /** @deprecated Use verbose instead */ // TODO: Remove depreciated method + debug: LeveledLogMethod; + /** @deprecated Use verbose instead */ // TODO: Remove depreciated method + trace: LeveledLogMethod; } export type LogLevel = "error" | "warn" | "info" | "verbose"; export interface KeypressEvent { diff --git a/packages/transactions/src/_buyCarFromDealer.ts b/packages/transactions/src/_buyCarFromDealer.ts index 0d840cce4..b85b673ec 100644 --- a/packages/transactions/src/_buyCarFromDealer.ts +++ b/packages/transactions/src/_buyCarFromDealer.ts @@ -21,7 +21,7 @@ export async function _buyCarFromDealer({ const purchaseStockCarMessage = new PurchaseStockCarMessage(); purchaseStockCarMessage.deserialize(packet.serialize()); - log.debug( + log.verbose( `[${connectionId}] Received PurchaseStockCarMessage: ${purchaseStockCarMessage.toString()}`, ); @@ -41,7 +41,7 @@ export async function _buyCarFromDealer({ // TODO: Get the new car ID from the database const newCarId = await purchaseCar(session.gameId, purchaseStockCarMessage.dealerId, purchaseStockCarMessage.brandedPardId, purchaseStockCarMessage.skinId, purchaseStockCarMessage.tradeInCarId) .then((newCarId) => { - log.debug( + log.verbose( 'Purchased car', { connectionId }, ); @@ -55,7 +55,7 @@ export async function _buyCarFromDealer({ throw new Error('Failed to purchase car'); }) - log.debug( + log.verbose( `[${connectionId}] Purchased car with ID: ${newCarId}`, ); @@ -73,7 +73,7 @@ export async function _buyCarFromDealer({ replyPacket.result.writeUInt32LE(101, 0); // MC_SUCCESS replyPacket.data.writeUInt32LE(newCarId, 0); - log.debug( + log.verbose( `[${connectionId}] Sending GenericReplyMessage: ${replyPacket.toString()}`, ); @@ -83,7 +83,7 @@ export async function _buyCarFromDealer({ responsePacket.setBuffer(replyPacket.serialize()); - log.debug( + log.verbose( `[${connectionId}] Sending response packet: ${responsePacket.toHexString()}`, ); diff --git a/packages/transactions/src/_buyNewPart.ts b/packages/transactions/src/_buyNewPart.ts index 3a9b6249d..f4dbca568 100644 --- a/packages/transactions/src/_buyNewPart.ts +++ b/packages/transactions/src/_buyNewPart.ts @@ -19,7 +19,7 @@ export async function _buyNewPart({ const buyNewPartMessage = new GenericRequestMessage(); buyNewPartMessage.deserialize(packet.data); - log.debug(`Received Message: ${buyNewPartMessage.toString()}`); + log.verbose(`Received Message: ${buyNewPartMessage.toString()}`); const requestedPart = buyNewPartMessage.data.readInt32LE() const fromDealerId = buyNewPartMessage.data2.readInt32LE() @@ -46,7 +46,7 @@ export async function _buyNewPart({ responsePacket._header.sequence = packet.sequenceNumber; responsePacket._header.flags = 8; - log.debug(newPartMessage.toString()) + log.verbose(newPartMessage.toString()) responsePacket.setBuffer(newPartMessage.serialize()); diff --git a/packages/transactions/src/_crcPreRaceData.ts b/packages/transactions/src/_crcPreRaceData.ts index b273dc533..a5becec21 100644 --- a/packages/transactions/src/_crcPreRaceData.ts +++ b/packages/transactions/src/_crcPreRaceData.ts @@ -24,7 +24,7 @@ export async function _crcPreRaceData({ rPacket.setBuffer(pReply.serialize()); - log.debug(`TrackingPing: ${rPacket.toString()}`); + log.verbose(`TrackingPing: ${rPacket.toString()}`); return { connectionId, messages: [rPacket] }; } diff --git a/packages/transactions/src/_createStandardRace.ts b/packages/transactions/src/_createStandardRace.ts index e209bdfe7..f38347f6a 100644 --- a/packages/transactions/src/_createStandardRace.ts +++ b/packages/transactions/src/_createStandardRace.ts @@ -17,7 +17,7 @@ export async function _createStandardRace({ const createRaceMessage = new CreateRaceMessage() createRaceMessage.deserialize(packet.serialize()) - log.debug(`createRaceMsg: ${createRaceMessage.toString()}`) + log.verbose(`createRaceMsg: ${createRaceMessage.toString()}`) // TODO Do stuff. Lots of stuff @@ -30,7 +30,7 @@ export async function _createStandardRace({ raceCreatedMessage.perRacePurseBonus = 3 - log.debug(`RaceCreatedmsg: ${raceCreatedMessage.toString()}`) + log.verbose(`RaceCreatedmsg: ${raceCreatedMessage.toLogString()}`) // Create new response packet @@ -40,7 +40,7 @@ export async function _createStandardRace({ rPacket.setBody(raceCreatedMessage) - log.debug(`_createStandardRace: ${rPacket.toString()}`); + log.verbose(`_createStandardRace: ${rPacket.toLogString()}`); return { connectionId, messages: [rPacket] }; } diff --git a/packages/transactions/src/_getArcadeCarInfo.ts b/packages/transactions/src/_getArcadeCarInfo.ts index 7229c5114..31b3f7d72 100644 --- a/packages/transactions/src/_getArcadeCarInfo.ts +++ b/packages/transactions/src/_getArcadeCarInfo.ts @@ -18,7 +18,7 @@ export async function _getArcadeCarInfo({ const getArcadeCarInfoMessage = new GenericRequestMessage(); getArcadeCarInfoMessage.deserialize(packet.data); - log.debug(`Received Message: ${getArcadeCarInfoMessage.toString()}`); + log.verbose(`Received Message: ${getArcadeCarInfoMessage.toString()}`); const arcadeCarInfoMessage = new ArcadeCarMessage(); arcadeCarInfoMessage._msgNo = 323; diff --git a/packages/transactions/src/_getFullCarInfo.ts b/packages/transactions/src/_getFullCarInfo.ts index 5a7239718..5b374f4cf 100644 --- a/packages/transactions/src/_getFullCarInfo.ts +++ b/packages/transactions/src/_getFullCarInfo.ts @@ -1,7 +1,11 @@ -import { buildVehiclePartTreeFromDB, type TPart, getVehiclePartTree, vehiclePartTreeToJSON } from "rusty-motors-database"; -import { getServerLogger, OldServerMessage } from "rusty-motors-shared"; -import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; -import { GenericRequestMessage } from "./GenericRequestMessage.js"; +import { + buildVehiclePartTreeFromDB, + type TPart, + getVehiclePartTree, +} from 'rusty-motors-database'; +import { getServerLogger, OldServerMessage } from 'rusty-motors-shared'; +import { MessageHandlerArgs, MessageHandlerResult } from './handlers.js'; +import { GenericRequestMessage } from './GenericRequestMessage.js'; const DAMAGE_SIZE = 2000; @@ -22,14 +26,15 @@ export class VehicleStruct { buffer.writeInt32LE(this.Flags, 8); // offset 8 buffer.writeInt32LE(this.Delta, 12); // offset 12 buffer.writeInt8(this.CarClass, 16); // offset 16 - const damageLengthOverride = this.damageLengthOverride ?? this.Damage.length; + const damageLengthOverride = + this.damageLengthOverride ?? this.Damage.length; buffer.writeInt16LE(damageLengthOverride, 17); // offset 17 if (this.Damage.length > 0) { this.Damage.copy(buffer, 19); // offset 19 } return buffer; } catch (error) { - getServerLogger("transactions/VehicleStruct").error( + getServerLogger('transactions/VehicleStruct').error( `Error in VehicleStruct.serialize: ${error}`, ); throw error; @@ -47,7 +52,7 @@ export class VehicleStruct { Flags: ${this.Flags} Delta: ${this.Delta} CarClass: ${this.CarClass} - Damage: ${this.Damage.toString("hex")} + Damage: ${this.Damage.toString('hex')} `; } } @@ -63,7 +68,7 @@ export class PartStruct { damage: number = 0; // 1 byte serialize() { - const log = getServerLogger("transactions/PartStruct"); + const log = getServerLogger('transactions/PartStruct'); try { const buffer = Buffer.alloc(this.size()); buffer.writeUInt32LE(this.partId, 0); @@ -98,20 +103,20 @@ class CarInfoStruct { parts: PartStruct[] = []; serialize() { - const log = getServerLogger("transactions/CarInfoStruct"); + const log = getServerLogger('transactions/CarInfoStruct'); try { const neededSize = 10 + this.vehicle.size() + this.noOfParts * 26; - log.debug(`Needed size: ${neededSize}`); + log.verbose(`Needed size: ${neededSize}`); const buffer = Buffer.alloc(neededSize); - log.debug(`Writing msgNo: ${this.msgNo}`); + log.verbose(`Writing msgNo: ${this.msgNo}`); buffer.writeUInt16LE(this.msgNo, 0); - log.debug(`Writing playerId: ${this.playerId}`); + log.verbose(`Writing playerId: ${this.playerId}`); buffer.writeUInt32LE(this.playerId, 2); - log.debug(`Serializing vehicle`); + log.verbose(`Serializing vehicle`); this.vehicle.serialize().copy(buffer, 6); - log.debug(`Writing noOfParts: ${this.noOfParts}`); + log.verbose(`Writing noOfParts: ${this.noOfParts}`); buffer.writeUInt16LE(this.noOfParts, 6 + this.vehicle.size()); let offset = 8 + this.vehicle.size(); for (const part of this.parts) { @@ -154,39 +159,37 @@ export type DBPart = { export async function _getCompleteVehicleInfo({ connectionId, packet, - log = getServerLogger("transactions/getCompleteVehicleInfo"), + log = getServerLogger('transactions/getCompleteVehicleInfo'), }: MessageHandlerArgs): Promise { const getCompleteVehicleInfoMessage = new GenericRequestMessage(); getCompleteVehicleInfoMessage.deserialize(packet.data); - log.debug(`Received Message: ${getCompleteVehicleInfoMessage.toString()}`); + log.verbose(`Received Message: ${getCompleteVehicleInfoMessage.toString()}`); const vehicleId = getCompleteVehicleInfoMessage.data.readUInt32LE(); const delta = getCompleteVehicleInfoMessage.data2.readUInt32LE(); - log.debug(`Requesting vehicleId: ${vehicleId} delta: ${delta}`); + log.verbose(`Requesting vehicleId: ${vehicleId} delta: ${delta}`); try { const carInfo = new CarInfoStruct(); let vehicleFromCache = await getVehiclePartTree(vehicleId); - if (typeof vehicleFromCache === "undefined") { - log.debug( + if (typeof vehicleFromCache === 'undefined') { + log.verbose( `Vehicle with id ${vehicleId} not found in cache, fetching from DB`, ); vehicleFromCache = await buildVehiclePartTreeFromDB(vehicleId); } - if (typeof vehicleFromCache === "undefined") { + if (typeof vehicleFromCache === 'undefined') { throw new Error( `Vehicle with id ${vehicleId} not found and not in DB`, ); } - log.debug( - `Vehicle part tree successfully fetched`, - ); + log.verbose(`Vehicle part tree successfully fetched`); carInfo.msgNo = 123; carInfo.playerId = 1; @@ -238,4 +241,4 @@ export async function _getCompleteVehicleInfo({ log.error(`Error in Fetching car: ${error}`); throw error; } -} \ No newline at end of file +} diff --git a/packages/transactions/src/_getGameUrls.ts b/packages/transactions/src/_getGameUrls.ts index e1e20941c..342dac752 100644 --- a/packages/transactions/src/_getGameUrls.ts +++ b/packages/transactions/src/_getGameUrls.ts @@ -18,7 +18,7 @@ export async function _getGameUrls({ const getGameUrlsMessage = new GenericRequestMessage(); getGameUrlsMessage.deserialize(packet.data); - log.debug(`Received Message: ${getGameUrlsMessage.toString()}`); + log.verbose(`Received Message: ${getGameUrlsMessage.toString()}`); const gameUrlsMessage = new GameUrlsMessage(); gameUrlsMessage._msgNo = 364; @@ -31,7 +31,7 @@ export async function _getGameUrls({ gameUrlsMessage.addURL(url); } - log.debug(gameUrlsMessage.toString()) + log.verbose(gameUrlsMessage.toString()) const responsePacket = new OldServerMessage(); diff --git a/packages/transactions/src/_getOwnedParts.ts b/packages/transactions/src/_getOwnedParts.ts index 9abe1248e..80d78ded0 100644 --- a/packages/transactions/src/_getOwnedParts.ts +++ b/packages/transactions/src/_getOwnedParts.ts @@ -18,7 +18,7 @@ export async function _getOwnedParts({ const getOwnedPartsMessage = new GenericRequestMessage(); getOwnedPartsMessage.deserialize(packet.data); - log.debug(`Received Message: ${getOwnedPartsMessage.toString()}`); + log.verbose(`Received Message: ${getOwnedPartsMessage.toString()}`); const state = fetchStateFromDatabase(); diff --git a/packages/transactions/src/_getOwnedVehicles.ts b/packages/transactions/src/_getOwnedVehicles.ts index 83fad6d08..d405c47d3 100644 --- a/packages/transactions/src/_getOwnedVehicles.ts +++ b/packages/transactions/src/_getOwnedVehicles.ts @@ -28,7 +28,7 @@ export async function _getOwnedVehicles({ const getOwnedVehiclesMessage = new GenericRequestMessage(); getOwnedVehiclesMessage.deserialize(packet.data); - log.debug(`Received Message: ${getOwnedVehiclesMessage.toString()}`); + log.verbose(`Received Message: ${getOwnedVehiclesMessage.toString()}`); const personId = getOwnedVehiclesMessage.data.readUInt32LE(0); diff --git a/packages/transactions/src/_getPlayerInfo.ts b/packages/transactions/src/_getPlayerInfo.ts index a7d6862eb..1a0141e4a 100644 --- a/packages/transactions/src/_getPlayerInfo.ts +++ b/packages/transactions/src/_getPlayerInfo.ts @@ -16,13 +16,13 @@ export async function _getPlayerInfo({ const getPlayerInfoMessage = new GenericRequestMessage(); getPlayerInfoMessage.deserialize(packet.data); - log.debug( + log.verbose( `[${connectionId}] Received GenericRequestMessage: ${getPlayerInfoMessage.toString()}`, ); const playerId = getPlayerInfoMessage.data.readUInt32LE(0); - log.debug(`[${connectionId}] Player ID: ${playerId}`); + log.verbose(`[${connectionId}] Player ID: ${playerId}`); try { const playerInfoMessage = new PlayerInfoMessage(); @@ -36,7 +36,7 @@ export async function _getPlayerInfo({ playerInfoMessage._bankBalance = 50; playerInfoMessage._numberOfPointsToNextLevel = 3; - log.debug( + log.verbose( `[${connectionId}] Sending PlayerInfoMessage: ${playerInfoMessage.toString()}`, ); diff --git a/packages/transactions/src/_getPlayerPhysical.ts b/packages/transactions/src/_getPlayerPhysical.ts index d81011b64..cfd9a8cc6 100644 --- a/packages/transactions/src/_getPlayerPhysical.ts +++ b/packages/transactions/src/_getPlayerPhysical.ts @@ -21,7 +21,7 @@ export async function _getPlayerPhysical({ const getPlayerPhysicalMessage = new GenericRequestMessage(); getPlayerPhysicalMessage.deserialize(packet.data); - log.debug( + log.verbose( `[${connectionId}] Received GenericRequestMessage: ${getPlayerPhysicalMessage.toString()}`, ); @@ -36,7 +36,7 @@ export async function _getPlayerPhysical({ playerPhysicalMessage._shirtColor = cloth_white; playerPhysicalMessage._pantsColor = cloth_yellow; - log.debug( + log.verbose( `[${connectionId}] Sending PlayerPhysicalMessage: ${playerPhysicalMessage.toString()}`, ); @@ -46,7 +46,7 @@ export async function _getPlayerPhysical({ responsePacket.setBuffer(playerPhysicalMessage.serialize()); - log.debug(`[${connectionId}] Sending response: ${responsePacket.toString()}`); + log.verbose(`[${connectionId}] Sending response: ${responsePacket.toString()}`); return { connectionId, messages: [responsePacket] }; } diff --git a/packages/transactions/src/_getPlayerRaceHistory.ts b/packages/transactions/src/_getPlayerRaceHistory.ts index 4fa7cac59..998ef0681 100644 --- a/packages/transactions/src/_getPlayerRaceHistory.ts +++ b/packages/transactions/src/_getPlayerRaceHistory.ts @@ -16,16 +16,16 @@ export async function _getPlayerRaceHistory({ packet, log = defaultLogger, }: MessageHandlerArgs): Promise { - log.debug(`[${connectionId}] Handling _getPlayerRaceHistory...`); + log.verbose(`[${connectionId}] Handling _getPlayerRaceHistory...`); const getPlayerRaceHistoryMessage = new GenericRequestMessage(); getPlayerRaceHistoryMessage.deserialize(packet.data); - log.debug(`Received Message: ${getPlayerRaceHistoryMessage.toString()}`); + log.verbose(`Received Message: ${getPlayerRaceHistoryMessage.toString()}`); const playerId = getPlayerRaceHistoryMessage.data.readUInt32LE(0); - log.debug(`Player ID: ${playerId}`); + log.verbose(`Player ID: ${playerId}`); const racingHistoryRecords = getRacingHistoryRecords(playerId); @@ -60,7 +60,7 @@ export async function _getPlayerRaceHistory({ playerRacingHistoryMessage.serialize(), ); - log.debug(`Sending Message: ${playerRacingHistoryMessage.toString()}`); + log.verbose(`Sending Message: ${playerRacingHistoryMessage.toString()}`); return { connectionId, messages: [responsePacket] }; } diff --git a/packages/transactions/src/_getStockCarInfo.ts b/packages/transactions/src/_getStockCarInfo.ts index c4d8881d8..b87d6703a 100644 --- a/packages/transactions/src/_getStockCarInfo.ts +++ b/packages/transactions/src/_getStockCarInfo.ts @@ -19,7 +19,7 @@ export async function _getStockCarInfo({ const getStockCarInfoMessage = new GenericRequestMessage(); getStockCarInfoMessage.deserialize(packet.data); - log.debug(`Received Message: ${getStockCarInfoMessage.toString()}`); + log.verbose(`Received Message: ${getStockCarInfoMessage.toString()}`); const stockCarInfoMessage = new StockCarInfoMessage(200, 0, 105); stockCarInfoMessage.starterCash = 200; @@ -30,7 +30,7 @@ export async function _getStockCarInfo({ stockCarInfoMessage.addStockCar(new StockCar(104, 15, true)); // Fairlane - Deal of the day stockCarInfoMessage.addStockCar(new StockCar(402, 20, false)); // Century - log.debug(`Sending Message: ${stockCarInfoMessage.toString()}`); + log.verbose(`Sending Message: ${stockCarInfoMessage.toString()}`); const responsePacket = new OldServerMessage(); responsePacket._header.sequence = packet.sequenceNumber; diff --git a/packages/transactions/src/_getTunables.ts b/packages/transactions/src/_getTunables.ts index c4de2192f..fc7b6847b 100644 --- a/packages/transactions/src/_getTunables.ts +++ b/packages/transactions/src/_getTunables.ts @@ -18,7 +18,7 @@ export async function _getTunables({ const getTunablesMessage = new GenericRequestMessage(); getTunablesMessage.deserialize(packet.data); - log.debug(`Received Message: ${getTunablesMessage.toString()}`); + log.verbose(`Received Message: ${getTunablesMessage.toString()}`); const tunablesMessage = new TunablesMessage(); tunablesMessage._msgNo = 390; diff --git a/packages/transactions/src/_joinRace.ts b/packages/transactions/src/_joinRace.ts index 2642c3465..ccbf56242 100644 --- a/packages/transactions/src/_joinRace.ts +++ b/packages/transactions/src/_joinRace.ts @@ -17,7 +17,7 @@ export async function _joinRace({ const joinRaceMessage = new JoinRaceMessage() joinRaceMessage.deserialize(packet.data) - log.debug(`JoinRaceMsg: ${joinRaceMessage.toString()}`) + log.verbose(`JoinRaceMsg: ${joinRaceMessage.toString()}`) // TODO Do stuff. Lots of stuff @@ -26,7 +26,7 @@ export async function _joinRace({ raceJoinedMessage.setPassword("Marty") - log.debug(`RaceJoinedMsg: ${raceJoinedMessage.toString()}`) + log.verbose(`RaceJoinedMsg: ${raceJoinedMessage.toString()}`) // Create new response packet @@ -36,7 +36,8 @@ export async function _joinRace({ rPacket.setBody(raceJoinedMessage) - log.debug(`_joinRace: ${rPacket.toString()}`); + // Avoid logging sensitive data such as passwords + log.verbose(`_joinRace: sequence=${rPacket.sequence}, msgNo=${rPacket.msgNo}`); return { connectionId, messages: [rPacket] }; } diff --git a/packages/transactions/src/_logout.ts b/packages/transactions/src/_logout.ts index 3ce484f80..dcd0d1502 100644 --- a/packages/transactions/src/_logout.ts +++ b/packages/transactions/src/_logout.ts @@ -14,7 +14,7 @@ export async function _logout({ packet, log = defaultLogger, }: MessageHandlerArgs): Promise { - log.debug(`[${connectionId}] Logout request: ${packet.toHexString()}`); + log.verbose(`[${connectionId}] Logout request: ${packet.toHexString()}`); // Create new response packet const pReply = new GenericReplyMessage(); pReply.msgNo = 101; @@ -24,7 +24,7 @@ export async function _logout({ rPacket._header.flags = 8; rPacket.setBuffer(pReply.serialize()); - log.debug(`[${connectionId}] Logout response: ${rPacket.toHexString()}`); + log.verbose(`[${connectionId}] Logout response: ${rPacket.toHexString()}`); return { connectionId, messages: [rPacket] }; } diff --git a/packages/transactions/src/_raceKeepAlive.ts b/packages/transactions/src/_raceKeepAlive.ts index 1a092b999..049e31501 100644 --- a/packages/transactions/src/_raceKeepAlive.ts +++ b/packages/transactions/src/_raceKeepAlive.ts @@ -17,7 +17,7 @@ export async function _raceKeepAlive({ const raceKeepAliveRequest = new GenericRequestMessage(); raceKeepAliveRequest.deserialize(packet.serialize()) - log.debug(`RaceKeepAlive`, { + log.verbose(`RaceKeepAlive`, { connectionId, data: JSON.stringify(raceKeepAliveRequest) }); diff --git a/packages/transactions/src/_updateCachedVehicle.ts b/packages/transactions/src/_updateCachedVehicle.ts index a80cbd465..2e8ad1aaa 100644 --- a/packages/transactions/src/_updateCachedVehicle.ts +++ b/packages/transactions/src/_updateCachedVehicle.ts @@ -24,7 +24,7 @@ export async function _updateCachedVehicle({ rPacket.setBuffer(pReply.serialize()); - log.debug(`updateCachedVehicle: ${rPacket.toString()}`); + log.verbose(`updateCachedVehicle: ${rPacket.toString()}`); return { connectionId, messages: [] }; } diff --git a/packages/transactions/src/clientConnect.ts b/packages/transactions/src/clientConnect.ts index 3dc7f96b7..36daaca55 100644 --- a/packages/transactions/src/clientConnect.ts +++ b/packages/transactions/src/clientConnect.ts @@ -33,7 +33,7 @@ export async function clientConnect({ newMessage.deserialize(packet.serialize()); - log.debug(`ClientConnectMsg: ${newMessage.toString()}`); + log.verbose(`ClientConnectMsg: ${newMessage.toString()}`); const customerId = newMessage._customerId; if (typeof customerId !== "number") { @@ -47,13 +47,13 @@ export async function clientConnect({ const existingEncryption = getEncryption(state, connectionId); if (existingEncryption) { - log.debug("Encryption already exists for this connection"); + log.verbose("Encryption already exists for this connection"); return { connectionId, messages: [] }; } let result; - log.debug(`Looking up the session key for ${customerId}...`); + log.verbose(`Looking up the session key for ${customerId}...`); result = await databaseManager.fetchSessionKeyByCustomerId(customerId); @@ -63,7 +63,7 @@ export async function clientConnect({ for customer ${customerId}`); } - log.debug(`Session key found for ${customerId}`); + log.verbose(`Session key found for ${customerId}`); const newCommandEncryptionPair = createCommandEncryptionPair( result.sessionKey, @@ -90,7 +90,7 @@ export async function clientConnect({ const personaName = newMessage._personaName; - log.debug(`cust: ${customerId} ID: ${personaId} Name: ${personaName}`); + log.verbose(`cust: ${customerId} ID: ${personaId} Name: ${personaName}`); // Create new response packet const pReply = new GenericReplyMessage(); @@ -101,7 +101,7 @@ export async function clientConnect({ responsePacket.setBuffer(pReply.serialize()); responsePacket._header.sequence = packet.sequenceNumber; - log.debug(`Response: ${responsePacket.serialize().toString("hex")}`); + log.verbose(`Response: ${responsePacket.serialize().toString("hex")}`); return { connectionId, messages: [responsePacket] }; } diff --git a/packages/transactions/src/getLobbies.ts b/packages/transactions/src/getLobbies.ts index 82c0d8e29..1aad2e033 100644 --- a/packages/transactions/src/getLobbies.ts +++ b/packages/transactions/src/getLobbies.ts @@ -15,9 +15,9 @@ async function _getLobbies({ connectionId, packet, }: MessageHandlerArgs): Promise { - defaultLogger.debug(`[${connectionId}] Received getLobbies packet ${packet.toString()}`); + defaultLogger.verbose(`[${connectionId}] Received getLobbies packet ${packet.toString()}`); - defaultLogger.debug(`[${connectionId}] Sending lobbies response...`); + defaultLogger.verbose(`[${connectionId}] Sending lobbies response...`); // Create new response packet const lobbiesResponsePacket = new MessageNode(); @@ -38,7 +38,7 @@ async function _getLobbies({ lobby._maxNumberPlayers = 8; lobby._defaultNight = 1 - defaultLogger.debug(`[${connectionId}] Sending lobby: ${lobby.toString()}`); + defaultLogger.verbose(`[${connectionId}] Sending lobby: ${lobby.toString()}`); lobbyResponse.addLobby(lobby); @@ -52,12 +52,12 @@ async function _getLobbies({ lobby1._maxNumberPlayers = 8; lobby1._defaultNight = 1 - defaultLogger.debug(`[${connectionId}] Sending lobby: ${lobby1.toString()}`); + defaultLogger.verbose(`[${connectionId}] Sending lobby: ${lobby1.toString()}`); lobbyResponse.addLobby(lobby1); - defaultLogger.debug(`[${connectionId}] Sending lobbyResponse: ${lobbyResponse.toString()}` + defaultLogger.verbose(`[${connectionId}] Sending lobbyResponse: ${lobbyResponse.toString()}` ); lobbiesResponsePacket.getBody().deserialize(lobbyResponse.serialize()); @@ -72,7 +72,7 @@ async function _getLobbies({ perseEntryResponse._shouldExpectMoreMessages = false; perseEntryResponse.addEntry(purseEntry); - defaultLogger.debug(`[${connectionId}] Sending purseEntryResponse: ${perseEntryResponse.toString()}`); + defaultLogger.verbose(`[${connectionId}] Sending purseEntryResponse: ${perseEntryResponse.toString()}`); const perseEntriesResponsePacket = new OldServerMessage(); perseEntriesResponsePacket._header.sequence = packet.sequenceNumber; @@ -95,11 +95,11 @@ export async function getLobbies({ log = defaultLogger, }: MessageHandlerArgs): Promise { const result = await _getLobbies({ connectionId, packet, log }); - log.debug("Dumping Lobbies response packet..."); + log.verbose("Dumping Lobbies response packet..."); result.messages.forEach((msg) => { - log.debug(msg.toString()); + log.verbose(msg.toString()); }); - log.debug(result.messages.join().toString()); + log.verbose(result.messages.join().toString()); return { connectionId, messages: result.messages, diff --git a/packages/transactions/src/internal.test.ts b/packages/transactions/src/internal.test.ts index 6d2125594..2c795ff3c 100644 --- a/packages/transactions/src/internal.test.ts +++ b/packages/transactions/src/internal.test.ts @@ -1,8 +1,8 @@ -import { describe, it, expect, vi, beforeEach } from "vitest"; -import { receiveTransactionsData } from "./internal.js"; +import { describe, it, expect, vi, beforeEach, Mock } from 'vitest'; +import { receiveTransactionsData } from './internal.js'; // Mocks for external modules used by internal.ts -vi.mock("rusty-motors-shared", () => { +vi.mock('rusty-motors-shared', () => { const logger = { debug: vi.fn(), verbose: vi.fn(), @@ -11,13 +11,19 @@ vi.mock("rusty-motors-shared", () => { return { getServerLogger: vi.fn(() => logger), // types/classes that may be imported but are unused in tests - MessageNode: class {}, + MessageNode: class { + deserialize(_: Buffer) { + /* noop */ + } + }, ServerLogger: class {}, McosEncryption: class {}, SerializedBufferOld: class {}, State: class {}, OldServerMessage: class { - _doDeserialize(_: Buffer) { /* noop */ } + deserialize(_: Buffer) { + /* noop */ + } }, // state/encryption related functions that internal.ts calls fetchStateFromDatabase: vi.fn(() => ({})), @@ -26,6 +32,7 @@ vi.mock("rusty-motors-shared", () => { decrypt: (buf: Buffer) => { // simple transformation for tests: flip bytes const out = Buffer.from(buf); + // @ts-ignore for (let i = 0; i < out.length; i++) out[i] = out[i] ^ 0xff; return out; }, @@ -36,44 +43,45 @@ vi.mock("rusty-motors-shared", () => { }); // Mock handlers module used by internal.ts so processInput finds a handler -vi.mock("./handlers.js", () => { +vi.mock('./handlers.js', () => { return { messageHandlers: [ { - name: "TESTMSG", + name: 'TESTMSG', handler: vi.fn(async () => { // return no outbound messages to keep tests focused on decryption behavior return { messages: [] }; }), }, ], - _MSG_STRING: (_: number) => "TESTMSG", + _MSG_STRING: (_: number) => 'TESTMSG', }; }); - // Reset mocks between tests for clearer assertions beforeEach(() => { vi.clearAllMocks(); }); -describe("decryptedMessage (via receiveTransactionsData)", () => { - it("should decrypt inbound message body and clear payload encryption flag", async () => { +describe('decryptedMessage (via receiveTransactionsData)', () => { + it('should decrypt inbound message body and clear payload encryption flag', async () => { // Prepare a body with a known serialized value const body = { serialize: () => Buffer.from([0xaa, 0x55]), - deserialize: vi.fn(function (buf: Buffer) { - // store deserialized data for assertions - (this as any).last = Buffer.from(buf); + deserialize: vi.fn((_: Buffer) => { + /* noop */ }), }; // Create a MessageNode-like object (plain object) const inboundMessage: any = { - serialize: () => Buffer.from("00", "hex"), + deserialize: vi.fn((_: Buffer) => { + /* noop */ + }), + serialize: () => Buffer.from('00', 'hex'), isPayloadEncrypted: () => true, isPayloadCompressed: () => false, - getBody: () => body, + getBody: vi.fn(() => body), data: Buffer.from([0xde, 0xad]), getMessageId: () => 1, getSequence: () => 0, @@ -83,24 +91,26 @@ describe("decryptedMessage (via receiveTransactionsData)", () => { }; const result = await receiveTransactionsData({ - connectionId: "conn-1", + connectionId: 'conn-1', message: inboundMessage, }); // handler returns no outbound messages, so messages array should be empty - expect(result.connectionId).toEqual("conn-1"); + expect(result.connectionId).toEqual('conn-1'); expect(result.messages).toHaveLength(0); // body.deserialize should have been called with decrypted data (xor 0xff transformation) expect(body.deserialize).toHaveBeenCalled(); - const calledWith = (body.deserialize as unknown as vi.Mock).mock.calls[0][0] as Buffer; + // @ts-ignore + const calledWith = (body.deserialize as unknown as Mock).mock + .calls[0][0] as Buffer; expect(calledWith).toBeInstanceOf(Buffer); expect(calledWith.length).toEqual(2); // ensure payload encryption flag was cleared on the object expect(inboundMessage._payloadEncrypted).toBe(false); }); - it("accepts ServerPacket-like objects interchangeably with MessageNode-like objects", async () => { + it('accepts ServerPacket-like objects interchangeably with MessageNode-like objects', async () => { // Create a ServerPacket-like class instance (different prototype) class ServerPacketLike { body: any; @@ -108,8 +118,12 @@ describe("decryptedMessage (via receiveTransactionsData)", () => { constructor(body: any) { this.body = body; } + deserialize = (_buf: Buffer) => + vi.fn((buf: Buffer) => { + (this as any).last = Buffer.from(buf); + }); serialize() { - return Buffer.from("01", "hex"); + return Buffer.from('01', 'hex'); } isPayloadEncrypted() { return true; @@ -133,7 +147,7 @@ describe("decryptedMessage (via receiveTransactionsData)", () => { const body = { serialize: () => Buffer.from([0x10, 0x20, 0x30]), - deserialize: vi.fn(function (buf: Buffer) { + deserialize: vi.fn((buf: Buffer) => { (this as any).last = Buffer.from(buf); }), }; @@ -141,15 +155,15 @@ describe("decryptedMessage (via receiveTransactionsData)", () => { const packet = new ServerPacketLike(body); const result = await receiveTransactionsData({ - connectionId: "conn-2", + connectionId: 'conn-2', message: packet as unknown as any, }); - expect(result.connectionId).toEqual("conn-2"); + expect(result.connectionId).toEqual('conn-2'); expect(result.messages).toHaveLength(0); // Ensure deserialize was called on the body and payload encryption flag cleared expect(body.deserialize).toHaveBeenCalled(); expect(packet._payloadEncrypted).toBe(false); }); -}); \ No newline at end of file +}); diff --git a/packages/transactions/src/internal.ts b/packages/transactions/src/internal.ts index 6e91f51fa..a89259976 100644 --- a/packages/transactions/src/internal.ts +++ b/packages/transactions/src/internal.ts @@ -19,7 +19,6 @@ import * as Sentry from "@sentry/node" import { McosEncryption, - SerializedBufferOld, type State, } from "rusty-motors-shared"; import { @@ -27,12 +26,7 @@ import { getEncryption, updateEncryption, } from "rusty-motors-shared"; -import { OldServerMessage } from "rusty-motors-shared"; import { messageHandlers, type MessageHandlerResult, _MSG_STRING } from "./handlers.js"; -import { - ServerPacket, - type BufferSerializer, -} from "rusty-motors-shared-packets"; import { explode } from "pklib-ts" @@ -48,13 +42,13 @@ async function processInput({ log = getServerLogger("transactionServer.processInput"), }: { connectionId: string; - inboundMessage: ServerPacket; + inboundMessage: MessageNode; log?: ServerLogger; }): Promise { const currentMessageNo = inboundMessage.getMessageId(); const currentMessageString = _MSG_STRING(currentMessageNo); - log.debug( + log.verbose( `[${connectionId}] Processing message: ${currentMessageNo} (${currentMessageString}), sequence: ${inboundMessage.getSequence()}`, ); @@ -64,8 +58,8 @@ async function processInput({ if (typeof result !== "undefined") { // Turn this into an OldServerMessage for compatibility - const packet = new OldServerMessage(); - packet._doDeserialize(inboundMessage.serialize()); + const packet = new MessageNode(); + packet.deserialize(inboundMessage.serialize()); try { const responsePackets = await result.handler({ @@ -121,7 +115,7 @@ export async function receiveTransactionsData({ }, ); - let decryptedMessage: ServerPacket; + let decryptedMessage: MessageNode; // Is the message encrypted? if (inboundMessage.isPayloadEncrypted()) { @@ -135,8 +129,8 @@ export async function receiveTransactionsData({ } // log the old buffer - log.debug( - `[${connectionId}] Inbound buffer: ${inboundMessage.getBody().toString("hex")}`, + log.verbose( + `[${connectionId}] Inbound buffer: ${inboundMessage.getBody().serialize().toString("hex")}`, ); decryptedMessage = decryptMessage( @@ -149,7 +143,7 @@ export async function receiveTransactionsData({ decryptedMessage = inboundMessage; } - let decompressedMessage: ServerPacket; + let decompressedMessage: MessageNode; if (decryptedMessage.isPayloadCompressed()) { @@ -158,7 +152,7 @@ export async function receiveTransactionsData({ connectionId, ); } else { - log.debug(`[${connectionId}] Message is not encrypted`); + log.verbose(`[${connectionId}] Message is not encrypted`); decompressedMessage = decryptedMessage; } @@ -171,10 +165,10 @@ export async function receiveTransactionsData({ }); // Loop through the outbound messages and encrypt them - const outboundMessages: ServerPacket[] = []; + const outboundMessages: MessageNode[] = []; response.messages.forEach((message) => { - const outboundMessage = new ServerPacket(); + const outboundMessage = new MessageNode(); outboundMessage.deserialize(message.serialize()); if (outboundMessage.isPayloadEncrypted()) { @@ -194,21 +188,21 @@ export async function receiveTransactionsData({ ); outboundMessages.push(encryptedMessage); } else { - log.debug( + log.verbose( `[${connectionId}] Sending message: ${outboundMessage.getMessageId()}`, ); outboundMessages.push(outboundMessage); } }); - log.debug( + log.verbose( `[${connectionId}] Exiting transaction module with ${outboundMessages.length} messages`, ); // Convert the outbound messages to SerializedBufferOld const outboundMessagesSerialized = outboundMessages.map((message) => { - const serialized = new SerializedBufferOld(); - serialized._doDeserialize(message.serialize()); + const serialized = new MessageNode(); + serialized.deserialize(message.serialize()); return serialized; }); @@ -246,7 +240,7 @@ function decryptMessage( verifyLength(inboundMessage.getBody().serialize(), decryptedMessage); // Assuming the message was decrypted successfully, update the buffer - log.debug( + log.verbose( `[${connectionId}] Decrypted buffer: ${decryptedMessage.toString("hex")}`, ); @@ -270,31 +264,30 @@ function decryptMessage( function encryptOutboundMessage( encryptionSettings: McosEncryption, - unencryptedMessage: ServerPacket, + unencryptedMessage: MessageNode, state: State, connectionId: string, log = getServerLogger("transactionServer.encryptOutboundMessage"), -): ServerPacket { +): MessageNode { try { const encryptedMessage = encryptionSettings.dataEncryption.encrypt( - unencryptedMessage.data.serialize(), + unencryptedMessage.getBody().serialize(), ); updateEncryption(state, encryptionSettings).save(); // Verify the length of the message - verifyLength(unencryptedMessage.data.serialize(), encryptedMessage); + verifyLength(unencryptedMessage.getBody().serialize(), encryptedMessage); // Assuming the message was decrypted successfully, update the buffer - log.debug( + log.verbose( `[${connectionId}] Encrypted buffer: ${encryptedMessage.toString("hex")}`, ); const outboundMessage = unencryptedMessage - outboundMessage.setDataBuffer(encryptedMessage) - outboundMessage.setSignature("TOMC") + outboundMessage.getBody().deserialize(encryptedMessage) outboundMessage.setPayloadEncryption(true); - log.debug( + log.verbose( `[${connectionId}] Encrypted message: ${outboundMessage.toHexString()}`, ); @@ -308,16 +301,16 @@ function encryptOutboundMessage( } function decompressMessage( - compressedMessage: ServerPacket, + compressedMessage: MessageNode, _connectionId: string, log = getServerLogger("transactionServer.decompressInboundMessage"), -): ServerPacket { - log.debug(`Decompressing message with initial messageId of ${compressedMessage.getMessageId()}`) +): MessageNode { + log.verbose(`Decompressing message with initial messageId of ${compressedMessage.getMessageId()}`) const outputBuffer = new Uint8Array(64 * 1024); // 64KB buffer let outputPos = 0; - const compressedPayload = compressedMessage.getDataBuffer().subarray(2) + const compressedPayload = compressedMessage.getBody().serialize().subarray(2) const writeCallback = (data: Uint8Array, bytesToWrite: number): number => { if (outputPos + bytesToWrite > outputBuffer.length) { @@ -343,10 +336,12 @@ function decompressMessage( if (result.success) { const outputData = Buffer.from(outputBuffer.slice(0, outputPos)); - log.debug(`DecompressedPayload: ${outputData.toString("hex")}`) + log.verbose(`DecompressedPayload: ${outputData.toString("hex")}`) // Output raw binary data to stdout - const uncompressedMessage = ServerPacket.copy(compressedMessage, outputData); + const uncompressedMessage = new MessageNode() + uncompressedMessage.deserialize(compressedMessage.serialize()) + uncompressedMessage.getBody().deserialize(outputData) uncompressedMessage.setPayloadCompression(false) return uncompressedMessage } else { diff --git a/packages/transactions/src/login.ts b/packages/transactions/src/login.ts index c3d5ddd1e..2125df3dc 100644 --- a/packages/transactions/src/login.ts +++ b/packages/transactions/src/login.ts @@ -23,14 +23,14 @@ export async function login({ const incomingPacket = new ServerPacket(); incomingPacket.deserialize(packet.serialize()); - log.debug( + log.verbose( `[${connectionId}] Received LoginMessage: ${incomingPacket.toString()}`, ); // Read the inbound packet const loginMessage = new LoginPayload(); loginMessage.deserialize(packet.data); - log.debug( + log.verbose( `[${connectionId}] Received LoginMessage: ${loginMessage.toString()}`, ); @@ -45,7 +45,7 @@ export async function login({ response.shardAveragePlayerLevel = 5; response.shardGNP = 830; - log.debug( + log.verbose( `[${connectionId}] Sending LoginCompleteMessage: ${response.toString()}`, ); @@ -58,15 +58,15 @@ export async function login({ outgoingPacket.setPayloadEncryption(true); outgoingPacket.setSignature("TOMC"); - log.debug(`[${connectionId}] Sending response: ${outgoingPacket.toString()}`); + log.verbose(`[${connectionId}] Sending response: ${outgoingPacket.toString()}`); - log.debug( + log.verbose( `[${connectionId}] Sending response(hex): ${outgoingPacket.serialize().toString("hex")}`, ); const responsePacket = new OldServerMessage(); responsePacket._header.sequence = incomingPacket.getSequence(); - responsePacket._doDeserialize(outgoingPacket.serialize()); + responsePacket.deserialize(outgoingPacket.serialize()); return { connectionId, messages: [responsePacket] }; } diff --git a/packages/transactions/src/trackingPing.ts b/packages/transactions/src/trackingPing.ts index 700de36ef..f8ccaa08c 100644 --- a/packages/transactions/src/trackingPing.ts +++ b/packages/transactions/src/trackingPing.ts @@ -24,7 +24,7 @@ export async function trackingPing({ rPacket.setBuffer(pReply.serialize()); - log.debug(`TrackingPing: ${rPacket.toString()}`); + log.verbose(`TrackingPing: ${rPacket.toString()}`); return { connectionId, messages: [] }; } diff --git a/src/chat/inGameEmails.ts b/src/chat/inGameEmails.ts index b5a9fd721..cc1451658 100644 --- a/src/chat/inGameEmails.ts +++ b/src/chat/inGameEmails.ts @@ -54,28 +54,28 @@ export class ReceiveEmailMessage extends ChatMessage { } export function handleListInGameEmailsMessage(message: ChatMessage): Buffer[] { - defaultLogger.debug(`Handling ListInGameEmailsMessage: ${message.toString()}`); + defaultLogger.verbose(`Handling ListInGameEmailsMessage: ${message.toString()}`); const parsedMessage = ListInGameEmailsMessage.fromBuffer(message.toBuffer()); - defaultLogger.debug(`Parsed message: ${parsedMessage.toString()}`); + defaultLogger.verbose(`Parsed message: ${parsedMessage.toString()}`); const totalEmails = unseenMail.size; const mailId = totalEmails > 0 ? unseenMail.keys().next().value || 0 : 0; const response = new ListInGameEmailsResponseMessage(totalEmails, mailId); - defaultLogger.debug(`Response: ${response.toString()}`); + defaultLogger.verbose(`Response: ${response.toString()}`); return [response.toBuffer()]; } export function handleReceiveEmailMessage(message: ChatMessage): Buffer[] { - defaultLogger.debug(`Handling ReceiveEmailMessage: ${message.toString()}`); + defaultLogger.verbose(`Handling ReceiveEmailMessage: ${message.toString()}`); const parsedMessage = ReceiveEmailMessage.fromBuffer(message.toBuffer()); - defaultLogger.debug(`Parsed message: ${parsedMessage.toString()}`); + defaultLogger.verbose(`Parsed message: ${parsedMessage.toString()}`); const requestedEmail = unseenMail.get(parsedMessage.mailId); @@ -87,7 +87,7 @@ export function handleReceiveEmailMessage(message: ChatMessage): Buffer[] { const email = requestedEmail; if (!parsedMessage.headerOnly) { - defaultLogger.debug(`Email body requested`); + defaultLogger.verbose(`Email body requested`); } const buffers: Buffer[] = []; diff --git a/src/chat/index.ts b/src/chat/index.ts index 5c5f8c811..ce0045cb6 100644 --- a/src/chat/index.ts +++ b/src/chat/index.ts @@ -34,7 +34,7 @@ async function receiveChatData({ message: BufferSerializer; }): Promise { defaultLogger.info(`Received chat data from connection ${connectionId}`); - defaultLogger.debug(`Message: ${message.toHexString()}`); + defaultLogger.verbose(`Message: ${message.toHexString()}`); let inboundMessage: ChatMessage; @@ -51,23 +51,23 @@ async function receiveChatData({ messages: [], }; } - defaultLogger.debug(`Deserialized message: ${inboundMessage.toString()}`); + defaultLogger.verbose(`Deserialized message: ${inboundMessage.toString()}`); const id = inboundMessage.messageId; - defaultLogger.debug(`Message ID: ${id}`); + defaultLogger.verbose(`Message ID: ${id}`); const handler = handlers.get(id); if (handler) { - defaultLogger.debug(`Handling message with ID ${id}`); + defaultLogger.verbose(`Handling message with ID ${id}`); const responses = handler(inboundMessage); - defaultLogger.debug( + defaultLogger.verbose( `Responses: ${responses.map((response) => bufferToHexString(response))}`, ); const messages = responses.map((response) => { const responseBuffer = new SerializedBufferOld(); - responseBuffer._doDeserialize(response); + responseBuffer.deserialize(response); return responseBuffer; }); diff --git a/src/mcots_server.ts b/src/mcots_server.ts index fc12ab758..ffc64f33f 100644 --- a/src/mcots_server.ts +++ b/src/mcots_server.ts @@ -46,7 +46,7 @@ function main() { privateKeyFile: "[REDACTED]", publicKeyFile: "[REDACTED]", }; - coreLogger.debug( + coreLogger.verbose( `Pre-flight checks passed. Starting server with config: ${JSON.stringify(sanitizedConfig)}`, ); diff --git a/src/nps_server.ts b/src/nps_server.ts index 6f2745622..69171c9f4 100755 --- a/src/nps_server.ts +++ b/src/nps_server.ts @@ -45,7 +45,7 @@ function main() { privateKeyFile: '[REDACTED]', publicKeyFile: '[REDACTED]', }; - coreLogger.debug( + coreLogger.verbose( `Pre-flight checks passed. Starting server with config: ${JSON.stringify(sanitizedConfig)}`, );