avocado-old/packages/server/socket.js
2019-04-20 14:12:45 -05:00

58 lines
1.2 KiB
JavaScript

const SocketServer = require('socket.io');
import {compose} from '@avocado/core';
import {EventEmitter} from '@avocado/mixins';
import {SocketIoParser, allPackets, idFromPacket} from '@avocado/packet';
const decorateServer = compose(
EventEmitter,
);
export class Server extends decorateServer(class {}) {
constructor(httpServer) {
super();
this.io = new SocketServer(httpServer, {
parser: SocketIoParser,
path: '/avocado',
perMessageDeflate: false,
serveClient: false,
});
this.io.on('connect', (socket) => {
this.emit('connect', new ServerSocket(socket));
});
}
}
const decorateSocket = compose(
EventEmitter,
);
class ServerSocket extends decorateSocket(class {}) {
constructor(socket) {
super();
this.socket = socket;
for (const Packet of allPackets()) {
const id = idFromPacket(Packet);
this.socket.on(id, (packet) => {
this.emit('packet', packet);
});
}
this.socket.on('disconnect', (...args) => {
this.emit('disconnect', ...args);
});
}
disconnect() {
this.socket.disconnect(true);
}
send(packet) {
const id = idFromPacket(packet.constructor);
this.socket.emit(id, packet.data);
}
}