From d586f119fa588a590a4ba2b74c8c210de710e3e7 Mon Sep 17 00:00:00 2001 From: Nayeem Rahman Date: Sat, 9 Nov 2019 19:40:22 +0000 Subject: net: Check for closing status when iterating Listener (#3309) std/http/server.ts: Use listener.next() instead of listener.accept() --- cli/js/net.ts | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) (limited to 'cli/js/net.ts') diff --git a/cli/js/net.ts b/cli/js/net.ts index f463da60b..8109934a4 100644 --- a/cli/js/net.ts +++ b/cli/js/net.ts @@ -82,7 +82,8 @@ export class ListenerImpl implements Listener { constructor( readonly rid: number, private transport: Transport, - private localAddr: string + private localAddr: string, + private closing: boolean = false ) {} async accept(): Promise { @@ -91,6 +92,7 @@ export class ListenerImpl implements Listener { } close(): void { + this.closing = true; close(this.rid); } @@ -102,10 +104,20 @@ export class ListenerImpl implements Listener { } async next(): Promise> { - return { - done: false, - value: await this.accept() - }; + if (this.closing) { + return { value: undefined, done: true }; + } + return await this.accept() + .then(value => ({ value, done: false })) + .catch(e => { + // It wouldn't be correct to simply check this.closing here. + // TODO: Get a proper error kind for this case, don't check the message. + // The current error kind is Other. + if (e.message == "Listener has been closed") { + return { value: undefined, done: true }; + } + throw e; + }); } [Symbol.asyncIterator](): AsyncIterator { -- cgit v1.2.3