@dfinity/agent
Version:
JavaScript and TypeScript library to interact with the Internet Computer
148 lines • 4.45 kB
JavaScript
"use strict";
var _a, _b;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ExpirableMap = void 0;
/**
* A map that expires entries after a given time.
* Defaults to 10 minutes.
*/
class ExpirableMap {
static { _a = Symbol.iterator, _b = Symbol.toStringTag; }
// Internals
#inner;
#expirationTime;
/**
* Create a new ExpirableMap.
* @param {ExpirableMapOptions<any, any>} options - options for the map.
* @param {Iterable<[any, any]>} options.source - an optional source of entries to initialize the map with.
* @param {number} options.expirationTime - the time in milliseconds after which entries will expire.
*/
constructor(options = {}) {
this[_a] = this.entries.bind(this);
this[_b] = 'ExpirableMap';
const { source = [], expirationTime = 10 * 60 * 1000 } = options;
const currentTime = Date.now();
this.#inner = new Map([...source].map(([key, value]) => [key, { value, timestamp: currentTime }]));
this.#expirationTime = expirationTime;
}
/**
* Prune removes all expired entries.
*/
prune() {
const currentTime = Date.now();
for (const [key, entry] of this.#inner.entries()) {
if (currentTime - entry.timestamp > this.#expirationTime) {
this.#inner.delete(key);
}
}
return this;
}
// Implementing the Map interface
/**
* Set the value for the given key. Prunes expired entries.
* @param key for the entry
* @param value of the entry
* @returns this
*/
set(key, value) {
this.prune();
const entry = {
value,
timestamp: Date.now(),
};
this.#inner.set(key, entry);
return this;
}
/**
* Get the value associated with the key, if it exists and has not expired.
* @param key K
* @returns the value associated with the key, or undefined if the key is not present or has expired.
*/
get(key) {
const entry = this.#inner.get(key);
if (entry === undefined) {
return undefined;
}
if (Date.now() - entry.timestamp > this.#expirationTime) {
this.#inner.delete(key);
return undefined;
}
return entry.value;
}
/**
* Clear all entries.
*/
clear() {
this.#inner.clear();
}
/**
* Entries returns the entries of the map, without the expiration time.
* @returns an iterator over the entries of the map.
*/
entries() {
const iterator = this.#inner.entries();
const generator = function* () {
for (const [key, value] of iterator) {
yield [key, value.value];
}
return undefined;
};
return generator();
}
/**
* Values returns the values of the map, without the expiration time.
* @returns an iterator over the values of the map.
*/
values() {
const iterator = this.#inner.values();
const generator = function* () {
for (const value of iterator) {
yield value.value;
}
return undefined;
};
return generator();
}
/**
* Keys returns the keys of the map
* @returns an iterator over the keys of the map.
*/
keys() {
return this.#inner.keys();
}
/**
* forEach calls the callbackfn on each entry of the map.
* @param callbackfn to call on each entry
* @param thisArg to use as this when calling the callbackfn
*/
forEach(callbackfn, thisArg) {
for (const [key, value] of this.#inner.entries()) {
callbackfn.call(thisArg, value.value, key, this);
}
}
/**
* has returns true if the key exists and has not expired.
* @param key K
* @returns true if the key exists and has not expired.
*/
has(key) {
return this.#inner.has(key);
}
/**
* delete the entry for the given key.
* @param key K
* @returns true if the key existed and has been deleted.
*/
delete(key) {
return this.#inner.delete(key);
}
/**
* get size of the map.
* @returns the size of the map.
*/
get size() {
return this.#inner.size;
}
}
exports.ExpirableMap = ExpirableMap;
//# sourceMappingURL=expirableMap.js.map