77 lines
1.9 KiB
JavaScript
Raw Normal View History

2023-11-29 18:23:54 +03:00
const util = require("util");
const Base = require("../structures/Base");
let EventEmitter;
try {
EventEmitter = require("eventemitter3");
} catch(err) {
EventEmitter = require("events").EventEmitter;
}
class BrowserWebSocketError extends Error {
constructor(message, event) {
super(message);
this.event = event;
}
}
/**
* Represents a browser's websocket usable by Eris
* @extends EventEmitter
* @prop {String} url The URL to connect to
*/
class BrowserWebSocket extends EventEmitter {
constructor(url) {
super();
if(typeof window === "undefined") {
throw new Error("BrowserWebSocket cannot be used outside of a browser environment");
}
this._ws = new window.WebSocket(url);
this._ws.onopen = () => this.emit("open");
this._ws.onmessage = this._onMessage.bind(this);
this._ws.onerror = (event) => this.emit("error", new BrowserWebSocketError("Unknown error", event));
this._ws.onclose = (event) => this.emit("close", event.code, event.reason);
}
get readyState() {
return this._ws.readyState;
}
close(code, reason) {
return this._ws.close(code, reason);
}
removeEventListener(type, listener) {
return this.removeListener(type, listener);
}
send(data) {
return this._ws.send(data);
}
terminate() {
return this._ws.close();
}
async _onMessage(event) {
if(event.data instanceof window.Blob) {
this.emit("message", await event.data.arrayBuffer());
} else {
this.emit("message", event.data);
}
}
[util.inspect.custom]() {
return Base.prototype[util.inspect.custom].call(this);
}
}
BrowserWebSocket.CONNECTING = 0;
BrowserWebSocket.OPEN = 1;
BrowserWebSocket.CLOSING = 2;
BrowserWebSocket.CLOSED = 3;
module.exports = BrowserWebSocket;