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 879x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 20018x 20018x 20018x 20018x 9x 9x 27x 27x 16x 16x 16x 27x 9x 9x 16x   16x 16x 16x 16x 16x 9x 9x 3x 3x 3x 9x 9x 9x 9x 10009x 10009x 10009x 10009x 10009x 9x 9x 9x 9x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 10009x 9x 9x 10000x 10000x 10000x 9x 9x 9x 10009x 9x  
'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);
};