Skip to content

Commit 6c05538

Browse files
committed
feat: expose createCacheEntry and createCacheMetaData helpers
as low level building block that can be used to manually set entries to a cache
1 parent 9654c37 commit 6c05538

File tree

6 files changed

+38
-28
lines changed

6 files changed

+38
-28
lines changed

src/cachified.spec.ts

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,10 @@ import {
1414
redisCacheAdapter,
1515
RedisLikeCache,
1616
GetFreshValue,
17+
createCacheEntry,
1718
} from './index';
1819
import { Deferred } from './createBatch';
19-
import { createCacheEntry, delay, report } from './testHelpers';
20+
import { delay, report } from './testHelpers';
2021

2122
jest.mock('./index', () => {
2223
if (process.version.startsWith('v18')) {
@@ -1471,13 +1472,9 @@ describe('cachified', () => {
14711472
expect(get).toHaveBeenCalledTimes(1);
14721473
expect(get).toHaveBeenCalledWith('test-3');
14731474
expect(set).toHaveBeenCalledTimes(1);
1474-
expect(set).toHaveBeenCalledWith(
1475-
'test-3',
1476-
JSON.stringify({
1477-
metadata: { ttl: 1, swr: 0, createdTime: 0 },
1478-
value: 'FOUR',
1479-
}),
1480-
{ EXAT: 1 },
1475+
expect(set).toHaveBeenCalledWith('test-3', expect.any(String), { EXAT: 1 });
1476+
expect(JSON.parse(set.mock.calls[0][1])).toEqual(
1477+
createCacheEntry('FOUR', { createdTime: 0, swr: 0, ttl: 1 }),
14811478
);
14821479

14831480
await cache.set('lel', undefined as any);

src/common.ts

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -229,11 +229,7 @@ export function createContext<Value>({
229229
staleRefreshTimeout: 0,
230230
forceFresh: false,
231231
...options,
232-
metadata: {
233-
ttl: ttl === Infinity ? null : ttl,
234-
swr: staleWhileRevalidate === Infinity ? null : staleWhileRevalidate,
235-
createdTime: Date.now(),
236-
},
232+
metadata: createCacheMetaData({ ttl, swr: staleWhileRevalidate }),
237233
};
238234

239235
const report =
@@ -263,3 +259,25 @@ export function totalTtl(metadata?: CacheMetadata): number {
263259
}
264260
return (metadata.ttl || 0) + (staleWhileRevalidate(metadata) || 0);
265261
}
262+
263+
export function createCacheMetaData({
264+
ttl = null,
265+
swr = 0,
266+
createdTime = Date.now(),
267+
}: Partial<Omit<CacheMetadata, 'swv'>> = {}) {
268+
return {
269+
ttl: ttl === Infinity ? null : ttl,
270+
swr: swr === Infinity ? null : swr,
271+
createdTime,
272+
};
273+
}
274+
275+
export function createCacheEntry<Value>(
276+
value: Value,
277+
metadata?: Partial<Omit<CacheMetadata, 'swv'>>,
278+
): CacheEntry<Value> {
279+
return {
280+
value,
281+
metadata: createCacheMetaData(metadata),
282+
};
283+
}

src/getFreshValue.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { Context, CacheMetadata } from './common';
1+
import { Context, CacheMetadata, createCacheEntry } from './common';
22
import { getCacheEntry, CACHE_EMPTY } from './getCachedValue';
33
import { shouldRefresh } from './shouldRefresh';
44
import { Reporter } from './reporter';
@@ -61,7 +61,7 @@ export async function getFreshValue<Value>(
6161
try {
6262
const write = shouldRefresh(metadata) !== 'now';
6363
if (write) {
64-
await cache.set(key, { metadata, value });
64+
await cache.set(key, createCacheEntry(value, metadata));
6565
}
6666
report({
6767
name: 'writeFreshValueSuccess',

src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export type {
77
GetFreshValue,
88
GetFreshValueContext,
99
} from './common';
10-
export { staleWhileRevalidate, totalTtl } from './common';
10+
export { staleWhileRevalidate, totalTtl, createCacheEntry } from './common';
1111
export * from './reporter';
1212
export * from './adapters';
1313
export { createBatch } from './createBatch';

src/reporter.spec.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
1-
import { cachified, CacheEntry, verboseReporter } from './index';
2-
import { createCacheEntry, delay, prettyPrint } from './testHelpers';
1+
import {
2+
cachified,
3+
CacheEntry,
4+
verboseReporter,
5+
createCacheEntry,
6+
} from './index';
7+
import { delay, prettyPrint } from './testHelpers';
38

49
jest.mock('./index', () => {
510
if (process.version.startsWith('v18')) {

src/testHelpers.ts

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,6 @@ export function delay(ms: number) {
2626
return new Promise((res) => setTimeout(res, ms));
2727
}
2828

29-
export function createCacheEntry<Value>(
30-
value: Value,
31-
metadata: Partial<CacheMetadata> = {},
32-
): CacheEntry<Value> {
33-
return {
34-
value,
35-
metadata: { createdTime: Date.now(), ttl: null, swr: 0, ...metadata },
36-
};
37-
}
38-
3929
export function report(calls: [event: CacheEvent<any>][]) {
4030
const totalCalls = String(calls.length + 1).length;
4131
return calls

0 commit comments

Comments
 (0)