summaryrefslogtreecommitdiff
path: root/op_crates/websocket/01_websocket.js
diff options
context:
space:
mode:
authorcrowlKats <13135287+crowlKats@users.noreply.github.com>2021-01-10 20:05:24 +0100
committerGitHub <noreply@github.com>2021-01-10 14:05:24 -0500
commit2c1f74402c00a2975cdaf9199b6487e5fd8175ba (patch)
tree92e6dea62cec75c09b7dde639cb2dff8cacc743e /op_crates/websocket/01_websocket.js
parent9801858cb0675de801b1c15d1b3826c88406068a (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.js93
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;
+ }
}
}
}