diff options
author | crowlKats <13135287+crowlKats@users.noreply.github.com> | 2021-01-10 20:05:24 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-10 14:05:24 -0500 |
commit | 2c1f74402c00a2975cdaf9199b6487e5fd8175ba (patch) | |
tree | 92e6dea62cec75c09b7dde639cb2dff8cacc743e /op_crates/websocket/01_websocket.js | |
parent | 9801858cb0675de801b1c15d1b3826c88406068a (diff) |
refactor(op_crates/websocket): refactor event loop (#9079)
Diffstat (limited to 'op_crates/websocket/01_websocket.js')
-rw-r--r-- | op_crates/websocket/01_websocket.js | 93 |
1 files changed, 56 insertions, 37 deletions
diff --git a/op_crates/websocket/01_websocket.js b/op_crates/websocket/01_websocket.js index 6cc23eb95..741e643e5 100644 --- a/op_crates/websocket/01_websocket.js +++ b/op_crates/websocket/01_websocket.js @@ -294,59 +294,78 @@ } async #eventLoop() { - if (this.#readyState === OPEN) { + while (this.#readyState === OPEN) { const message = await core.jsonOpAsync( "op_ws_next_event", { rid: this.#rid }, ); - if (message.type === "string" || message.type === "binary") { - let data; - if (message.type === "string") { - data = message.data; - } else { + switch (message.kind) { + case "string": { + const event = new MessageEvent("message", { + data: message.data, + origin: this.#url, + }); + event.target = this; + this.dispatchEvent(event); + + break; + } + + case "binary": { + let data; + if (this.binaryType === "blob") { data = new Blob([new Uint8Array(message.data)]); } else { data = new Uint8Array(message.data).buffer; } + + const event = new MessageEvent("message", { + data, + origin: this.#url, + }); + event.target = this; + this.dispatchEvent(event); + + break; } - const event = new MessageEvent("message", { - data, - origin: this.#url, - }); - event.target = this; - this.dispatchEvent(event); + case "ping": + core.jsonOpAsync("op_ws_send", { + rid: this.#rid, + kind: "pong", + }); - this.#eventLoop(); - } else if (message.type === "ping") { - core.jsonOpAsync("op_ws_send", { - rid: this.#rid, - kind: "pong", - }); + break; - this.#eventLoop(); - } else if (message.type === "close") { - this.#readyState = CLOSED; - const event = new CloseEvent("close", { - wasClean: true, - code: message.code, - reason: message.reason, - }); - event.target = this; - this.dispatchEvent(event); - } else if (message.type === "error") { - this.#readyState = CLOSED; + case "close": { + this.#readyState = CLOSED; + + const event = new CloseEvent("close", { + wasClean: true, + code: message.data.code, + reason: message.data.reason, + }); + event.target = this; + this.dispatchEvent(event); - const errorEv = new ErrorEvent("error"); - errorEv.target = this; - this.dispatchEvent(errorEv); + break; + } - this.#readyState = CLOSED; - const closeEv = new CloseEvent("close"); - closeEv.target = this; - this.dispatchEvent(closeEv); + case "error": { + this.#readyState = CLOSED; + + const errorEv = new ErrorEvent("error"); + errorEv.target = this; + this.dispatchEvent(errorEv); + + const closeEv = new CloseEvent("close"); + closeEv.target = this; + this.dispatchEvent(closeEv); + + break; + } } } } |