aboutsummaryrefslogtreecommitdiffstats
path: root/server/src/core
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--server/src/core/server.js69
1 files changed, 56 insertions, 13 deletions
diff --git a/server/src/core/server.js b/server/src/core/server.js
index 753ed70..9bea738 100644
--- a/server/src/core/server.js
+++ b/server/src/core/server.js
@@ -14,6 +14,7 @@ const socketReady = require('ws').OPEN;
const crypto = require('crypto');
const ipSalt = (Math.random().toString(36).substring(2, 16) + Math.random().toString(36).substring(2, (Math.random() * 16))).repeat(16);
const Police = require('./rateLimiter');
+const pulseSpeed = 16000; // ping all clients every X ms
class server extends wsServer {
/**
@@ -27,6 +28,9 @@ class server extends wsServer {
this._core = core;
this._police = new Police();
this._cmdBlacklist = {};
+ this._heartBeat = setInterval(((data) => {
+ this.beatHeart();
+ }).bind(this), pulseSpeed);
this.on('error', (err) => {
this.handleError('server', err);
@@ -38,6 +42,26 @@ class server extends wsServer {
}
/**
+ * Send empty `ping` frame to each client
+ *
+ */
+ beatHeart () {
+ let targetSockets = this.findSockets({});
+
+ if (targetSockets.length === 0) {
+ return;
+ }
+
+ for (let i = 0, l = targetSockets.length; i < l; i++) {
+ try {
+ if (targetSockets[i].readyState === socketReady) {
+ targetSockets[i].ping();
+ }
+ } catch (e) { }
+ }
+ }
+
+ /**
* Bind listeners for the new socket created on connection to this class
*
* @param {Object} socket New socket object
@@ -120,16 +144,7 @@ class server extends wsServer {
* @param {Object} socket Closing socket object
*/
handleClose (socket) {
- try {
- if (socket.channel) {
- this.broadcast({
- cmd: 'onlineRemove',
- nick: socket.nick
- }, { channel: socket.channel });
- }
- } catch (err) {
- console.log(`Server, handle close event error: ${err}`);
- }
+ this._core.commands.handleCommand(this, socket, { cmd: 'disconnect' });
}
/**
@@ -206,9 +221,37 @@ class server extends wsServer {
for ( let socket of this.clients ) {
curMatch = 0;
- for( let i = 0; i < reqCount; i++ ) {
- if (typeof socket[filterAttribs[i]] !== 'undefined' && socket[filterAttribs[i]] === filter[filterAttribs[i]])
- curMatch++;
+ for (let i = 0; i < reqCount; i++) {
+ if (typeof socket[filterAttribs[i]] !== 'undefined') {
+ switch(typeof filter[filterAttribs[i]]) {
+ case 'object': {
+ if (Array.isArray(filter[filterAttribs[i]])) {
+ if (filter[filterAttribs[i]].indexOf(socket[filterAttribs[i]]) !== -1) {
+ curMatch++;
+ }
+ } else {
+ if (socket[filterAttribs[i]] === filter[filterAttribs[i]]) {
+ curMatch++;
+ }
+ }
+ break;
+ }
+
+ case 'function': {
+ if (filter[filterAttribs[i]](socket[filterAttribs[i]])) {
+ curMatch++;
+ }
+ break;
+ }
+
+ default: {
+ if (socket[filterAttribs[i]] === filter[filterAttribs[i]]) {
+ curMatch++;
+ }
+ break;
+ }
+ }
+ }
}
if (curMatch === reqCount) {