You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
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); };
|