Basic networking #9
3 changed files with 32 additions and 3 deletions
|
@ -1,19 +1,29 @@
|
||||||
import { PeerMetadata, NetworkMessage, PasswordResponse } from "./types";
|
import {
|
||||||
|
PeerMetadata,
|
||||||
|
NetworkMessage,
|
||||||
|
PasswordResponse,
|
||||||
|
RoomInfo
|
||||||
|
} from "./types";
|
||||||
import EventEmitter from "eventemitter3";
|
import EventEmitter from "eventemitter3";
|
||||||
|
|
||||||
export abstract class Client extends EventEmitter {
|
export abstract class Client extends EventEmitter {
|
||||||
public metadata: PeerMetadata;
|
public metadata: PeerMetadata;
|
||||||
public players: string[];
|
public players!: string[];
|
||||||
|
public roomInfo!: RoomInfo;
|
||||||
|
|
||||||
public constructor(metadata: PeerMetadata) {
|
public constructor(metadata: PeerMetadata) {
|
||||||
super();
|
super();
|
||||||
this.metadata = metadata;
|
this.metadata = metadata;
|
||||||
this.players = [];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected _received(data: NetworkMessage) {
|
protected _received(data: NetworkMessage) {
|
||||||
this.emit("data", data);
|
this.emit("data", data);
|
||||||
switch (data.kind) {
|
switch (data.kind) {
|
||||||
|
// Server is sending over player list and room info
|
||||||
|
case "room-info":
|
||||||
|
this.roomInfo = data.room;
|
||||||
|
this.players = data.players;
|
||||||
|
break;
|
||||||
// Someone changed name (or was forced to)
|
// Someone changed name (or was forced to)
|
||||||
case "rename":
|
case "rename":
|
||||||
if (data.oldname == this.metadata.name) {
|
if (data.oldname == this.metadata.name) {
|
||||||
|
|
|
@ -59,6 +59,9 @@ export class PeerServer extends EventEmitter {
|
||||||
players
|
players
|
||||||
};
|
};
|
||||||
|
|
||||||
|
local.players = Object.keys(this.players);
|
||||||
|
local.roomInfo = this.room.info;
|
||||||
|
|
||||||
// Setup peer
|
// Setup peer
|
||||||
this.peer = customPeer ? customPeer : new Peer();
|
this.peer = customPeer ? customPeer : new Peer();
|
||||||
this.peer.on("open", function(id) {
|
this.peer.on("open", function(id) {
|
||||||
|
|
|
@ -132,4 +132,20 @@ describe("network/PeerClient", () => {
|
||||||
expect(msg.message).toEqual(hellomsg);
|
expect(msg.message).toEqual(hellomsg);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("Client internal player list gets correctly updated", async () => {
|
||||||
|
const mox = new MockHelper();
|
||||||
|
const hook = new EventHook();
|
||||||
|
const local = new LocalClient({ name: "server-player" });
|
||||||
|
const server = mox.createServer(sampleRoom(), "test-server", local);
|
||||||
|
const client = mox.createClient();
|
||||||
|
hook.hookEmitter(local, "player-joined", "client-joined");
|
||||||
|
hook.hookEmitter(local, "player-left", "client-left");
|
||||||
|
client.connect("test-server");
|
||||||
|
await hook.expect("client-joined", 1000);
|
||||||
|
expect(local.players).toHaveLength(2);
|
||||||
|
client.leave();
|
||||||
|
await hook.expect("client-left", 1000);
|
||||||
|
expect(local.players).toHaveLength(1);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue