@gantryland/task-cache 0.4.0 → 0.5.0
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/README.md +16 -15
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -7
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -15,12 +15,10 @@ import { Task } from "@gantryland/task";
|
|
|
15
15
|
import { MemoryCacheStore, cache } from "@gantryland/task-cache";
|
|
16
16
|
|
|
17
17
|
const store = new MemoryCacheStore();
|
|
18
|
-
const
|
|
19
|
-
(
|
|
18
|
+
const usersTask = new Task(() => fetch("/api/users").then((r) => r.json())).pipe(
|
|
19
|
+
cache("users", store, { ttl: 60_000 }),
|
|
20
20
|
);
|
|
21
21
|
|
|
22
|
-
const usersTask = new Task(usersTaskFn);
|
|
23
|
-
|
|
24
22
|
await usersTask.run();
|
|
25
23
|
await usersTask.run();
|
|
26
24
|
```
|
|
@@ -57,7 +55,7 @@ cache<T, Args extends unknown[] = []>(
|
|
|
57
55
|
key: CacheKey,
|
|
58
56
|
store: CacheStore,
|
|
59
57
|
options?: CacheOptions,
|
|
60
|
-
):
|
|
58
|
+
): TaskOperator<T, T, Args>
|
|
61
59
|
```
|
|
62
60
|
|
|
63
61
|
Returns a wrapper that serves fresh cache hits and resolves source on miss or stale entry.
|
|
@@ -69,7 +67,7 @@ staleWhileRevalidate<T, Args extends unknown[] = []>(
|
|
|
69
67
|
key: CacheKey,
|
|
70
68
|
store: CacheStore,
|
|
71
69
|
options: StaleWhileRevalidateOptions,
|
|
72
|
-
):
|
|
70
|
+
): TaskOperator<T, T, Args>
|
|
73
71
|
```
|
|
74
72
|
|
|
75
73
|
Returns a wrapper that can return stale values within `staleTtl` while refreshing in background.
|
|
@@ -108,32 +106,35 @@ type StaleWhileRevalidateOptions = CacheOptions & {
|
|
|
108
106
|
```typescript
|
|
109
107
|
const store = new MemoryCacheStore();
|
|
110
108
|
|
|
111
|
-
const listUsers =
|
|
112
|
-
|
|
109
|
+
const listUsers = new Task(() => fetch("/api/users").then((r) => r.json())).pipe(
|
|
110
|
+
cache("users:list", store, { ttl: 30_000 }),
|
|
113
111
|
);
|
|
114
112
|
```
|
|
115
113
|
|
|
116
114
|
### Example: Stale-While-Revalidate for Dashboards
|
|
117
115
|
|
|
118
116
|
```typescript
|
|
119
|
-
const getStats =
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
117
|
+
const getStats = new Task(() => fetch("/api/stats").then((r) => r.json())).pipe(
|
|
118
|
+
staleWhileRevalidate("stats", store, {
|
|
119
|
+
ttl: 10_000,
|
|
120
|
+
staleTtl: 50_000,
|
|
121
|
+
}),
|
|
122
|
+
);
|
|
123
123
|
```
|
|
124
124
|
|
|
125
125
|
### Example: Disable Dedupe for Independent Refreshes
|
|
126
126
|
|
|
127
127
|
```typescript
|
|
128
|
-
const getFeed =
|
|
129
|
-
|
|
128
|
+
const getFeed = new Task(() => fetch("/api/feed").then((r) => r.json())).pipe(
|
|
129
|
+
cache("feed", store, { ttl: 5_000, dedupe: false }),
|
|
130
130
|
);
|
|
131
131
|
```
|
|
132
132
|
|
|
133
133
|
## Runtime Semantics
|
|
134
134
|
|
|
135
135
|
- `cache` returns cached value when entry is fresh; otherwise it executes and stores on success.
|
|
136
|
-
- `
|
|
136
|
+
- `cache` validates `ttl` as a non-negative finite number when provided.
|
|
137
|
+
- `staleWhileRevalidate` validates `ttl` and `staleTtl` as non-negative finite numbers.
|
|
137
138
|
- Fresh SWR hit returns immediately without background work.
|
|
138
139
|
- Stale-window SWR hit returns stale value and triggers background revalidation.
|
|
139
140
|
- Background revalidation errors are ignored for the caller path.
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { TaskOperator } from "@gantryland/task";
|
|
2
2
|
/** Cache key type used by cache stores and wrappers. */
|
|
3
3
|
export type CacheKey = string | number | symbol;
|
|
4
4
|
/** Stored cache value with last update timestamp. */
|
|
@@ -29,9 +29,9 @@ export type StaleWhileRevalidateOptions = CacheOptions & {
|
|
|
29
29
|
staleTtl?: number;
|
|
30
30
|
};
|
|
31
31
|
/** Cache wrapper with optional TTL and in-flight deduplication. */
|
|
32
|
-
export declare const cache: <T, Args extends unknown[] = []>(key: CacheKey, store: CacheStore, options?: CacheOptions) =>
|
|
32
|
+
export declare const cache: <T, Args extends unknown[] = []>(key: CacheKey, store: CacheStore, options?: CacheOptions) => TaskOperator<T, T, Args>;
|
|
33
33
|
/**
|
|
34
34
|
* Return stale values within a stale window and refresh in background.
|
|
35
35
|
*/
|
|
36
|
-
export declare const staleWhileRevalidate: <T, Args extends unknown[] = []>(key: CacheKey, store: CacheStore, options: StaleWhileRevalidateOptions) =>
|
|
36
|
+
export declare const staleWhileRevalidate: <T, Args extends unknown[] = []>(key: CacheKey, store: CacheStore, options: StaleWhileRevalidateOptions) => TaskOperator<T, T, Args>;
|
|
37
37
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE7D,wDAAwD;AACxD,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEhD,qDAAqD;AACrD,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;IAC1B,KAAK,EAAE,CAAC,CAAC;IACT,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,yDAAyD;AACzD,MAAM,MAAM,UAAU,GAAG;IACvB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACjD,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAClD,MAAM,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAC;CAC7B,CAAC;AAEF,8CAA8C;AAC9C,qBAAa,gBAAiB,YAAW,UAAU;IACjD,OAAO,CAAC,KAAK,CAA4C;IAEzD,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS;IAIhD,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI;IAIjD,MAAM,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI;CAG5B;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,mDAAmD;AACnD,MAAM,MAAM,2BAA2B,GAAG,YAAY,GAAG;IACvD,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AA2EF,mEAAmE;AACnE,eAAO,MAAM,KAAK,GACf,CAAC,EAAE,IAAI,SAAS,OAAO,EAAE,GAAG,EAAE,EAC7B,KAAK,QAAQ,EACb,OAAO,UAAU,EACjB,UAAS,YAAiB,KACzB,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAUzB,CAAC;AAEJ;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAC9B,CAAC,EAAE,IAAI,SAAS,OAAO,EAAE,GAAG,EAAE,EAC7B,KAAK,QAAQ,EACb,OAAO,UAAU,EACjB,SAAS,2BAA2B,KACnC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAyBzB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -27,11 +27,11 @@ const isFresh = (entry, ttl) => {
|
|
|
27
27
|
return true;
|
|
28
28
|
return Date.now() - entry.updatedAt <= ttl;
|
|
29
29
|
};
|
|
30
|
-
const
|
|
31
|
-
if (typeof
|
|
32
|
-
throw new Error(
|
|
30
|
+
const toValidNonNegativeFinite = (value, name) => {
|
|
31
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value < 0) {
|
|
32
|
+
throw new Error(`${name} must be a non-negative finite number`);
|
|
33
33
|
}
|
|
34
|
-
return
|
|
34
|
+
return value;
|
|
35
35
|
};
|
|
36
36
|
const isWithinStale = (entry, ttl, staleTtl) => {
|
|
37
37
|
const age = Date.now() - entry.updatedAt;
|
|
@@ -67,8 +67,11 @@ const resolveWithDedupe = async (key, store, taskFn, args, options = {}) => {
|
|
|
67
67
|
};
|
|
68
68
|
/** Cache wrapper with optional TTL and in-flight deduplication. */
|
|
69
69
|
export const cache = (key, store, options = {}) => (taskFn) => async (...args) => {
|
|
70
|
+
const ttl = options.ttl === undefined
|
|
71
|
+
? undefined
|
|
72
|
+
: toValidNonNegativeFinite(options.ttl, "cache ttl");
|
|
70
73
|
const entry = store.get(key);
|
|
71
|
-
if (entry && isFresh(entry,
|
|
74
|
+
if (entry && isFresh(entry, ttl))
|
|
72
75
|
return entry.value;
|
|
73
76
|
return resolveWithDedupe(key, store, taskFn, args, options);
|
|
74
77
|
};
|
|
@@ -76,11 +79,14 @@ export const cache = (key, store, options = {}) => (taskFn) => async (...args) =
|
|
|
76
79
|
* Return stale values within a stale window and refresh in background.
|
|
77
80
|
*/
|
|
78
81
|
export const staleWhileRevalidate = (key, store, options) => (taskFn) => async (...args) => {
|
|
79
|
-
const ttl =
|
|
82
|
+
const ttl = toValidNonNegativeFinite(options?.ttl, "staleWhileRevalidate ttl");
|
|
83
|
+
const staleTtl = options.staleTtl === undefined
|
|
84
|
+
? undefined
|
|
85
|
+
: toValidNonNegativeFinite(options.staleTtl, "staleWhileRevalidate staleTtl");
|
|
80
86
|
const entry = store.get(key);
|
|
81
87
|
if (entry && isFresh(entry, ttl))
|
|
82
88
|
return entry.value;
|
|
83
|
-
if (entry && isWithinStale(entry, ttl,
|
|
89
|
+
if (entry && isWithinStale(entry, ttl, staleTtl)) {
|
|
84
90
|
void resolveWithDedupe(key, store, taskFn, args, options).catch(() => {
|
|
85
91
|
// Background revalidation errors are ignored.
|
|
86
92
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAkBA,8CAA8C;AAC9C,MAAM,OAAO,gBAAgB;IAA7B;QACU,UAAK,GAAG,IAAI,GAAG,EAAiC,CAAC;IAa3D,CAAC;IAXC,GAAG,CAAI,GAAa;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAA8B,CAAC;IAC1D,CAAC;IAED,GAAG,CAAI,GAAa,EAAE,KAAoB;QACxC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,GAAa;QAClB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;CACF;AAcD,MAAM,cAAc,GAAG,IAAI,OAAO,EAA0B,CAAC;AAE7D,MAAM,aAAa,GAAG,CAAC,KAAiB,EAAc,EAAE;IACtD,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,GAAG,GAAe,IAAI,GAAG,EAAE,CAAC;IAClC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC/B,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,KAA0B,EAAE,GAAY,EAAW,EAAE;IACpE,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACnC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,IAAI,GAAG,CAAC;AAC7C,CAAC,CAAC;AAEF,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gantryland/task-cache",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Task-function cache wrappers for @gantryland/task",
|
|
5
5
|
"keywords": ["task", "cache", "memoize", "async"],
|
|
6
6
|
"type": "module",
|
|
@@ -40,6 +40,6 @@
|
|
|
40
40
|
},
|
|
41
41
|
"homepage": "https://github.com/joehoot/gantryland/tree/main/packages/task-cache#readme",
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@gantryland/task": "^0.
|
|
43
|
+
"@gantryland/task": "^0.5.0"
|
|
44
44
|
}
|
|
45
45
|
}
|