Skip to content

Commit c47b2cb

Browse files
atlowChemijuanarbol
authored andcommitted
dgram: socket add asyncDispose
PR-URL: #48717 Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: Moshe Atlow <[email protected]> Reviewed-By: Benjamin Gruenbaum <[email protected]>
1 parent 1295c76 commit c47b2cb

File tree

3 files changed

+41
-1
lines changed

3 files changed

+41
-1
lines changed

doc/api/dgram.md

+12
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,17 @@ added: v0.1.99
372372
Close the underlying socket and stop listening for data on it. If a callback is
373373
provided, it is added as a listener for the [`'close'`][] event.
374374

375+
### `socket[Symbol.asyncDispose]()`
376+
377+
<!-- YAML
378+
added: REPLACEME
379+
-->
380+
381+
> Stability: 1 - Experimental
382+
383+
Calls [`socket.close()`][] and returns a promise that fulfills when the
384+
socket has closed.
385+
375386
### `socket.connect(port[, address][, callback])`
376387

377388
<!-- YAML
@@ -992,4 +1003,5 @@ and `udp6` sockets). The bound address and port can be retrieved using
9921003
[`socket.address().address`]: #socketaddress
9931004
[`socket.address().port`]: #socketaddress
9941005
[`socket.bind()`]: #socketbindport-address-callback
1006+
[`socket.close()`]: #socketclosecallback
9951007
[byte length]: buffer.md#static-method-bufferbytelengthstring-encoding

lib/dgram.js

+9-1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ const {
3030
ObjectDefineProperty,
3131
ObjectSetPrototypeOf,
3232
ReflectApply,
33+
SymbolAsyncDispose,
3334
SymbolDispose,
3435
} = primordials;
3536

@@ -59,7 +60,7 @@ const {
5960
validatePort,
6061
} = require('internal/validators');
6162
const { Buffer } = require('buffer');
62-
const { deprecate, guessHandleType } = require('internal/util');
63+
const { deprecate, guessHandleType, promisify } = require('internal/util');
6364
const { isArrayBufferView } = require('internal/util/types');
6465
const EventEmitter = require('events');
6566
const {
@@ -752,6 +753,13 @@ Socket.prototype.close = function(callback) {
752753
return this;
753754
};
754755

756+
Socket.prototype[SymbolAsyncDispose] = async function() {
757+
if (!this[kStateSymbol].handle) {
758+
return;
759+
}
760+
return FunctionPrototypeCall(promisify(this.close), this);
761+
};
762+
755763

756764
function socketCloseNT(self) {
757765
self.emit('close');
+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import * as common from '../common/index.mjs';
2+
import assert from 'node:assert';
3+
import dgram from 'node:dgram';
4+
import { describe, it } from 'node:test';
5+
6+
describe('dgram.Socket[Symbol.asyncDispose]()', () => {
7+
it('should close the socket', async () => {
8+
const server = dgram.createSocket({ type: 'udp4' });
9+
server.on('close', common.mustCall());
10+
await server[Symbol.asyncDispose]().then(common.mustCall());
11+
12+
assert.throws(() => server.address(), { code: 'ERR_SOCKET_DGRAM_NOT_RUNNING' });
13+
});
14+
15+
it('should resolve even if the socket is already closed', async () => {
16+
const server = dgram.createSocket({ type: 'udp4' });
17+
await server[Symbol.asyncDispose]().then(common.mustCall());
18+
await server[Symbol.asyncDispose]().then(common.mustCall(), common.mustNotCall());
19+
});
20+
});

0 commit comments

Comments
 (0)