Skip to content

Commit

Permalink
Fix GameMessage header (#1790)
Browse files Browse the repository at this point in the history
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit


- **Refactor**
- Improved game message handling and version identification for enhanced
compatibility and reliability.
- **New Features**
- Updated game message serialization process to support multiple
versions, ensuring a smoother gaming experience.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
  • Loading branch information
drazisil authored Mar 5, 2024
2 parents d8c8ec0 + c03c5c2 commit 1f13686
Show file tree
Hide file tree
Showing 7 changed files with 33 additions and 11 deletions.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
"dependencies": {
"@rustymotors/database": "workspace:^",
"@rustymotors/shared": "workspace:^",
"@rustymotors/shared-packets": "workspace:^",
"@sentry/node": "^7.102.0",
"@sentry/profiling-node": "^7.104.0",
"slonik": "29",
Expand Down
1 change: 1 addition & 0 deletions packages/gateway/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
"dependencies": {
"@fastify/sensible": "^5.5.0",
"@rustymotors/shared": "workspace:^",
"@rustymotors/shared-packets": "workspace:^",
"@sentry/node": "^7.102.0",
"fastify": "^4.25.2"
}
Expand Down
17 changes: 13 additions & 4 deletions packages/gateway/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,12 @@ import {
MessageProcessorError,
getGameMessageProcessor,
getPortMessageType,
GameMessage,
GameMessage as OldGameMessage,
} from "../../nps/index.js";
import { SocketCallback } from "../../nps/messageProcessors/index.js";
import { getAsHex } from "../../nps/utils/pureGet.js";
import { ServiceResponse } from "@rustymotors/shared";
import { GameMessage } from "@rustymotors/shared-packets";

/**
* @typedef {object} OnDataHandlerArgs
Expand Down Expand Up @@ -244,7 +245,7 @@ function sendToSocket(

export function processGameMessage(
connectionId: string,
message: GameMessage,
message: OldGameMessage,
log: ServerLogger,
socketCallback: SocketCallback,
) {
Expand Down Expand Up @@ -279,16 +280,24 @@ export function handleGameMessage(
// Log raw bytes
log.trace(`Raw bytes: ${bytes.toString("hex")}`);

// Since a GameMessage v1 header is 12 byes long, a message smaller that that can only be v0
const msgVersion = bytes.byteLength <= 12 ? 0 : 1;

// Load new game message
const gameMessage = new GameMessage(msgVersion).deserialize(bytes);

log.debug(`Game message: ${gameMessage}`);

// Try to identify the message version
const version = GameMessage.identifyVersion(bytes);
const version = OldGameMessage.identifyVersion(bytes);

// Log the version
log.debug(`Message version: ${version}`);

// Try to parse it
try {
// Create a new message
const message = new GameMessage(version);
const message = new OldGameMessage(version);
message.deserialize(bytes);

// Process the message
Expand Down
1 change: 1 addition & 0 deletions packages/shared-packets/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
export * from "./src/interfaces.js";
export {GameMessage } from "./src/GameMessage.js";
8 changes: 7 additions & 1 deletion packages/shared-packets/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,13 @@
"private": true,
"version": "1.0.0",
"description": "",
"main": "index.js",
"type": "module",
"exports": {
".": {
"import": "./index.ts",
"require": "./index.ts"
}
},
"scripts": {
"build": "rm -rf dist && tsc",
"test": "echo \"Error: no test specified\" && exit 1"
Expand Down
10 changes: 4 additions & 6 deletions packages/shared-packets/src/GameMessage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,11 @@ export class GameMessageHeader extends Serializable implements ISerializable {
getLength(): number {
return this.length;
}
setVersion(version: 0 | 257): void {
if (version !== 0 && version !== 257) {
setVersion(version: 0 | 1): void {
if (version !== 0 && version !== 1) {
throw new Error(`Invalid version: ${version}`);
}
this.version = version;
this.version = version === 0 ? 0 : 257;
}
setId(id: number): void {
this.id = id;
Expand Down Expand Up @@ -151,9 +151,7 @@ export class GameMessage extends Serializable implements IMessage {
}

override toString(): string {
return `Id: ${this.header.getId()}
Length: ${this.header.getLength()}
Data: ${this.data.toString()}`;
return `Id: ${this.header.getId()}, Length: ${this.header.getLength()}, Data: ${this.data.asHexString()}`;
}

static identifyVersion(data: Buffer): 0 | 257 {
Expand Down
6 changes: 6 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 1f13686

Please sign in to comment.