64 lines
2.7 KiB
JavaScript
64 lines
2.7 KiB
JavaScript
|
|
import { utf8DecodeJs } from "./utils/utf8.mjs";
|
||
|
|
var DEFAULT_MAX_KEY_LENGTH = 16;
|
||
|
|
var DEFAULT_MAX_LENGTH_PER_KEY = 16;
|
||
|
|
var CachedKeyDecoder = /** @class */ (function () {
|
||
|
|
function CachedKeyDecoder(maxKeyLength, maxLengthPerKey) {
|
||
|
|
if (maxKeyLength === void 0) { maxKeyLength = DEFAULT_MAX_KEY_LENGTH; }
|
||
|
|
if (maxLengthPerKey === void 0) { maxLengthPerKey = DEFAULT_MAX_LENGTH_PER_KEY; }
|
||
|
|
this.maxKeyLength = maxKeyLength;
|
||
|
|
this.maxLengthPerKey = maxLengthPerKey;
|
||
|
|
this.hit = 0;
|
||
|
|
this.miss = 0;
|
||
|
|
// avoid `new Array(N)`, which makes a sparse array,
|
||
|
|
// because a sparse array is typically slower than a non-sparse array.
|
||
|
|
this.caches = [];
|
||
|
|
for (var i = 0; i < this.maxKeyLength; i++) {
|
||
|
|
this.caches.push([]);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
CachedKeyDecoder.prototype.canBeCached = function (byteLength) {
|
||
|
|
return byteLength > 0 && byteLength <= this.maxKeyLength;
|
||
|
|
};
|
||
|
|
CachedKeyDecoder.prototype.find = function (bytes, inputOffset, byteLength) {
|
||
|
|
var records = this.caches[byteLength - 1];
|
||
|
|
FIND_CHUNK: for (var _i = 0, records_1 = records; _i < records_1.length; _i++) {
|
||
|
|
var record = records_1[_i];
|
||
|
|
var recordBytes = record.bytes;
|
||
|
|
for (var j = 0; j < byteLength; j++) {
|
||
|
|
if (recordBytes[j] !== bytes[inputOffset + j]) {
|
||
|
|
continue FIND_CHUNK;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return record.str;
|
||
|
|
}
|
||
|
|
return null;
|
||
|
|
};
|
||
|
|
CachedKeyDecoder.prototype.store = function (bytes, value) {
|
||
|
|
var records = this.caches[bytes.length - 1];
|
||
|
|
var record = { bytes: bytes, str: value };
|
||
|
|
if (records.length >= this.maxLengthPerKey) {
|
||
|
|
// `records` are full!
|
||
|
|
// Set `record` to an arbitrary position.
|
||
|
|
records[(Math.random() * records.length) | 0] = record;
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
records.push(record);
|
||
|
|
}
|
||
|
|
};
|
||
|
|
CachedKeyDecoder.prototype.decode = function (bytes, inputOffset, byteLength) {
|
||
|
|
var cachedValue = this.find(bytes, inputOffset, byteLength);
|
||
|
|
if (cachedValue != null) {
|
||
|
|
this.hit++;
|
||
|
|
return cachedValue;
|
||
|
|
}
|
||
|
|
this.miss++;
|
||
|
|
var str = utf8DecodeJs(bytes, inputOffset, byteLength);
|
||
|
|
// Ensure to copy a slice of bytes because the byte may be NodeJS Buffer and Buffer#slice() returns a reference to its internal ArrayBuffer.
|
||
|
|
var slicedCopyOfBytes = Uint8Array.prototype.slice.call(bytes, inputOffset, inputOffset + byteLength);
|
||
|
|
this.store(slicedCopyOfBytes, str);
|
||
|
|
return str;
|
||
|
|
};
|
||
|
|
return CachedKeyDecoder;
|
||
|
|
}());
|
||
|
|
export { CachedKeyDecoder };
|
||
|
|
//# sourceMappingURL=CachedKeyDecoder.mjs.map
|