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 27x 27x 16x 16x 16x 27x 10x 10x 16x   16x 16x 16x 16x 16x 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);
};