| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 | var hpack = require('../hpack');var utils = hpack.utils;var encoder = hpack.encoder;var table = hpack.table;var assert = utils.assert;var inherits = require('inherits');var Duplex = require('readable-stream').Duplex;function Compressor(options) {  Duplex.call(this, {    writableObjectMode: true  });  this._encoder = null;  this._table = table.create(options.table);}inherits(Compressor, Duplex);module.exports = Compressor;Compressor.create = function create(options) {  return new Compressor(options);};Compressor.prototype._read = function _read() {  // We only push!};Compressor.prototype._write = function _write(data, enc, cb) {  assert(Array.isArray(data), 'Compressor.write() expects list of headers');  this._encoder = encoder.create();  for (var i = 0; i < data.length; i++)    this._encodeHeader(data[i]);  var data = this._encoder.render();  this._encoder = null;  cb(null);  for (var i = 0; i < data.length; i++)    this.push(data[i]);};Compressor.prototype.updateTableSize = function updateTableSize(size) {  if (size >= this._table.protocolMaxSize) {    size = this._table.protocolMaxSize;    var enc = encoder.create();    // indexed = 0    // incremental = 0    // update = 1    enc.encodeBits(1, 3);    enc.encodeInt(size);    var data = enc.render();    for (var i = 0; i < data.length; i++)      this.push(data[i]);  }  this._table.updateSize(size);};Compressor.prototype.reset = function reset() {  var enc = encoder.create();  var size = this._table.maxSize;  // indexed = 0  // incremental = 0  // update = 1  enc.encodeBits(1, 3);  enc.encodeInt(0);  // Evict everything  this._table.updateSize(0);  // indexed = 0  // incremental = 0  // update = 1  enc.encodeBits(1, 3);  enc.encodeInt(size);  // Revert size  this._table.updateSize(size);  var data = enc.render();  for (var i = 0; i < data.length; i++)    this.push(data[i]);};Compressor.prototype._encodeHeader = function _encodeHeader(header) {  if (header.neverIndex) {    var index = 0;    var neverIndex = 1;    var isIndexed = 0;    var isIncremental = 0;  } else {    var index = this._table.reverseLookup(header.name, header.value);    var isIndexed = index > 0;    var isIncremental = header.incremental !== false;    var neverIndex = 0;  }  this._encoder.encodeBit(isIndexed);  if (isIndexed) {    this._encoder.encodeInt(index);    return;  }  var name = utils.toArray(header.name);  var value = utils.toArray(header.value);  this._encoder.encodeBit(isIncremental);  if (isIncremental) {    this._table.add(header.name, header.value, name.length, value.length);  } else {    // Update = false    this._encoder.encodeBit(0);    this._encoder.encodeBit(neverIndex);  }  // index is negative for `name`-only headers  this._encoder.encodeInt(-index);  if (index === 0)    this._encoder.encodeStr(name, header.huffman !== false);  this._encoder.encodeStr(value, header.huffman !== false);};
 |