memoization.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. 'use strict'
  2. const { LRUCache } = require('lru-cache')
  3. const MEMOIZED = new LRUCache({
  4. max: 500,
  5. maxSize: 50 * 1024 * 1024, // 50MB
  6. ttl: 3 * 60 * 1000, // 3 minutes
  7. sizeCalculation: (entry, key) => key.startsWith('key:') ? entry.data.length : entry.length,
  8. })
  9. module.exports.clearMemoized = clearMemoized
  10. function clearMemoized () {
  11. const old = {}
  12. MEMOIZED.forEach((v, k) => {
  13. old[k] = v
  14. })
  15. MEMOIZED.clear()
  16. return old
  17. }
  18. module.exports.put = put
  19. function put (cache, entry, data, opts) {
  20. pickMem(opts).set(`key:${cache}:${entry.key}`, { entry, data })
  21. putDigest(cache, entry.integrity, data, opts)
  22. }
  23. module.exports.put.byDigest = putDigest
  24. function putDigest (cache, integrity, data, opts) {
  25. pickMem(opts).set(`digest:${cache}:${integrity}`, data)
  26. }
  27. module.exports.get = get
  28. function get (cache, key, opts) {
  29. return pickMem(opts).get(`key:${cache}:${key}`)
  30. }
  31. module.exports.get.byDigest = getDigest
  32. function getDigest (cache, integrity, opts) {
  33. return pickMem(opts).get(`digest:${cache}:${integrity}`)
  34. }
  35. class ObjProxy {
  36. constructor (obj) {
  37. this.obj = obj
  38. }
  39. get (key) {
  40. return this.obj[key]
  41. }
  42. set (key, val) {
  43. this.obj[key] = val
  44. }
  45. }
  46. function pickMem (opts) {
  47. if (!opts || !opts.memoize) {
  48. return MEMOIZED
  49. } else if (opts.memoize.get && opts.memoize.set) {
  50. return opts.memoize
  51. } else if (typeof opts.memoize === 'object') {
  52. return new ObjProxy(opts.memoize)
  53. } else {
  54. return MEMOIZED
  55. }
  56. }