Skip to content

Commit

Permalink
Fix Shards in browser environments (abalabahaha#1001)
Browse files Browse the repository at this point in the history
  • Loading branch information
Snazzah authored Aug 19, 2020
1 parent b9d6de1 commit 1ffabb0
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 2 deletions.
2 changes: 1 addition & 1 deletion lib/gateway/Shard.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ const ExtendedUser = require("../structures/ExtendedUser");
const User = require("../structures/User");
const Invite = require("../structures/Invite");
const Constants = require("../Constants");
let WebSocket = typeof window !== "undefined" ? window.WebSocket : require("ws");
let WebSocket = typeof window !== "undefined" ? require("../util/BrowserWebSocket") : require("ws");

let EventEmitter;
try {
Expand Down
69 changes: 69 additions & 0 deletions lib/util/BrowserWebSocket.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
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);
}

async _onMessage(event) {
if(event.data instanceof window.Blob) {
this.emit("message", await event.data.arrayBuffer());
} else {
this.emit("message", event.data);
}
}

get readyState() {
return this._ws.readyState;
}

send(data) {
return this._ws.send(data);
}

close(code, reason) {
return this._ws.close(code, reason);
}

terminate() {
return this._ws.close();
}

removeEventListener(type, listener) {
return this.removeListener(type, listener);
}
}

BrowserWebSocket.CONNECTING = 0;
BrowserWebSocket.OPEN = 1;
BrowserWebSocket.CLOSING = 2;
BrowserWebSocket.CLOSED = 3;

module.exports = BrowserWebSocket;
2 changes: 1 addition & 1 deletion lib/voice/VoiceConnection.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ const Piper = require("./Piper");
const VoiceDataStream = require("./VoiceDataStream");
const {createOpus} = require("../util/Opus");

let WebSocket = typeof window !== "undefined" ? window.WebSocket : require("ws");
let WebSocket = typeof window !== "undefined" ? require("../util/BrowserWebSocket") : require("ws");

let EventEmitter;
try {
Expand Down

0 comments on commit 1ffabb0

Please sign in to comment.