Skip to content

Commit 8fd61e1

Browse files
AndreasMadsengibfahn
authored andcommitted
async_wrap: add provider types for net server
Adds `TCPSERVERWRAP` and `PIPESERVERWRAP` as provider types. This makes it possible to distinguish servers from connections. PR-URL: #17157 Backport-PR-URL: #17623 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net>
1 parent 673e263 commit 8fd61e1

32 files changed

+289
-169
lines changed

benchmark/net/tcp-raw-c2s.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const bench = common.createBenchmark(main, {
1414
dur: [5]
1515
});
1616

17-
const TCP = process.binding('tcp_wrap').TCP;
17+
const { TCP, constants: TCPConstants } = process.binding('tcp_wrap');
1818
const TCPConnectWrap = process.binding('tcp_wrap').TCPConnectWrap;
1919
const WriteWrap = process.binding('stream_wrap').WriteWrap;
2020
const PORT = common.PORT;
@@ -36,7 +36,7 @@ function fail(err, syscall) {
3636
}
3737

3838
function server() {
39-
const serverHandle = new TCP();
39+
const serverHandle = new TCP(TCPConstants.SERVER);
4040
var err = serverHandle.bind('127.0.0.1', PORT);
4141
if (err)
4242
fail(err, 'bind');
@@ -92,7 +92,7 @@ function client() {
9292
throw new Error(`invalid type: ${type}`);
9393
}
9494

95-
const clientHandle = new TCP();
95+
const clientHandle = new TCP(TCPConstants.SOCKET);
9696
const connectReq = new TCPConnectWrap();
9797
const err = clientHandle.connect(connectReq, '127.0.0.1', PORT);
9898

benchmark/net/tcp-raw-pipe.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const bench = common.createBenchmark(main, {
1414
dur: [5]
1515
});
1616

17-
const TCP = process.binding('tcp_wrap').TCP;
17+
const { TCP, constants: TCPConstants } = process.binding('tcp_wrap');
1818
const TCPConnectWrap = process.binding('tcp_wrap').TCPConnectWrap;
1919
const WriteWrap = process.binding('stream_wrap').WriteWrap;
2020
const PORT = common.PORT;
@@ -35,7 +35,7 @@ function fail(err, syscall) {
3535
}
3636

3737
function server() {
38-
const serverHandle = new TCP();
38+
const serverHandle = new TCP(TCPConstants.SERVER);
3939
var err = serverHandle.bind('127.0.0.1', PORT);
4040
if (err)
4141
fail(err, 'bind');
@@ -89,7 +89,7 @@ function client() {
8989
throw new Error(`invalid type: ${type}`);
9090
}
9191

92-
const clientHandle = new TCP();
92+
const clientHandle = new TCP(TCPConstants.SOCKET);
9393
const connectReq = new TCPConnectWrap();
9494
const err = clientHandle.connect(connectReq, '127.0.0.1', PORT);
9595
var bytes = 0;

benchmark/net/tcp-raw-s2c.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const bench = common.createBenchmark(main, {
1414
dur: [5]
1515
});
1616

17-
const TCP = process.binding('tcp_wrap').TCP;
17+
const { TCP, constants: TCPConstants } = process.binding('tcp_wrap');
1818
const TCPConnectWrap = process.binding('tcp_wrap').TCPConnectWrap;
1919
const WriteWrap = process.binding('stream_wrap').WriteWrap;
2020
const PORT = common.PORT;
@@ -35,7 +35,7 @@ function fail(err, syscall) {
3535
}
3636

3737
function server() {
38-
const serverHandle = new TCP();
38+
const serverHandle = new TCP(TCPConstants.SERVER);
3939
var err = serverHandle.bind('127.0.0.1', PORT);
4040
if (err)
4141
fail(err, 'bind');
@@ -107,7 +107,7 @@ function server() {
107107
}
108108

109109
function client() {
110-
const clientHandle = new TCP();
110+
const clientHandle = new TCP(TCPConstants.SOCKET);
111111
const connectReq = new TCPConnectWrap();
112112
const err = clientHandle.connect(connectReq, '127.0.0.1', PORT);
113113

doc/api/async_hooks.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ resource's constructor.
234234
```text
235235
FSEVENTWRAP, FSREQWRAP, GETADDRINFOREQWRAP, GETNAMEINFOREQWRAP, HTTPPARSER,
236236
JSSTREAM, PIPECONNECTWRAP, PIPEWRAP, PROCESSWRAP, QUERYWRAP, SHUTDOWNWRAP,
237-
SIGNALWRAP, STATWATCHER, TCPCONNECTWRAP, TCPWRAP, TIMERWRAP, TTYWRAP,
237+
SIGNALWRAP, STATWATCHER, TCPCONNECTWRAP, TCPSERVER, TCPWRAP, TIMERWRAP, TTYWRAP,
238238
UDPSENDWRAP, UDPWRAP, WRITEWRAP, ZLIB, SSLCONNECTION, PBKDF2REQUEST,
239239
RANDOMBYTESREQUEST, TLSWRAP, Timeout, Immediate, TickObject
240240
```
@@ -273,13 +273,13 @@ require('net').createServer((conn) => {}).listen(8080);
273273
Output when hitting the server with `nc localhost 8080`:
274274

275275
```console
276-
TCPWRAP(2): trigger: 1 execution: 1
276+
TCPSERVERWRAP(2): trigger: 1 execution: 1
277277
TCPWRAP(4): trigger: 2 execution: 0
278278
```
279279

280-
The first `TCPWRAP` is the server which receives the connections.
280+
The `TCPSERVERWRAP` is the server which receives the connections.
281281

282-
The second `TCPWRAP` is the new connection from the client. When a new
282+
The `TCPWRAP` is the new connection from the client. When a new
283283
connection is made the `TCPWrap` instance is immediately constructed. This
284284
happens outside of any JavaScript stack (side note: a `executionAsyncId()` of `0`
285285
means it's being executed from C++, with no JavaScript stack above it).
@@ -352,7 +352,7 @@ require('net').createServer(() => {}).listen(8080, () => {
352352
Output from only starting the server:
353353

354354
```console
355-
TCPWRAP(2): trigger: 1 execution: 1
355+
TCPSERVERWRAP(2): trigger: 1 execution: 1
356356
TickObject(3): trigger: 2 execution: 1
357357
before: 3
358358
Timeout(4): trigger: 3 execution: 3
@@ -385,7 +385,7 @@ Only using `execution` to graph resource allocation results in the following:
385385
TTYWRAP(6) -> Timeout(4) -> TIMERWRAP(5) -> TickObject(3) -> root(1)
386386
```
387387

388-
The `TCPWRAP` is not part of this graph, even though it was the reason for
388+
The `TCPSERVERWRAP` is not part of this graph, even though it was the reason for
389389
`console.log()` being called. This is because binding to a port without a
390390
hostname is a *synchronous* operation, but to maintain a completely asynchronous
391391
API the user's callback is placed in a `process.nextTick()`.

lib/_tls_wrap.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ const { Buffer } = require('buffer');
3434
const debug = util.debuglog('tls');
3535
const { Timer } = process.binding('timer_wrap');
3636
const tls_wrap = process.binding('tls_wrap');
37-
const { TCP } = process.binding('tcp_wrap');
38-
const { Pipe } = process.binding('pipe_wrap');
37+
const { TCP, constants: TCPConstants } = process.binding('tcp_wrap');
38+
const { Pipe, constants: PipeConstants } = process.binding('pipe_wrap');
3939
const kDisableRenegotiation = Symbol('disable-renegotiation');
4040

4141
function onhandshakestart() {
@@ -376,7 +376,9 @@ TLSSocket.prototype._wrapHandle = function(wrap) {
376376

377377
var options = this._tlsOptions;
378378
if (!handle) {
379-
handle = options.pipe ? new Pipe() : new TCP();
379+
handle = options.pipe ?
380+
new Pipe(PipeConstants.SOCKET) :
381+
new TCP(TCPConstants.SOCKET);
380382
handle.owner = this;
381383
}
382384

lib/child_process.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ const debug = util.debuglog('child_process');
3131
const uv = process.binding('uv');
3232
const spawn_sync = process.binding('spawn_sync');
3333
const { Buffer } = require('buffer');
34-
const { Pipe } = process.binding('pipe_wrap');
34+
const { Pipe, constants: PipeConstants } = process.binding('pipe_wrap');
3535
const child_process = require('internal/child_process');
3636
const {
3737
_validateStdio,
@@ -106,7 +106,7 @@ exports.fork = function(modulePath /*, args, options*/) {
106106

107107
exports._forkChild = function(fd) {
108108
// set process.send()
109-
var p = new Pipe(true);
109+
var p = new Pipe(PipeConstants.IPC);
110110
p.open(fd);
111111
p.unref();
112112
const control = setupChannel(process, p);

lib/internal/child_process.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ const assert = require('assert');
1010
const uv = process.binding('uv');
1111
const { Process } = process.binding('process_wrap');
1212
const { WriteWrap } = process.binding('stream_wrap');
13-
const { Pipe } = process.binding('pipe_wrap');
13+
const { Pipe, constants: PipeConstants } = process.binding('pipe_wrap');
1414
const { TTY } = process.binding('tty_wrap');
1515
const { TCP } = process.binding('tcp_wrap');
1616
const { UDP } = process.binding('udp_wrap');
@@ -845,7 +845,7 @@ function _validateStdio(stdio, sync) {
845845
};
846846

847847
if (!sync)
848-
a.handle = new Pipe();
848+
a.handle = new Pipe(PipeConstants.SOCKET);
849849

850850
acc.push(a);
851851
} else if (stdio === 'ipc') {
@@ -858,7 +858,7 @@ function _validateStdio(stdio, sync) {
858858
throw new errors.Error('ERR_IPC_SYNC_FORK');
859859
}
860860

861-
ipc = new Pipe(true);
861+
ipc = new Pipe(PipeConstants.IPC);
862862
ipcFd = i;
863863

864864
acc.push({

lib/net.js

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ const uv = process.binding('uv');
3333

3434
const { Buffer } = require('buffer');
3535
const TTYWrap = process.binding('tty_wrap');
36-
const { TCP } = process.binding('tcp_wrap');
37-
const { Pipe } = process.binding('pipe_wrap');
36+
const { TCP, constants: TCPConstants } = process.binding('tcp_wrap');
37+
const { Pipe, constants: PipeConstants } = process.binding('pipe_wrap');
3838
const { TCPConnectWrap } = process.binding('tcp_wrap');
3939
const { PipeConnectWrap } = process.binding('pipe_wrap');
4040
const { ShutdownWrap, WriteWrap } = process.binding('stream_wrap');
@@ -53,10 +53,20 @@ const exceptionWithHostPort = util._exceptionWithHostPort;
5353

5454
function noop() {}
5555

56-
function createHandle(fd) {
57-
var type = TTYWrap.guessHandleType(fd);
58-
if (type === 'PIPE') return new Pipe();
59-
if (type === 'TCP') return new TCP();
56+
function createHandle(fd, is_server) {
57+
const type = TTYWrap.guessHandleType(fd);
58+
if (type === 'PIPE') {
59+
return new Pipe(
60+
is_server ? PipeConstants.SERVER : PipeConstants.SOCKET
61+
);
62+
}
63+
64+
if (type === 'TCP') {
65+
return new TCP(
66+
is_server ? TCPConstants.SERVER : TCPConstants.SOCKET
67+
);
68+
}
69+
6070
throw new TypeError('Unsupported fd type: ' + type);
6171
}
6272

@@ -196,7 +206,7 @@ function Socket(options) {
196206
this._handle = options.handle; // private
197207
this[async_id_symbol] = getNewAsyncId(this._handle);
198208
} else if (options.fd !== undefined) {
199-
this._handle = createHandle(options.fd);
209+
this._handle = createHandle(options.fd, false);
200210
this._handle.open(options.fd);
201211
this[async_id_symbol] = this._handle.getAsyncId();
202212
// options.fd can be string (since it is user-defined),
@@ -1003,7 +1013,9 @@ Socket.prototype.connect = function(...args) {
10031013
debug('pipe', pipe, path);
10041014

10051015
if (!this._handle) {
1006-
this._handle = pipe ? new Pipe() : new TCP();
1016+
this._handle = pipe ?
1017+
new Pipe(PipeConstants.SOCKET) :
1018+
new TCP(TCPConstants.SOCKET);
10071019
initSocketHandle(this);
10081020
}
10091021

@@ -1253,7 +1265,7 @@ function createServerHandle(address, port, addressType, fd) {
12531265
var isTCP = false;
12541266
if (typeof fd === 'number' && fd >= 0) {
12551267
try {
1256-
handle = createHandle(fd);
1268+
handle = createHandle(fd, true);
12571269
} catch (e) {
12581270
// Not a fd we can listen on. This will trigger an error.
12591271
debug('listen invalid fd=%d:', fd, e.message);
@@ -1264,15 +1276,15 @@ function createServerHandle(address, port, addressType, fd) {
12641276
handle.writable = true;
12651277
assert(!address && !port);
12661278
} else if (port === -1 && addressType === -1) {
1267-
handle = new Pipe();
1279+
handle = new Pipe(PipeConstants.SERVER);
12681280
if (process.platform === 'win32') {
12691281
var instances = parseInt(process.env.NODE_PENDING_PIPE_INSTANCES);
12701282
if (!isNaN(instances)) {
12711283
handle.setPendingInstances(instances);
12721284
}
12731285
}
12741286
} else {
1275-
handle = new TCP();
1287+
handle = new TCP(TCPConstants.SERVER);
12761288
isTCP = true;
12771289
}
12781290

src/async-wrap.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ namespace node {
4747
V(HTTPPARSER) \
4848
V(JSSTREAM) \
4949
V(PIPECONNECTWRAP) \
50+
V(PIPESERVERWRAP) \
5051
V(PIPEWRAP) \
5152
V(PROCESSWRAP) \
5253
V(PROMISE) \
@@ -55,6 +56,7 @@ namespace node {
5556
V(SIGNALWRAP) \
5657
V(STATWATCHER) \
5758
V(TCPCONNECTWRAP) \
59+
V(TCPSERVERWRAP) \
5860
V(TCPWRAP) \
5961
V(TIMERWRAP) \
6062
V(TTYWRAP) \

src/connection_wrap.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,9 @@ void ConnectionWrap<WrapType, UVType>::OnConnection(uv_stream_t* handle,
5151
if (status == 0) {
5252
env->set_init_trigger_async_id(wrap_data->get_async_id());
5353
// Instantiate the client javascript object and handle.
54-
Local<Object> client_obj = WrapType::Instantiate(env, wrap_data);
54+
Local<Object> client_obj = WrapType::Instantiate(env,
55+
wrap_data,
56+
WrapType::SOCKET);
5557

5658
// Unwrap the client javascript object.
5759
WrapType* wrap;

0 commit comments

Comments
 (0)