summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
Diffstat (limited to 'ext')
-rw-r--r--ext/net/01_net.js22
-rw-r--r--ext/node/polyfills/internal_binding/udp_wrap.ts11
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,