|
62 | 62 | * - error |
63 | 63 | * - lookup |
64 | 64 | */ |
65 | | - |
66 | | -//TODO Add a connectedSockets array to the server that will update with disconnects, and heartbeat timeouts |
67 | | -//TODO Send a packet from the server to the client if it should use packet splitters |
68 | 65 |
|
69 | | -let net = require('net'); |
| 66 | +const net = require('net'); |
70 | 67 | const pako = require('pako'); |
| 68 | +const crypto = require('crypto'); |
71 | 69 |
|
72 | 70 | class TCPClient { |
73 | 71 | constructor(address, port, useHeartbeat) { |
@@ -162,9 +160,9 @@ class TCPClient { |
162 | 160 |
|
163 | 161 | case 'connection': |
164 | 162 | case 'connect': |
165 | | - this.socket.on('connect', (socket) => { |
| 163 | + this.socket.on('connect', cb => { |
166 | 164 | setTimeout(() => { //Wait for the connection packet |
167 | | - callback(socket); |
| 165 | + callback(cb); |
168 | 166 | }, 20); |
169 | 167 | }); |
170 | 168 | break; |
@@ -259,6 +257,8 @@ class TCPServer { |
259 | 257 | }); |
260 | 258 |
|
261 | 259 | this.server.on('connection', (socket) => { |
| 260 | + socket.id = crypto.randomUUID(); |
| 261 | + |
262 | 262 | this.connectedSockets.push(socket); |
263 | 263 | this.allSockets.push(socket); |
264 | 264 |
|
@@ -344,7 +344,10 @@ class TCPServer { |
344 | 344 | }else { |
345 | 345 | switch(event.toLowerCase()) { |
346 | 346 | case 'close': |
347 | | - socket.on('close', callback); |
| 347 | + socket.on('close', cb => { |
| 348 | + this.removeSocketFromConnectedSockets(socket); |
| 349 | + callback(cb); |
| 350 | + }); |
348 | 351 | break; |
349 | 352 |
|
350 | 353 | case 'data': |
@@ -412,18 +415,21 @@ class TCPServer { |
412 | 415 |
|
413 | 416 | if (socket.heartbeatCounter === 8) { |
414 | 417 | socket.emit('error', new TCPServiceError(ErrorType.HEARTBEAT, 'A client has timed out due to heartbeat', socket)); |
415 | | - |
416 | | - this.server.close(() => { |
417 | | - if (this.heartbeatInterval !== null && this.heartbeatInterval !== undefined) { |
418 | | - clearInterval(this.heartbeatInterval); |
419 | | - } |
420 | | - }); |
| 418 | + this.removeSocketFromConnectedSockets(socket); |
421 | 419 | } |
422 | 420 | } |
423 | 421 | }, 900) |
424 | 422 | } |
425 | 423 | }, 1000) |
426 | 424 | } |
| 425 | + |
| 426 | + removeSocketFromConnectedSockets(socket) { |
| 427 | + this.connectedSockets.forEach((loopSocket, index) => { |
| 428 | + if (loopSocket.id === socket.id) { |
| 429 | + this.connectedSockets.splice(index, 1); |
| 430 | + } |
| 431 | + }); |
| 432 | + } |
427 | 433 | } |
428 | 434 |
|
429 | 435 | module.exports = { TCPClient, TCPServer } |
|
0 commit comments