| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 | var hpack = require('../hpack');var utils = hpack.utils;var assert = utils.assert;function Table(options) {  this['static'] = hpack['static-table'];  this.dynamic = [];  this.size = 0;  this.maxSize = 0;  this.length = this['static'].table.length;  this.protocolMaxSize = options.maxSize;  this.maxSize = this.protocolMaxSize;  this.lookupDepth = options.lookupDepth || 32;}module.exports = Table;Table.create = function create(options) {  return new Table(options);};Table.prototype.lookup = function lookup(index) {  assert(index !== 0, 'Zero indexed field');  assert(index <= this.length, 'Indexed field OOB')  if (index <= this['static'].table.length)    return this['static'].table[index - 1];  else    return this.dynamic[this.length - index];};Table.prototype.reverseLookup = function reverseLookup(name, value) {  var staticEntry = this['static'].map[name];  if (staticEntry && staticEntry.values[value])    return staticEntry.values[value];  // Reverse search dynamic table (new items are at the end of it)  var limit = Math.max(0, this.dynamic.length - this.lookupDepth);  for (var i = this.dynamic.length - 1; i >= limit; i--) {    var entry = this.dynamic[i];    if (entry.name === name && entry.value === value)      return this.length - i;    if (entry.name === name) {      // Prefer smaller index      if (staticEntry)        break;      return -(this.length - i);    }  }  if (staticEntry)    return -staticEntry.index;  return 0;};Table.prototype.add = function add(name, value, nameSize, valueSize) {  var totalSize = nameSize + valueSize + 32;  this.dynamic.push({    name: name,    value: value,    nameSize: nameSize,    totalSize: totalSize  });  this.size += totalSize;  this.length++;  this.evict();};Table.prototype.evict = function evict() {  while (this.size > this.maxSize) {    var entry = this.dynamic.shift();    this.size -= entry.totalSize;    this.length--;  }  assert(this.size >= 0, 'Table size sanity check failed');};Table.prototype.updateSize = function updateSize(size) {  assert(size <= this.protocolMaxSize, 'Table size bigger than maximum');  this.maxSize = size;  this.evict();};
 |