LruTtlMap.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.LruTtlMap = void 0;
  4. const LruMap_1 = require("./LruMap");
  5. /**
  6. * An {@link LruMap} where each entry additionally carries an absolute expiry
  7. * deadline, in the same units as the `now` timestamps supplied to reads
  8. * (milliseconds since the Unix epoch, by default).
  9. */
  10. class LruTtlMap extends LruMap_1.LruMap {
  11. constructor() {
  12. super(...arguments);
  13. this.expiry = new Map();
  14. }
  15. clear() {
  16. this.expiry.clear();
  17. super.clear();
  18. }
  19. delete(key) {
  20. this.expiry.delete(key);
  21. return super.delete(key);
  22. }
  23. /**
  24. * @param now Current time, defaults to `Date.now()`. Entries with a deadline
  25. * strictly below it are treated as missing and are removed.
  26. */
  27. has(key, now = Date.now()) {
  28. if (!super.has(key))
  29. return false;
  30. const expiry = this.expiry.get(key) || 0;
  31. const expired = now > expiry;
  32. if (expired)
  33. this.delete(key);
  34. return !expired;
  35. }
  36. /**
  37. * @param now Current time, defaults to `Date.now()`. Entries with a deadline
  38. * strictly below it are treated as missing and are removed.
  39. */
  40. get(key, now) {
  41. if (!this.has(key, now))
  42. return undefined;
  43. const value = super.get(key);
  44. super.set(key, value);
  45. return value;
  46. }
  47. /**
  48. * @param expiry Absolute deadline after which the entry expires, defaults to
  49. * `Infinity` (never expires). For a relative TTL use `Date.now() + ttl`.
  50. */
  51. set(key, value, expiry = Infinity) {
  52. this.expiry.set(key, expiry);
  53. super.set(key, value);
  54. return this;
  55. }
  56. }
  57. exports.LruTtlMap = LruTtlMap;