1'use strict';
2const common = require('../common');
3
4if (!common.hasCrypto)
5  common.skip('missing crypto');
6
7const fixtures = require('../common/fixtures');
8
9const net = require('net');
10const stream = require('stream');
11const tls = require('tls');
12
13const server = tls.createServer({
14  key: fixtures.readKey('agent1-key.pem'),
15  cert: fixtures.readKey('agent1-cert.pem')
16}, common.mustCall(function(c) {
17  console.log('new client');
18
19  c.resume();
20  c.end('ohai');
21})).listen(0, common.mustCall(function() {
22  const raw = net.connect(this.address().port);
23
24  let pending = false;
25  raw.on('readable', function() {
26    if (pending)
27      p._read();
28  });
29
30  raw.on('end', function() {
31    p.push(null);
32  });
33
34  const p = new stream.Duplex({
35    read: function read() {
36      pending = false;
37
38      const chunk = raw.read();
39      if (chunk) {
40        console.log('read', chunk);
41        this.push(chunk);
42      } else {
43        pending = true;
44      }
45    },
46    write: function write(data, enc, cb) {
47      console.log('write', data, enc);
48      raw.write(data, enc, cb);
49    }
50  });
51
52  const socket = tls.connect({
53    socket: p,
54    rejectUnauthorized: false
55  }, common.mustCall(function() {
56    console.log('client secure');
57
58    socket.resume();
59    socket.end('hello');
60  }));
61
62  socket.once('close', function() {
63    console.log('client close');
64    server.close();
65  });
66}));
67