import io from 'socket.io-client'; import {compose} from '@avocado/core'; import {EventEmitter} from '@avocado/mixins'; import {SocketIoParser, allPackets, idFromPacket} from '@avocado/packet'; const decorate = compose( EventEmitter, ); class SocketClient extends decorate(class {}) { constructor(address, options = {}) { super(); this.isConnected = false; this.socket = io(address, { parser: SocketIoParser, path: '/avocado', perMessageDeflate: false, ...options, }); this.socket.on('connect', () => { this.isConnected = true; this.emit('connect'); }); this.socket.on('disconnect', () => { this.isConnected = false; this.emit('disconnect'); }); for (const Packet of allPackets()) { const id = idFromPacket(Packet); this.socket.on(id, (packet) => { this.emit('packet', packet); }); } } send(packet) { const id = idFromPacket(packet.constructor); this.socket.emit(id, packet.data); } } export function create(address) { return new SocketClient(address); }