export default class WetSockClient { constructor(url) { this.socket = new WebSocket(url); this.listeners = new Map(); this.plugins = new Map(); this.socket.addEventListener('open', () => { console.log('Connected to WetSock server'); }); this.socket.addEventListener('message', (event) => { const message = JSON.parse(event.data); this.handleMessage(message); }); this.socket.addEventListener('close', () => { console.log('Disconnected from WetSock server'); }); } on(event, callback) { if (!this.listeners.has(event)) { this.listeners.set(event, []); } this.listeners.get(event).push(callback); } emit(event, ...args) { const listeners = this.listeners.get(event); if (listeners) { listeners.forEach((listener) => listener(...args)); } } handleMessage(message) { this.emit('message', message); const { event, data, ...rest } = message; switch (event) { case 'plugins': this.updatePlugins(data); break; } this.emit(event, data); } updatePlugins(plugins) { plugins.forEach((plugin) => { this.plugins.set(plugin.identifier, plugin.actions); }); } send(message) { if(typeof(message) != 'string') throw new TypeError('message needs to be a string'); if(message.startsWith('/')) { const [command, ...rest] = message.split(' '); message = { action: command.substring(1), message: rest.join(' ') } } this.socket.send(JSON.stringify(message)); } }