| 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);
 
- };
 
 
  |