All files / lib/internal/tls secure-pair.js

98.84% Statements 85/86
91.67% Branches 11/12
100% Functions 8/8
98.84% Lines 85/86

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 878x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 20018x 20018x 20018x 20018x 8x 8x 28x 28x 17x 17x 17x 28x 8x 8x 17x   17x 17x 17x 17x 17x 8x 8x 3x 3x 3x 8x 8x 8x 8x 10009x 10009x 10009x 10009x 10009x 8x 8x 8x 8x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 8x 8x 10000x 10000x 10000x 8x 8x 8x 10009x 8x  
'use strict';
 
const EventEmitter = require('events');
const { Duplex } = require('stream');
const _tls_wrap = require('_tls_wrap');
const _tls_common = require('_tls_common');
 
const {
  Symbol,
  ReflectConstruct,
} = primordials;
 
const kCallback = Symbol('Callback');
const kOtherSide = Symbol('Other');
 
class DuplexSocket extends Duplex {
  constructor() {
    super();
    this[kCallback] = null;
    this[kOtherSide] = null;
  }
 
  _read() {
    const callback = this[kCallback];
    if (callback) {
      this[kCallback] = null;
      callback();
    }
  }
 
  _write(chunk, encoding, callback) {
    if (chunk.length === 0) {
      process.nextTick(callback);
    } else {
      this[kOtherSide].push(chunk);
      this[kOtherSide][kCallback] = callback;
    }
  }
 
  _final(callback) {
    this[kOtherSide].on('end', callback);
    this[kOtherSide].push(null);
  }
}
 
class DuplexPair {
  constructor() {
    this.socket1 = new DuplexSocket();
    this.socket2 = new DuplexSocket();
    this.socket1[kOtherSide] = this.socket2;
    this.socket2[kOtherSide] = this.socket1;
  }
}
 
class SecurePair extends EventEmitter {
  constructor(secureContext = _tls_common.createSecureContext(),
              isServer = false,
              requestCert = !isServer,
              rejectUnauthorized = false,
              options = {}) {
    super();
    const { socket1, socket2 } = new DuplexPair();
 
    this.server = options.server;
    this.credentials = secureContext;
 
    this.encrypted = socket1;
    this.cleartext = new _tls_wrap.TLSSocket(socket2, {
      secureContext,
      isServer,
      requestCert,
      rejectUnauthorized,
      ...options
    });
    this.cleartext.once('secure', () => this.emit('secure'));
  }
 
  destroy() {
    this.cleartext.destroy();
    this.encrypted.destroy();
  }
}
 
exports.createSecurePair = function createSecurePair(...args) {
  return ReflectConstruct(SecurePair, args);
};