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.
Files changed (68) hide show
  1. package/CHANGELOG.md +13 -1
  2. package/CODE_OF_CONDUCT.md +103 -47
  3. package/{CONTRIBUTING.md → CONTRIBUTING.template.md} +4 -2
  4. package/README.md +2 -2
  5. package/dist/core/LimitedCache.d.ts +4 -3
  6. package/dist/core/LimitedCache.d.ts.map +1 -0
  7. package/dist/core/LimitedCache.js +29 -0
  8. package/dist/core/LimitedCache.js.map +1 -0
  9. package/dist/core/LimitedCacheObject.d.ts +5 -4
  10. package/dist/core/LimitedCacheObject.d.ts.map +1 -0
  11. package/dist/core/LimitedCacheObject.js +52 -0
  12. package/dist/core/LimitedCacheObject.js.map +1 -0
  13. package/dist/core/builtIns.d.ts +12 -11
  14. package/dist/core/builtIns.d.ts.map +1 -0
  15. package/dist/core/builtIns.js +5 -0
  16. package/dist/core/builtIns.js.map +1 -0
  17. package/dist/core/defaultOptions.d.ts +6 -5
  18. package/dist/core/defaultOptions.d.ts.map +1 -0
  19. package/dist/core/defaultOptions.js +14 -0
  20. package/dist/core/defaultOptions.js.map +1 -0
  21. package/dist/core/limitedCacheUtil.d.ts +13 -12
  22. package/dist/core/limitedCacheUtil.d.ts.map +1 -0
  23. package/dist/core/limitedCacheUtil.js +14 -0
  24. package/dist/core/limitedCacheUtil.js.map +1 -0
  25. package/dist/core/lowLevelFunctions.d.ts +14 -13
  26. package/dist/core/lowLevelFunctions.d.ts.map +1 -0
  27. package/dist/core/lowLevelFunctions.js +240 -0
  28. package/dist/core/lowLevelFunctions.js.map +1 -0
  29. package/dist/index.cjs +388 -0
  30. package/dist/index.d.ts +7 -6
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +7 -8
  33. package/dist/index.js.map +1 -0
  34. package/dist/types.d.ts +58 -60
  35. package/dist/types.d.ts.map +1 -0
  36. package/dist/types.js +2 -0
  37. package/dist/types.js.map +1 -0
  38. package/package.json +82 -74
  39. package/src/__tests__/LimitedCache.test.ts +8 -8
  40. package/src/__tests__/LimitedCacheObject.test.ts +9 -7
  41. package/src/__tests__/lowLevelFunctions.test.ts +20 -16
  42. package/src/__tests__/scenarios/keys.test.ts +2 -2
  43. package/src/__tests__/scenarios/maxCacheSize.test.ts +4 -4
  44. package/src/__tests__/scenarios/maxCacheTime.test.ts +3 -3
  45. package/src/__tests__/scenarios/values.test.ts +2 -2
  46. package/src/__tests__/typeChecks/LimitedCacheObjectTypes.test.ts +5 -3
  47. package/src/__tests__/typeChecks/LimitedCacheTypes.test.ts +5 -3
  48. package/src/__tests__/typeChecks/lowLevelFunctionsTypes.test.ts +5 -3
  49. package/src/core/LimitedCache.ts +2 -2
  50. package/src/core/LimitedCacheObject.ts +3 -3
  51. package/src/core/defaultOptions.ts +1 -1
  52. package/src/core/limitedCacheUtil.ts +1 -1
  53. package/src/core/lowLevelFunctions.ts +8 -8
  54. package/src/index.ts +6 -6
  55. package/dist/limited-cache.cjs.development.js +0 -469
  56. package/dist/limited-cache.cjs.development.js.map +0 -1
  57. package/dist/limited-cache.cjs.production.min.js +0 -2
  58. package/dist/limited-cache.cjs.production.min.js.map +0 -1
  59. package/dist/limited-cache.esm.js +0 -448
  60. package/dist/limited-cache.esm.js.map +0 -1
  61. package/legacy-types/ts3.x/dist/core/LimitedCache.d.ts +0 -3
  62. package/legacy-types/ts3.x/dist/core/LimitedCacheObject.d.ts +0 -4
  63. package/legacy-types/ts3.x/dist/core/builtIns.d.ts +0 -11
  64. package/legacy-types/ts3.x/dist/core/defaultOptions.d.ts +0 -5
  65. package/legacy-types/ts3.x/dist/core/limitedCacheUtil.d.ts +0 -12
  66. package/legacy-types/ts3.x/dist/core/lowLevelFunctions.d.ts +0 -13
  67. package/legacy-types/ts3.x/dist/index.d.ts +0 -6
  68. package/legacy-types/ts3.x/dist/types.d.ts +0 -60
