| | |
| | | |
| | | /** @typedef {import("../util/Hash")} Hash */ |
| | | /** @typedef {typeof import("../util/Hash")} HashConstructor */ |
| | | /** @typedef {import("../util/Hash").HashFunction} HashFunction */ |
| | | |
| | | /** |
| | | * Represents the lazy hashed etag runtime component. |
| | | * @typedef {object} HashableObject |
| | | * @property {(hash: Hash) => void} updateHash |
| | | */ |
| | | |
| | | class LazyHashedEtag { |
| | | /** |
| | | * Creates an instance of LazyHashedEtag. |
| | | * @param {HashableObject} obj object with updateHash method |
| | | * @param {string | HashConstructor} hashFunction the hash function to use |
| | | * @param {HashFunction} hashFunction the hash function to use |
| | | */ |
| | | constructor(obj, hashFunction = DEFAULTS.HASH_FUNCTION) { |
| | | /** @type {HashableObject} */ |
| | | this._obj = obj; |
| | | /** @type {undefined | string} */ |
| | | this._hash = undefined; |
| | | /** @type {HashFunction} */ |
| | | this._hashFunction = hashFunction; |
| | | } |
| | | |
| | | /** |
| | | * Returns a string representation. |
| | | * @returns {string} hash of object |
| | | */ |
| | | toString() { |
| | |
| | | } |
| | | } |
| | | |
| | | /** @type {Map<string | HashConstructor, WeakMap<HashableObject, LazyHashedEtag>>} */ |
| | | /** @typedef {WeakMap<HashableObject, LazyHashedEtag>} InnerCache */ |
| | | |
| | | /** @type {Map<HashFunction, InnerCache>} */ |
| | | const mapStrings = new Map(); |
| | | |
| | | /** @type {WeakMap<HashConstructor, WeakMap<HashableObject, LazyHashedEtag>>} */ |
| | | /** @type {WeakMap<HashConstructor, InnerCache>} */ |
| | | const mapObjects = new WeakMap(); |
| | | |
| | | /** |
| | | * Returns etag. |
| | | * @param {HashableObject} obj object with updateHash method |
| | | * @param {(string | HashConstructor)=} hashFunction the hash function to use |
| | | * @param {HashFunction=} hashFunction the hash function to use |
| | | * @returns {LazyHashedEtag} etag |
| | | */ |
| | | const getter = (obj, hashFunction = DEFAULTS.HASH_FUNCTION) => { |
| | | /** @type {undefined | InnerCache} */ |
| | | let innerMap; |
| | | if (typeof hashFunction === "string") { |
| | | innerMap = mapStrings.get(hashFunction); |
| | | if (innerMap === undefined) { |
| | | const newHash = new LazyHashedEtag(obj, hashFunction); |
| | | /** @type {InnerCache} */ |
| | | innerMap = new WeakMap(); |
| | | innerMap.set(obj, newHash); |
| | | mapStrings.set(hashFunction, innerMap); |
| | |
| | | innerMap = mapObjects.get(hashFunction); |
| | | if (innerMap === undefined) { |
| | | const newHash = new LazyHashedEtag(obj, hashFunction); |
| | | /** @type {InnerCache} */ |
| | | innerMap = new WeakMap(); |
| | | innerMap.set(obj, newHash); |
| | | mapObjects.set(hashFunction, innerMap); |