diff options
author | Divy Srivastava <dj.srivastava23@gmail.com> | 2022-10-19 17:20:41 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-19 17:20:41 +0530 |
commit | e3a30954811238ce55a9d0f8b193c3a58535b72d (patch) | |
tree | 7828361d7a5712ee8c8c12b23c43069256a942af /ext/websocket/01_websocket.js | |
parent | 743fcc0668f553c7902c44b1f6a484db42c1cfd0 (diff) |
perf(ext/websocket): optimize `op_ws_next_event` (#16325)
Towards https://github.com/denoland/deno/issues/16315
Diffstat (limited to 'ext/websocket/01_websocket.js')
-rw-r--r-- | ext/websocket/01_websocket.js | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/ext/websocket/01_websocket.js b/ext/websocket/01_websocket.js index e4774f815..797d64723 100644 --- a/ext/websocket/01_websocket.js +++ b/ext/websocket/01_websocket.js @@ -18,6 +18,7 @@ ArrayPrototypeJoin, ArrayPrototypeMap, ArrayPrototypeSome, + Uint32Array, ErrorPrototypeToString, ObjectDefineProperties, ObjectPrototypeIsPrototypeOf, @@ -82,6 +83,10 @@ const _idleTimeoutDuration = Symbol("[[idleTimeout]]"); const _idleTimeoutTimeout = Symbol("[[idleTimeoutTimeout]]"); const _serverHandleIdleTimeout = Symbol("[[serverHandleIdleTimeout]]"); + + /* [event type, close code] */ + const eventBuf = new Uint32Array(2); + class WebSocket extends EventTarget { [_rid]; @@ -410,13 +415,15 @@ async [_eventLoop]() { while (this[_readyState] !== CLOSED) { - const { kind, value } = await core.opAsync( + const value = await core.opAsync( "op_ws_next_event", this[_rid], + eventBuf, ); - + const kind = eventBuf[0]; switch (kind) { - case "string": { + /* string */ + case 0: { this[_serverHandleIdleTimeout](); const event = new MessageEvent("message", { data: value, @@ -425,7 +432,8 @@ this.dispatchEvent(event); break; } - case "binary": { + /* binary */ + case 1: { this[_serverHandleIdleTimeout](); let data; @@ -442,18 +450,23 @@ this.dispatchEvent(event); break; } - case "ping": { + /* ping */ + case 3: { core.opAsync("op_ws_send", this[_rid], { kind: "pong", }); break; } - case "pong": { + /* pong */ + case 4: { this[_serverHandleIdleTimeout](); break; } - case "closed": - case "close": { + /* closed */ + case 6: // falls through + /* close */ + case 2: { + const code = eventBuf[1]; const prevState = this[_readyState]; this[_readyState] = CLOSED; clearTimeout(this[_idleTimeoutTimeout]); @@ -463,8 +476,8 @@ await core.opAsync( "op_ws_close", this[_rid], - value.code, - value.reason, + code, + value, ); } catch { // ignore failures @@ -473,14 +486,15 @@ const event = new CloseEvent("close", { wasClean: true, - code: value.code, - reason: value.reason, + code, + reason: value, }); this.dispatchEvent(event); core.tryClose(this[_rid]); break; } - case "error": { + /* error */ + case 5: { this[_readyState] = CLOSED; const errorEv = new ErrorEvent("error", { |