summaryrefslogtreecommitdiff
path: root/op_crates/websocket/01_websocket.js
diff options
context:
space:
mode:
Diffstat (limited to 'op_crates/websocket/01_websocket.js')
-rw-r--r--op_crates/websocket/01_websocket.js107
1 files changed, 59 insertions, 48 deletions
diff --git a/op_crates/websocket/01_websocket.js b/op_crates/websocket/01_websocket.js
index a37cd01cc..374d174b0 100644
--- a/op_crates/websocket/01_websocket.js
+++ b/op_crates/websocket/01_websocket.js
@@ -307,60 +307,71 @@
async #eventLoop() {
while (this.#readyState === OPEN) {
- const message = await core.opAsync(
+ const { kind, value } = await core.opAsync(
"op_ws_next_event",
this.#rid,
);
- if ("string" in message) {
- const event = new MessageEvent("message", {
- data: message.string,
- origin: this.#url,
- });
- event.target = this;
- this.dispatchEvent(event);
- } else if ("binary" in message) {
- let data;
-
- if (this.binaryType === "blob") {
- data = new Blob([new Uint8Array(message.binary)]);
- } else {
- data = new Uint8Array(message.binary).buffer;
+ switch (kind) {
+ case "string": {
+ const event = new MessageEvent("message", {
+ data: value,
+ origin: this.#url,
+ });
+ event.target = this;
+ this.dispatchEvent(event);
+ break;
}
+ case "binary": {
+ let data;
+
+ if (this.binaryType === "blob") {
+ data = new Blob([new Uint8Array(value)]);
+ } else {
+ data = new Uint8Array(value).buffer;
+ }
+
+ const event = new MessageEvent("message", {
+ data,
+ origin: this.#url,
+ });
+ event.target = this;
+ this.dispatchEvent(event);
+ break;
+ }
+ case "ping": {
+ core.opAsync("op_ws_send", {
+ rid: this.#rid,
+ kind: "pong",
+ });
+ break;
+ }
+ case "close": {
+ this.#readyState = CLOSED;
- const event = new MessageEvent("message", {
- data,
- origin: this.#url,
- });
- event.target = this;
- this.dispatchEvent(event);
- } else if ("ping" in message) {
- core.opAsync("op_ws_send", {
- rid: this.#rid,
- kind: "pong",
- });
- } else if ("close" in message) {
- this.#readyState = CLOSED;
-
- const event = new CloseEvent("close", {
- wasClean: true,
- code: message.close.code,
- reason: message.close.reason,
- });
- event.target = this;
- this.dispatchEvent(event);
- tryClose(this.#rid);
- } else if ("error" in message) {
- 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);
- tryClose(this.#rid);
+ const event = new CloseEvent("close", {
+ wasClean: true,
+ code: value.code,
+ reason: value.reason,
+ });
+ event.target = this;
+ this.dispatchEvent(event);
+ tryClose(this.#rid);
+ break;
+ }
+ 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);
+ tryClose(this.#rid);
+ break;
+ }
}
}
}