'use strict'; const common = require('../common'); if (!common.hasCrypto) common.skip('missing crypto'); const assert = require('assert'); const fixtures = require('../common/fixtures'); const makeDuplexPair = require('../common/duplexpair'); const tls = require('tls'); const net = require('net'); // This test ensures that `bufferSize` also works for those tlsSockets // created from `socket` of `Duplex`, with which, TLSSocket will wrap // sockets in `StreamWrap`. { const iter = 10; function createDuplex(port) { const { clientSide, serverSide } = makeDuplexPair(); return new Promise((resolve, reject) => { const socket = net.connect({ port, }, common.mustCall(() => { clientSide.pipe(socket); socket.pipe(clientSide); clientSide.on('close', common.mustCall(() => socket.destroy())); socket.on('close', common.mustCall(() => clientSide.destroy())); resolve(serverSide); })); }); } const server = tls.createServer({ key: fixtures.readKey('agent2-key.pem'), cert: fixtures.readKey('agent2-cert.pem') }, common.mustCall((socket) => { let str = ''; socket.setEncoding('utf-8'); socket.on('data', (chunk) => { str += chunk; }); socket.on('end', common.mustCall(() => { assert.strictEqual(str, 'a'.repeat(iter - 1)); server.close(); })); })); server.listen(0, common.mustCall(() => { const { port } = server.address(); createDuplex(port).then((socket) => { const client = tls.connect({ socket, rejectUnauthorized: false, }, common.mustCall(() => { assert.strictEqual(client.bufferSize, 0); for (let i = 1; i < iter; i++) { client.write('a'); assert.strictEqual(client.bufferSize, i + 1); } // It seems that tlsSockets created from sockets of `Duplex` emit no // "finish" events. We use "end" event instead. client.on('end', common.mustCall(() => { assert.strictEqual(client.bufferSize, undefined); })); client.end(); })); }); })); }