diff options
Diffstat (limited to 'ext')
-rw-r--r-- | ext/net/01_net.js | 22 | ||||
-rw-r--r-- | ext/node/polyfills/internal_binding/udp_wrap.ts | 11 |
2 files changed, 29 insertions, 4 deletions
diff --git a/ext/net/01_net.js b/ext/net/01_net.js index c4a921536..699423b22 100644 --- a/ext/net/01_net.js +++ b/ext/net/01_net.js @@ -295,6 +295,8 @@ class Listener { class Datagram { #rid = 0; #addr = null; + #unref = false; + #promise = null; constructor(rid, addr, bufSize = 1024) { this.#rid = rid; @@ -367,10 +369,12 @@ class Datagram { let remoteAddr; switch (this.addr.transport) { case "udp": { - ({ 0: nread, 1: remoteAddr } = await op_net_recv_udp( + this.#promise = op_net_recv_udp( this.rid, buf, - )); + ); + if (this.#unref) core.unrefOpPromise(this.#promise); + ({ 0: nread, 1: remoteAddr } = await this.#promise); remoteAddr.transport = "udp"; break; } @@ -413,6 +417,20 @@ class Datagram { core.close(this.rid); } + ref() { + this.#unref = false; + if (this.#promise !== null) { + core.refOpPromise(this.#promise); + } + } + + unref() { + this.#unref = true; + if (this.#promise !== null) { + core.unrefOpPromise(this.#promise); + } + } + async *[SymbolAsyncIterator]() { while (true) { try { diff --git a/ext/node/polyfills/internal_binding/udp_wrap.ts b/ext/node/polyfills/internal_binding/udp_wrap.ts index 619950997..209c84a23 100644 --- a/ext/node/polyfills/internal_binding/udp_wrap.ts +++ b/ext/node/polyfills/internal_binding/udp_wrap.ts @@ -78,6 +78,7 @@ export class UDP extends HandleWrap { #listener?: Deno.DatagramConn; #receiving = false; + #unrefed = false; #recvBufferSize = UDP_DGRAM_MAXSIZE; #sendBufferSize = UDP_DGRAM_MAXSIZE; @@ -273,7 +274,8 @@ export class UDP extends HandleWrap { } override ref() { - notImplemented("udp.UDP.prototype.ref"); + this.#listener?.ref(); + this.#unrefed = false; } send( @@ -315,7 +317,8 @@ export class UDP extends HandleWrap { } override unref() { - notImplemented("udp.UDP.prototype.unref"); + this.#listener?.unref(); + this.#unrefed = true; } #doBind(ip: string, port: number, _flags: number, family: number): number { @@ -443,6 +446,10 @@ export class UDP extends HandleWrap { let remoteAddr: Deno.NetAddr | null; let nread: number | null; + if (this.#unrefed) { + this.#listener!.unref(); + } + try { [buf, remoteAddr] = (await this.#listener!.receive(p)) as [ Uint8Array, |