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