| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 | var hpack = require('../hpack');var utils = hpack.utils;var decoder = hpack.decoder;var table = hpack.table;var assert = utils.assert;var inherits = require('inherits');var Duplex = require('readable-stream').Duplex;function Decompressor(options) {  Duplex.call(this, {    readableObjectMode: true  });  this._decoder = decoder.create();  this._table = table.create(options.table);}inherits(Decompressor, Duplex);module.exports = Decompressor;Decompressor.create = function create(options) {  return new Decompressor(options);};Decompressor.prototype._read = function _read() {  // We only push!};Decompressor.prototype._write = function _write(data, enc, cb) {  this._decoder.push(data);  cb(null);};Decompressor.prototype.execute = function execute(cb) {  while (!this._decoder.isEmpty()) {    try {      this._execute();    } catch (err) {      if (cb)        return done(err);      else        return this.emit('error', err);    }  }  if (cb)    done(null);  function done(err) {    process.nextTick(function() {      cb(err);    });  }};Decompressor.prototype.updateTableSize = function updateTableSize(size) {  this._table.updateSize(size);};Decompressor.prototype._execute = function _execute() {  var isIndexed = this._decoder.decodeBit();  if (isIndexed)    return this._processIndexed();  var isIncremental = this._decoder.decodeBit();  var neverIndex = 0;  if (!isIncremental) {    var isUpdate = this._decoder.decodeBit();    if (isUpdate)      return this._processUpdate();    neverIndex = this._decoder.decodeBit();  }  this._processLiteral(isIncremental, neverIndex);};Decompressor.prototype._processIndexed = function _processIndexed() {  var index = this._decoder.decodeInt();  var lookup = this._table.lookup(index);  this.push({ name: lookup.name, value: lookup.value, neverIndex: false });};Decompressor.prototype._processLiteral = function _processLiteral(inc, never) {  var index = this._decoder.decodeInt();  var name;  var nameSize;  // Literal header-name too  if (index === 0) {    name = this._decoder.decodeStr();    nameSize = name.length;    name = utils.stringify(name);  } else {    var lookup = this._table.lookup(index);    nameSize = lookup.nameSize;    name = lookup.name;  }  var value = this._decoder.decodeStr();  var valueSize = value.length;  value = utils.stringify(value);  if (inc)    this._table.add(name, value, nameSize, valueSize);  this.push({ name: name, value: value, neverIndex: never !== 0});};Decompressor.prototype._processUpdate = function _processUpdate() {  var size = this._decoder.decodeInt();  this.updateTableSize(size);};
 |