• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Flags: --expose-internals
2'use strict';
3const common = require('../common');
4const assert = require('assert');
5
6const { internalBinding } = require('internal/test/binding');
7const { TCP, constants: TCPConstants } = internalBinding('tcp_wrap');
8const {
9  WriteWrap,
10  kReadBytesOrError,
11  kArrayBufferOffset,
12  streamBaseState
13} = internalBinding('stream_wrap');
14
15const server = new TCP(TCPConstants.SOCKET);
16
17const r = server.bind('0.0.0.0', 0);
18assert.strictEqual(r, 0);
19let port = {};
20server.getsockname(port);
21port = port.port;
22
23server.listen(128);
24
25server.onconnection = (err, client) => {
26  assert.strictEqual(client.writeQueueSize, 0);
27  console.log('got connection');
28
29  const maybeCloseClient = () => {
30    if (client.pendingWrites.length === 0 && client.gotEOF) {
31      console.log('close client');
32      client.close();
33    }
34  };
35
36  client.readStart();
37  client.pendingWrites = [];
38  client.onread = common.mustCall((arrayBuffer) => {
39    if (arrayBuffer) {
40      const offset = streamBaseState[kArrayBufferOffset];
41      const nread = streamBaseState[kReadBytesOrError];
42      const buffer = Buffer.from(arrayBuffer, offset, nread);
43      assert.ok(buffer.length > 0);
44
45      assert.strictEqual(client.writeQueueSize, 0);
46
47      const req = new WriteWrap();
48      req.async = false;
49      const returnCode = client.writeBuffer(req, buffer);
50      assert.strictEqual(returnCode, 0);
51      client.pendingWrites.push(req);
52
53      console.log(`client.writeQueueSize: ${client.writeQueueSize}`);
54      // 11 bytes should flush
55      assert.strictEqual(client.writeQueueSize, 0);
56
57      if (req.async)
58        req.oncomplete = common.mustCall(done);
59      else
60        process.nextTick(done.bind(null, 0, client, req));
61
62      function done(status, client_, req_) {
63        assert.strictEqual(client.pendingWrites.shift(), req);
64
65        // Check parameters.
66        assert.strictEqual(status, 0);
67        assert.strictEqual(client_, client);
68        assert.strictEqual(req_, req);
69
70        console.log(`client.writeQueueSize: ${client.writeQueueSize}`);
71        assert.strictEqual(client.writeQueueSize, 0);
72
73        maybeCloseClient();
74      }
75
76    } else {
77      console.log('eof');
78      client.gotEOF = true;
79      server.close();
80      maybeCloseClient();
81    }
82  }, 2);
83};
84
85const net = require('net');
86
87const c = net.createConnection(port);
88
89c.on('connect', common.mustCall(() => { c.end('hello world'); }));
90
91c.setEncoding('utf8');
92c.on('data', common.mustCall((d) => {
93  assert.strictEqual(d, 'hello world');
94}));
95
96c.on('close', () => {
97  console.error('client closed');
98});
99