Skip to content

Commit

Permalink
Use BatchMessageStruct to implement PlayersLeftHeaderStruct
Browse files Browse the repository at this point in the history
  • Loading branch information
rexim committed Sep 19, 2024
1 parent c0e85c4 commit 7713c5f
Show file tree
Hide file tree
Showing 6 changed files with 12 additions and 61 deletions.
2 changes: 1 addition & 1 deletion client.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,7 @@ async function createGame() {
else if (common.PlayersLeftHeaderStruct.verify(view)) {
const count = common.PlayersLeftHeaderStruct.count(view);
for (let i = 0; i < count; ++i) {
const id = common.PlayersLeftHeaderStruct.items(i).id.read(view);
const id = common.PlayersLeftHeaderStruct.item(event.data, i).getUint32(0, true);
players.delete(id);
}
}
Expand Down
2 changes: 1 addition & 1 deletion client.mts
Original file line number Diff line number Diff line change
Expand Up @@ -470,7 +470,7 @@ async function createGame(): Promise<Game> {
} else if (common.PlayersLeftHeaderStruct.verify(view)) {
const count = common.PlayersLeftHeaderStruct.count(view);
for (let i = 0; i < count; ++i) {
const id = common.PlayersLeftHeaderStruct.items(i).id.read(view);
const id = common.PlayersLeftHeaderStruct.item(event.data, i).getUint32(0, true);
players.delete(id);
}
} else if (common.PlayersMovingHeaderStruct.verify(view)) {
Expand Down
26 changes: 1 addition & 25 deletions common.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -386,31 +386,7 @@ export const PlayerStruct = (() => {
})();
export const PlayersJoinedHeaderStruct = BatchMessageStruct(MessageKind.PlayerJoined, PlayerStruct);
export const PlayersMovingHeaderStruct = BatchMessageStruct(MessageKind.PlayerMoving, PlayerStruct);
export const PlayersLeftHeaderStruct = (() => {
const allocator = { size: 0 };
const kind = allocUint8Field(allocator);
const headerSize = allocator.size;
const itemSize = UINT32_SIZE;
const items = (index) => {
return {
id: {
read: (view) => view.getUint32(headerSize + index * itemSize, true),
write: (view, value) => view.setUint32(headerSize + index * itemSize, value, true)
}
};
};
const verify = (view) => view.byteLength >= headerSize &&
(view.byteLength - headerSize) % itemSize === 0 &&
kind.read(view) === MessageKind.PlayerLeft;
const allocateAndInit = (countItems) => {
const buffer = new ArrayBuffer(headerSize + itemSize * countItems);
const view = new DataView(buffer);
kind.write(view, MessageKind.PlayerLeft);
return view;
};
const count = (view) => (view.byteLength - headerSize) / itemSize;
return { kind, count, items, itemSize, headerSize, verify, allocateAndInit };
})();
export const PlayersLeftHeaderStruct = BatchMessageStruct(MessageKind.PlayerLeft, { size: UINT32_SIZE });
export function properMod(a, b) {
return (a % b + b) % b;
}
Expand Down
27 changes: 1 addition & 26 deletions common.mts
Original file line number Diff line number Diff line change
Expand Up @@ -426,32 +426,7 @@ export const PlayerStruct = (() => {

export const PlayersJoinedHeaderStruct = BatchMessageStruct(MessageKind.PlayerJoined, PlayerStruct);
export const PlayersMovingHeaderStruct = BatchMessageStruct(MessageKind.PlayerMoving, PlayerStruct);
export const PlayersLeftHeaderStruct = (() => {
const allocator = { size: 0 };
const kind = allocUint8Field(allocator);
const headerSize = allocator.size;
const itemSize = UINT32_SIZE;
const items = (index: number) => {
return {
id: {
read: (view: DataView): number => view.getUint32(headerSize + index*itemSize, true),
write: (view: DataView, value: number): void => view.setUint32(headerSize + index*itemSize, value, true)
}
}
}
const verify = (view: DataView) =>
view.byteLength >= headerSize &&
(view.byteLength - headerSize)%itemSize === 0 &&
kind.read(view) === MessageKind.PlayerLeft;
const allocateAndInit = (countItems: number): DataView => {
const buffer = new ArrayBuffer(headerSize + itemSize*countItems);
const view = new DataView(buffer);
kind.write(view, MessageKind.PlayerLeft);
return view;
}
const count = (view: DataView) => (view.byteLength - headerSize)/itemSize
return {kind, count, items, itemSize, headerSize, verify, allocateAndInit};
})();
export const PlayersLeftHeaderStruct = BatchMessageStruct(MessageKind.PlayerLeft, { size: UINT32_SIZE });

// It's such mod that properMod(-1, 100) === 99
export function properMod(a: number, b: number): number {
Expand Down
8 changes: 4 additions & 4 deletions server.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -229,15 +229,15 @@ function tick() {
}
if (leftIds.size > 0) {
const count = leftIds.size;
const view = common.PlayersLeftHeaderStruct.allocateAndInit(count);
const buffer = common.PlayersLeftHeaderStruct.allocateAndInit(count);
let index = 0;
leftIds.forEach((leftId) => {
common.PlayersLeftHeaderStruct.items(index).id.write(view, leftId);
common.PlayersLeftHeaderStruct.item(buffer, index).setUint32(0, leftId, true);
index += 1;
});
players.forEach((player) => {
player.ws.send(view);
bytesSentCounter += view.byteLength;
player.ws.send(buffer);
bytesSentCounter += buffer.byteLength;
messageSentCounter += 1;
});
}
Expand Down
8 changes: 4 additions & 4 deletions server.mts
Original file line number Diff line number Diff line change
Expand Up @@ -267,15 +267,15 @@ function tick() {
// Notifying about whom left
if (leftIds.size > 0) {
const count = leftIds.size;
const view = common.PlayersLeftHeaderStruct.allocateAndInit(count);
const buffer = common.PlayersLeftHeaderStruct.allocateAndInit(count);
let index = 0;
leftIds.forEach((leftId) => {
common.PlayersLeftHeaderStruct.items(index).id.write(view, leftId)
common.PlayersLeftHeaderStruct.item(buffer, index).setUint32(0, leftId, true);
index += 1;
})
players.forEach((player) => {
player.ws.send(view);
bytesSentCounter += view.byteLength;
player.ws.send(buffer);
bytesSentCounter += buffer.byteLength;
messageSentCounter += 1
})
}
Expand Down

0 comments on commit 7713c5f

Please sign in to comment.