refactor: Deno.listener closes when breaking out of async iterator (#4976)

This commit is contained in:
Bartek Iwańczuk 2020-04-29 01:08:02 +02:00 committed by GitHub
parent 6fd754fba0
commit 640f6878f6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 56 additions and 11 deletions

View file

@ -61,21 +61,30 @@ export class ListenerImpl implements Listener {
return new ConnImpl(res.rid, res.remoteAddr, res.localAddr);
}
async next(): Promise<IteratorResult<Conn>> {
let conn: Conn;
try {
conn = await this.accept();
} catch (error) {
if (error instanceof errors.BadResource) {
return { value: undefined, done: true };
}
throw error;
}
return { value: conn!, done: false };
}
return(value?: Conn): Promise<IteratorResult<Conn>> {
this.close();
return Promise.resolve({ value, done: true });
}
close(): void {
close(this.rid);
}
async *[Symbol.asyncIterator](): AsyncIterableIterator<Conn> {
while (true) {
try {
yield await this.accept();
} catch (error) {
if (error instanceof errors.BadResource) {
break;
}
throw error;
}
}
[Symbol.asyncIterator](): AsyncIterableIterator<Conn> {
return this;
}
}