limited-cache 2.0.0 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -1
- package/CODE_OF_CONDUCT.md +103 -47
- package/{CONTRIBUTING.md → CONTRIBUTING.template.md} +4 -2
- package/README.md +2 -2
- package/dist/core/LimitedCache.d.ts +4 -3
- package/dist/core/LimitedCache.d.ts.map +1 -0
- package/dist/core/LimitedCache.js +29 -0
- package/dist/core/LimitedCache.js.map +1 -0
- package/dist/core/LimitedCacheObject.d.ts +5 -4
- package/dist/core/LimitedCacheObject.d.ts.map +1 -0
- package/dist/core/LimitedCacheObject.js +52 -0
- package/dist/core/LimitedCacheObject.js.map +1 -0
- package/dist/core/builtIns.d.ts +12 -11
- package/dist/core/builtIns.d.ts.map +1 -0
- package/dist/core/builtIns.js +5 -0
- package/dist/core/builtIns.js.map +1 -0
- package/dist/core/defaultOptions.d.ts +6 -5
- package/dist/core/defaultOptions.d.ts.map +1 -0
- package/dist/core/defaultOptions.js +14 -0
- package/dist/core/defaultOptions.js.map +1 -0
- package/dist/core/limitedCacheUtil.d.ts +13 -12
- package/dist/core/limitedCacheUtil.d.ts.map +1 -0
- package/dist/core/limitedCacheUtil.js +14 -0
- package/dist/core/limitedCacheUtil.js.map +1 -0
- package/dist/core/lowLevelFunctions.d.ts +14 -13
- package/dist/core/lowLevelFunctions.d.ts.map +1 -0
- package/dist/core/lowLevelFunctions.js +240 -0
- package/dist/core/lowLevelFunctions.js.map +1 -0
- package/dist/index.cjs +388 -0
- package/dist/index.d.ts +7 -6
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -8
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +58 -60
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +82 -74
- package/src/__tests__/LimitedCache.test.ts +8 -8
- package/src/__tests__/LimitedCacheObject.test.ts +9 -7
- package/src/__tests__/lowLevelFunctions.test.ts +20 -16
- package/src/__tests__/scenarios/keys.test.ts +2 -2
- package/src/__tests__/scenarios/maxCacheSize.test.ts +4 -4
- package/src/__tests__/scenarios/maxCacheTime.test.ts +3 -3
- package/src/__tests__/scenarios/values.test.ts +2 -2
- package/src/__tests__/typeChecks/LimitedCacheObjectTypes.test.ts +5 -3
- package/src/__tests__/typeChecks/LimitedCacheTypes.test.ts +5 -3
- package/src/__tests__/typeChecks/lowLevelFunctionsTypes.test.ts +5 -3
- package/src/core/LimitedCache.ts +2 -2
- package/src/core/LimitedCacheObject.ts +3 -3
- package/src/core/defaultOptions.ts +1 -1
- package/src/core/limitedCacheUtil.ts +1 -1
- package/src/core/lowLevelFunctions.ts +8 -8
- package/src/index.ts +6 -6
- package/dist/limited-cache.cjs.development.js +0 -469
- package/dist/limited-cache.cjs.development.js.map +0 -1
- package/dist/limited-cache.cjs.production.min.js +0 -2
- package/dist/limited-cache.cjs.production.min.js.map +0 -1
- package/dist/limited-cache.esm.js +0 -448
- package/dist/limited-cache.esm.js.map +0 -1
- package/legacy-types/ts3.x/dist/core/LimitedCache.d.ts +0 -3
- package/legacy-types/ts3.x/dist/core/LimitedCacheObject.d.ts +0 -4
- package/legacy-types/ts3.x/dist/core/builtIns.d.ts +0 -11
- package/legacy-types/ts3.x/dist/core/defaultOptions.d.ts +0 -5
- package/legacy-types/ts3.x/dist/core/limitedCacheUtil.d.ts +0 -12
- package/legacy-types/ts3.x/dist/core/lowLevelFunctions.d.ts +0 -13
- package/legacy-types/ts3.x/dist/index.d.ts +0 -6
- package/legacy-types/ts3.x/dist/types.d.ts +0 -60
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e={maxCacheSize:100,maxCacheTime:864e5,warnIfItemPurgedBeforeTime:5e3,opLimit:200,scanLimit:50};function t(){return(t=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}var n=Object.create,r=Object.assign,o=Object.prototype.hasOwnProperty,i=Date.now,a=function(e){return Math.max(e,0)||0},c=function(e){return r(e,{maxCacheSize:a(e.maxCacheSize),maxCacheTime:a(e.maxCacheTime),opLimit:a(e.opLimit)}),e},s=function(e){return!!e&&!!e.limitedCacheMetaVersion},u=function(e){if(!s(e))throw new Error("Limited-cache metadata is missing: please check your usage");2!==e.limitedCacheMetaVersion&&(console.warn("Limited-cache metadata is from an incompatible version (1). It must be reset."),e.limitedCacheMetaVersion=2,C(e))},f=function(e,t){return u(e),c(r(e.options,t))},p=function(n){if(s(n)){var r=n;return u(r),r}var o=c(t({},e,n));return C({limitedCacheMetaVersion:2,options:o})},l=function(e,t){var n=e.keyInfo[t];return n?n[1]||n[0]+(e.options.maxCacheTime||31536e6):0},h=function(e,t,n){return l(e,t)<n},m=function(e){u(e);var t=e.cache,o=e.keyList,a=e.keyInfo,c=i(),s=o.reduce((function(n,r){var o=n[0],i=n[1],s=n[2];return h(e,r,c)||(o[r]=t[r],i.push(r),s[r]=a[r]),n}),[{},[],n(null)]);return r(e,{cache:s[0],keyList:s[1],keyInfo:s[2],opsLeft:e.options.opLimit})},v=function(e,t,n){var r=e.cache,o=e.keyList,i=e.keyInfo,a=t,c=o[t],s=o.length;do{r[c]=i[c]=void 0,c=o[++a]}while(a<s&&h(e,c,n));o.splice(t,a-t)},L=function(e,t){u(e);var n=e.cache;if(o.call(n,t)&&void 0!==n[t]){if(!h(e,t,i()))return!0;n[t]=void 0}return!1},x=function(e,t){if(u(e),L(e,t))return e.cache[t]},d=function(e){return u(e),m(e),e.cache},y=function(e,n,r){u(e);var o,a=e.options.maxCacheSize,c=e.keyList,s=e.keyInfo,f=i(),p=!s[n];return e.cache[n]!==r&&(e.cache=t({},e.cache,((o={})[n]=r,o))),s[n]=[f,0],p&&(c.push(n),e.opsLeft--,e.opsLeft<=0&&m(e),a&&e.keyList.length>a&&function(e,t){var n=e.options.scanLimit,r=e.keyList,o=0,i=l(e,r[0]);if(i>t)for(var a=0,c=Math.min(r.length,n);a<c;){var s=l(e,r[a]);if(s<t){o=a,i=0;break}s<i&&(o=a,i=s),a+=1}v(e,o,t)}(e,f)),h(e,c[0],f)&&v(e,0,f),e},w=function(e,n){u(e);var r,o=e.cache,i=e.keyInfo;return i[n]&&(void 0!==o[n]&&(e.cache=t({},o,((r={})[n]=void 0,r))),i[n]=void 0),e},C=function(e){return u(e),r(e,{cache:{},keyList:[],keyInfo:n(null),opsLeft:e.options.opLimit})},g=function(e,t){return e.bind(null,t)},M={get:function(e,t){return"hasOwnProperty"===t?o:x(e,t)},getOwnPropertyDescriptor:function(e,t){var n=L(e,t),r=x(e,t);if(n)return{configurable:!0,enumerable:n,value:r,writable:!0}},has:L,set:function(e,t,n){return y(e,t,n),n},deleteProperty:function(e,t){return w(e,t),!0},ownKeys:function(e){return Object.keys(d(e))}},O=new WeakMap,k={init:p,get:x,getAll:d,has:L,set:y,remove:w,reset:C,doMaintenance:m,setOptions:f};exports.CURRENT_META_VERSION=2,exports.LimitedCache=function(e){var t=p(e);return{get:g(x,t),getAll:g(d,t),has:g(L,t),set:function(e,n){return y(t,e,n),n},remove:function(e){return w(t,e),!0},reset:g(C,t),getCacheMeta:function(){return t},getOptions:function(){return t.options},setOptions:g(f,t),doMaintenance:g(m,t)}},exports.LimitedCacheObject=function(e){var t=p(e),n=new Proxy(t,M);return O.set(n,t),n},exports.MAXIMUM_CACHE_TIME=31536e6,exports.defaultOptions=e,exports.getCacheMetaFromObject=function(e){return O.get(e)},exports.isCacheMeta=s,exports.limitedCacheUtil=k,exports.lowLevelDoMaintenance=m,exports.lowLevelGetAll=d,exports.lowLevelGetOne=x,exports.lowLevelHas=L,exports.lowLevelInit=p,exports.lowLevelRemove=w,exports.lowLevelReset=C,exports.lowLevelSet=y,exports.lowLevelSetOptions=f,exports.upgradeCacheMeta=u;
|
|
2
|
-
//# sourceMappingURL=limited-cache.cjs.production.min.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"limited-cache.cjs.production.min.js","sources":["../src/core/defaultOptions.ts","../src/core/builtIns.ts","../src/core/lowLevelFunctions.ts","../src/core/LimitedCache.ts","../src/core/LimitedCacheObject.ts","../src/core/limitedCacheUtil.ts"],"sourcesContent":["import { LimitedCacheOptionsReadonly } from '../types';\n\nconst CURRENT_META_VERSION = 2;\nconst MAXIMUM_CACHE_TIME = 365 * 86400 * 1000;\n\nconst defaultOptions: LimitedCacheOptionsReadonly = {\n // Public\n maxCacheSize: 100,\n maxCacheTime: 86400 * 1000,\n // Development-only\n warnIfItemPurgedBeforeTime: 5000,\n // Private\n opLimit: 200,\n scanLimit: 50,\n};\n\nexport { CURRENT_META_VERSION, MAXIMUM_CACHE_TIME, defaultOptions };\n","// To help minification\nconst {\n create: objectCreate,\n assign: objectAssign,\n prototype: { hasOwnProperty },\n} = Object;\nconst dateNow = Date.now;\n\nexport { objectAssign, objectCreate, dateNow, hasOwnProperty };\n","import { objectAssign, objectCreate, dateNow, hasOwnProperty } from './builtIns';\nimport { CURRENT_META_VERSION, MAXIMUM_CACHE_TIME, defaultOptions } from './defaultOptions';\nimport {\n LimitedCacheOptions,\n LimitedCacheOptionsReadonly,\n LimitedCacheMeta,\n LimitedCacheOptionsFull,\n DefaultItemType,\n} from '../types';\n\n/* Initialization and options */\n\nconst positiveNumberOrZero = (value: number): number => Math.max(value, 0) || 0;\n\nconst normalizeOptions = (cacheMetaOptions: LimitedCacheOptionsFull): LimitedCacheOptionsFull => {\n objectAssign(cacheMetaOptions, {\n maxCacheSize: positiveNumberOrZero(cacheMetaOptions.maxCacheSize),\n maxCacheTime: positiveNumberOrZero(cacheMetaOptions.maxCacheTime),\n opLimit: positiveNumberOrZero(cacheMetaOptions.opLimit),\n });\n\n if (process.env.NODE_ENV !== 'production') {\n cacheMetaOptions.warnIfItemPurgedBeforeTime = positiveNumberOrZero(\n cacheMetaOptions.warnIfItemPurgedBeforeTime,\n );\n }\n return cacheMetaOptions;\n};\n\nconst isCacheMeta = (cacheMeta: LimitedCacheMeta): boolean => {\n return !!cacheMeta && !!cacheMeta.limitedCacheMetaVersion;\n};\n\nconst upgradeCacheMeta = (cacheMeta: LimitedCacheMeta): void => {\n if (!isCacheMeta(cacheMeta)) {\n throw new Error('Limited-cache metadata is missing: please check your usage');\n }\n if (cacheMeta.limitedCacheMetaVersion !== CURRENT_META_VERSION) {\n // Version is out of date! (Today the only prior version is 1)\n // Version 1: Cache meta cannot be migrated because timestamps and keys are incompatible\n console.warn('Limited-cache metadata is from an incompatible version (1). It must be reset.');\n cacheMeta.limitedCacheMetaVersion = CURRENT_META_VERSION;\n lowLevelReset(cacheMeta);\n }\n};\n\nconst lowLevelSetOptions = <ItemType = DefaultItemType>(\n cacheMeta: LimitedCacheMeta<ItemType>,\n options: LimitedCacheOptions,\n): LimitedCacheOptionsReadonly => {\n upgradeCacheMeta(cacheMeta);\n return normalizeOptions(objectAssign(cacheMeta.options, options));\n};\n\nconst lowLevelInit = <ItemType = DefaultItemType>(\n optionsOrCacheMeta?: LimitedCacheOptions | LimitedCacheMeta<ItemType>,\n): LimitedCacheMeta<ItemType> => {\n if (isCacheMeta(optionsOrCacheMeta as LimitedCacheMeta<ItemType>)) {\n const existingCacheMeta = optionsOrCacheMeta as LimitedCacheMeta<ItemType>;\n upgradeCacheMeta(existingCacheMeta);\n return existingCacheMeta;\n }\n // Else: it's options\n const fullOptions = normalizeOptions({ ...defaultOptions, ...optionsOrCacheMeta });\n\n // The cacheMeta is created once, and persists per instance\n const newCacheMeta = lowLevelReset({\n limitedCacheMetaVersion: CURRENT_META_VERSION,\n options: fullOptions,\n } as LimitedCacheMeta<ItemType>);\n\n return newCacheMeta;\n};\n\n/* Internal cache manipulation */\n\nconst _getExpireTime = (cacheMeta: LimitedCacheMeta, cacheKey: string): number => {\n const {\n options: { maxCacheTime },\n keyInfo: { [cacheKey]: keyInfo },\n } = cacheMeta;\n if (!keyInfo) {\n // A missing record is always treated as expired\n return 0;\n }\n // If we have an exact expireTime then honor it. Otherwise it'll depend on the current maxCacheTime.\n const [setTime, expireTime] = keyInfo;\n return expireTime || setTime + (maxCacheTime || MAXIMUM_CACHE_TIME);\n};\n\nconst _cacheKeyHasExpired = (\n cacheMeta: LimitedCacheMeta,\n cacheKey: string,\n now: number,\n): boolean => {\n return _getExpireTime(cacheMeta, cacheKey) < now;\n};\n\nconst lowLevelDoMaintenance = <ItemType = DefaultItemType>(\n cacheMeta: LimitedCacheMeta<ItemType>,\n): LimitedCacheMeta<ItemType> => {\n upgradeCacheMeta(cacheMeta);\n const { cache, keyList, keyInfo } = cacheMeta;\n const now = dateNow();\n\n // Rebuild cache from keyList only, checking timestamps to auto-remove expired\n const [newCache, newKeyList, newKeyInfo] = keyList.reduce(\n (acc, cacheKey) => {\n const [accCache, accKeyList, accKeyInfo] = acc;\n if (!_cacheKeyHasExpired(cacheMeta, cacheKey, now)) {\n accCache[cacheKey] = cache[cacheKey];\n accKeyList.push(cacheKey);\n accKeyInfo[cacheKey] = keyInfo[cacheKey];\n }\n return acc;\n },\n [\n {} as typeof cacheMeta['cache'],\n [] as typeof cacheMeta['keyList'],\n objectCreate(null) as typeof cacheMeta['keyInfo'],\n ],\n );\n\n return objectAssign(cacheMeta, {\n cache: newCache,\n keyList: newKeyList,\n keyInfo: newKeyInfo,\n opsLeft: cacheMeta.options.opLimit,\n });\n};\n\nconst _removeFromIndex = (cacheMeta: LimitedCacheMeta, startIndex: number, now: number): void => {\n const { cache, keyList, keyInfo } = cacheMeta;\n\n // Always remove the item requested, and also remove any neighbors who have expired\n let nextIndex = startIndex;\n let nextCacheKey = keyList[startIndex];\n const keyListLength = keyList.length;\n do {\n // Remove the 'next' item\n\n cache[nextCacheKey] = keyInfo[nextCacheKey] = undefined;\n\n // Now advance and decide whether to keep going\n nextIndex++;\n nextCacheKey = keyList[nextIndex];\n } while (nextIndex < keyListLength && _cacheKeyHasExpired(cacheMeta, nextCacheKey, now));\n\n // Remove the index for everything from the startIndex until we stopped\n keyList.splice(startIndex, nextIndex - startIndex);\n};\n\nconst _removeItemsToMakeRoom = (cacheMeta: LimitedCacheMeta, now: number): void => {\n const {\n options: { scanLimit, warnIfItemPurgedBeforeTime },\n cache,\n keyList,\n keyInfo,\n } = cacheMeta;\n\n // These track the soonest-to-expire thing we've found. It may not actually be \"oldest\".\n // By default we'll remove the item at the head of the queue, unless we find something better.\n let oldestItemIndex = 0;\n let oldestExpireTime = _getExpireTime(cacheMeta, keyList[0]);\n\n if (oldestExpireTime > now) {\n // The head of the list hasn't yet expired: scan for a better candidate to remove\n let indexToCheck = 0;\n const maxIndexToCheck = Math.min(keyList.length, scanLimit);\n while (indexToCheck < maxIndexToCheck) {\n const cacheKeyForIndex = keyList[indexToCheck];\n let expireTimeForIndex = _getExpireTime(cacheMeta, cacheKeyForIndex);\n\n // We only consider it if it's eligible for expiration: otherwise it can't be a better option\n // than the default head-of-queue\n if (expireTimeForIndex < now) {\n // We found an expired item! This wins automatically\n oldestItemIndex = indexToCheck;\n oldestExpireTime = 0;\n break;\n }\n if (expireTimeForIndex < oldestExpireTime) {\n // We have a new leader\n oldestItemIndex = indexToCheck;\n oldestExpireTime = expireTimeForIndex;\n }\n indexToCheck += 1;\n }\n }\n\n // Warn if the 'oldest' item is more recent than we'd like: this means it cycled into and out of\n // cache too quickly for the cache to be useful.\n if (\n process.env.NODE_ENV !== 'production' &&\n warnIfItemPurgedBeforeTime &&\n oldestExpireTime > now\n ) {\n const oldestItemKey = keyList[oldestItemIndex];\n const [oldestItemSetTime, oldestItemExpireTime] = keyInfo[oldestItemKey]!;\n\n if (now - oldestItemSetTime < warnIfItemPurgedBeforeTime) {\n console.warn(\n 'Purged an item from cache while it was still fresh: you may want to increase maxCacheSize',\n {\n currentTime: now,\n key: oldestItemKey,\n item: cache[oldestItemKey],\n setTime: oldestItemSetTime,\n expireTime: oldestItemExpireTime,\n timeInCache: now - oldestItemSetTime,\n },\n );\n }\n }\n\n // Remove the oldest item we found, plus any expired neighbors\n _removeFromIndex(cacheMeta, oldestItemIndex, now);\n};\n\n/* Accessors */\n\nconst lowLevelHas = <ItemType = DefaultItemType>(\n cacheMeta: LimitedCacheMeta<ItemType>,\n cacheKey: string,\n): boolean => {\n upgradeCacheMeta(cacheMeta);\n const { cache } = cacheMeta;\n if (hasOwnProperty.call(cache, cacheKey) && cache[cacheKey] !== undefined) {\n if (!_cacheKeyHasExpired(cacheMeta, cacheKey, dateNow())) {\n return true;\n }\n // If it's expired, clear the value so that we can short-circuit future lookups\n cache[cacheKey] = undefined;\n }\n return false;\n};\n\nconst lowLevelGetOne = <ItemType = DefaultItemType>(\n cacheMeta: LimitedCacheMeta<ItemType>,\n cacheKey: string,\n): ItemType | undefined => {\n upgradeCacheMeta(cacheMeta);\n if (lowLevelHas(cacheMeta, cacheKey)) {\n return cacheMeta.cache[cacheKey];\n }\n return;\n};\n\nconst lowLevelGetAll = <ItemType = DefaultItemType>(\n cacheMeta: LimitedCacheMeta<ItemType>,\n): Record<string, ItemType> => {\n upgradeCacheMeta(cacheMeta);\n // Remove all expired values, and return whatever's left\n lowLevelDoMaintenance(cacheMeta);\n // Retype because there won't be any `undefined` values after doMaintenance\n return cacheMeta.cache as Record<string, ItemType>;\n};\n\nconst lowLevelSet = <ItemType = DefaultItemType>(\n cacheMeta: LimitedCacheMeta<ItemType>,\n cacheKey: string,\n item: ItemType,\n): LimitedCacheMeta<ItemType> => {\n upgradeCacheMeta(cacheMeta);\n\n const {\n options: { maxCacheSize },\n keyList,\n keyInfo,\n } = cacheMeta;\n\n const now = dateNow();\n const isNew = !keyInfo[cacheKey];\n\n if (cacheMeta.cache[cacheKey] !== item) {\n // The cache itself is immutable (but the rest of cacheMeta is not)\n cacheMeta.cache = {\n ...cacheMeta.cache,\n [cacheKey]: item,\n };\n }\n // We've now set or updated it. Regardless of whether it's new, bump its set time\n // @TODO: expireTime override\n keyInfo[cacheKey] = [now, 0];\n\n if (isNew) {\n // It's a new key: grow the cache, then shrink it if we can\n keyList.push(cacheKey);\n\n cacheMeta.opsLeft--;\n if (cacheMeta.opsLeft <= 0) {\n // Time for an oil change\n lowLevelDoMaintenance(cacheMeta);\n }\n\n if (maxCacheSize && cacheMeta.keyList.length > maxCacheSize) {\n // We're still over the limit: drop at least one item\n _removeItemsToMakeRoom(cacheMeta, now);\n }\n }\n\n if (_cacheKeyHasExpired(cacheMeta, keyList[0], now)) {\n // While we're here, if we need to expire the head of the queue then drop it\n _removeFromIndex(cacheMeta, 0, now);\n }\n\n return cacheMeta;\n};\n\nconst lowLevelRemove = <ItemType = DefaultItemType>(\n cacheMeta: LimitedCacheMeta<ItemType>,\n cacheKey: string,\n): LimitedCacheMeta<ItemType> => {\n upgradeCacheMeta(cacheMeta);\n const { cache, keyInfo } = cacheMeta;\n\n if (keyInfo[cacheKey]) {\n if (cache[cacheKey] !== undefined) {\n cacheMeta.cache = {\n ...cache,\n [cacheKey]: undefined,\n };\n }\n keyInfo[cacheKey] = undefined;\n }\n\n return cacheMeta;\n};\n\nconst lowLevelReset = <ItemType = DefaultItemType>(\n cacheMeta: LimitedCacheMeta<ItemType>,\n): LimitedCacheMeta<ItemType> => {\n upgradeCacheMeta(cacheMeta);\n return objectAssign(cacheMeta, {\n cache: {},\n keyList: [],\n keyInfo: objectCreate(null),\n opsLeft: cacheMeta.options.opLimit,\n });\n};\n\nexport {\n isCacheMeta,\n upgradeCacheMeta,\n lowLevelInit,\n lowLevelGetOne,\n lowLevelGetAll,\n lowLevelHas,\n lowLevelSet,\n lowLevelRemove,\n lowLevelReset,\n lowLevelDoMaintenance,\n lowLevelSetOptions,\n};\n","import {\n lowLevelInit,\n lowLevelGetOne,\n lowLevelGetAll,\n lowLevelHas,\n lowLevelSet,\n lowLevelRemove,\n lowLevelReset,\n lowLevelSetOptions,\n lowLevelDoMaintenance,\n} from './lowLevelFunctions';\nimport {\n LimitedCacheOptions,\n LimitedCacheOptionsReadonly,\n LimitedCacheInstance,\n LimitedCacheMeta,\n DefaultItemType,\n} from '../types';\n\n// Most public functions just call a low-level function directly, passing the cacheMeta.\n// Doing this via a helper function makes the typeChecks easier, and minifies better.\nconst bindFunctionToCacheMeta = <ItemType>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fn: (cacheMeta: LimitedCacheMeta<ItemType>, ...otherArgs: any) => any,\n cacheMeta: LimitedCacheMeta<ItemType>,\n) => fn.bind(null, cacheMeta);\n\nconst LimitedCache = <ItemType = DefaultItemType>(\n options?: LimitedCacheOptions,\n): LimitedCacheInstance<ItemType> => {\n const cacheMeta = lowLevelInit<ItemType>(options);\n\n return {\n get: bindFunctionToCacheMeta<ItemType>(lowLevelGetOne, cacheMeta),\n getAll: bindFunctionToCacheMeta<ItemType>(lowLevelGetAll, cacheMeta),\n has: bindFunctionToCacheMeta<ItemType>(lowLevelHas, cacheMeta),\n set: (cacheKey, item): ItemType => {\n lowLevelSet(cacheMeta, cacheKey, item);\n return item;\n },\n remove: (cacheKey): true => {\n lowLevelRemove(cacheMeta, cacheKey);\n return true;\n },\n reset: bindFunctionToCacheMeta<ItemType>(lowLevelReset, cacheMeta),\n getCacheMeta: (): LimitedCacheMeta<ItemType> => cacheMeta,\n getOptions: (): LimitedCacheOptionsReadonly => cacheMeta.options,\n setOptions: bindFunctionToCacheMeta<ItemType>(lowLevelSetOptions, cacheMeta),\n doMaintenance: bindFunctionToCacheMeta<ItemType>(lowLevelDoMaintenance, cacheMeta),\n };\n};\n\nexport { LimitedCache };\n","import { hasOwnProperty } from './builtIns';\nimport {\n lowLevelInit,\n lowLevelGetOne,\n lowLevelGetAll,\n lowLevelHas,\n lowLevelSet,\n lowLevelRemove,\n} from './lowLevelFunctions';\nimport {\n LimitedCacheOptions,\n LimitedCacheObjectInstance,\n LimitedCacheMeta,\n DefaultItemType,\n} from '../types';\n\n// The `any` here doesn't escape out anywhere: it's overridden by the constructor below\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst proxyHandler: ProxyHandler<LimitedCacheObjectInstance<any>> = {\n get: (cacheMeta: LimitedCacheMeta, cacheKey: string) => {\n if (cacheKey === 'hasOwnProperty') {\n return hasOwnProperty;\n }\n return lowLevelGetOne(cacheMeta, cacheKey);\n },\n getOwnPropertyDescriptor: (cacheMeta: LimitedCacheMeta, cacheKey: string) => {\n const hasResult = lowLevelHas(cacheMeta, cacheKey);\n const getResult = lowLevelGetOne(cacheMeta, cacheKey);\n\n if (hasResult) {\n return {\n configurable: true,\n enumerable: hasResult,\n value: getResult,\n writable: true,\n };\n }\n return;\n },\n has: lowLevelHas,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n set: (cacheMeta: LimitedCacheMeta, cacheKey: string, item: any): any => {\n lowLevelSet(cacheMeta, cacheKey, item);\n return item;\n },\n deleteProperty: (cacheMeta: LimitedCacheMeta, cacheKey: string): true => {\n lowLevelRemove(cacheMeta, cacheKey);\n return true;\n },\n ownKeys: (cacheMeta: LimitedCacheMeta) => Object.keys(lowLevelGetAll(cacheMeta)),\n};\n\n/**\n * So that we can retrieve the cacheMeta for a LimitedCacheObject, without polluting its properties, each proxy\n * is associated back to its internal cacheMeta here.\n */\nconst cacheMetasForProxies = new WeakMap();\n\nconst LimitedCacheObject = <ItemType = DefaultItemType>(\n options?: LimitedCacheOptions,\n): LimitedCacheObjectInstance<ItemType> => {\n const cacheMeta = lowLevelInit(options);\n const limitedCacheObject = new Proxy(cacheMeta, proxyHandler);\n\n cacheMetasForProxies.set(limitedCacheObject, cacheMeta);\n return limitedCacheObject;\n};\n\nconst getCacheMetaFromObject = (instance: LimitedCacheObjectInstance): LimitedCacheMeta => {\n return cacheMetasForProxies.get(instance);\n};\n\nexport { LimitedCacheObject, getCacheMetaFromObject };\n","import {\n lowLevelGetOne,\n lowLevelGetAll,\n lowLevelHas,\n lowLevelInit,\n lowLevelDoMaintenance,\n lowLevelRemove,\n lowLevelReset,\n lowLevelSet,\n lowLevelSetOptions,\n} from './lowLevelFunctions';\n\nconst limitedCacheUtil = {\n init: lowLevelInit,\n get: lowLevelGetOne,\n getAll: lowLevelGetAll,\n has: lowLevelHas,\n set: lowLevelSet,\n remove: lowLevelRemove,\n reset: lowLevelReset,\n doMaintenance: lowLevelDoMaintenance,\n setOptions: lowLevelSetOptions,\n};\n\nexport { limitedCacheUtil };\n"],"names":["defaultOptions","maxCacheSize","maxCacheTime","warnIfItemPurgedBeforeTime","opLimit","scanLimit","objectCreate","Object","create","objectAssign","assign","hasOwnProperty","prototype","dateNow","Date","now","positiveNumberOrZero","value","Math","max","normalizeOptions","cacheMetaOptions","isCacheMeta","cacheMeta","limitedCacheMetaVersion","upgradeCacheMeta","Error","console","warn","lowLevelReset","lowLevelSetOptions","options","lowLevelInit","optionsOrCacheMeta","existingCacheMeta","fullOptions","_getExpireTime","cacheKey","keyInfo","_cacheKeyHasExpired","lowLevelDoMaintenance","cache","keyList","reduce","acc","accCache","accKeyList","accKeyInfo","push","opsLeft","_removeFromIndex","startIndex","nextIndex","nextCacheKey","keyListLength","length","undefined","splice","lowLevelHas","call","lowLevelGetOne","lowLevelGetAll","lowLevelSet","item","isNew","oldestItemIndex","oldestExpireTime","indexToCheck","maxIndexToCheck","min","expireTimeForIndex","_removeItemsToMakeRoom","lowLevelRemove","bindFunctionToCacheMeta","fn","bind","proxyHandler","get","getOwnPropertyDescriptor","hasResult","getResult","configurable","enumerable","writable","has","set","deleteProperty","ownKeys","keys","cacheMetasForProxies","WeakMap","limitedCacheUtil","init","getAll","remove","reset","doMaintenance","setOptions","getCacheMeta","getOptions","limitedCacheObject","Proxy","instance"],"mappings":"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"}
|
|
@@ -1,448 +0,0 @@
|
|
|
1
|
-
var CURRENT_META_VERSION = 2;
|
|
2
|
-
var MAXIMUM_CACHE_TIME = 365 * 86400 * 1000;
|
|
3
|
-
var defaultOptions = {
|
|
4
|
-
// Public
|
|
5
|
-
maxCacheSize: 100,
|
|
6
|
-
maxCacheTime: 86400 * 1000,
|
|
7
|
-
// Development-only
|
|
8
|
-
warnIfItemPurgedBeforeTime: 5000,
|
|
9
|
-
// Private
|
|
10
|
-
opLimit: 200,
|
|
11
|
-
scanLimit: 50
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
function _extends() {
|
|
15
|
-
_extends = Object.assign || function (target) {
|
|
16
|
-
for (var i = 1; i < arguments.length; i++) {
|
|
17
|
-
var source = arguments[i];
|
|
18
|
-
|
|
19
|
-
for (var key in source) {
|
|
20
|
-
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
21
|
-
target[key] = source[key];
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
return target;
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
return _extends.apply(this, arguments);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// To help minification
|
|
33
|
-
var objectCreate = Object.create,
|
|
34
|
-
objectAssign = Object.assign,
|
|
35
|
-
hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
36
|
-
var dateNow = Date.now;
|
|
37
|
-
|
|
38
|
-
/* Initialization and options */
|
|
39
|
-
|
|
40
|
-
var positiveNumberOrZero = function positiveNumberOrZero(value) {
|
|
41
|
-
return Math.max(value, 0) || 0;
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
var normalizeOptions = function normalizeOptions(cacheMetaOptions) {
|
|
45
|
-
objectAssign(cacheMetaOptions, {
|
|
46
|
-
maxCacheSize: positiveNumberOrZero(cacheMetaOptions.maxCacheSize),
|
|
47
|
-
maxCacheTime: positiveNumberOrZero(cacheMetaOptions.maxCacheTime),
|
|
48
|
-
opLimit: positiveNumberOrZero(cacheMetaOptions.opLimit)
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
52
|
-
cacheMetaOptions.warnIfItemPurgedBeforeTime = positiveNumberOrZero(cacheMetaOptions.warnIfItemPurgedBeforeTime);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
return cacheMetaOptions;
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
var isCacheMeta = function isCacheMeta(cacheMeta) {
|
|
59
|
-
return !!cacheMeta && !!cacheMeta.limitedCacheMetaVersion;
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
var upgradeCacheMeta = function upgradeCacheMeta(cacheMeta) {
|
|
63
|
-
if (!isCacheMeta(cacheMeta)) {
|
|
64
|
-
throw new Error('Limited-cache metadata is missing: please check your usage');
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
if (cacheMeta.limitedCacheMetaVersion !== CURRENT_META_VERSION) {
|
|
68
|
-
// Version is out of date! (Today the only prior version is 1)
|
|
69
|
-
// Version 1: Cache meta cannot be migrated because timestamps and keys are incompatible
|
|
70
|
-
console.warn('Limited-cache metadata is from an incompatible version (1). It must be reset.');
|
|
71
|
-
cacheMeta.limitedCacheMetaVersion = CURRENT_META_VERSION;
|
|
72
|
-
lowLevelReset(cacheMeta);
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
var lowLevelSetOptions = function lowLevelSetOptions(cacheMeta, options) {
|
|
77
|
-
upgradeCacheMeta(cacheMeta);
|
|
78
|
-
return normalizeOptions(objectAssign(cacheMeta.options, options));
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
var lowLevelInit = function lowLevelInit(optionsOrCacheMeta) {
|
|
82
|
-
if (isCacheMeta(optionsOrCacheMeta)) {
|
|
83
|
-
var existingCacheMeta = optionsOrCacheMeta;
|
|
84
|
-
upgradeCacheMeta(existingCacheMeta);
|
|
85
|
-
return existingCacheMeta;
|
|
86
|
-
} // Else: it's options
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
var fullOptions = normalizeOptions(_extends({}, defaultOptions, optionsOrCacheMeta)); // The cacheMeta is created once, and persists per instance
|
|
90
|
-
|
|
91
|
-
var newCacheMeta = lowLevelReset({
|
|
92
|
-
limitedCacheMetaVersion: CURRENT_META_VERSION,
|
|
93
|
-
options: fullOptions
|
|
94
|
-
});
|
|
95
|
-
return newCacheMeta;
|
|
96
|
-
};
|
|
97
|
-
/* Internal cache manipulation */
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
var _getExpireTime = function _getExpireTime(cacheMeta, cacheKey) {
|
|
101
|
-
var maxCacheTime = cacheMeta.options.maxCacheTime,
|
|
102
|
-
keyInfo = cacheMeta.keyInfo[cacheKey];
|
|
103
|
-
|
|
104
|
-
if (!keyInfo) {
|
|
105
|
-
// A missing record is always treated as expired
|
|
106
|
-
return 0;
|
|
107
|
-
} // If we have an exact expireTime then honor it. Otherwise it'll depend on the current maxCacheTime.
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
var setTime = keyInfo[0],
|
|
111
|
-
expireTime = keyInfo[1];
|
|
112
|
-
return expireTime || setTime + (maxCacheTime || MAXIMUM_CACHE_TIME);
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
var _cacheKeyHasExpired = function _cacheKeyHasExpired(cacheMeta, cacheKey, now) {
|
|
116
|
-
return _getExpireTime(cacheMeta, cacheKey) < now;
|
|
117
|
-
};
|
|
118
|
-
|
|
119
|
-
var lowLevelDoMaintenance = function lowLevelDoMaintenance(cacheMeta) {
|
|
120
|
-
upgradeCacheMeta(cacheMeta);
|
|
121
|
-
var cache = cacheMeta.cache,
|
|
122
|
-
keyList = cacheMeta.keyList,
|
|
123
|
-
keyInfo = cacheMeta.keyInfo;
|
|
124
|
-
var now = dateNow(); // Rebuild cache from keyList only, checking timestamps to auto-remove expired
|
|
125
|
-
|
|
126
|
-
var _keyList$reduce = keyList.reduce(function (acc, cacheKey) {
|
|
127
|
-
var accCache = acc[0],
|
|
128
|
-
accKeyList = acc[1],
|
|
129
|
-
accKeyInfo = acc[2];
|
|
130
|
-
|
|
131
|
-
if (!_cacheKeyHasExpired(cacheMeta, cacheKey, now)) {
|
|
132
|
-
accCache[cacheKey] = cache[cacheKey];
|
|
133
|
-
accKeyList.push(cacheKey);
|
|
134
|
-
accKeyInfo[cacheKey] = keyInfo[cacheKey];
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
return acc;
|
|
138
|
-
}, [{}, [], objectCreate(null)]),
|
|
139
|
-
newCache = _keyList$reduce[0],
|
|
140
|
-
newKeyList = _keyList$reduce[1],
|
|
141
|
-
newKeyInfo = _keyList$reduce[2];
|
|
142
|
-
|
|
143
|
-
return objectAssign(cacheMeta, {
|
|
144
|
-
cache: newCache,
|
|
145
|
-
keyList: newKeyList,
|
|
146
|
-
keyInfo: newKeyInfo,
|
|
147
|
-
opsLeft: cacheMeta.options.opLimit
|
|
148
|
-
});
|
|
149
|
-
};
|
|
150
|
-
|
|
151
|
-
var _removeFromIndex = function _removeFromIndex(cacheMeta, startIndex, now) {
|
|
152
|
-
var cache = cacheMeta.cache,
|
|
153
|
-
keyList = cacheMeta.keyList,
|
|
154
|
-
keyInfo = cacheMeta.keyInfo; // Always remove the item requested, and also remove any neighbors who have expired
|
|
155
|
-
|
|
156
|
-
var nextIndex = startIndex;
|
|
157
|
-
var nextCacheKey = keyList[startIndex];
|
|
158
|
-
var keyListLength = keyList.length;
|
|
159
|
-
|
|
160
|
-
do {
|
|
161
|
-
// Remove the 'next' item
|
|
162
|
-
cache[nextCacheKey] = keyInfo[nextCacheKey] = undefined; // Now advance and decide whether to keep going
|
|
163
|
-
|
|
164
|
-
nextIndex++;
|
|
165
|
-
nextCacheKey = keyList[nextIndex];
|
|
166
|
-
} while (nextIndex < keyListLength && _cacheKeyHasExpired(cacheMeta, nextCacheKey, now)); // Remove the index for everything from the startIndex until we stopped
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
keyList.splice(startIndex, nextIndex - startIndex);
|
|
170
|
-
};
|
|
171
|
-
|
|
172
|
-
var _removeItemsToMakeRoom = function _removeItemsToMakeRoom(cacheMeta, now) {
|
|
173
|
-
var _cacheMeta$options = cacheMeta.options,
|
|
174
|
-
scanLimit = _cacheMeta$options.scanLimit,
|
|
175
|
-
warnIfItemPurgedBeforeTime = _cacheMeta$options.warnIfItemPurgedBeforeTime,
|
|
176
|
-
cache = cacheMeta.cache,
|
|
177
|
-
keyList = cacheMeta.keyList,
|
|
178
|
-
keyInfo = cacheMeta.keyInfo; // These track the soonest-to-expire thing we've found. It may not actually be "oldest".
|
|
179
|
-
// By default we'll remove the item at the head of the queue, unless we find something better.
|
|
180
|
-
|
|
181
|
-
var oldestItemIndex = 0;
|
|
182
|
-
|
|
183
|
-
var oldestExpireTime = _getExpireTime(cacheMeta, keyList[0]);
|
|
184
|
-
|
|
185
|
-
if (oldestExpireTime > now) {
|
|
186
|
-
// The head of the list hasn't yet expired: scan for a better candidate to remove
|
|
187
|
-
var indexToCheck = 0;
|
|
188
|
-
var maxIndexToCheck = Math.min(keyList.length, scanLimit);
|
|
189
|
-
|
|
190
|
-
while (indexToCheck < maxIndexToCheck) {
|
|
191
|
-
var cacheKeyForIndex = keyList[indexToCheck];
|
|
192
|
-
|
|
193
|
-
var expireTimeForIndex = _getExpireTime(cacheMeta, cacheKeyForIndex); // We only consider it if it's eligible for expiration: otherwise it can't be a better option
|
|
194
|
-
// than the default head-of-queue
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
if (expireTimeForIndex < now) {
|
|
198
|
-
// We found an expired item! This wins automatically
|
|
199
|
-
oldestItemIndex = indexToCheck;
|
|
200
|
-
oldestExpireTime = 0;
|
|
201
|
-
break;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
if (expireTimeForIndex < oldestExpireTime) {
|
|
205
|
-
// We have a new leader
|
|
206
|
-
oldestItemIndex = indexToCheck;
|
|
207
|
-
oldestExpireTime = expireTimeForIndex;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
indexToCheck += 1;
|
|
211
|
-
}
|
|
212
|
-
} // Warn if the 'oldest' item is more recent than we'd like: this means it cycled into and out of
|
|
213
|
-
// cache too quickly for the cache to be useful.
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
if (process.env.NODE_ENV !== 'production' && warnIfItemPurgedBeforeTime && oldestExpireTime > now) {
|
|
217
|
-
var oldestItemKey = keyList[oldestItemIndex];
|
|
218
|
-
var _keyInfo$oldestItemKe = keyInfo[oldestItemKey],
|
|
219
|
-
oldestItemSetTime = _keyInfo$oldestItemKe[0],
|
|
220
|
-
oldestItemExpireTime = _keyInfo$oldestItemKe[1];
|
|
221
|
-
|
|
222
|
-
if (now - oldestItemSetTime < warnIfItemPurgedBeforeTime) {
|
|
223
|
-
console.warn('Purged an item from cache while it was still fresh: you may want to increase maxCacheSize', {
|
|
224
|
-
currentTime: now,
|
|
225
|
-
key: oldestItemKey,
|
|
226
|
-
item: cache[oldestItemKey],
|
|
227
|
-
setTime: oldestItemSetTime,
|
|
228
|
-
expireTime: oldestItemExpireTime,
|
|
229
|
-
timeInCache: now - oldestItemSetTime
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
|
-
} // Remove the oldest item we found, plus any expired neighbors
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
_removeFromIndex(cacheMeta, oldestItemIndex, now);
|
|
236
|
-
};
|
|
237
|
-
/* Accessors */
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
var lowLevelHas = function lowLevelHas(cacheMeta, cacheKey) {
|
|
241
|
-
upgradeCacheMeta(cacheMeta);
|
|
242
|
-
var cache = cacheMeta.cache;
|
|
243
|
-
|
|
244
|
-
if (hasOwnProperty.call(cache, cacheKey) && cache[cacheKey] !== undefined) {
|
|
245
|
-
if (!_cacheKeyHasExpired(cacheMeta, cacheKey, dateNow())) {
|
|
246
|
-
return true;
|
|
247
|
-
} // If it's expired, clear the value so that we can short-circuit future lookups
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
cache[cacheKey] = undefined;
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
return false;
|
|
254
|
-
};
|
|
255
|
-
|
|
256
|
-
var lowLevelGetOne = function lowLevelGetOne(cacheMeta, cacheKey) {
|
|
257
|
-
upgradeCacheMeta(cacheMeta);
|
|
258
|
-
|
|
259
|
-
if (lowLevelHas(cacheMeta, cacheKey)) {
|
|
260
|
-
return cacheMeta.cache[cacheKey];
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
return;
|
|
264
|
-
};
|
|
265
|
-
|
|
266
|
-
var lowLevelGetAll = function lowLevelGetAll(cacheMeta) {
|
|
267
|
-
upgradeCacheMeta(cacheMeta); // Remove all expired values, and return whatever's left
|
|
268
|
-
|
|
269
|
-
lowLevelDoMaintenance(cacheMeta); // Retype because there won't be any `undefined` values after doMaintenance
|
|
270
|
-
|
|
271
|
-
return cacheMeta.cache;
|
|
272
|
-
};
|
|
273
|
-
|
|
274
|
-
var lowLevelSet = function lowLevelSet(cacheMeta, cacheKey, item) {
|
|
275
|
-
upgradeCacheMeta(cacheMeta);
|
|
276
|
-
var maxCacheSize = cacheMeta.options.maxCacheSize,
|
|
277
|
-
keyList = cacheMeta.keyList,
|
|
278
|
-
keyInfo = cacheMeta.keyInfo;
|
|
279
|
-
var now = dateNow();
|
|
280
|
-
var isNew = !keyInfo[cacheKey];
|
|
281
|
-
|
|
282
|
-
if (cacheMeta.cache[cacheKey] !== item) {
|
|
283
|
-
var _extends2;
|
|
284
|
-
|
|
285
|
-
// The cache itself is immutable (but the rest of cacheMeta is not)
|
|
286
|
-
cacheMeta.cache = _extends({}, cacheMeta.cache, (_extends2 = {}, _extends2[cacheKey] = item, _extends2));
|
|
287
|
-
} // We've now set or updated it. Regardless of whether it's new, bump its set time
|
|
288
|
-
// @TODO: expireTime override
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
keyInfo[cacheKey] = [now, 0];
|
|
292
|
-
|
|
293
|
-
if (isNew) {
|
|
294
|
-
// It's a new key: grow the cache, then shrink it if we can
|
|
295
|
-
keyList.push(cacheKey);
|
|
296
|
-
cacheMeta.opsLeft--;
|
|
297
|
-
|
|
298
|
-
if (cacheMeta.opsLeft <= 0) {
|
|
299
|
-
// Time for an oil change
|
|
300
|
-
lowLevelDoMaintenance(cacheMeta);
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
if (maxCacheSize && cacheMeta.keyList.length > maxCacheSize) {
|
|
304
|
-
// We're still over the limit: drop at least one item
|
|
305
|
-
_removeItemsToMakeRoom(cacheMeta, now);
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
if (_cacheKeyHasExpired(cacheMeta, keyList[0], now)) {
|
|
310
|
-
// While we're here, if we need to expire the head of the queue then drop it
|
|
311
|
-
_removeFromIndex(cacheMeta, 0, now);
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
return cacheMeta;
|
|
315
|
-
};
|
|
316
|
-
|
|
317
|
-
var lowLevelRemove = function lowLevelRemove(cacheMeta, cacheKey) {
|
|
318
|
-
upgradeCacheMeta(cacheMeta);
|
|
319
|
-
var cache = cacheMeta.cache,
|
|
320
|
-
keyInfo = cacheMeta.keyInfo;
|
|
321
|
-
|
|
322
|
-
if (keyInfo[cacheKey]) {
|
|
323
|
-
if (cache[cacheKey] !== undefined) {
|
|
324
|
-
var _extends3;
|
|
325
|
-
|
|
326
|
-
cacheMeta.cache = _extends({}, cache, (_extends3 = {}, _extends3[cacheKey] = undefined, _extends3));
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
keyInfo[cacheKey] = undefined;
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
return cacheMeta;
|
|
333
|
-
};
|
|
334
|
-
|
|
335
|
-
var lowLevelReset = function lowLevelReset(cacheMeta) {
|
|
336
|
-
upgradeCacheMeta(cacheMeta);
|
|
337
|
-
return objectAssign(cacheMeta, {
|
|
338
|
-
cache: {},
|
|
339
|
-
keyList: [],
|
|
340
|
-
keyInfo: objectCreate(null),
|
|
341
|
-
opsLeft: cacheMeta.options.opLimit
|
|
342
|
-
});
|
|
343
|
-
};
|
|
344
|
-
|
|
345
|
-
// Doing this via a helper function makes the typeChecks easier, and minifies better.
|
|
346
|
-
|
|
347
|
-
var bindFunctionToCacheMeta = function bindFunctionToCacheMeta( // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
348
|
-
fn, cacheMeta) {
|
|
349
|
-
return fn.bind(null, cacheMeta);
|
|
350
|
-
};
|
|
351
|
-
|
|
352
|
-
var LimitedCache = function LimitedCache(options) {
|
|
353
|
-
var cacheMeta = lowLevelInit(options);
|
|
354
|
-
return {
|
|
355
|
-
get: bindFunctionToCacheMeta(lowLevelGetOne, cacheMeta),
|
|
356
|
-
getAll: bindFunctionToCacheMeta(lowLevelGetAll, cacheMeta),
|
|
357
|
-
has: bindFunctionToCacheMeta(lowLevelHas, cacheMeta),
|
|
358
|
-
set: function set(cacheKey, item) {
|
|
359
|
-
lowLevelSet(cacheMeta, cacheKey, item);
|
|
360
|
-
return item;
|
|
361
|
-
},
|
|
362
|
-
remove: function remove(cacheKey) {
|
|
363
|
-
lowLevelRemove(cacheMeta, cacheKey);
|
|
364
|
-
return true;
|
|
365
|
-
},
|
|
366
|
-
reset: bindFunctionToCacheMeta(lowLevelReset, cacheMeta),
|
|
367
|
-
getCacheMeta: function getCacheMeta() {
|
|
368
|
-
return cacheMeta;
|
|
369
|
-
},
|
|
370
|
-
getOptions: function getOptions() {
|
|
371
|
-
return cacheMeta.options;
|
|
372
|
-
},
|
|
373
|
-
setOptions: bindFunctionToCacheMeta(lowLevelSetOptions, cacheMeta),
|
|
374
|
-
doMaintenance: bindFunctionToCacheMeta(lowLevelDoMaintenance, cacheMeta)
|
|
375
|
-
};
|
|
376
|
-
};
|
|
377
|
-
|
|
378
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
379
|
-
|
|
380
|
-
var proxyHandler = {
|
|
381
|
-
get: function get(cacheMeta, cacheKey) {
|
|
382
|
-
if (cacheKey === 'hasOwnProperty') {
|
|
383
|
-
return hasOwnProperty;
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
return lowLevelGetOne(cacheMeta, cacheKey);
|
|
387
|
-
},
|
|
388
|
-
getOwnPropertyDescriptor: function getOwnPropertyDescriptor(cacheMeta, cacheKey) {
|
|
389
|
-
var hasResult = lowLevelHas(cacheMeta, cacheKey);
|
|
390
|
-
var getResult = lowLevelGetOne(cacheMeta, cacheKey);
|
|
391
|
-
|
|
392
|
-
if (hasResult) {
|
|
393
|
-
return {
|
|
394
|
-
configurable: true,
|
|
395
|
-
enumerable: hasResult,
|
|
396
|
-
value: getResult,
|
|
397
|
-
writable: true
|
|
398
|
-
};
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
return;
|
|
402
|
-
},
|
|
403
|
-
has: lowLevelHas,
|
|
404
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
405
|
-
set: function set(cacheMeta, cacheKey, item) {
|
|
406
|
-
lowLevelSet(cacheMeta, cacheKey, item);
|
|
407
|
-
return item;
|
|
408
|
-
},
|
|
409
|
-
deleteProperty: function deleteProperty(cacheMeta, cacheKey) {
|
|
410
|
-
lowLevelRemove(cacheMeta, cacheKey);
|
|
411
|
-
return true;
|
|
412
|
-
},
|
|
413
|
-
ownKeys: function ownKeys(cacheMeta) {
|
|
414
|
-
return Object.keys(lowLevelGetAll(cacheMeta));
|
|
415
|
-
}
|
|
416
|
-
};
|
|
417
|
-
/**
|
|
418
|
-
* So that we can retrieve the cacheMeta for a LimitedCacheObject, without polluting its properties, each proxy
|
|
419
|
-
* is associated back to its internal cacheMeta here.
|
|
420
|
-
*/
|
|
421
|
-
|
|
422
|
-
var cacheMetasForProxies = /*#__PURE__*/new WeakMap();
|
|
423
|
-
|
|
424
|
-
var LimitedCacheObject = function LimitedCacheObject(options) {
|
|
425
|
-
var cacheMeta = lowLevelInit(options);
|
|
426
|
-
var limitedCacheObject = new Proxy(cacheMeta, proxyHandler);
|
|
427
|
-
cacheMetasForProxies.set(limitedCacheObject, cacheMeta);
|
|
428
|
-
return limitedCacheObject;
|
|
429
|
-
};
|
|
430
|
-
|
|
431
|
-
var getCacheMetaFromObject = function getCacheMetaFromObject(instance) {
|
|
432
|
-
return cacheMetasForProxies.get(instance);
|
|
433
|
-
};
|
|
434
|
-
|
|
435
|
-
var limitedCacheUtil = {
|
|
436
|
-
init: lowLevelInit,
|
|
437
|
-
get: lowLevelGetOne,
|
|
438
|
-
getAll: lowLevelGetAll,
|
|
439
|
-
has: lowLevelHas,
|
|
440
|
-
set: lowLevelSet,
|
|
441
|
-
remove: lowLevelRemove,
|
|
442
|
-
reset: lowLevelReset,
|
|
443
|
-
doMaintenance: lowLevelDoMaintenance,
|
|
444
|
-
setOptions: lowLevelSetOptions
|
|
445
|
-
};
|
|
446
|
-
|
|
447
|
-
export { CURRENT_META_VERSION, LimitedCache, LimitedCacheObject, MAXIMUM_CACHE_TIME, defaultOptions, getCacheMetaFromObject, isCacheMeta, limitedCacheUtil, lowLevelDoMaintenance, lowLevelGetAll, lowLevelGetOne, lowLevelHas, lowLevelInit, lowLevelRemove, lowLevelReset, lowLevelSet, lowLevelSetOptions, upgradeCacheMeta };
|
|
448
|
-
//# sourceMappingURL=limited-cache.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"limited-cache.esm.js","sources":["../src/core/defaultOptions.ts","../src/core/builtIns.ts","../src/core/lowLevelFunctions.ts","../src/core/LimitedCache.ts","../src/core/LimitedCacheObject.ts","../src/core/limitedCacheUtil.ts"],"sourcesContent":["import { LimitedCacheOptionsReadonly } from '../types';\n\nconst CURRENT_META_VERSION = 2;\nconst MAXIMUM_CACHE_TIME = 365 * 86400 * 1000;\n\nconst defaultOptions: LimitedCacheOptionsReadonly = {\n // Public\n maxCacheSize: 100,\n maxCacheTime: 86400 * 1000,\n // Development-only\n warnIfItemPurgedBeforeTime: 5000,\n // Private\n opLimit: 200,\n scanLimit: 50,\n};\n\nexport { CURRENT_META_VERSION, MAXIMUM_CACHE_TIME, defaultOptions };\n","// To help minification\nconst {\n create: objectCreate,\n assign: objectAssign,\n prototype: { hasOwnProperty },\n} = Object;\nconst dateNow = Date.now;\n\nexport { objectAssign, objectCreate, dateNow, hasOwnProperty };\n","import { objectAssign, objectCreate, dateNow, hasOwnProperty } from './builtIns';\nimport { CURRENT_META_VERSION, MAXIMUM_CACHE_TIME, defaultOptions } from './defaultOptions';\nimport {\n LimitedCacheOptions,\n LimitedCacheOptionsReadonly,\n LimitedCacheMeta,\n LimitedCacheOptionsFull,\n DefaultItemType,\n} from '../types';\n\n/* Initialization and options */\n\nconst positiveNumberOrZero = (value: number): number => Math.max(value, 0) || 0;\n\nconst normalizeOptions = (cacheMetaOptions: LimitedCacheOptionsFull): LimitedCacheOptionsFull => {\n objectAssign(cacheMetaOptions, {\n maxCacheSize: positiveNumberOrZero(cacheMetaOptions.maxCacheSize),\n maxCacheTime: positiveNumberOrZero(cacheMetaOptions.maxCacheTime),\n opLimit: positiveNumberOrZero(cacheMetaOptions.opLimit),\n });\n\n if (process.env.NODE_ENV !== 'production') {\n cacheMetaOptions.warnIfItemPurgedBeforeTime = positiveNumberOrZero(\n cacheMetaOptions.warnIfItemPurgedBeforeTime,\n );\n }\n return cacheMetaOptions;\n};\n\nconst isCacheMeta = (cacheMeta: LimitedCacheMeta): boolean => {\n return !!cacheMeta && !!cacheMeta.limitedCacheMetaVersion;\n};\n\nconst upgradeCacheMeta = (cacheMeta: LimitedCacheMeta): void => {\n if (!isCacheMeta(cacheMeta)) {\n throw new Error('Limited-cache metadata is missing: please check your usage');\n }\n if (cacheMeta.limitedCacheMetaVersion !== CURRENT_META_VERSION) {\n // Version is out of date! (Today the only prior version is 1)\n // Version 1: Cache meta cannot be migrated because timestamps and keys are incompatible\n console.warn('Limited-cache metadata is from an incompatible version (1). It must be reset.');\n cacheMeta.limitedCacheMetaVersion = CURRENT_META_VERSION;\n lowLevelReset(cacheMeta);\n }\n};\n\nconst lowLevelSetOptions = <ItemType = DefaultItemType>(\n cacheMeta: LimitedCacheMeta<ItemType>,\n options: LimitedCacheOptions,\n): LimitedCacheOptionsReadonly => {\n upgradeCacheMeta(cacheMeta);\n return normalizeOptions(objectAssign(cacheMeta.options, options));\n};\n\nconst lowLevelInit = <ItemType = DefaultItemType>(\n optionsOrCacheMeta?: LimitedCacheOptions | LimitedCacheMeta<ItemType>,\n): LimitedCacheMeta<ItemType> => {\n if (isCacheMeta(optionsOrCacheMeta as LimitedCacheMeta<ItemType>)) {\n const existingCacheMeta = optionsOrCacheMeta as LimitedCacheMeta<ItemType>;\n upgradeCacheMeta(existingCacheMeta);\n return existingCacheMeta;\n }\n // Else: it's options\n const fullOptions = normalizeOptions({ ...defaultOptions, ...optionsOrCacheMeta });\n\n // The cacheMeta is created once, and persists per instance\n const newCacheMeta = lowLevelReset({\n limitedCacheMetaVersion: CURRENT_META_VERSION,\n options: fullOptions,\n } as LimitedCacheMeta<ItemType>);\n\n return newCacheMeta;\n};\n\n/* Internal cache manipulation */\n\nconst _getExpireTime = (cacheMeta: LimitedCacheMeta, cacheKey: string): number => {\n const {\n options: { maxCacheTime },\n keyInfo: { [cacheKey]: keyInfo },\n } = cacheMeta;\n if (!keyInfo) {\n // A missing record is always treated as expired\n return 0;\n }\n // If we have an exact expireTime then honor it. Otherwise it'll depend on the current maxCacheTime.\n const [setTime, expireTime] = keyInfo;\n return expireTime || setTime + (maxCacheTime || MAXIMUM_CACHE_TIME);\n};\n\nconst _cacheKeyHasExpired = (\n cacheMeta: LimitedCacheMeta,\n cacheKey: string,\n now: number,\n): boolean => {\n return _getExpireTime(cacheMeta, cacheKey) < now;\n};\n\nconst lowLevelDoMaintenance = <ItemType = DefaultItemType>(\n cacheMeta: LimitedCacheMeta<ItemType>,\n): LimitedCacheMeta<ItemType> => {\n upgradeCacheMeta(cacheMeta);\n const { cache, keyList, keyInfo } = cacheMeta;\n const now = dateNow();\n\n // Rebuild cache from keyList only, checking timestamps to auto-remove expired\n const [newCache, newKeyList, newKeyInfo] = keyList.reduce(\n (acc, cacheKey) => {\n const [accCache, accKeyList, accKeyInfo] = acc;\n if (!_cacheKeyHasExpired(cacheMeta, cacheKey, now)) {\n accCache[cacheKey] = cache[cacheKey];\n accKeyList.push(cacheKey);\n accKeyInfo[cacheKey] = keyInfo[cacheKey];\n }\n return acc;\n },\n [\n {} as typeof cacheMeta['cache'],\n [] as typeof cacheMeta['keyList'],\n objectCreate(null) as typeof cacheMeta['keyInfo'],\n ],\n );\n\n return objectAssign(cacheMeta, {\n cache: newCache,\n keyList: newKeyList,\n keyInfo: newKeyInfo,\n opsLeft: cacheMeta.options.opLimit,\n });\n};\n\nconst _removeFromIndex = (cacheMeta: LimitedCacheMeta, startIndex: number, now: number): void => {\n const { cache, keyList, keyInfo } = cacheMeta;\n\n // Always remove the item requested, and also remove any neighbors who have expired\n let nextIndex = startIndex;\n let nextCacheKey = keyList[startIndex];\n const keyListLength = keyList.length;\n do {\n // Remove the 'next' item\n\n cache[nextCacheKey] = keyInfo[nextCacheKey] = undefined;\n\n // Now advance and decide whether to keep going\n nextIndex++;\n nextCacheKey = keyList[nextIndex];\n } while (nextIndex < keyListLength && _cacheKeyHasExpired(cacheMeta, nextCacheKey, now));\n\n // Remove the index for everything from the startIndex until we stopped\n keyList.splice(startIndex, nextIndex - startIndex);\n};\n\nconst _removeItemsToMakeRoom = (cacheMeta: LimitedCacheMeta, now: number): void => {\n const {\n options: { scanLimit, warnIfItemPurgedBeforeTime },\n cache,\n keyList,\n keyInfo,\n } = cacheMeta;\n\n // These track the soonest-to-expire thing we've found. It may not actually be \"oldest\".\n // By default we'll remove the item at the head of the queue, unless we find something better.\n let oldestItemIndex = 0;\n let oldestExpireTime = _getExpireTime(cacheMeta, keyList[0]);\n\n if (oldestExpireTime > now) {\n // The head of the list hasn't yet expired: scan for a better candidate to remove\n let indexToCheck = 0;\n const maxIndexToCheck = Math.min(keyList.length, scanLimit);\n while (indexToCheck < maxIndexToCheck) {\n const cacheKeyForIndex = keyList[indexToCheck];\n let expireTimeForIndex = _getExpireTime(cacheMeta, cacheKeyForIndex);\n\n // We only consider it if it's eligible for expiration: otherwise it can't be a better option\n // than the default head-of-queue\n if (expireTimeForIndex < now) {\n // We found an expired item! This wins automatically\n oldestItemIndex = indexToCheck;\n oldestExpireTime = 0;\n break;\n }\n if (expireTimeForIndex < oldestExpireTime) {\n // We have a new leader\n oldestItemIndex = indexToCheck;\n oldestExpireTime = expireTimeForIndex;\n }\n indexToCheck += 1;\n }\n }\n\n // Warn if the 'oldest' item is more recent than we'd like: this means it cycled into and out of\n // cache too quickly for the cache to be useful.\n if (\n process.env.NODE_ENV !== 'production' &&\n warnIfItemPurgedBeforeTime &&\n oldestExpireTime > now\n ) {\n const oldestItemKey = keyList[oldestItemIndex];\n const [oldestItemSetTime, oldestItemExpireTime] = keyInfo[oldestItemKey]!;\n\n if (now - oldestItemSetTime < warnIfItemPurgedBeforeTime) {\n console.warn(\n 'Purged an item from cache while it was still fresh: you may want to increase maxCacheSize',\n {\n currentTime: now,\n key: oldestItemKey,\n item: cache[oldestItemKey],\n setTime: oldestItemSetTime,\n expireTime: oldestItemExpireTime,\n timeInCache: now - oldestItemSetTime,\n },\n );\n }\n }\n\n // Remove the oldest item we found, plus any expired neighbors\n _removeFromIndex(cacheMeta, oldestItemIndex, now);\n};\n\n/* Accessors */\n\nconst lowLevelHas = <ItemType = DefaultItemType>(\n cacheMeta: LimitedCacheMeta<ItemType>,\n cacheKey: string,\n): boolean => {\n upgradeCacheMeta(cacheMeta);\n const { cache } = cacheMeta;\n if (hasOwnProperty.call(cache, cacheKey) && cache[cacheKey] !== undefined) {\n if (!_cacheKeyHasExpired(cacheMeta, cacheKey, dateNow())) {\n return true;\n }\n // If it's expired, clear the value so that we can short-circuit future lookups\n cache[cacheKey] = undefined;\n }\n return false;\n};\n\nconst lowLevelGetOne = <ItemType = DefaultItemType>(\n cacheMeta: LimitedCacheMeta<ItemType>,\n cacheKey: string,\n): ItemType | undefined => {\n upgradeCacheMeta(cacheMeta);\n if (lowLevelHas(cacheMeta, cacheKey)) {\n return cacheMeta.cache[cacheKey];\n }\n return;\n};\n\nconst lowLevelGetAll = <ItemType = DefaultItemType>(\n cacheMeta: LimitedCacheMeta<ItemType>,\n): Record<string, ItemType> => {\n upgradeCacheMeta(cacheMeta);\n // Remove all expired values, and return whatever's left\n lowLevelDoMaintenance(cacheMeta);\n // Retype because there won't be any `undefined` values after doMaintenance\n return cacheMeta.cache as Record<string, ItemType>;\n};\n\nconst lowLevelSet = <ItemType = DefaultItemType>(\n cacheMeta: LimitedCacheMeta<ItemType>,\n cacheKey: string,\n item: ItemType,\n): LimitedCacheMeta<ItemType> => {\n upgradeCacheMeta(cacheMeta);\n\n const {\n options: { maxCacheSize },\n keyList,\n keyInfo,\n } = cacheMeta;\n\n const now = dateNow();\n const isNew = !keyInfo[cacheKey];\n\n if (cacheMeta.cache[cacheKey] !== item) {\n // The cache itself is immutable (but the rest of cacheMeta is not)\n cacheMeta.cache = {\n ...cacheMeta.cache,\n [cacheKey]: item,\n };\n }\n // We've now set or updated it. Regardless of whether it's new, bump its set time\n // @TODO: expireTime override\n keyInfo[cacheKey] = [now, 0];\n\n if (isNew) {\n // It's a new key: grow the cache, then shrink it if we can\n keyList.push(cacheKey);\n\n cacheMeta.opsLeft--;\n if (cacheMeta.opsLeft <= 0) {\n // Time for an oil change\n lowLevelDoMaintenance(cacheMeta);\n }\n\n if (maxCacheSize && cacheMeta.keyList.length > maxCacheSize) {\n // We're still over the limit: drop at least one item\n _removeItemsToMakeRoom(cacheMeta, now);\n }\n }\n\n if (_cacheKeyHasExpired(cacheMeta, keyList[0], now)) {\n // While we're here, if we need to expire the head of the queue then drop it\n _removeFromIndex(cacheMeta, 0, now);\n }\n\n return cacheMeta;\n};\n\nconst lowLevelRemove = <ItemType = DefaultItemType>(\n cacheMeta: LimitedCacheMeta<ItemType>,\n cacheKey: string,\n): LimitedCacheMeta<ItemType> => {\n upgradeCacheMeta(cacheMeta);\n const { cache, keyInfo } = cacheMeta;\n\n if (keyInfo[cacheKey]) {\n if (cache[cacheKey] !== undefined) {\n cacheMeta.cache = {\n ...cache,\n [cacheKey]: undefined,\n };\n }\n keyInfo[cacheKey] = undefined;\n }\n\n return cacheMeta;\n};\n\nconst lowLevelReset = <ItemType = DefaultItemType>(\n cacheMeta: LimitedCacheMeta<ItemType>,\n): LimitedCacheMeta<ItemType> => {\n upgradeCacheMeta(cacheMeta);\n return objectAssign(cacheMeta, {\n cache: {},\n keyList: [],\n keyInfo: objectCreate(null),\n opsLeft: cacheMeta.options.opLimit,\n });\n};\n\nexport {\n isCacheMeta,\n upgradeCacheMeta,\n lowLevelInit,\n lowLevelGetOne,\n lowLevelGetAll,\n lowLevelHas,\n lowLevelSet,\n lowLevelRemove,\n lowLevelReset,\n lowLevelDoMaintenance,\n lowLevelSetOptions,\n};\n","import {\n lowLevelInit,\n lowLevelGetOne,\n lowLevelGetAll,\n lowLevelHas,\n lowLevelSet,\n lowLevelRemove,\n lowLevelReset,\n lowLevelSetOptions,\n lowLevelDoMaintenance,\n} from './lowLevelFunctions';\nimport {\n LimitedCacheOptions,\n LimitedCacheOptionsReadonly,\n LimitedCacheInstance,\n LimitedCacheMeta,\n DefaultItemType,\n} from '../types';\n\n// Most public functions just call a low-level function directly, passing the cacheMeta.\n// Doing this via a helper function makes the typeChecks easier, and minifies better.\nconst bindFunctionToCacheMeta = <ItemType>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fn: (cacheMeta: LimitedCacheMeta<ItemType>, ...otherArgs: any) => any,\n cacheMeta: LimitedCacheMeta<ItemType>,\n) => fn.bind(null, cacheMeta);\n\nconst LimitedCache = <ItemType = DefaultItemType>(\n options?: LimitedCacheOptions,\n): LimitedCacheInstance<ItemType> => {\n const cacheMeta = lowLevelInit<ItemType>(options);\n\n return {\n get: bindFunctionToCacheMeta<ItemType>(lowLevelGetOne, cacheMeta),\n getAll: bindFunctionToCacheMeta<ItemType>(lowLevelGetAll, cacheMeta),\n has: bindFunctionToCacheMeta<ItemType>(lowLevelHas, cacheMeta),\n set: (cacheKey, item): ItemType => {\n lowLevelSet(cacheMeta, cacheKey, item);\n return item;\n },\n remove: (cacheKey): true => {\n lowLevelRemove(cacheMeta, cacheKey);\n return true;\n },\n reset: bindFunctionToCacheMeta<ItemType>(lowLevelReset, cacheMeta),\n getCacheMeta: (): LimitedCacheMeta<ItemType> => cacheMeta,\n getOptions: (): LimitedCacheOptionsReadonly => cacheMeta.options,\n setOptions: bindFunctionToCacheMeta<ItemType>(lowLevelSetOptions, cacheMeta),\n doMaintenance: bindFunctionToCacheMeta<ItemType>(lowLevelDoMaintenance, cacheMeta),\n };\n};\n\nexport { LimitedCache };\n","import { hasOwnProperty } from './builtIns';\nimport {\n lowLevelInit,\n lowLevelGetOne,\n lowLevelGetAll,\n lowLevelHas,\n lowLevelSet,\n lowLevelRemove,\n} from './lowLevelFunctions';\nimport {\n LimitedCacheOptions,\n LimitedCacheObjectInstance,\n LimitedCacheMeta,\n DefaultItemType,\n} from '../types';\n\n// The `any` here doesn't escape out anywhere: it's overridden by the constructor below\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst proxyHandler: ProxyHandler<LimitedCacheObjectInstance<any>> = {\n get: (cacheMeta: LimitedCacheMeta, cacheKey: string) => {\n if (cacheKey === 'hasOwnProperty') {\n return hasOwnProperty;\n }\n return lowLevelGetOne(cacheMeta, cacheKey);\n },\n getOwnPropertyDescriptor: (cacheMeta: LimitedCacheMeta, cacheKey: string) => {\n const hasResult = lowLevelHas(cacheMeta, cacheKey);\n const getResult = lowLevelGetOne(cacheMeta, cacheKey);\n\n if (hasResult) {\n return {\n configurable: true,\n enumerable: hasResult,\n value: getResult,\n writable: true,\n };\n }\n return;\n },\n has: lowLevelHas,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n set: (cacheMeta: LimitedCacheMeta, cacheKey: string, item: any): any => {\n lowLevelSet(cacheMeta, cacheKey, item);\n return item;\n },\n deleteProperty: (cacheMeta: LimitedCacheMeta, cacheKey: string): true => {\n lowLevelRemove(cacheMeta, cacheKey);\n return true;\n },\n ownKeys: (cacheMeta: LimitedCacheMeta) => Object.keys(lowLevelGetAll(cacheMeta)),\n};\n\n/**\n * So that we can retrieve the cacheMeta for a LimitedCacheObject, without polluting its properties, each proxy\n * is associated back to its internal cacheMeta here.\n */\nconst cacheMetasForProxies = new WeakMap();\n\nconst LimitedCacheObject = <ItemType = DefaultItemType>(\n options?: LimitedCacheOptions,\n): LimitedCacheObjectInstance<ItemType> => {\n const cacheMeta = lowLevelInit(options);\n const limitedCacheObject = new Proxy(cacheMeta, proxyHandler);\n\n cacheMetasForProxies.set(limitedCacheObject, cacheMeta);\n return limitedCacheObject;\n};\n\nconst getCacheMetaFromObject = (instance: LimitedCacheObjectInstance): LimitedCacheMeta => {\n return cacheMetasForProxies.get(instance);\n};\n\nexport { LimitedCacheObject, getCacheMetaFromObject };\n","import {\n lowLevelGetOne,\n lowLevelGetAll,\n lowLevelHas,\n lowLevelInit,\n lowLevelDoMaintenance,\n lowLevelRemove,\n lowLevelReset,\n lowLevelSet,\n lowLevelSetOptions,\n} from './lowLevelFunctions';\n\nconst limitedCacheUtil = {\n init: lowLevelInit,\n get: lowLevelGetOne,\n getAll: lowLevelGetAll,\n has: lowLevelHas,\n set: lowLevelSet,\n remove: lowLevelRemove,\n reset: lowLevelReset,\n doMaintenance: lowLevelDoMaintenance,\n setOptions: lowLevelSetOptions,\n};\n\nexport { limitedCacheUtil };\n"],"names":["CURRENT_META_VERSION","MAXIMUM_CACHE_TIME","defaultOptions","maxCacheSize","maxCacheTime","warnIfItemPurgedBeforeTime","opLimit","scanLimit","objectCreate","Object","create","objectAssign","assign","hasOwnProperty","prototype","dateNow","Date","now","positiveNumberOrZero","value","Math","max","normalizeOptions","cacheMetaOptions","process","env","NODE_ENV","isCacheMeta","cacheMeta","limitedCacheMetaVersion","upgradeCacheMeta","Error","console","warn","lowLevelReset","lowLevelSetOptions","options","lowLevelInit","optionsOrCacheMeta","existingCacheMeta","fullOptions","newCacheMeta","_getExpireTime","cacheKey","keyInfo","setTime","expireTime","_cacheKeyHasExpired","lowLevelDoMaintenance","cache","keyList","reduce","acc","accCache","accKeyList","accKeyInfo","push","newCache","newKeyList","newKeyInfo","opsLeft","_removeFromIndex","startIndex","nextIndex","nextCacheKey","keyListLength","length","undefined","splice","_removeItemsToMakeRoom","oldestItemIndex","oldestExpireTime","indexToCheck","maxIndexToCheck","min","cacheKeyForIndex","expireTimeForIndex","oldestItemKey","oldestItemSetTime","oldestItemExpireTime","currentTime","key","item","timeInCache","lowLevelHas","call","lowLevelGetOne","lowLevelGetAll","lowLevelSet","isNew","lowLevelRemove","bindFunctionToCacheMeta","fn","bind","LimitedCache","get","getAll","has","set","remove","reset","getCacheMeta","getOptions","setOptions","doMaintenance","proxyHandler","getOwnPropertyDescriptor","hasResult","getResult","configurable","enumerable","writable","deleteProperty","ownKeys","keys","cacheMetasForProxies","WeakMap","LimitedCacheObject","limitedCacheObject","Proxy","getCacheMetaFromObject","instance","limitedCacheUtil","init"],"mappings":"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"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { LimitedCacheObjectInstance, LimitedCacheMeta } from '../types';
|
|
2
|
-
declare const LimitedCacheObject: <ItemType = any>(options?: Partial<import("../types").LimitedCacheOptionsFull> | null | undefined) => LimitedCacheObjectInstance<ItemType>;
|
|
3
|
-
declare const getCacheMetaFromObject: (instance: LimitedCacheObjectInstance) => LimitedCacheMeta;
|
|
4
|
-
export { LimitedCacheObject, getCacheMetaFromObject };
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
declare const objectCreate: {
|
|
2
|
-
(o: object | null): any;
|
|
3
|
-
(o: object | null, properties: PropertyDescriptorMap & ThisType<any>): any;
|
|
4
|
-
}, objectAssign: {
|
|
5
|
-
<T, U>(target: T, source: U): T & U;
|
|
6
|
-
<T_1, U_1, V>(target: T_1, source1: U_1, source2: V): T_1 & U_1 & V;
|
|
7
|
-
<T_2, U_2, V_1, W>(target: T_2, source1: U_2, source2: V_1, source3: W): T_2 & U_2 & V_1 & W;
|
|
8
|
-
(target: object, ...sources: any[]): any;
|
|
9
|
-
}, hasOwnProperty: (v: string | number | symbol) => boolean;
|
|
10
|
-
declare const dateNow: () => number;
|
|
11
|
-
export { objectAssign, objectCreate, dateNow, hasOwnProperty };
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { LimitedCacheOptionsReadonly } from '../types';
|
|
2
|
-
declare const CURRENT_META_VERSION = 2;
|
|
3
|
-
declare const MAXIMUM_CACHE_TIME: number;
|
|
4
|
-
declare const defaultOptions: LimitedCacheOptionsReadonly;
|
|
5
|
-
export { CURRENT_META_VERSION, MAXIMUM_CACHE_TIME, defaultOptions };
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
declare const limitedCacheUtil: {
|
|
2
|
-
init: <ItemType = any>(optionsOrCacheMeta?: Partial<import("..").LimitedCacheOptionsFull> | import("..").LimitedCacheMeta<ItemType> | null | undefined) => import("..").LimitedCacheMeta<ItemType>;
|
|
3
|
-
get: <ItemType_1 = any>(cacheMeta: import("..").LimitedCacheMeta<ItemType_1>, cacheKey: string) => ItemType_1 | undefined;
|
|
4
|
-
getAll: <ItemType_2 = any>(cacheMeta: import("..").LimitedCacheMeta<ItemType_2>) => Record<string, ItemType_2>;
|
|
5
|
-
has: <ItemType_3 = any>(cacheMeta: import("..").LimitedCacheMeta<ItemType_3>, cacheKey: string) => boolean;
|
|
6
|
-
set: <ItemType_4 = any>(cacheMeta: import("..").LimitedCacheMeta<ItemType_4>, cacheKey: string, item: ItemType_4) => import("..").LimitedCacheMeta<ItemType_4>;
|
|
7
|
-
remove: <ItemType_5 = any>(cacheMeta: import("..").LimitedCacheMeta<ItemType_5>, cacheKey: string) => import("..").LimitedCacheMeta<ItemType_5>;
|
|
8
|
-
reset: <ItemType_6 = any>(cacheMeta: import("..").LimitedCacheMeta<ItemType_6>) => import("..").LimitedCacheMeta<ItemType_6>;
|
|
9
|
-
doMaintenance: <ItemType_7 = any>(cacheMeta: import("..").LimitedCacheMeta<ItemType_7>) => import("..").LimitedCacheMeta<ItemType_7>;
|
|
10
|
-
setOptions: <ItemType_8 = any>(cacheMeta: import("..").LimitedCacheMeta<ItemType_8>, options: import("..").LimitedCacheOptions) => Readonly<import("..").LimitedCacheOptionsFull>;
|
|
11
|
-
};
|
|
12
|
-
export { limitedCacheUtil };
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { LimitedCacheOptions, LimitedCacheOptionsReadonly, LimitedCacheMeta, LimitedCacheOptionsFull } from '../types';
|
|
2
|
-
declare const isCacheMeta: (cacheMeta: LimitedCacheMeta) => boolean;
|
|
3
|
-
declare const upgradeCacheMeta: (cacheMeta: LimitedCacheMeta) => void;
|
|
4
|
-
declare const lowLevelSetOptions: <ItemType = any>(cacheMeta: LimitedCacheMeta<ItemType>, options: LimitedCacheOptions) => LimitedCacheOptionsReadonly;
|
|
5
|
-
declare const lowLevelInit: <ItemType = any>(optionsOrCacheMeta?: Partial<LimitedCacheOptionsFull> | LimitedCacheMeta<ItemType> | null | undefined) => LimitedCacheMeta<ItemType>;
|
|
6
|
-
declare const lowLevelDoMaintenance: <ItemType = any>(cacheMeta: LimitedCacheMeta<ItemType>) => LimitedCacheMeta<ItemType>;
|
|
7
|
-
declare const lowLevelHas: <ItemType = any>(cacheMeta: LimitedCacheMeta<ItemType>, cacheKey: string) => boolean;
|
|
8
|
-
declare const lowLevelGetOne: <ItemType = any>(cacheMeta: LimitedCacheMeta<ItemType>, cacheKey: string) => ItemType | undefined;
|
|
9
|
-
declare const lowLevelGetAll: <ItemType = any>(cacheMeta: LimitedCacheMeta<ItemType>) => Record<string, ItemType>;
|
|
10
|
-
declare const lowLevelSet: <ItemType = any>(cacheMeta: LimitedCacheMeta<ItemType>, cacheKey: string, item: ItemType) => LimitedCacheMeta<ItemType>;
|
|
11
|
-
declare const lowLevelRemove: <ItemType = any>(cacheMeta: LimitedCacheMeta<ItemType>, cacheKey: string) => LimitedCacheMeta<ItemType>;
|
|
12
|
-
declare const lowLevelReset: <ItemType = any>(cacheMeta: LimitedCacheMeta<ItemType>) => LimitedCacheMeta<ItemType>;
|
|
13
|
-
export { isCacheMeta, upgradeCacheMeta, lowLevelInit, lowLevelGetOne, lowLevelGetAll, lowLevelHas, lowLevelSet, lowLevelRemove, lowLevelReset, lowLevelDoMaintenance, lowLevelSetOptions, };
|