diff options
author | 2022-06-22 06:42:57 -0700 | |
---|---|---|
committer | 2022-06-22 06:56:47 -0700 | |
commit | 527eb40a2c114d5a361ab5506a82c9b7701e03f7 (patch) | |
tree | a0dadfa7aaaf702cd04cfc5b9b7f80435fbb6f67 /src | |
parent | 2cdbd2de83981aa0e0bc26db5b5ebd261507f112 (diff) | |
download | bun-527eb40a2c114d5a361ab5506a82c9b7701e03f7.tar.gz bun-527eb40a2c114d5a361ab5506a82c9b7701e03f7.tar.zst bun-527eb40a2c114d5a361ab5506a82c9b7701e03f7.zip |
`ws` polyfil
Diffstat (limited to 'src')
-rw-r--r-- | src/javascript/jsc/ws.exports.js | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/src/javascript/jsc/ws.exports.js b/src/javascript/jsc/ws.exports.js new file mode 100644 index 000000000..90d3f8911 --- /dev/null +++ b/src/javascript/jsc/ws.exports.js @@ -0,0 +1,97 @@ +// this just wraps WebSocket to look like an EventEmitter +// without actually using an EventEmitter polyfill + +class BunWebSocket extends globalThis.WebSocket { + constructor(url, ...args) { + super(url, ...args); + this.#wrappedHandlers = new WeakMap(); + } + #wrappedHandlers = new WeakMap(); + + on(event, callback) { + if (event === "message") { + var handler = ({ data }) => { + try { + callback(data); + } catch (e) { + globalThis.reportError(e); + } + }; + + this.#wrappedHandlers.set(callback, handler); + this.addEventListener(event, handler); + } else { + this.addEventListener(event, callback); + } + } + + once(event, callback) { + if (event === "message") { + var handler = ({ data }) => { + try { + callback(data); + } catch (e) { + globalThis.reportError(e); + } + }; + + this.#wrappedHandlers.set(callback, handler); + this.addEventListener(event, handler, { once: true }); + } else { + this.addEventListener(event, callback, { once: true }); + } + } + + emit(event, data) { + if (event === "message") { + this.dispatchEvent(new MessageEvent("message", { data })); + } else { + this.dispatchEvent(new CustomEvent(event, { detail: data })); + } + } + + off(event, callback) { + var wrapped = this.#wrappedHandlers.get(callback); + if (wrapped) { + this.removeEventListener(event, wrapped); + this.#wrappedHandlers.delete(callback); + } else { + this.removeEventListener(event, callback); + } + } +} + +BunWebSocket.WebSocket = BunWebSocket; +var WebSocketServer = (BunWebSocket.WebSocketServer = class WebSocketServer { + constructor() { + throw new Error("Not implemented yet!"); + } +}); + +var Sender = (BunWebSocket.Sender = class Sender { + constructor() { + throw new Error("Not supported in Bun"); + } +}); + +var Receiver = (BunWebSocket.Receiver = class Receiver { + constructor() { + throw new Error("Not supported in Bun"); + } +}); + +var createWebSocketStream = (BunWebSocket.createWebSocketStream = function ( + ws +) { + throw new Error("Not supported in Bun"); +}); + +export default BunWebSocket; + +export { + createWebSocketStream, + Sender, + Receiver, + BunWebSocket as WebSocket, + WebSocketServer, +}; |