avocado-old/packages/net/server/socket.js

70 lines
1.4 KiB
JavaScript
Raw Normal View History

2019-04-24 18:01:17 -05:00
import SocketIoServer from 'socket.io';
2019-03-17 23:45:48 -05:00
2019-04-20 14:12:45 -05:00
import {compose} from '@avocado/core';
import {EventEmitter} from '@avocado/mixins';
2019-04-24 18:01:17 -05:00
import {SocketIoParser, allPackets, idFromPacket} from '../packet';
2019-04-11 15:26:13 -05:00
2019-04-20 14:12:45 -05:00
const decorateServer = compose(
EventEmitter,
);
2019-04-24 18:01:17 -05:00
export class SocketServer extends decorateServer(class {}) {
2019-03-17 23:45:48 -05:00
2019-04-20 21:34:49 -05:00
constructor() {
2019-03-17 23:45:48 -05:00
super();
2019-04-20 19:31:53 -05:00
this.onConnect = this.onConnect.bind(this);
}
close(fn) {
this.io.off('connect', this.onConnect);
this.io.close(fn);
}
onConnect(socket) {
this.emit('connect', new ServerSocket(socket));
}
2019-04-20 21:34:49 -05:00
open(httpServer) {
2019-04-24 18:01:17 -05:00
this.io = new SocketIoServer(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,
});
2019-04-20 19:31:53 -05:00
this.io.on('connect', this.onConnect);
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);
2019-04-25 03:43:13 -05:00
this.socket.on(id, (data) => {
this.emit('packet', new Packet(data));
2019-04-11 15:26:13 -05:00
});
}
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
}
}