diff --git a/src/Peer.ts b/src/Peer.ts index 9f42c59b65acf59e3f1c0c8990e8512f32b5799f..47f3bb3ffa5a7e626b9203ee84347775e590ed10 100644 --- a/src/Peer.ts +++ b/src/Peer.ts @@ -119,13 +119,14 @@ export class Peer { } const close = () => { - this.emit("disconnect", this); this.status = kDisconnected; Peer.removePeer(this); + this.emit("disconnect", this); } const error = (e) => { console.error("Socket error: ", e); + Peer.removePeer(this); this.sock.close(); this.status = kDisconnected; } @@ -346,11 +347,15 @@ export class Peer { /** * Closes the socket */ - close() { - if(!isw3c(this.sock)){ - this.sock.close(); - } - this.status = kDisconnected; + async close() { + if (this.status === kDisconnected) return; + + return new Promise(resolve => { + this.on("disconnect", resolve); + if(!isw3c(this.sock)){ + this.sock.close(); + } + }); } getUuid(): string { @@ -361,7 +366,7 @@ export class Peer { static addPeer(p: Peer) { Peer.peers.set(p.string_id, p); - if (Peer.peers.size === 1) { + if (Peer.peers.size === 1 && !Peer.interval) { Peer.interval = setInterval(() => { for (const [id, peer] of Peer.peers) { peer.updateStatistics(); diff --git a/tests/peer.unit.test.ts b/tests/peer.unit.test.ts index 99fb94821b71fb864eba1c2ff8d92b30b2058ad5..a86db1a081c10163154b54422bc6ada36e858665 100644 --- a/tests/peer.unit.test.ts +++ b/tests/peer.unit.test.ts @@ -9,6 +9,7 @@ describe("Peer class", () => { let clientPeer: Peer; let serverPeer: Peer; let wss: WebSocket.Server; + let conn: WebSocket; beforeEach(async () => { return new Promise((resolve) => { @@ -18,7 +19,7 @@ describe("Peer class", () => { serverPeer = new Peer(ws, true); }); - const conn = new WebSocket('ws://127.0.0.1:9003'); + conn = new WebSocket('ws://127.0.0.1:9003'); clientPeer = new Peer(conn); clientPeer.on('connect', () => { resolve(true); @@ -27,9 +28,9 @@ describe("Peer class", () => { }); afterEach(async () => { + await clientPeer.close(); + await serverPeer.close(); return new Promise((resolve) => { - clientPeer.close(); - serverPeer.close(); wss.close(() => { resolve(true); });