2019-03-17 23:45:48 -05:00
|
|
|
const SocketServer = require('socket.io');
|
|
|
|
|
2019-04-20 14:12:45 -05:00
|
|
|
import {compose} from '@avocado/core';
|
|
|
|
import {EventEmitter} from '@avocado/mixins';
|
2019-04-11 15:26:13 -05:00
|
|
|
import {SocketIoParser, allPackets, idFromPacket} from '@avocado/packet';
|
|
|
|
|
2019-04-20 14:12:45 -05:00
|
|
|
const decorateServer = compose(
|
|
|
|
EventEmitter,
|
|
|
|
);
|
|
|
|
|
|
|
|
export class Server extends decorateServer(class {}) {
|
2019-03-17 23:45:48 -05:00
|
|
|
|
|
|
|
constructor(httpServer) {
|
|
|
|
super();
|
|
|
|
this.io = new SocketServer(httpServer, {
|
2019-04-11 15:26:13 -05:00
|
|
|
parser: SocketIoParser,
|
2019-03-17 23:45:48 -05:00
|
|
|
path: '/avocado',
|
2019-04-12 00:09:25 -05:00
|
|
|
perMessageDeflate: false,
|
2019-03-17 23:45:48 -05:00
|
|
|
serveClient: false,
|
|
|
|
});
|
|
|
|
this.io.on('connect', (socket) => {
|
2019-04-11 15:26:13 -05:00
|
|
|
this.emit('connect', new ServerSocket(socket));
|
2019-03-17 23:45:48 -05:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2019-04-11 15:26:13 -05:00
|
|
|
}
|
|
|
|
|
2019-04-20 14:12:45 -05:00
|
|
|
const decorateSocket = compose(
|
|
|
|
EventEmitter,
|
|
|
|
);
|
|
|
|
|
|
|
|
class ServerSocket extends decorateSocket(class {}) {
|
2019-04-11 15:26:13 -05:00
|
|
|
|
|
|
|
constructor(socket) {
|
|
|
|
super();
|
|
|
|
this.socket = socket;
|
|
|
|
for (const Packet of allPackets()) {
|
|
|
|
const id = idFromPacket(Packet);
|
|
|
|
this.socket.on(id, (packet) => {
|
|
|
|
this.emit('packet', packet);
|
|
|
|
});
|
|
|
|
}
|
2019-04-11 16:16:56 -05:00
|
|
|
this.socket.on('disconnect', (...args) => {
|
|
|
|
this.emit('disconnect', ...args);
|
|
|
|
});
|
2019-04-11 15:26:13 -05:00
|
|
|
}
|
|
|
|
|
2019-04-20 14:12:45 -05:00
|
|
|
disconnect() {
|
|
|
|
this.socket.disconnect(true);
|
|
|
|
}
|
|
|
|
|
2019-04-11 15:26:13 -05:00
|
|
|
send(packet) {
|
|
|
|
const id = idFromPacket(packet.constructor);
|
|
|
|
this.socket.emit(id, packet.data);
|
2019-03-17 23:45:48 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|