From ff932b411d63269dbd4d30ea6bd0aa5160fd8aff Mon Sep 17 00:00:00 2001 From: Bert Belder Date: Sat, 9 Oct 2021 22:37:19 +0200 Subject: fix(core): poll async ops eagerly (#12385) Currently all async ops are polled lazily, which means that op initialization code is postponed until control is yielded to the event loop. This has some weird consequences, e.g. ```js let listener = Deno.listen(...); let conn_promise = listener.accept(); listener.close(); // `BadResource` is thrown. A reasonable error would be `Interrupted`. let conn = await conn_promise; ``` JavaScript promises are expected to be eagerly evaluated. This patch makes ops actually do that. --- ext/net/01_net.js | 6 +++--- ext/web/13_message_port.js | 15 +++++++++++---- 2 files changed, 14 insertions(+), 7 deletions(-) (limited to 'ext') diff --git a/ext/net/01_net.js b/ext/net/01_net.js index cc10a1c0a..39df5a9d4 100644 --- a/ext/net/01_net.js +++ b/ext/net/01_net.js @@ -3,7 +3,7 @@ ((window) => { const core = window.Deno.core; - const { BadResource } = core; + const { BadResource, Interrupted } = core; const { PromiseResolve, SymbolAsyncIterator, @@ -124,7 +124,7 @@ try { conn = await this.accept(); } catch (error) { - if (error instanceof BadResource) { + if (error instanceof BadResource || error instanceof Interrupted) { return { value: undefined, done: true }; } throw error; @@ -191,7 +191,7 @@ try { yield await this.receive(); } catch (err) { - if (err instanceof BadResource) { + if (err instanceof BadResource || err instanceof Interrupted) { break; } throw err; diff --git a/ext/web/13_message_port.js b/ext/web/13_message_port.js index c02b373d6..1430d8327 100644 --- a/ext/web/13_message_port.js +++ b/ext/web/13_message_port.js @@ -10,6 +10,7 @@ ((window) => { const core = window.Deno.core; + const { Interrupted } = core; const webidl = window.__bootstrap.webidl; const { setEventTargetData } = window.__bootstrap.eventTarget; const { defineEventHandler } = window.__bootstrap.event; @@ -134,10 +135,16 @@ this[_enabled] = true; while (true) { if (this[_id] === null) break; - const data = await core.opAsync( - "op_message_port_recv_message", - this[_id], - ); + let data; + try { + data = await core.opAsync( + "op_message_port_recv_message", + this[_id], + ); + } catch (err) { + if (err instanceof Interrupted) break; + throw err; + } if (data === null) break; let message, transferables; try { -- cgit v1.2.3