text: var tls = require('tls');
  var url = require('url');
  var utils = require('../utils');
  var Client = require('../client');
  
  /**
   *  Constructor for a Jayson TLS-encrypted TCP Client
   *  @class ClientTls
   *  @constructor
   *  @extends Client
   *  @param {Object|String} [options] Optional hash of settings or a URL
   *  @return {ClientTls}
   */
  var ClientTls = function(options) {
    // accept first parameter as a url string
    if(typeof(options) === 'string') options = url.parse(options);
  
    if(!(this instanceof ClientTls)) return new ClientTls(options);
    Client.call(this, options);
  
    var defaults = utils.merge(this.options, {
      encoding: 'utf8'
    });
  
    this.options = utils.merge(defaults, options || {});
  };
  require('util').inherits(ClientTls, Client);
  
  module.exports = ClientTls;
  
  ClientTls.prototype._request = function(request, callback) {
    var self = this;
  
    // copies options so object can be modified in this context
    var options = utils.merge({}, this.options);
  
    utils.JSON.stringify(request, options, function(err, body) {
      if(err) return callback(err);
  
      var handled = false;
  
      var conn = tls.connect(options, function() {
  
        conn.setEncoding(options.encoding);
  
        // wont get anything for notifications, just end here
        if(utils.Request.isNotification(request)) {
  
          handled = true;
          conn.end(body);
          callback();
  
        } else {
  
          utils.parseStream(conn, options, function(err, response) {
            handled = true;
            conn.end();
            if(err) return callback(err);
            callback(null, response);
          });
  
          conn.write(body);
        
        }
  
      });
  
      conn.on('error', function(err) {
        self.emit('tcp error', err);
        callback(err);
      });
  
      conn.on('end', function() {
        if(!handled) callback(); 
      });
    });
  };
  