48 lines
1.1 KiB
JavaScript
48 lines
1.1 KiB
JavaScript
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);
|
|
}
|