summaryrefslogtreecommitdiff
path: root/ext/websocket/02_websocketstream.js
diff options
context:
space:
mode:
authorDivy Srivastava <dj.srivastava23@gmail.com>2022-10-19 17:20:41 +0530
committerGitHub <noreply@github.com>2022-10-19 17:20:41 +0530
commite3a30954811238ce55a9d0f8b193c3a58535b72d (patch)
tree7828361d7a5712ee8c8c12b23c43069256a942af /ext/websocket/02_websocketstream.js
parent743fcc0668f553c7902c44b1f6a484db42c1cfd0 (diff)
perf(ext/websocket): optimize `op_ws_next_event` (#16325)
Towards https://github.com/denoland/deno/issues/16315
Diffstat (limited to 'ext/websocket/02_websocketstream.js')
-rw-r--r--ext/websocket/02_websocketstream.js40
1 files changed, 28 insertions, 12 deletions
diff --git a/ext/websocket/02_websocketstream.js b/ext/websocket/02_websocketstream.js
index 598816d05..876f4d0ed 100644
--- a/ext/websocket/02_websocketstream.js
+++ b/ext/websocket/02_websocketstream.js
@@ -27,6 +27,7 @@
SymbolFor,
TypeError,
Uint8ArrayPrototype,
+ Uint32Array,
} = window.__bootstrap.primordials;
webidl.converters.WebSocketStreamOptions = webidl.createDictionaryConverter(
@@ -168,12 +169,15 @@
PromisePrototypeThen(
(async () => {
while (true) {
- const { kind } = await core.opAsync(
+ const kind = new Uint32Array(2);
+ await core.opAsync(
"op_ws_next_event",
create.rid,
+ kind,
);
- if (kind === "close") {
+ /* close */
+ if (kind[0] === 2) {
break;
}
}
@@ -237,35 +241,46 @@
await this.closed;
},
});
+
const pull = async (controller) => {
- const { kind, value } = await core.opAsync(
+ /* [event type, close code] */
+ const eventBuf = new Uint32Array(2);
+ const value = await core.opAsync(
"op_ws_next_event",
this[_rid],
+ eventBuf,
);
-
+ const kind = eventBuf[0];
switch (kind) {
- case "string": {
+ /* string */
+ case 0: {
controller.enqueue(value);
break;
}
- case "binary": {
+ /* binary */
+ case 1: {
controller.enqueue(value);
break;
}
- case "ping": {
+ /* ping */
+ case 3: {
await core.opAsync("op_ws_send", this[_rid], {
kind: "pong",
});
await pull(controller);
break;
}
- case "closed":
- case "close": {
- this[_closed].resolve(value);
+ /* closed */
+ case 6: // falls through
+ /* close */
+ case 2: {
+ const code = eventBuf[1];
+ this[_closed].resolve({ code, reason: value });
core.tryClose(this[_rid]);
break;
}
- case "error": {
+ /* error */
+ case 5: {
const err = new Error(value);
this[_closed].reject(err);
controller.error(err);
@@ -285,7 +300,8 @@
return pull(controller);
}
- this[_closed].resolve(value);
+ const code = eventBuf[1];
+ this[_closed].resolve({ code, reason: value });
core.tryClose(this[_rid]);
}
};