@c9up/echo 0.1.5 → 0.1.7
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/dist/CacheManager.d.ts +63 -28
- package/dist/CacheManager.d.ts.map +1 -1
- package/dist/CacheManager.js +348 -70
- package/dist/CacheManager.js.map +1 -1
- package/dist/EchoProvider.d.ts +15 -9
- package/dist/EchoProvider.d.ts.map +1 -1
- package/dist/EchoProvider.js +47 -13
- package/dist/EchoProvider.js.map +1 -1
- package/dist/StoreManager.d.ts +61 -0
- package/dist/StoreManager.d.ts.map +1 -0
- package/dist/StoreManager.js +70 -0
- package/dist/StoreManager.js.map +1 -0
- package/dist/drivers/MemoryDriver.d.ts +13 -6
- package/dist/drivers/MemoryDriver.d.ts.map +1 -1
- package/dist/drivers/MemoryDriver.js +67 -61
- package/dist/drivers/MemoryDriver.js.map +1 -1
- package/dist/drivers/RedisDriver.d.ts +17 -17
- package/dist/drivers/RedisDriver.d.ts.map +1 -1
- package/dist/drivers/RedisDriver.js +103 -55
- package/dist/drivers/RedisDriver.js.map +1 -1
- package/dist/drivers/TieredDriver.d.ts +41 -0
- package/dist/drivers/TieredDriver.d.ts.map +1 -0
- package/dist/drivers/TieredDriver.js +132 -0
- package/dist/drivers/TieredDriver.js.map +1 -0
- package/dist/duration.d.ts +32 -0
- package/dist/duration.d.ts.map +1 -0
- package/dist/duration.js +75 -0
- package/dist/duration.js.map +1 -0
- package/dist/errors.d.ts +21 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +31 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +15 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -2
- package/dist/index.js.map +1 -1
- package/dist/testing/main.d.ts +41 -0
- package/dist/testing/main.d.ts.map +1 -0
- package/dist/testing/main.js +41 -0
- package/dist/testing/main.js.map +1 -0
- package/dist/types.d.ts +146 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +6 -1
- package/src/CacheManager.ts +497 -99
- package/src/EchoProvider.ts +58 -15
- package/src/StoreManager.ts +104 -0
- package/src/drivers/MemoryDriver.ts +97 -66
- package/src/drivers/RedisDriver.ts +135 -58
- package/src/drivers/TieredDriver.ts +186 -0
- package/src/duration.ts +86 -0
- package/src/errors.ts +33 -0
- package/src/index.ts +43 -3
- package/src/testing/main.ts +69 -0
- package/src/types.ts +156 -0
package/dist/CacheManager.d.ts
CHANGED
|
@@ -1,48 +1,83 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* CacheManager —
|
|
2
|
+
* CacheManager — a single cache store with a unified, bentocache/@adonisjs/cache
|
|
3
|
+
* parity API over a pluggable {@link CacheDriver}.
|
|
4
|
+
*
|
|
5
|
+
* Every read/write method accepts EITHER the Adonis/bento object form
|
|
6
|
+
* (`get({ key })`, `set({ key, value, ttl, tags })`, `getOrSet({ key, factory,
|
|
7
|
+
* … })`) OR echo's original positional form (`get(key)`, `set(key, value,
|
|
8
|
+
* ttlSeconds)`, `getOrSet(key, ttlSeconds, factory)`). The object form is the
|
|
9
|
+
* canonical one; the positional form is kept for back-compat.
|
|
3
10
|
*/
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
flush(): Promise<void>;
|
|
9
|
-
has(key: string): Promise<boolean>;
|
|
10
|
-
}
|
|
11
|
+
import { type Duration } from "./duration.js";
|
|
12
|
+
import type { CacheEmitter, DeleteByTagOptions, DeleteManyOptions, DeleteOptions, ExpireOptions, Factory, GetOptions, GetOrSetForeverOptions, GetOrSetOptions, HasOptions, SetOptions } from "./types.js";
|
|
13
|
+
export type { CacheDriver } from "./types.js";
|
|
14
|
+
import type { CacheDriver } from "./types.js";
|
|
11
15
|
export interface CacheConfig {
|
|
12
16
|
driver?: string;
|
|
13
17
|
prefix?: string;
|
|
18
|
+
/** Default TTL in **seconds** (echo-native unit; see `duration.ts`). */
|
|
14
19
|
ttl?: number;
|
|
20
|
+
/** Default grace period (stale-while-revalidate) as a {@link Duration}. */
|
|
21
|
+
grace?: Duration;
|
|
22
|
+
/** Default soft timeout for `getOrSet` (return stale if the factory is slower). */
|
|
23
|
+
timeout?: Duration;
|
|
24
|
+
/** Default hard timeout for `getOrSet`. */
|
|
25
|
+
hardTimeout?: Duration;
|
|
26
|
+
/** Default single-flight lock wait before falling back to stale. */
|
|
27
|
+
lockTimeout?: Duration;
|
|
28
|
+
/** Store name reported in events (default `"default"`). */
|
|
29
|
+
name?: string;
|
|
30
|
+
/** Optional event emitter (`cache:hit` / `miss` / `written` / `deleted` / `cleared`). */
|
|
31
|
+
emitter?: CacheEmitter;
|
|
32
|
+
}
|
|
33
|
+
/** Shared single-flight state — one map per store, threaded through namespaces. */
|
|
34
|
+
interface SharedState {
|
|
35
|
+
inflight: Map<string, {
|
|
36
|
+
promise: Promise<unknown>;
|
|
37
|
+
}>;
|
|
15
38
|
}
|
|
16
39
|
export declare class CacheManager {
|
|
17
|
-
private
|
|
18
|
-
|
|
19
|
-
private defaultTtl;
|
|
20
|
-
constructor(driver: CacheDriver, config?: CacheConfig);
|
|
21
|
-
private prefixKey;
|
|
40
|
+
#private;
|
|
41
|
+
constructor(driver: CacheDriver, config?: CacheConfig, shared?: SharedState);
|
|
22
42
|
get<T = unknown>(key: string): Promise<T | null>;
|
|
43
|
+
get<T = unknown>(options: GetOptions<T>): Promise<T | null>;
|
|
23
44
|
set(key: string, value: unknown, ttlSeconds?: number): Promise<void>;
|
|
45
|
+
set(options: SetOptions): Promise<void>;
|
|
46
|
+
/** Set a value that never expires (bento `setForever`). */
|
|
47
|
+
setForever(options: Omit<SetOptions, "ttl">): Promise<void>;
|
|
24
48
|
delete(key: string): Promise<boolean>;
|
|
25
|
-
|
|
26
|
-
|
|
49
|
+
delete(options: DeleteOptions): Promise<boolean>;
|
|
50
|
+
/** Delete multiple keys (bento `deleteMany`). */
|
|
51
|
+
deleteMany(keysOrOptions: string[] | DeleteManyOptions): Promise<boolean>;
|
|
27
52
|
has(key: string): Promise<boolean>;
|
|
53
|
+
has(options: HasOptions): Promise<boolean>;
|
|
54
|
+
/** Inverse of {@link has} (bento `missing`). */
|
|
55
|
+
missing(keyOrOptions: string | HasOptions): Promise<boolean>;
|
|
56
|
+
/** Read a key and delete it in one step (bento `pull`). Returns `null` on miss. */
|
|
57
|
+
pull<T = unknown>(key: string): Promise<T | null>;
|
|
28
58
|
/**
|
|
29
|
-
*
|
|
30
|
-
* `
|
|
31
|
-
* any existing prefix). Shares the same driver + default TTL.
|
|
59
|
+
* Expire a key: mark it stale immediately while retaining it for the grace
|
|
60
|
+
* window (bento `expire`). Without grace this is equivalent to a delete.
|
|
32
61
|
*/
|
|
33
|
-
|
|
34
|
-
/**
|
|
62
|
+
expire(keyOrOptions: string | ExpireOptions): Promise<boolean>;
|
|
63
|
+
/** Clear the whole store (bento/Adonis `clear`). */
|
|
64
|
+
clear(): Promise<void>;
|
|
65
|
+
/** Set a value with tags for grouped invalidation (bento parity). */
|
|
35
66
|
setWithTags(key: string, value: unknown, tags: string[], ttlSeconds?: number): Promise<void>;
|
|
36
|
-
/**
|
|
67
|
+
/** Invalidate all entries carrying any of the given tags (bento `deleteByTag`). */
|
|
68
|
+
deleteByTag(tags: string[]): Promise<void>;
|
|
69
|
+
deleteByTag(options: DeleteByTagOptions): Promise<void>;
|
|
70
|
+
/** @deprecated alias of {@link deleteByTag}. */
|
|
37
71
|
flushTags(tags: string[]): Promise<void>;
|
|
38
|
-
/** In-flight promises for stampede prevention. Each factory is typed per-call; the map is keyed by prefixed cache key. */
|
|
39
|
-
private inflight;
|
|
40
72
|
/**
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
* Adonis's object form — echo keeps a leaner cache surface.)
|
|
73
|
+
* A cache view scoped under an extra key prefix (Adonis `cache.namespace()`).
|
|
74
|
+
* Shares the SAME driver, defaults, emitter AND single-flight state, so a
|
|
75
|
+
* `getOrSet` stampede is collapsed across namespace views of the same key.
|
|
45
76
|
*/
|
|
46
|
-
|
|
77
|
+
namespace(ns: string): CacheManager;
|
|
78
|
+
getOrSet<T>(key: string, ttlSeconds: number, factory: Factory<T>): Promise<T>;
|
|
79
|
+
getOrSet<T>(options: GetOrSetOptions<T>): Promise<T>;
|
|
80
|
+
/** Like {@link getOrSet} but the stored value never expires (bento `getOrSetForever`). */
|
|
81
|
+
getOrSetForever<T>(options: GetOrSetForeverOptions<T>): Promise<T>;
|
|
47
82
|
}
|
|
48
83
|
//# sourceMappingURL=CacheManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CacheManager.d.ts","sourceRoot":"","sources":["../src/CacheManager.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"CacheManager.d.ts","sourceRoot":"","sources":["../src/CacheManager.ts"],"names":[],"mappings":"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"}
|
package/dist/CacheManager.js
CHANGED
|
@@ -1,101 +1,379 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* CacheManager —
|
|
2
|
+
* CacheManager — a single cache store with a unified, bentocache/@adonisjs/cache
|
|
3
|
+
* parity API over a pluggable {@link CacheDriver}.
|
|
4
|
+
*
|
|
5
|
+
* Every read/write method accepts EITHER the Adonis/bento object form
|
|
6
|
+
* (`get({ key })`, `set({ key, value, ttl, tags })`, `getOrSet({ key, factory,
|
|
7
|
+
* … })`) OR echo's original positional form (`get(key)`, `set(key, value,
|
|
8
|
+
* ttlSeconds)`, `getOrSet(key, ttlSeconds, factory)`). The object form is the
|
|
9
|
+
* canonical one; the positional form is kept for back-compat.
|
|
3
10
|
*/
|
|
11
|
+
import { parseDuration, resolveTtlSeconds } from "./duration.js";
|
|
12
|
+
import { FactoryError, TimeoutError } from "./errors.js";
|
|
4
13
|
function isTaggableDriver(driver) {
|
|
5
14
|
const candidate = driver;
|
|
6
|
-
return (typeof candidate.
|
|
7
|
-
typeof candidate.
|
|
15
|
+
return (typeof candidate.setWithTags === "function" &&
|
|
16
|
+
(typeof candidate.deleteByTag === "function" ||
|
|
17
|
+
typeof candidate.flushTags === "function"));
|
|
18
|
+
}
|
|
19
|
+
/** Resolve an optional {@link Duration} to milliseconds; `undefined` when unset. */
|
|
20
|
+
function resolveMs(duration) {
|
|
21
|
+
if (duration === undefined || duration === null)
|
|
22
|
+
return undefined;
|
|
23
|
+
const seconds = typeof duration === "number" ? duration : parseDuration(duration);
|
|
24
|
+
return Math.max(0, seconds) * 1000;
|
|
25
|
+
}
|
|
26
|
+
const TIMEOUT = Symbol("echo.timeout");
|
|
27
|
+
function withTimeout(promise, ms) {
|
|
28
|
+
return new Promise((resolve, reject) => {
|
|
29
|
+
const timer = setTimeout(() => resolve(TIMEOUT), ms);
|
|
30
|
+
if (typeof timer === "object" && "unref" in timer) {
|
|
31
|
+
timer.unref();
|
|
32
|
+
}
|
|
33
|
+
promise.then((value) => {
|
|
34
|
+
clearTimeout(timer);
|
|
35
|
+
resolve(value);
|
|
36
|
+
}, (error) => {
|
|
37
|
+
clearTimeout(timer);
|
|
38
|
+
reject(error);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
8
41
|
}
|
|
9
42
|
export class CacheManager {
|
|
10
|
-
driver;
|
|
11
|
-
prefix;
|
|
12
|
-
defaultTtl;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
43
|
+
#driver;
|
|
44
|
+
#prefix;
|
|
45
|
+
#defaultTtl;
|
|
46
|
+
#defaultGrace;
|
|
47
|
+
#defaultTimeout;
|
|
48
|
+
#defaultHardTimeout;
|
|
49
|
+
#defaultLockTimeout;
|
|
50
|
+
#name;
|
|
51
|
+
#emitter;
|
|
52
|
+
#shared;
|
|
53
|
+
constructor(driver, config, shared) {
|
|
54
|
+
this.#driver = driver;
|
|
55
|
+
this.#prefix = config?.prefix ?? "";
|
|
56
|
+
this.#defaultTtl = config?.ttl ?? 3600;
|
|
57
|
+
this.#defaultGrace = config?.grace;
|
|
58
|
+
this.#defaultTimeout = config?.timeout;
|
|
59
|
+
this.#defaultHardTimeout = config?.hardTimeout;
|
|
60
|
+
this.#defaultLockTimeout = config?.lockTimeout;
|
|
61
|
+
this.#name = config?.name ?? "default";
|
|
62
|
+
this.#emitter = config?.emitter;
|
|
63
|
+
this.#shared = shared ?? { inflight: new Map() };
|
|
64
|
+
}
|
|
65
|
+
#prefixKey(key) {
|
|
66
|
+
return this.#prefix ? `${this.#prefix}:${key}` : key;
|
|
17
67
|
}
|
|
18
|
-
|
|
19
|
-
|
|
68
|
+
#emit(event, payload) {
|
|
69
|
+
this.#emitter?.emit(event, payload);
|
|
20
70
|
}
|
|
21
|
-
async
|
|
22
|
-
|
|
71
|
+
async #readEntry(prefixed) {
|
|
72
|
+
if (this.#driver.getEntry)
|
|
73
|
+
return this.#driver.getEntry(prefixed);
|
|
74
|
+
const value = await this.#driver.get(prefixed);
|
|
75
|
+
return value === null ? null : { value, stale: false };
|
|
23
76
|
}
|
|
24
|
-
async
|
|
77
|
+
async #writeValue(prefixed, value, ttlSeconds, graceSeconds, tags) {
|
|
25
78
|
if (value === null || value === undefined) {
|
|
79
|
+
// Named divergence (fail-loud): unlike bento (which no-ops), echo throws
|
|
80
|
+
// on caching null/undefined — a null cache write is almost always a bug.
|
|
26
81
|
throw new TypeError("Echo: caching null/undefined values is not supported");
|
|
27
82
|
}
|
|
28
|
-
|
|
83
|
+
if (this.#driver.setEntry) {
|
|
84
|
+
await this.#driver.setEntry(prefixed, value, {
|
|
85
|
+
ttlSeconds,
|
|
86
|
+
graceSeconds,
|
|
87
|
+
tags,
|
|
88
|
+
});
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (tags.length > 0) {
|
|
92
|
+
if (!isTaggableDriver(this.#driver)) {
|
|
93
|
+
throw new Error("Echo: the configured driver does not support tag-based invalidation");
|
|
94
|
+
}
|
|
95
|
+
await this.#driver.setWithTags(prefixed, value, tags, ttlSeconds);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
await this.#driver.set(prefixed, value, ttlSeconds);
|
|
29
99
|
}
|
|
30
|
-
async
|
|
31
|
-
|
|
100
|
+
async get(keyOrOptions) {
|
|
101
|
+
const key = typeof keyOrOptions === "string" ? keyOrOptions : keyOrOptions.key;
|
|
102
|
+
const graceSeconds = typeof keyOrOptions === "string"
|
|
103
|
+
? resolveTtlSeconds(this.#defaultGrace, 0)
|
|
104
|
+
: resolveTtlSeconds(keyOrOptions.grace ?? this.#defaultGrace, 0);
|
|
105
|
+
const defaultValue = typeof keyOrOptions === "string" ? undefined : keyOrOptions.defaultValue;
|
|
106
|
+
const entry = await this.#readEntry(this.#prefixKey(key));
|
|
107
|
+
if (entry && !entry.stale) {
|
|
108
|
+
this.#emit("cache:hit", {
|
|
109
|
+
key,
|
|
110
|
+
value: entry.value,
|
|
111
|
+
store: this.#name,
|
|
112
|
+
graced: false,
|
|
113
|
+
});
|
|
114
|
+
return entry.value;
|
|
115
|
+
}
|
|
116
|
+
if (entry && entry.stale && graceSeconds > 0) {
|
|
117
|
+
this.#emit("cache:hit", {
|
|
118
|
+
key,
|
|
119
|
+
value: entry.value,
|
|
120
|
+
store: this.#name,
|
|
121
|
+
graced: true,
|
|
122
|
+
});
|
|
123
|
+
return entry.value;
|
|
124
|
+
}
|
|
125
|
+
this.#emit("cache:miss", { key, store: this.#name });
|
|
126
|
+
if (defaultValue !== undefined) {
|
|
127
|
+
return defaultValue instanceof Function ? defaultValue() : defaultValue;
|
|
128
|
+
}
|
|
129
|
+
return null;
|
|
32
130
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
131
|
+
async set(keyOrOptions, value, ttlSeconds) {
|
|
132
|
+
let key;
|
|
133
|
+
let val;
|
|
134
|
+
let ttl;
|
|
135
|
+
let graceSeconds;
|
|
136
|
+
let tags;
|
|
137
|
+
if (typeof keyOrOptions === "string") {
|
|
138
|
+
key = keyOrOptions;
|
|
139
|
+
val = value;
|
|
140
|
+
ttl = ttlSeconds ?? this.#defaultTtl;
|
|
141
|
+
graceSeconds = 0;
|
|
142
|
+
tags = [];
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
key = keyOrOptions.key;
|
|
146
|
+
val = keyOrOptions.value;
|
|
147
|
+
ttl = resolveTtlSeconds(keyOrOptions.ttl, this.#defaultTtl);
|
|
148
|
+
graceSeconds = resolveTtlSeconds(keyOrOptions.grace ?? this.#defaultGrace, 0);
|
|
149
|
+
tags = keyOrOptions.tags ?? [];
|
|
150
|
+
}
|
|
151
|
+
await this.#writeValue(this.#prefixKey(key), val, ttl, graceSeconds, tags);
|
|
152
|
+
this.#emit("cache:written", { key, value: val, store: this.#name });
|
|
153
|
+
}
|
|
154
|
+
/** Set a value that never expires (bento `setForever`). */
|
|
155
|
+
setForever(options) {
|
|
156
|
+
return this.set({ ...options, ttl: null });
|
|
157
|
+
}
|
|
158
|
+
async delete(keyOrOptions) {
|
|
159
|
+
const key = typeof keyOrOptions === "string" ? keyOrOptions : keyOrOptions.key;
|
|
160
|
+
const deleted = await this.#driver.delete(this.#prefixKey(key));
|
|
161
|
+
this.#emit("cache:deleted", { key, store: this.#name });
|
|
162
|
+
return deleted;
|
|
163
|
+
}
|
|
164
|
+
/** Delete multiple keys (bento `deleteMany`). */
|
|
165
|
+
async deleteMany(keysOrOptions) {
|
|
166
|
+
const keys = Array.isArray(keysOrOptions)
|
|
167
|
+
? keysOrOptions
|
|
168
|
+
: keysOrOptions.keys;
|
|
169
|
+
let all = true;
|
|
170
|
+
for (const key of keys) {
|
|
171
|
+
const ok = await this.#driver.delete(this.#prefixKey(key));
|
|
172
|
+
this.#emit("cache:deleted", { key, store: this.#name });
|
|
173
|
+
if (!ok)
|
|
174
|
+
all = false;
|
|
175
|
+
}
|
|
176
|
+
return all;
|
|
177
|
+
}
|
|
178
|
+
async has(keyOrOptions) {
|
|
179
|
+
const key = typeof keyOrOptions === "string" ? keyOrOptions : keyOrOptions.key;
|
|
180
|
+
return this.#driver.has(this.#prefixKey(key));
|
|
181
|
+
}
|
|
182
|
+
/** Inverse of {@link has} (bento `missing`). */
|
|
183
|
+
async missing(keyOrOptions) {
|
|
184
|
+
const key = typeof keyOrOptions === "string" ? keyOrOptions : keyOrOptions.key;
|
|
185
|
+
return !(await this.has(key));
|
|
36
186
|
}
|
|
37
|
-
|
|
38
|
-
|
|
187
|
+
/** Read a key and delete it in one step (bento `pull`). Returns `null` on miss. */
|
|
188
|
+
async pull(key) {
|
|
189
|
+
const value = await this.get(key);
|
|
190
|
+
if (value !== null)
|
|
191
|
+
await this.delete(key);
|
|
192
|
+
return value;
|
|
39
193
|
}
|
|
40
194
|
/**
|
|
41
|
-
*
|
|
42
|
-
* `
|
|
43
|
-
* any existing prefix). Shares the same driver + default TTL.
|
|
195
|
+
* Expire a key: mark it stale immediately while retaining it for the grace
|
|
196
|
+
* window (bento `expire`). Without grace this is equivalent to a delete.
|
|
44
197
|
*/
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
198
|
+
async expire(keyOrOptions) {
|
|
199
|
+
const key = typeof keyOrOptions === "string" ? keyOrOptions : keyOrOptions.key;
|
|
200
|
+
const prefixed = this.#prefixKey(key);
|
|
201
|
+
const graceSeconds = resolveTtlSeconds(this.#defaultGrace, 0);
|
|
202
|
+
const entry = await this.#readEntry(prefixed);
|
|
203
|
+
if (entry === null)
|
|
204
|
+
return false;
|
|
205
|
+
if (graceSeconds > 0 && this.#driver.setEntry) {
|
|
206
|
+
// Mark the entry stale RIGHT NOW (logical expiry one ms in the past) while
|
|
207
|
+
// keeping it physically for the grace window. A positive `ttlSeconds`
|
|
208
|
+
// would leave a brief fresh window during which the value is still served
|
|
209
|
+
// and the factory never runs.
|
|
210
|
+
await this.#driver.setEntry(prefixed, entry.value, {
|
|
211
|
+
expiresAt: Date.now() - 1,
|
|
212
|
+
graceSeconds,
|
|
213
|
+
});
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
return this.#driver.delete(prefixed);
|
|
217
|
+
}
|
|
218
|
+
/** Clear the whole store (bento/Adonis `clear`). */
|
|
219
|
+
async clear() {
|
|
220
|
+
await this.#driver.flush();
|
|
221
|
+
this.#emit("cache:cleared", { store: this.#name });
|
|
50
222
|
}
|
|
51
|
-
|
|
223
|
+
// ---- tags ------------------------------------------------------------
|
|
224
|
+
/** Set a value with tags for grouped invalidation (bento parity). */
|
|
52
225
|
async setWithTags(key, value, tags, ttlSeconds) {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
226
|
+
await this.#writeValue(this.#prefixKey(key), value, ttlSeconds ?? this.#defaultTtl, 0, tags);
|
|
227
|
+
this.#emit("cache:written", { key, value, store: this.#name });
|
|
228
|
+
}
|
|
229
|
+
async deleteByTag(tagsOrOptions) {
|
|
230
|
+
const tags = Array.isArray(tagsOrOptions)
|
|
231
|
+
? tagsOrOptions
|
|
232
|
+
: tagsOrOptions.tags;
|
|
233
|
+
if (!isTaggableDriver(this.#driver)) {
|
|
57
234
|
throw new Error("Echo: the configured driver does not support tag-based invalidation");
|
|
58
235
|
}
|
|
59
|
-
|
|
236
|
+
if (typeof this.#driver.deleteByTag === "function") {
|
|
237
|
+
return this.#driver.deleteByTag(tags);
|
|
238
|
+
}
|
|
239
|
+
return this.#driver.flushTags(tags);
|
|
60
240
|
}
|
|
61
|
-
/**
|
|
241
|
+
/** @deprecated alias of {@link deleteByTag}. */
|
|
62
242
|
async flushTags(tags) {
|
|
63
|
-
|
|
64
|
-
|
|
243
|
+
return this.deleteByTag(tags);
|
|
244
|
+
}
|
|
245
|
+
// ---- namespace -------------------------------------------------------
|
|
246
|
+
/**
|
|
247
|
+
* A cache view scoped under an extra key prefix (Adonis `cache.namespace()`).
|
|
248
|
+
* Shares the SAME driver, defaults, emitter AND single-flight state, so a
|
|
249
|
+
* `getOrSet` stampede is collapsed across namespace views of the same key.
|
|
250
|
+
*/
|
|
251
|
+
namespace(ns) {
|
|
252
|
+
return new CacheManager(this.#driver, {
|
|
253
|
+
prefix: this.#prefix ? `${this.#prefix}:${ns}` : ns,
|
|
254
|
+
ttl: this.#defaultTtl,
|
|
255
|
+
grace: this.#defaultGrace,
|
|
256
|
+
timeout: this.#defaultTimeout,
|
|
257
|
+
hardTimeout: this.#defaultHardTimeout,
|
|
258
|
+
lockTimeout: this.#defaultLockTimeout,
|
|
259
|
+
name: this.#name,
|
|
260
|
+
emitter: this.#emitter,
|
|
261
|
+
}, this.#shared);
|
|
262
|
+
}
|
|
263
|
+
// ---- getOrSet --------------------------------------------------------
|
|
264
|
+
#normalizeGetOrSet(a, b, c) {
|
|
265
|
+
if (typeof a === "string") {
|
|
266
|
+
if (typeof c !== "function") {
|
|
267
|
+
throw new TypeError("Echo: getOrSet(key, ttl, factory) requires a factory function");
|
|
268
|
+
}
|
|
269
|
+
return {
|
|
270
|
+
key: a,
|
|
271
|
+
factory: c,
|
|
272
|
+
ttlSeconds: resolveTtlSeconds(b, this.#defaultTtl),
|
|
273
|
+
graceSeconds: resolveTtlSeconds(this.#defaultGrace, 0),
|
|
274
|
+
timeoutMs: resolveMs(this.#defaultTimeout),
|
|
275
|
+
hardTimeoutMs: resolveMs(this.#defaultHardTimeout),
|
|
276
|
+
lockTimeoutMs: resolveMs(this.#defaultLockTimeout),
|
|
277
|
+
tags: [],
|
|
278
|
+
};
|
|
65
279
|
}
|
|
66
|
-
|
|
280
|
+
return {
|
|
281
|
+
key: a.key,
|
|
282
|
+
factory: a.factory,
|
|
283
|
+
ttlSeconds: resolveTtlSeconds(a.ttl, this.#defaultTtl),
|
|
284
|
+
graceSeconds: resolveTtlSeconds(a.grace ?? this.#defaultGrace, 0),
|
|
285
|
+
timeoutMs: resolveMs(a.timeout ?? this.#defaultTimeout),
|
|
286
|
+
hardTimeoutMs: resolveMs(a.hardTimeout ?? this.#defaultHardTimeout),
|
|
287
|
+
lockTimeoutMs: resolveMs(a.lockTimeout ?? this.#defaultLockTimeout),
|
|
288
|
+
tags: a.tags ?? [],
|
|
289
|
+
onFactoryError: a.onFactoryError,
|
|
290
|
+
};
|
|
67
291
|
}
|
|
68
|
-
/** In-flight promises for stampede prevention. Each factory is typed per-call; the map is keyed by prefixed cache key. */
|
|
69
|
-
inflight = new Map();
|
|
70
292
|
/**
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
* Adonis's object form — echo keeps a leaner cache surface.)
|
|
293
|
+
* Run (or join) the single-flight factory for `prefixed`. Resolves to the
|
|
294
|
+
* fresh value on success; on failure it calls `onFactoryError` and either
|
|
295
|
+
* resolves to `staleValue` (when a stale fallback exists) or rejects.
|
|
75
296
|
*/
|
|
76
|
-
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
return
|
|
297
|
+
#invokeFactory(prefixed, o, hasStale, staleValue) {
|
|
298
|
+
const run = async () => {
|
|
299
|
+
try {
|
|
300
|
+
const value = await o.factory();
|
|
301
|
+
await this.#writeValue(prefixed, value, o.ttlSeconds, o.graceSeconds, o.tags);
|
|
302
|
+
this.#emit("cache:written", {
|
|
303
|
+
key: o.key,
|
|
304
|
+
value,
|
|
305
|
+
store: this.#name,
|
|
306
|
+
});
|
|
307
|
+
return value;
|
|
308
|
+
}
|
|
309
|
+
catch (error) {
|
|
310
|
+
o.onFactoryError?.(new FactoryError(o.key, error, hasStale));
|
|
311
|
+
if (hasStale && staleValue !== undefined)
|
|
312
|
+
return staleValue;
|
|
313
|
+
throw error;
|
|
314
|
+
}
|
|
315
|
+
finally {
|
|
316
|
+
this.#shared.inflight.delete(prefixed);
|
|
317
|
+
}
|
|
318
|
+
};
|
|
319
|
+
return run();
|
|
320
|
+
}
|
|
321
|
+
async getOrSet(a, b, c) {
|
|
322
|
+
const o = this.#normalizeGetOrSet(a, b, c);
|
|
323
|
+
const prefixed = this.#prefixKey(o.key);
|
|
324
|
+
const entry = await this.#readEntry(prefixed);
|
|
325
|
+
if (entry && !entry.stale) {
|
|
326
|
+
this.#emit("cache:hit", {
|
|
327
|
+
key: o.key,
|
|
328
|
+
value: entry.value,
|
|
329
|
+
store: this.#name,
|
|
330
|
+
graced: false,
|
|
331
|
+
});
|
|
332
|
+
return entry.value;
|
|
333
|
+
}
|
|
334
|
+
const hasStale = entry !== null && entry.stale && o.graceSeconds > 0;
|
|
335
|
+
const staleValue = hasStale ? entry.value : undefined;
|
|
336
|
+
let record = this.#shared.inflight.get(prefixed);
|
|
337
|
+
if (!record) {
|
|
338
|
+
record = {
|
|
339
|
+
promise: this.#invokeFactory(prefixed, o, hasStale, staleValue),
|
|
340
|
+
};
|
|
341
|
+
this.#shared.inflight.set(prefixed, record);
|
|
342
|
+
}
|
|
343
|
+
// Single-flight join point: the shared map is heterogeneous (many T), so
|
|
344
|
+
// this generic re-assertion is unavoidable (mirrors echo <=0.1.5).
|
|
345
|
+
const factoryPromise = record.promise;
|
|
346
|
+
if (hasStale && staleValue !== undefined) {
|
|
347
|
+
// Stale-while-revalidate: serve stale up to the soft timeout (default 0
|
|
348
|
+
// = serve immediately), let the factory refresh in the background.
|
|
349
|
+
const softMs = o.timeoutMs ?? 0;
|
|
350
|
+
const waitMs = o.lockTimeoutMs !== undefined
|
|
351
|
+
? Math.min(softMs, o.lockTimeoutMs)
|
|
352
|
+
: softMs;
|
|
353
|
+
const result = await withTimeout(factoryPromise, waitMs);
|
|
354
|
+
if (result === TIMEOUT) {
|
|
355
|
+
this.#emit("cache:hit", {
|
|
356
|
+
key: o.key,
|
|
357
|
+
value: staleValue,
|
|
358
|
+
store: this.#name,
|
|
359
|
+
graced: true,
|
|
360
|
+
});
|
|
361
|
+
return staleValue;
|
|
362
|
+
}
|
|
363
|
+
return result;
|
|
364
|
+
}
|
|
365
|
+
if (o.hardTimeoutMs !== undefined) {
|
|
366
|
+
const result = await withTimeout(factoryPromise, o.hardTimeoutMs);
|
|
367
|
+
if (result === TIMEOUT) {
|
|
368
|
+
throw new TimeoutError(o.key, o.hardTimeoutMs);
|
|
369
|
+
}
|
|
370
|
+
return result;
|
|
371
|
+
}
|
|
372
|
+
return factoryPromise;
|
|
373
|
+
}
|
|
374
|
+
/** Like {@link getOrSet} but the stored value never expires (bento `getOrSetForever`). */
|
|
375
|
+
getOrSetForever(options) {
|
|
376
|
+
return this.getOrSet({ ...options, ttl: null });
|
|
99
377
|
}
|
|
100
378
|
}
|
|
101
379
|
//# sourceMappingURL=CacheManager.js.map
|
package/dist/CacheManager.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CacheManager.js","sourceRoot":"","sources":["../src/CacheManager.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CacheManager.js","sourceRoot":"","sources":["../src/CacheManager.ts"],"names":[],"mappings":"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"}
|