This app provides monitoring and information features for the common freifunk user and the technical stuff of a freifunk community.
Code base is taken from a TUM Practical Course project and added here to see if Freifunk Altdorf can use it.
https://www.freifunk-altdorf.de
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.0 KiB
55 lines
1.0 KiB
'use strict'; |
|
const mimicFn = require('mimic-fn'); |
|
|
|
const cacheStore = new WeakMap(); |
|
|
|
const defaultCacheKey = function (x) { |
|
if (arguments.length === 1 && (x === null || x === undefined || (typeof x !== 'function' && typeof x !== 'object'))) { |
|
return x; |
|
} |
|
|
|
return JSON.stringify(arguments); |
|
}; |
|
|
|
module.exports = (fn, opts) => { |
|
opts = Object.assign({ |
|
cacheKey: defaultCacheKey, |
|
cache: new Map() |
|
}, opts); |
|
|
|
const memoized = function () { |
|
const cache = cacheStore.get(memoized); |
|
const key = opts.cacheKey.apply(null, arguments); |
|
|
|
if (cache.has(key)) { |
|
const c = cache.get(key); |
|
|
|
if (typeof opts.maxAge !== 'number' || Date.now() < c.maxAge) { |
|
return c.data; |
|
} |
|
} |
|
|
|
const ret = fn.apply(null, arguments); |
|
|
|
cache.set(key, { |
|
data: ret, |
|
maxAge: Date.now() + (opts.maxAge || 0) |
|
}); |
|
|
|
return ret; |
|
}; |
|
|
|
mimicFn(memoized, fn); |
|
|
|
cacheStore.set(memoized, opts.cache); |
|
|
|
return memoized; |
|
}; |
|
|
|
module.exports.clear = fn => { |
|
const cache = cacheStore.get(fn); |
|
|
|
if (cache && typeof cache.clear === 'function') { |
|
cache.clear(); |
|
} |
|
};
|
|
|