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

98.83% Statements 85/86
91.66% Branches 11/12
100% Functions 8/8
98.83% 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 8710x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 20018x 20018x 20018x 20018x 10x 10x 28x 28x 17x 17x 17x 28x 10x 10x 17x   17x 17x 17x 17x 17x 10x 10x 3x 3x 3x 10x 10x 10x 10x 10009x 10009x 10009x 10009x 10009x 10x 10x 10x 10x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10x 10x 10000x 10000x 10000x 10x 10x 10x 10009x 10x  
'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);
};