77 lines
1.9 KiB
JavaScript
77 lines
1.9 KiB
JavaScript
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;
|