code: function MessageEmitter(ptcl, opts) {
    opts = opts || {};
    events.EventEmitter.call(this);
  
    this._ptcl = ptcl;
    this._strict = !!opts.strictErrors;
    this._endWritable = !!utils.getOption(opts, 'endWritable', true);
    this._timeout = utils.getOption(opts, 'timeout', 10000);
    this._prefix = normalizedPrefix(opts.scope);
  
    this._cache = opts.cache || {};
    var fgpt = opts.serverFingerprint;
    var adapter;
    if (fgpt) {
      adapter = this._cache[fgpt];
    }
    if (!adapter) {
      // This might happen even if the server fingerprint option was set, in
      // cases where the cache doesn't contain the corresponding adapter.
      fgpt = ptcl.getFingerprint();
      adapter = this._cache[fgpt] = new Adapter(ptcl, ptcl, fgpt);
    }
    this._adapter = adapter;
  
    this._registry = new Registry(this, PREFIX_LENGTH);
    this._destroyed = false;
    this._interrupted = false;
    this.once('_eot', function (pending) { this.emit('eot', pending); });
  }
docs: Base message emitter class.
  
  See below for the two available variants.