From dd8e6ee49feb1a3953b70b9381d09a3f9f123d8c Mon Sep 17 00:00:00 2001 From: Jack Hadrill Date: Sat, 6 Sep 2025 18:50:08 +0100 Subject: [PATCH] Improve library --- src/index.ts | 12 ++++++------ src/messages/basic.ts | 18 +++++++++++++----- src/messages/history.ts | 5 ++--- src/messages/keepalive.ts | 1 - src/messages/packet.ts | 13 ++++++++----- src/messages/userDataRequest.ts | 2 +- src/messages/userDataResponse.ts | 2 +- 7 files changed, 31 insertions(+), 22 deletions(-) diff --git a/src/index.ts b/src/index.ts index 9b280a5..ed8cdf3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,9 +1,9 @@ export { numberToUint16BE, numberToUint32BE } from "./utilities/number"; export { unpackIncomingPacket } from "./messages/packet"; export { packers, unpackers } from "./mapping"; -export { MessageTypes } from "./common"; -export { IncomingPacket, OutgoingPacket } from "./messages/packet"; -export { SubscribeMessage } from "./messages/subscribe"; -export { BasicMessage } from "./messages/basic"; -export { UserDataRequestMessage } from "./messages/userDataRequest"; -export { UserDataResponseMessage } from "./messages/userDataResponse"; +export type { MessageTypes } from "./common"; +export type { IncomingPacket, OutgoingPacket } from "./messages/packet"; +export type { SubscribeMessage } from "./messages/subscribe"; +export type { BasicMessage } from "./messages/basic"; +export type { UserDataRequestMessage } from "./messages/userDataRequest"; +export type { UserDataResponseMessage } from "./messages/userDataResponse"; diff --git a/src/messages/basic.ts b/src/messages/basic.ts index 1096381..b1be002 100644 --- a/src/messages/basic.ts +++ b/src/messages/basic.ts @@ -1,4 +1,4 @@ -import { encrypt } from "romulus-js"; +import { encrypt, decrypt } from "romulus-js"; import { DEFAULT_KEY, MessageTypes } from "../common"; import { numberToUint16BE } from "../utilities/number"; import { packOutgoingPacket } from "./packet"; @@ -28,9 +28,17 @@ export function packBasicMessage( /** * Unpack the data section of an incoming basic message (0x0001) message. - * @param data The data section of an incoming basic message (0x0001) message. - * @returns An encrypted unpacked basic message (0x0001) message. + * @param data The encrypted data section of an incoming basic message (0x0001) message. + * @param key The key to decrypt the data with. + * @returns The decrypted plaintext message. */ -export function unpackBasicMessage(data: Uint8Array): Uint8Array { - return data; +export function unpackBasicMessage( + data: Uint8Array, + key: Uint8Array = DEFAULT_KEY, +): Uint8Array { + const result = decrypt(data, MESSAGE_TYPE, key); + if (result.success) { + return result.plaintext; + } + throw new Error("Failed to decrypt basic message"); } diff --git a/src/messages/history.ts b/src/messages/history.ts index f0630c1..90e1ce3 100644 --- a/src/messages/history.ts +++ b/src/messages/history.ts @@ -5,12 +5,11 @@ import { packOutgoingPacket } from "./packet"; const MESSAGE_TYPE = numberToUint16BE(MessageTypes.GetHistory); /** - * Create an outgoing keepalive (0x0005) packet. - * @returns An outgoing keepalive (0x0005) packet. + * Create an outgoing get history (0xfffe) packet. + * @returns An outgoing get history (0xfffe) packet. */ export function packGetHistoryMessage(): Uint8Array { return packOutgoingPacket({ messageType: MESSAGE_TYPE, - data: new Uint8Array(0), }); } diff --git a/src/messages/keepalive.ts b/src/messages/keepalive.ts index 3187948..63a8fa0 100644 --- a/src/messages/keepalive.ts +++ b/src/messages/keepalive.ts @@ -11,6 +11,5 @@ const MESSAGE_TYPE = numberToUint16BE(MessageTypes.Keepalive); export function packKeepaliveMessage(): Uint8Array { return packOutgoingPacket({ messageType: MESSAGE_TYPE, - data: new Uint8Array(0), }); } diff --git a/src/messages/packet.ts b/src/messages/packet.ts index 18fb78a..32645fa 100644 --- a/src/messages/packet.ts +++ b/src/messages/packet.ts @@ -10,7 +10,7 @@ export interface IncomingPacket { export interface OutgoingPacket { messageType: Uint8Array; - data: Uint8Array; + data?: Uint8Array; } /** @@ -19,18 +19,21 @@ export interface OutgoingPacket { * @returns A buffer containing the ready-to-send packet. */ export function packOutgoingPacket(outgoingPacket: OutgoingPacket): Uint8Array { + // Default to empty data if not provided + const data = outgoingPacket.data ?? new Uint8Array(0); + // Verify that the data does not exceed the maximum data length. - if (outgoingPacket.data.length > MAX_DATA_LENGTH) { + if (data.length > MAX_DATA_LENGTH) { throw RangeError( - `Specified data of length ${outgoingPacket.data.length} exceeds max data length ${MAX_DATA_LENGTH}.`, + `Specified data of length ${data.length} exceeds max data length ${MAX_DATA_LENGTH}.`, ); } // Prepare the outgoing packet. const buffer = new SmartBuffer(); buffer.writeBytes(outgoingPacket.messageType); - buffer.writeBytes(numberToUint16BE(outgoingPacket.data.length)); - buffer.writeBytes(outgoingPacket.data); + buffer.writeBytes(numberToUint16BE(data.length)); + buffer.writeBytes(data); return buffer.data; } diff --git a/src/messages/userDataRequest.ts b/src/messages/userDataRequest.ts index 45cfa2b..fdbc91a 100644 --- a/src/messages/userDataRequest.ts +++ b/src/messages/userDataRequest.ts @@ -60,7 +60,7 @@ export function unpackUserDataRequestMessage( data: Uint8Array, ): UserDataRequestMessage { // Unpack and read data in correct format. - const packedData = SmartBuffer.from(data); + const packedData = SmartBuffer.from(Array.from(data)); const usernameLength = packedData.readUInt16(); const username = packedData.readBytes(usernameLength); diff --git a/src/messages/userDataResponse.ts b/src/messages/userDataResponse.ts index 87b937d..6b005b5 100644 --- a/src/messages/userDataResponse.ts +++ b/src/messages/userDataResponse.ts @@ -59,7 +59,7 @@ export function unpackUserDataResponseMessage( data: Uint8Array, ): UserDataResponseMessage { // Unpack and read data in correct format. - const packedData = SmartBuffer.from(data); + const packedData = SmartBuffer.from(Array.from(data)); const usernameLength = packedData.readUInt16(); const username = packedData.readBytes(usernameLength);