diff options
author | Divy Srivastava <dj.srivastava23@gmail.com> | 2023-03-31 10:34:12 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-31 10:34:12 +0530 |
commit | 0f41aff1d9f6c131ff69d6dd1dc053afb008a19d (patch) | |
tree | d4b21f4519610d22fa0f83214fa05c1af3415ffb /ext/websocket/01_websocket.js | |
parent | 772201449713fbefad6c42b9ce545a5bb2d7499b (diff) |
perf(ext/websocket): efficient event kind serialization (#18509)
Use u16 to represent the kind of event (0 - 6) & event code > 6 is
treated as the close code. This way we can represent all events + the
close code in a single JS number. This is safe because (as per RFC 6455)
close code from 0-999 are reserved & not used.
| name | avg msg/sec/core |
| --- | --- |
| deno_main | `127820.750000` |
| deno #18506 | `140079.000000` |
| deno #18506 + this | `150104.250000` |
Diffstat (limited to 'ext/websocket/01_websocket.js')
-rw-r--r-- | ext/websocket/01_websocket.js | 57 |
1 files changed, 33 insertions, 24 deletions
diff --git a/ext/websocket/01_websocket.js b/ext/websocket/01_websocket.js index 06eb08b60..03a6427c2 100644 --- a/ext/websocket/01_websocket.js +++ b/ext/websocket/01_websocket.js @@ -394,13 +394,14 @@ class WebSocket extends EventTarget { async [_eventLoop]() { while (this[_readyState] !== CLOSED) { - const { kind, value } = await core.opAsync( + const { 0: kind, 1: value } = await core.opAsync( "op_ws_next_event", this[_rid], ); switch (kind) { - case "string": { + case 0: { + /* string */ this[_serverHandleIdleTimeout](); const event = new MessageEvent("message", { data: value, @@ -409,14 +410,15 @@ class WebSocket extends EventTarget { this.dispatchEvent(event); break; } - case "binary": { + case 1: { + /* binary */ this[_serverHandleIdleTimeout](); let data; if (this.binaryType === "blob") { data = new Blob([value]); } else { - data = value.buffer; + data = value; } const event = new MessageEvent("message", { @@ -427,12 +429,32 @@ class WebSocket extends EventTarget { this.dispatchEvent(event); break; } - case "pong": { + case 2: { + /* pong */ this[_serverHandleIdleTimeout](); break; } - case "closed": - case "close": { + case 5: { + /* error */ + this[_readyState] = CLOSED; + + const errorEv = new ErrorEvent("error", { + message: value, + }); + this.dispatchEvent(errorEv); + + const closeEv = new CloseEvent("close"); + this.dispatchEvent(closeEv); + core.tryClose(this[_rid]); + break; + } + case 3: { + /* ping */ + break; + } + default: { + /* close */ + const code = kind; const prevState = this[_readyState]; this[_readyState] = CLOSED; clearTimeout(this[_idleTimeoutTimeout]); @@ -442,8 +464,8 @@ class WebSocket extends EventTarget { await core.opAsync( "op_ws_close", this[_rid], - value.code, - value.reason, + code, + value, ); } catch { // ignore failures @@ -452,26 +474,13 @@ class WebSocket extends EventTarget { const event = new CloseEvent("close", { wasClean: true, - code: value.code, - reason: value.reason, + code: code, + reason: value, }); this.dispatchEvent(event); core.tryClose(this[_rid]); break; } - case "error": { - this[_readyState] = CLOSED; - - const errorEv = new ErrorEvent("error", { - message: value, - }); - this.dispatchEvent(errorEv); - - const closeEv = new CloseEvent("close"); - this.dispatchEvent(closeEv); - core.tryClose(this[_rid]); - break; - } } } } |