@@ -0,0 +1,240 @@
1
+ import { objectAssign, objectCreate, dateNow, hasOwnProperty } from './builtIns.js';
2
+ import { CURRENT_META_VERSION, MAXIMUM_CACHE_TIME, defaultOptions } from './defaultOptions.js';
3
+ /* Initialization and options */
4
+ const positiveNumberOrZero = (value) => Math.max(value, 0) || 0;
5
+ const normalizeOptions = (cacheMetaOptions) => {
6
+ objectAssign(cacheMetaOptions, {
7
+ maxCacheSize: positiveNumberOrZero(cacheMetaOptions.maxCacheSize),
8
+ maxCacheTime: positiveNumberOrZero(cacheMetaOptions.maxCacheTime),
9
+ opLimit: positiveNumberOrZero(cacheMetaOptions.opLimit),
10
+ });
11
+ if (process.env.NODE_ENV !== 'production') {
12
+ cacheMetaOptions.warnIfItemPurgedBeforeTime = positiveNumberOrZero(cacheMetaOptions.warnIfItemPurgedBeforeTime);
13
+ }
14
+ return cacheMetaOptions;
15
+ };
16
+ const isCacheMeta = (cacheMeta) => {
17
+ return !!cacheMeta && !!cacheMeta.limitedCacheMetaVersion;
18
+ };
19
+ const upgradeCacheMeta = (cacheMeta) => {
20
+ if (!isCacheMeta(cacheMeta)) {
21
+ throw new Error('Limited-cache metadata is missing: please check your usage');
22
+ }
23
+ if (cacheMeta.limitedCacheMetaVersion !== CURRENT_META_VERSION) {
24
+ // Version is out of date! (Today the only prior version is 1)
25
+ // Version 1: Cache meta cannot be migrated because timestamps and keys are incompatible
26
+ console.warn('Limited-cache metadata is from an incompatible version (1). It must be reset.');
27
+ cacheMeta.limitedCacheMetaVersion = CURRENT_META_VERSION;
28
+ lowLevelReset(cacheMeta);
29
+ }
30
+ };
31
+ const lowLevelSetOptions = (cacheMeta, options) => {
32
+ upgradeCacheMeta(cacheMeta);
33
+ return normalizeOptions(objectAssign(cacheMeta.options, options));
34
+ };
35
+ const lowLevelInit = (optionsOrCacheMeta) => {
36
+ if (isCacheMeta(optionsOrCacheMeta)) {
37
+ const existingCacheMeta = optionsOrCacheMeta;
38
+ upgradeCacheMeta(existingCacheMeta);
39
+ return existingCacheMeta;
40
+ }
41
+ // Else: it's options
42
+ const fullOptions = normalizeOptions({ ...defaultOptions, ...optionsOrCacheMeta });
43
+ // The cacheMeta is created once, and persists per instance
44
+ const newCacheMeta = lowLevelReset({
45
+ limitedCacheMetaVersion: CURRENT_META_VERSION,
46
+ options: fullOptions,
47
+ });
48
+ return newCacheMeta;
49
+ };
50
+ /* Internal cache manipulation */
51
+ const _getExpireTime = (cacheMeta, cacheKey) => {
52
+ const { options: { maxCacheTime }, keyInfo: { [cacheKey]: keyInfo }, } = cacheMeta;
53
+ if (!keyInfo) {
54
+ // A missing record is always treated as expired
55
+ return 0;
56
+ }
57
+ // If we have an exact expireTime then honor it. Otherwise it'll depend on the current maxCacheTime.
58
+ const [setTime, expireTime] = keyInfo;
59
+ return expireTime || setTime + (maxCacheTime || MAXIMUM_CACHE_TIME);
60
+ };
61
+ const _cacheKeyHasExpired = (cacheMeta, cacheKey, now) => {
62
+ return _getExpireTime(cacheMeta, cacheKey) < now;
63
+ };
64
+ const lowLevelDoMaintenance = (cacheMeta) => {
65
+ upgradeCacheMeta(cacheMeta);
66
+ const { cache, keyList, keyInfo } = cacheMeta;
67
+ const now = dateNow();
68
+ // Rebuild cache from keyList only, checking timestamps to auto-remove expired
69
+ const [newCache, newKeyList, newKeyInfo] = keyList.reduce((acc, cacheKey) => {
70
+ const [accCache, accKeyList, accKeyInfo] = acc;
71
+ if (!_cacheKeyHasExpired(cacheMeta, cacheKey, now)) {
72
+ accCache[cacheKey] = cache[cacheKey];
73
+ accKeyList.push(cacheKey);
74
+ accKeyInfo[cacheKey] = keyInfo[cacheKey];
75
+ }
76
+ return acc;
77
+ }, [
78
+ {},
79
+ [],
80
+ objectCreate(null),
81
+ ]);
82
+ return objectAssign(cacheMeta, {
83
+ cache: newCache,
84
+ keyList: newKeyList,
85
+ keyInfo: newKeyInfo,
86
+ opsLeft: cacheMeta.options.opLimit,
87
+ });
88
+ };
89
+ const _removeFromIndex = (cacheMeta, startIndex, now) => {
90
+ const { cache, keyList, keyInfo } = cacheMeta;
91
+ // Always remove the item requested, and also remove any neighbors who have expired
92
+ let nextIndex = startIndex;
93
+ let nextCacheKey = keyList[startIndex];
94
+ const keyListLength = keyList.length;
95
+ do {
96
+ // Remove the 'next' item
97
+ cache[nextCacheKey] = keyInfo[nextCacheKey] = undefined;
98
+ // Now advance and decide whether to keep going
99
+ nextIndex++;
100
+ nextCacheKey = keyList[nextIndex];
101
+ } while (nextIndex < keyListLength && _cacheKeyHasExpired(cacheMeta, nextCacheKey, now));
102
+ // Remove the index for everything from the startIndex until we stopped
103
+ keyList.splice(startIndex, nextIndex - startIndex);
104
+ };
105
+ const _removeItemsToMakeRoom = (cacheMeta, now) => {
106
+ const { options: { scanLimit, warnIfItemPurgedBeforeTime }, cache, keyList, keyInfo, } = cacheMeta;
107
+ // These track the soonest-to-expire thing we've found. It may not actually be "oldest".
108
+ // By default we'll remove the item at the head of the queue, unless we find something better.
109
+ let oldestItemIndex = 0;
110
+ let oldestExpireTime = _getExpireTime(cacheMeta, keyList[0]);
111
+ if (oldestExpireTime > now) {
112
+ // The head of the list hasn't yet expired: scan for a better candidate to remove
113
+ let indexToCheck = 0;
114
+ const maxIndexToCheck = Math.min(keyList.length, scanLimit);
115
+ while (indexToCheck < maxIndexToCheck) {
116
+ const cacheKeyForIndex = keyList[indexToCheck];
117
+ const expireTimeForIndex = _getExpireTime(cacheMeta, cacheKeyForIndex);
118
+ // We only consider it if it's eligible for expiration: otherwise it can't be a better option
119
+ // than the default head-of-queue
120
+ if (expireTimeForIndex < now) {
121
+ // We found an expired item! This wins automatically
122
+ oldestItemIndex = indexToCheck;
123
+ oldestExpireTime = 0;
124
+ break;
125
+ }
126
+ if (expireTimeForIndex < oldestExpireTime) {
127
+ // We have a new leader
128
+ oldestItemIndex = indexToCheck;
129
+ oldestExpireTime = expireTimeForIndex;
130
+ }
131
+ indexToCheck += 1;
132
+ }
133
+ }
134
+ // Warn if the 'oldest' item is more recent than we'd like: this means it cycled into and out of
135
+ // cache too quickly for the cache to be useful.
136
+ if (process.env.NODE_ENV !== 'production' &&
137
+ warnIfItemPurgedBeforeTime &&
138
+ oldestExpireTime > now) {
139
+ const oldestItemKey = keyList[oldestItemIndex];
140
+ const [oldestItemSetTime, oldestItemExpireTime] = keyInfo[oldestItemKey];
141
+ if (now - oldestItemSetTime < warnIfItemPurgedBeforeTime) {
142
+ console.warn('Purged an item from cache while it was still fresh: you may want to increase maxCacheSize', {
143
+ currentTime: now,
144
+ key: oldestItemKey,
145
+ item: cache[oldestItemKey],
146
+ setTime: oldestItemSetTime,
147
+ expireTime: oldestItemExpireTime,
148
+ timeInCache: now - oldestItemSetTime,
149
+ });
150
+ }
151
+ }
152
+ // Remove the oldest item we found, plus any expired neighbors
153
+ _removeFromIndex(cacheMeta, oldestItemIndex, now);
154
+ };
155
+ /* Accessors */
156
+ const lowLevelHas = (cacheMeta, cacheKey) => {
157
+ upgradeCacheMeta(cacheMeta);
158
+ const { cache } = cacheMeta;
159
+ if (hasOwnProperty.call(cache, cacheKey) && cache[cacheKey] !== undefined) {
160
+ if (!_cacheKeyHasExpired(cacheMeta, cacheKey, dateNow())) {
161
+ return true;
162
+ }
163
+ // If it's expired, clear the value so that we can short-circuit future lookups
164
+ cache[cacheKey] = undefined;
165
+ }
166
+ return false;
167
+ };
168
+ const lowLevelGetOne = (cacheMeta, cacheKey) => {
169
+ upgradeCacheMeta(cacheMeta);
170
+ if (lowLevelHas(cacheMeta, cacheKey)) {
171
+ return cacheMeta.cache[cacheKey];
172
+ }
173
+ return;
174
+ };
175
+ const lowLevelGetAll = (cacheMeta) => {
176
+ upgradeCacheMeta(cacheMeta);
177
+ // Remove all expired values, and return whatever's left
178
+ lowLevelDoMaintenance(cacheMeta);
179
+ // Retype because there won't be any `undefined` values after doMaintenance
180
+ return cacheMeta.cache;
181
+ };
182
+ const lowLevelSet = (cacheMeta, cacheKey, item) => {
183
+ upgradeCacheMeta(cacheMeta);
184
+ const { options: { maxCacheSize }, keyList, keyInfo, } = cacheMeta;
185
+ const now = dateNow();
186
+ const isNew = !keyInfo[cacheKey];
187
+ if (cacheMeta.cache[cacheKey] !== item) {
188
+ // The cache itself is immutable (but the rest of cacheMeta is not)
189
+ cacheMeta.cache = {
190
+ ...cacheMeta.cache,
191
+ [cacheKey]: item,
192
+ };
193
+ }
194
+ // We've now set or updated it. Regardless of whether it's new, bump its set time
195
+ // @TODO: expireTime override
196
+ keyInfo[cacheKey] = [now, 0];
197
+ if (isNew) {
198
+ // It's a new key: grow the cache, then shrink it if we can
199
+ keyList.push(cacheKey);
200
+ cacheMeta.opsLeft--;
201
+ if (cacheMeta.opsLeft <= 0) {
202
+ // Time for an oil change
203
+ lowLevelDoMaintenance(cacheMeta);
204
+ }
205
+ if (maxCacheSize && cacheMeta.keyList.length > maxCacheSize) {
206
+ // We're still over the limit: drop at least one item
207
+ _removeItemsToMakeRoom(cacheMeta, now);
208
+ }
209
+ }
210
+ if (_cacheKeyHasExpired(cacheMeta, keyList[0], now)) {
211
+ // While we're here, if we need to expire the head of the queue then drop it
212
+ _removeFromIndex(cacheMeta, 0, now);
213
+ }
214
+ return cacheMeta;
215
+ };
216
+ const lowLevelRemove = (cacheMeta, cacheKey) => {
217
+ upgradeCacheMeta(cacheMeta);
218
+ const { cache, keyInfo } = cacheMeta;
219
+ if (keyInfo[cacheKey]) {
220
+ if (cache[cacheKey] !== undefined) {
221
+ cacheMeta.cache = {
222
+ ...cache,
223
+ [cacheKey]: undefined,
224
+ };
225
+ }
226
+ keyInfo[cacheKey] = undefined;
227
+ }
228
+ return cacheMeta;
229
+ };
230
+ const lowLevelReset = (cacheMeta) => {
231
+ upgradeCacheMeta(cacheMeta);
232
+ return objectAssign(cacheMeta, {
233
+ cache: {},
234
+ keyList: [],
235
+ keyInfo: objectCreate(null),
236
+ opsLeft: cacheMeta.options.opLimit,
237
+ });
238
+ };
239
+ export { isCacheMeta, upgradeCacheMeta, lowLevelInit, lowLevelGetOne, lowLevelGetAll, lowLevelHas, lowLevelSet, lowLevelRemove, lowLevelReset, lowLevelDoMaintenance, lowLevelSetOptions, };
240
+ //# sourceMappingURL=lowLevelFunctions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lowLevelFunctions.js","sourceRoot":"","sources":["../../src/core/lowLevelFunctions.ts"],"names":[],"mappings":"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"}
package/dist/index.cjs ADDED
@@ -0,0 +1,388 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ CURRENT_META_VERSION: () => CURRENT_META_VERSION,
24
+ LimitedCache: () => LimitedCache,
25
+ LimitedCacheObject: () => LimitedCacheObject,
26
+ MAXIMUM_CACHE_TIME: () => MAXIMUM_CACHE_TIME,
27
+ defaultOptions: () => defaultOptions,
28
+ getCacheMetaFromObject: () => getCacheMetaFromObject,
29
+ isCacheMeta: () => isCacheMeta,
30
+ limitedCacheUtil: () => limitedCacheUtil,
31
+ lowLevelDoMaintenance: () => lowLevelDoMaintenance,
32
+ lowLevelGetAll: () => lowLevelGetAll,
33
+ lowLevelGetOne: () => lowLevelGetOne,
34
+ lowLevelHas: () => lowLevelHas,
35
+ lowLevelInit: () => lowLevelInit,
36
+ lowLevelRemove: () => lowLevelRemove,
37
+ lowLevelReset: () => lowLevelReset,
38
+ lowLevelSet: () => lowLevelSet,
39
+ lowLevelSetOptions: () => lowLevelSetOptions,
40
+ upgradeCacheMeta: () => upgradeCacheMeta
41
+ });
42
+ module.exports = __toCommonJS(src_exports);
43
+
44
+ // src/core/defaultOptions.ts
45
+ var CURRENT_META_VERSION = 2;
46
+ var MAXIMUM_CACHE_TIME = 365 * 86400 * 1e3;
47
+ var defaultOptions = {
48
+ // Public
49
+ maxCacheSize: 100,
50
+ maxCacheTime: 86400 * 1e3,
51
+ // Development-only
52
+ warnIfItemPurgedBeforeTime: 5e3,
53
+ // Private
54
+ opLimit: 200,
55
+ scanLimit: 50
56
+ };
57
+
58
+ // src/core/builtIns.ts
59
+ var {
60
+ create: objectCreate,
61
+ assign: objectAssign,
62
+ prototype: { hasOwnProperty }
63
+ } = Object;
64
+ var dateNow = Date.now;
65
+
66
+ // src/core/lowLevelFunctions.ts
67
+ var positiveNumberOrZero = (value) => Math.max(value, 0) || 0;
68
+ var normalizeOptions = (cacheMetaOptions) => {
69
+ objectAssign(cacheMetaOptions, {
70
+ maxCacheSize: positiveNumberOrZero(cacheMetaOptions.maxCacheSize),
71
+ maxCacheTime: positiveNumberOrZero(cacheMetaOptions.maxCacheTime),
72
+ opLimit: positiveNumberOrZero(cacheMetaOptions.opLimit)
73
+ });
74
+ if (process.env.NODE_ENV !== "production") {
75
+ cacheMetaOptions.warnIfItemPurgedBeforeTime = positiveNumberOrZero(
76
+ cacheMetaOptions.warnIfItemPurgedBeforeTime
77
+ );
78
+ }
79
+ return cacheMetaOptions;
80
+ };
81
+ var isCacheMeta = (cacheMeta) => {
82
+ return !!cacheMeta && !!cacheMeta.limitedCacheMetaVersion;
83
+ };
84
+ var upgradeCacheMeta = (cacheMeta) => {
85
+ if (!isCacheMeta(cacheMeta)) {
86
+ throw new Error("Limited-cache metadata is missing: please check your usage");
87
+ }
88
+ if (cacheMeta.limitedCacheMetaVersion !== CURRENT_META_VERSION) {
89
+ console.warn("Limited-cache metadata is from an incompatible version (1). It must be reset.");
90
+ cacheMeta.limitedCacheMetaVersion = CURRENT_META_VERSION;
91
+ lowLevelReset(cacheMeta);
92
+ }
93
+ };
94
+ var lowLevelSetOptions = (cacheMeta, options) => {
95
+ upgradeCacheMeta(cacheMeta);
96
+ return normalizeOptions(objectAssign(cacheMeta.options, options));
97
+ };
98
+ var lowLevelInit = (optionsOrCacheMeta) => {
99
+ if (isCacheMeta(optionsOrCacheMeta)) {
100
+ const existingCacheMeta = optionsOrCacheMeta;
101
+ upgradeCacheMeta(existingCacheMeta);
102
+ return existingCacheMeta;
103
+ }
104
+ const fullOptions = normalizeOptions({ ...defaultOptions, ...optionsOrCacheMeta });
105
+ const newCacheMeta = lowLevelReset({
106
+ limitedCacheMetaVersion: CURRENT_META_VERSION,
107
+ options: fullOptions
108
+ });
109
+ return newCacheMeta;
110
+ };
111
+ var _getExpireTime = (cacheMeta, cacheKey) => {
112
+ const {
113
+ options: { maxCacheTime },
114
+ keyInfo: { [cacheKey]: keyInfo }
115
+ } = cacheMeta;
116
+ if (!keyInfo) {
117
+ return 0;
118
+ }
119
+ const [setTime, expireTime] = keyInfo;
120
+ return expireTime || setTime + (maxCacheTime || MAXIMUM_CACHE_TIME);
121
+ };
122
+ var _cacheKeyHasExpired = (cacheMeta, cacheKey, now) => {
123
+ return _getExpireTime(cacheMeta, cacheKey) < now;
124
+ };
125
+ var lowLevelDoMaintenance = (cacheMeta) => {
126
+ upgradeCacheMeta(cacheMeta);
127
+ const { cache, keyList, keyInfo } = cacheMeta;
128
+ const now = dateNow();
129
+ const [newCache, newKeyList, newKeyInfo] = keyList.reduce(
130
+ (acc, cacheKey) => {
131
+ const [accCache, accKeyList, accKeyInfo] = acc;
132
+ if (!_cacheKeyHasExpired(cacheMeta, cacheKey, now)) {
133
+ accCache[cacheKey] = cache[cacheKey];
134
+ accKeyList.push(cacheKey);
135
+ accKeyInfo[cacheKey] = keyInfo[cacheKey];
136
+ }
137
+ return acc;
138
+ },
139
+ [
140
+ {},
141
+ [],
142
+ objectCreate(null)
143
+ ]
144
+ );
145
+ return objectAssign(cacheMeta, {
146
+ cache: newCache,
147
+ keyList: newKeyList,
148
+ keyInfo: newKeyInfo,
149
+ opsLeft: cacheMeta.options.opLimit
150
+ });
151
+ };
152
+ var _removeFromIndex = (cacheMeta, startIndex, now) => {
153
+ const { cache, keyList, keyInfo } = cacheMeta;
154
+ let nextIndex = startIndex;
155
+ let nextCacheKey = keyList[startIndex];
156
+ const keyListLength = keyList.length;
157
+ do {
158
+ cache[nextCacheKey] = keyInfo[nextCacheKey] = void 0;
159
+ nextIndex++;
160
+ nextCacheKey = keyList[nextIndex];
161
+ } while (nextIndex < keyListLength && _cacheKeyHasExpired(cacheMeta, nextCacheKey, now));
162
+ keyList.splice(startIndex, nextIndex - startIndex);
163
+ };
164
+ var _removeItemsToMakeRoom = (cacheMeta, now) => {
165
+ const {
166
+ options: { scanLimit, warnIfItemPurgedBeforeTime },
167
+ cache,
168
+ keyList,
169
+ keyInfo
170
+ } = cacheMeta;
171
+ let oldestItemIndex = 0;
172
+ let oldestExpireTime = _getExpireTime(cacheMeta, keyList[0]);
173
+ if (oldestExpireTime > now) {
174
+ let indexToCheck = 0;
175
+ const maxIndexToCheck = Math.min(keyList.length, scanLimit);
176
+ while (indexToCheck < maxIndexToCheck) {
177
+ const cacheKeyForIndex = keyList[indexToCheck];
178
+ const expireTimeForIndex = _getExpireTime(cacheMeta, cacheKeyForIndex);
179
+ if (expireTimeForIndex < now) {
180
+ oldestItemIndex = indexToCheck;
181
+ oldestExpireTime = 0;
182
+ break;
183
+ }
184
+ if (expireTimeForIndex < oldestExpireTime) {
185
+ oldestItemIndex = indexToCheck;
186
+ oldestExpireTime = expireTimeForIndex;
187
+ }
188
+ indexToCheck += 1;
189
+ }
190
+ }
191
+ if (process.env.NODE_ENV !== "production" && warnIfItemPurgedBeforeTime && oldestExpireTime > now) {
192
+ const oldestItemKey = keyList[oldestItemIndex];
193
+ const [oldestItemSetTime, oldestItemExpireTime] = keyInfo[oldestItemKey];
194
+ if (now - oldestItemSetTime < warnIfItemPurgedBeforeTime) {
195
+ console.warn(
196
+ "Purged an item from cache while it was still fresh: you may want to increase maxCacheSize",
197
+ {
198
+ currentTime: now,
199
+ key: oldestItemKey,
200
+ item: cache[oldestItemKey],
201
+ setTime: oldestItemSetTime,
202
+ expireTime: oldestItemExpireTime,
203
+ timeInCache: now - oldestItemSetTime
204
+ }
205
+ );
206
+ }
207
+ }
208
+ _removeFromIndex(cacheMeta, oldestItemIndex, now);
209
+ };
210
+ var lowLevelHas = (cacheMeta, cacheKey) => {
211
+ upgradeCacheMeta(cacheMeta);
212
+ const { cache } = cacheMeta;
213
+ if (hasOwnProperty.call(cache, cacheKey) && cache[cacheKey] !== void 0) {
214
+ if (!_cacheKeyHasExpired(cacheMeta, cacheKey, dateNow())) {
215
+ return true;
216
+ }
217
+ cache[cacheKey] = void 0;
218
+ }
219
+ return false;
220
+ };
221
+ var lowLevelGetOne = (cacheMeta, cacheKey) => {
222
+ upgradeCacheMeta(cacheMeta);
223
+ if (lowLevelHas(cacheMeta, cacheKey)) {
224
+ return cacheMeta.cache[cacheKey];
225
+ }
226
+ return;
227
+ };
228
+ var lowLevelGetAll = (cacheMeta) => {
229
+ upgradeCacheMeta(cacheMeta);
230
+ lowLevelDoMaintenance(cacheMeta);
231
+ return cacheMeta.cache;
232
+ };
233
+ var lowLevelSet = (cacheMeta, cacheKey, item) => {
234
+ upgradeCacheMeta(cacheMeta);
235
+ const {
236
+ options: { maxCacheSize },
237
+ keyList,
238
+ keyInfo
239
+ } = cacheMeta;
240
+ const now = dateNow();
241
+ const isNew = !keyInfo[cacheKey];
242
+ if (cacheMeta.cache[cacheKey] !== item) {
243
+ cacheMeta.cache = {
244
+ ...cacheMeta.cache,
245
+ [cacheKey]: item
246
+ };
247
+ }
248
+ keyInfo[cacheKey] = [now, 0];
249
+ if (isNew) {
250
+ keyList.push(cacheKey);
251
+ cacheMeta.opsLeft--;
252
+ if (cacheMeta.opsLeft <= 0) {
253
+ lowLevelDoMaintenance(cacheMeta);
254
+ }
255
+ if (maxCacheSize && cacheMeta.keyList.length > maxCacheSize) {
256
+ _removeItemsToMakeRoom(cacheMeta, now);
257
+ }
258
+ }
259
+ if (_cacheKeyHasExpired(cacheMeta, keyList[0], now)) {
260
+ _removeFromIndex(cacheMeta, 0, now);
261
+ }
262
+ return cacheMeta;
263
+ };
264
+ var lowLevelRemove = (cacheMeta, cacheKey) => {
265
+ upgradeCacheMeta(cacheMeta);
266
+ const { cache, keyInfo } = cacheMeta;
267
+ if (keyInfo[cacheKey]) {
268
+ if (cache[cacheKey] !== void 0) {
269
+ cacheMeta.cache = {
270
+ ...cache,
271
+ [cacheKey]: void 0
272
+ };
273
+ }
274
+ keyInfo[cacheKey] = void 0;
275
+ }
276
+ return cacheMeta;
277
+ };
278
+ var lowLevelReset = (cacheMeta) => {
279
+ upgradeCacheMeta(cacheMeta);
280
+ return objectAssign(cacheMeta, {
281
+ cache: {},
282
+ keyList: [],
283
+ keyInfo: objectCreate(null),
284
+ opsLeft: cacheMeta.options.opLimit
285
+ });
286
+ };
287
+
288
+ // src/core/LimitedCache.ts
289
+ var bindFunctionToCacheMeta = (fn, cacheMeta) => fn.bind(null, cacheMeta);
290
+ var LimitedCache = (options) => {
291
+ const cacheMeta = lowLevelInit(options);
292
+ return {
293
+ get: bindFunctionToCacheMeta(lowLevelGetOne, cacheMeta),
294
+ getAll: bindFunctionToCacheMeta(lowLevelGetAll, cacheMeta),
295
+ has: bindFunctionToCacheMeta(lowLevelHas, cacheMeta),
296
+ set: (cacheKey, item) => {
297
+ lowLevelSet(cacheMeta, cacheKey, item);
298
+ return item;
299
+ },
300
+ remove: (cacheKey) => {
301
+ lowLevelRemove(cacheMeta, cacheKey);
302
+ return true;
303
+ },
304
+ reset: bindFunctionToCacheMeta(lowLevelReset, cacheMeta),
305
+ getCacheMeta: () => cacheMeta,
306
+ getOptions: () => cacheMeta.options,
307
+ setOptions: bindFunctionToCacheMeta(lowLevelSetOptions, cacheMeta),
308
+ doMaintenance: bindFunctionToCacheMeta(lowLevelDoMaintenance, cacheMeta)
309
+ };
310
+ };
311
+
312
+ // src/core/LimitedCacheObject.ts
313
+ var proxyHandler = {
314
+ get: (cacheMeta, cacheKey) => {
315
+ if (cacheKey === "hasOwnProperty") {
316
+ return hasOwnProperty;
317
+ }
318
+ return lowLevelGetOne(cacheMeta, cacheKey);
319
+ },
320
+ getOwnPropertyDescriptor: (cacheMeta, cacheKey) => {
321
+ const hasResult = lowLevelHas(cacheMeta, cacheKey);
322
+ const getResult = lowLevelGetOne(cacheMeta, cacheKey);
323
+ if (hasResult) {
324
+ return {
325
+ configurable: true,
326
+ enumerable: hasResult,
327
+ value: getResult,
328
+ writable: true
329
+ };
330
+ }
331
+ return;
332
+ },
333
+ has: lowLevelHas,
334
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
335
+ set: (cacheMeta, cacheKey, item) => {
336
+ lowLevelSet(cacheMeta, cacheKey, item);
337
+ return item;
338
+ },
339
+ deleteProperty: (cacheMeta, cacheKey) => {
340
+ lowLevelRemove(cacheMeta, cacheKey);
341
+ return true;
342
+ },
343
+ ownKeys: (cacheMeta) => Object.keys(lowLevelGetAll(cacheMeta))
344
+ };
345
+ var cacheMetasForProxies = /* @__PURE__ */ new WeakMap();
346
+ var LimitedCacheObject = (options) => {
347
+ const cacheMeta = lowLevelInit(options);
348
+ const limitedCacheObject = new Proxy(cacheMeta, proxyHandler);
349
+ cacheMetasForProxies.set(limitedCacheObject, cacheMeta);
350
+ return limitedCacheObject;
351
+ };
352
+ var getCacheMetaFromObject = (instance) => {
353
+ return cacheMetasForProxies.get(instance);
354
+ };
355
+
356
+ // src/core/limitedCacheUtil.ts
357
+ var limitedCacheUtil = {
358
+ init: lowLevelInit,
359
+ get: lowLevelGetOne,
360
+ getAll: lowLevelGetAll,
361
+ has: lowLevelHas,
362
+ set: lowLevelSet,
363
+ remove: lowLevelRemove,
364
+ reset: lowLevelReset,
365
+ doMaintenance: lowLevelDoMaintenance,
366
+ setOptions: lowLevelSetOptions
367
+ };
368
+ // Annotate the CommonJS export names for ESM import in node:
369
+ 0 && (module.exports = {
370
+ CURRENT_META_VERSION,
371
+ LimitedCache,
372
+ LimitedCacheObject,
373
+ MAXIMUM_CACHE_TIME,
374
+ defaultOptions,
375
+ getCacheMetaFromObject,
376
+ isCacheMeta,
377
+ limitedCacheUtil,
378
+ lowLevelDoMaintenance,
379
+ lowLevelGetAll,
380
+ lowLevelGetOne,
381
+ lowLevelHas,
382
+ lowLevelInit,
383
+ lowLevelRemove,
384
+ lowLevelReset,
385
+ lowLevelSet,
386
+ lowLevelSetOptions,
387
+ upgradeCacheMeta
388
+ });
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
- export * from './core/defaultOptions';
2
- export * from './core/LimitedCache';
3
- export * from './core/LimitedCacheObject';
4
- export * from './core/limitedCacheUtil';
5
- export * from './core/lowLevelFunctions';
6
- export * from './types';
1
+ export * from './core/defaultOptions.js';
2
+ export * from './core/LimitedCache.js';
3
+ export * from './core/LimitedCacheObject.js';
4
+ export * from './core/limitedCacheUtil.js';
5
+ export * from './core/lowLevelFunctions.js';
6
+ export * from './types.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAE3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,8 +1,7 @@
1
-
2
- 'use strict'
3
-
4
- if (process.env.NODE_ENV === 'production') {
5
- module.exports = require('./limited-cache.cjs.production.min.js')
6
- } else {
7
- module.exports = require('./limited-cache.cjs.development.js')
8
- }
1
+ export * from './core/defaultOptions.js';
2
+ export * from './core/LimitedCache.js';
3
+ export * from './core/LimitedCacheObject.js';
4
+ export * from './core/limitedCacheUtil.js';
5
+ export * from './core/lowLevelFunctions.js';
6
+ export * from './types.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAE3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,YAAY,CAAC"}