@c9up/echo 0.1.6 → 0.1.8
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.js +2 -2
- package/dist/CacheManager.js.map +1 -1
- package/dist/EchoProvider.d.ts +1 -1
- package/dist/EchoProvider.d.ts.map +1 -1
- package/dist/EchoProvider.js +5 -5
- package/dist/EchoProvider.js.map +1 -1
- package/dist/StoreManager.d.ts +9 -0
- package/dist/StoreManager.d.ts.map +1 -1
- package/dist/StoreManager.js +11 -1
- package/dist/StoreManager.js.map +1 -1
- package/dist/drivers/RedisDriver.d.ts +8 -1
- package/dist/drivers/RedisDriver.d.ts.map +1 -1
- package/dist/drivers/RedisDriver.js +59 -29
- package/dist/drivers/RedisDriver.js.map +1 -1
- package/dist/quasar.d.ts +18 -0
- package/dist/quasar.d.ts.map +1 -0
- package/dist/quasar.js +64 -0
- package/dist/quasar.js.map +1 -0
- package/dist/services/main.d.ts.map +1 -1
- package/dist/services/main.js +9 -0
- package/dist/services/main.js.map +1 -1
- package/package.json +7 -2
- package/src/CacheManager.ts +2 -2
- package/src/EchoProvider.ts +6 -6
- package/src/StoreManager.ts +17 -2
- package/src/drivers/RedisDriver.ts +69 -29
- package/src/quasar.ts +84 -0
- package/src/services/main.ts +9 -0
package/dist/CacheManager.js
CHANGED
|
@@ -113,7 +113,7 @@ export class CacheManager {
|
|
|
113
113
|
});
|
|
114
114
|
return entry.value;
|
|
115
115
|
}
|
|
116
|
-
if (entry
|
|
116
|
+
if (entry?.stale && graceSeconds > 0) {
|
|
117
117
|
this.#emit("cache:hit", {
|
|
118
118
|
key,
|
|
119
119
|
value: entry.value,
|
|
@@ -331,7 +331,7 @@ export class CacheManager {
|
|
|
331
331
|
});
|
|
332
332
|
return entry.value;
|
|
333
333
|
}
|
|
334
|
-
const hasStale = entry
|
|
334
|
+
const hasStale = entry?.stale === true && o.graceSeconds > 0;
|
|
335
335
|
const staleValue = hasStale ? entry.value : undefined;
|
|
336
336
|
let record = this.#shared.inflight.get(prefixed);
|
|
337
337
|
if (!record) {
|
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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"}
|
package/dist/EchoProvider.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { type CacheConfig } from "./CacheManager.js";
|
|
|
6
6
|
*/
|
|
7
7
|
interface EchoContainer {
|
|
8
8
|
singleton(token: unknown, factory: () => unknown): void;
|
|
9
|
-
resolve<T = unknown>(token: unknown): T
|
|
9
|
+
resolve<T = unknown>(token: unknown): Promise<T>;
|
|
10
10
|
}
|
|
11
11
|
interface EchoConfigStore {
|
|
12
12
|
get<T = unknown>(key: string): T | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EchoProvider.d.ts","sourceRoot":"","sources":["../src/EchoProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAgB,MAAM,mBAAmB,CAAC;AAMnE;;;;GAIG;AACH,UAAU,aAAa;IACtB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,GAAG,IAAI,CAAC;IACxD,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"EchoProvider.d.ts","sourceRoot":"","sources":["../src/EchoProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAgB,MAAM,mBAAmB,CAAC;AAMnE;;;;GAIG;AACH,UAAU,aAAa;IACtB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,GAAG,IAAI,CAAC;IACxD,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACjD;AACD,UAAU,eAAe;IACxB,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;CAC7C;AACD,MAAM,WAAW,cAAc;IAC9B,SAAS,EAAE,aAAa,CAAC;IACzB,MAAM,EAAE,eAAe,CAAC;CACxB;AAED,MAAM,WAAW,kBAAmB,SAAQ,WAAW;IACtD;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAC;CAClB;AAmBD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,OAAO,OAAO,YAAY;;IACpB,SAAS,CAAC,GAAG,EAAE,cAAc;gBAAnB,GAAG,EAAE,cAAc;IAYzC,QAAQ,IAAI,IAAI;IA0BV,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAC/B"}
|
package/dist/EchoProvider.js
CHANGED
|
@@ -37,9 +37,9 @@ export default class EchoProvider {
|
|
|
37
37
|
constructor(app) {
|
|
38
38
|
this.app = app;
|
|
39
39
|
}
|
|
40
|
-
#resolveEmitter() {
|
|
40
|
+
async #resolveEmitter() {
|
|
41
41
|
try {
|
|
42
|
-
const candidate = this.app.container.resolve("emitter");
|
|
42
|
+
const candidate = await this.app.container.resolve("emitter");
|
|
43
43
|
if (isEmitter(candidate))
|
|
44
44
|
return candidate;
|
|
45
45
|
}
|
|
@@ -49,8 +49,8 @@ export default class EchoProvider {
|
|
|
49
49
|
return undefined;
|
|
50
50
|
}
|
|
51
51
|
register() {
|
|
52
|
-
this.app.container.singleton(CacheManager, () => {
|
|
53
|
-
const emitter = this.#resolveEmitter();
|
|
52
|
+
this.app.container.singleton(CacheManager, async () => {
|
|
53
|
+
const emitter = await this.#resolveEmitter();
|
|
54
54
|
const raw = this.app.config.get("cache");
|
|
55
55
|
if (isMultiStoreConfig(raw)) {
|
|
56
56
|
const manager = new CacheStoreManager({ ...raw, emitter });
|
|
@@ -68,7 +68,7 @@ export default class EchoProvider {
|
|
|
68
68
|
this.app.container.singleton("cache", () => this.app.container.resolve(CacheManager));
|
|
69
69
|
}
|
|
70
70
|
async boot() {
|
|
71
|
-
setCache(this.app.container.resolve(CacheManager));
|
|
71
|
+
setCache(await this.app.container.resolve(CacheManager));
|
|
72
72
|
}
|
|
73
73
|
async shutdown() { }
|
|
74
74
|
}
|
package/dist/EchoProvider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EchoProvider.js","sourceRoot":"","sources":["../src/EchoProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAyB,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAiC9C,SAAS,SAAS,CAAC,KAAc;IAChC,OAAO,CACN,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,UAAU,CAChD,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACzC,OAAO,CACN,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,QAAQ,IAAI,KAAK;QACjB,SAAS,IAAI,KAAK,CAClB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,OAAO,OAAO,YAAY;IACV;IAAtB,YAAsB,GAAmB;QAAnB,QAAG,GAAH,GAAG,CAAgB;IAAG,CAAC;IAE7C,eAAe;
|
|
1
|
+
{"version":3,"file":"EchoProvider.js","sourceRoot":"","sources":["../src/EchoProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAyB,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAiC9C,SAAS,SAAS,CAAC,KAAc;IAChC,OAAO,CACN,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,UAAU,CAChD,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACzC,OAAO,CACN,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,QAAQ,IAAI,KAAK;QACjB,SAAS,IAAI,KAAK,CAClB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,OAAO,OAAO,YAAY;IACV;IAAtB,YAAsB,GAAmB;QAAnB,QAAG,GAAH,GAAG,CAAgB;IAAG,CAAC;IAE7C,KAAK,CAAC,eAAe;QACpB,IAAI,CAAC;YACJ,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAU,SAAS,CAAC,CAAC;YACvE,IAAI,SAAS,CAAC,SAAS,CAAC;gBAAE,OAAO,SAAS,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACR,oDAAoD;QACrD,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,QAAQ;QACP,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAU,OAAO,CAAC,CAAC;YAElD,IAAI,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC3D,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC;YACtB,CAAC;YAED,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,EAAE,CAAuB,CAAC;YACjD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC;YACzC,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CACd,8BAA8B,MAAM,2BAA2B;oBAC9D,gEAAgE;oBAChE,2CAA2C,CAC5C,CAAC;YACH,CAAC;YACD,OAAO,IAAI,YAAY,CAAC,IAAI,YAAY,EAAE,EAAE,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,CAC1C,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAe,YAAY,CAAC,CACtD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACT,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAe,YAAY,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,QAAQ,KAAmB,CAAC;CAClC"}
|
package/dist/StoreManager.d.ts
CHANGED
|
@@ -42,9 +42,18 @@ export declare const drivers: {
|
|
|
42
42
|
memory(options?: {
|
|
43
43
|
sweepIntervalMs?: number;
|
|
44
44
|
}): DriverFactory;
|
|
45
|
+
/**
|
|
46
|
+
* Either hand it a client, or name a quasar connection — the AdonisJS shape,
|
|
47
|
+
* where a store says `connection: "cache"` and the Redis module owns the
|
|
48
|
+
* socket. Naming a connection loads @c9up/quasar on the first command, so a
|
|
49
|
+
* memory-only app never pays for it.
|
|
50
|
+
*/
|
|
45
51
|
redis(options: {
|
|
46
52
|
client: RedisClient;
|
|
47
53
|
prefix?: string;
|
|
54
|
+
} | {
|
|
55
|
+
connection?: string;
|
|
56
|
+
prefix?: string;
|
|
48
57
|
}): DriverFactory;
|
|
49
58
|
tiered(options: {
|
|
50
59
|
l1: DriverFactory;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StoreManager.d.ts","sourceRoot":"","sources":["../src/StoreManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,KAAK,WAAW,EAAe,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,KAAK,QAAQ,EAAgB,MAAM,2BAA2B,CAAC;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"StoreManager.d.ts","sourceRoot":"","sources":["../src/StoreManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,KAAK,WAAW,EAAe,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,KAAK,QAAQ,EAAgB,MAAM,2BAA2B,CAAC;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5D,2EAA2E;AAC3E,MAAM,MAAM,aAAa,GAAG,MAAM,WAAW,CAAC;AAE9C,MAAM,WAAW,WAAW;IAC3B,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,WAAW,CAAC,EAAE,QAAQ,CAAC;IACvB,WAAW,CAAC,EAAE,QAAQ,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACpC,6CAA6C;IAC7C,OAAO,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,yEAAyE;AACzE,eAAO,MAAM,OAAO;qBACF;QAAE,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,aAAa;IAG7D;;;;;OAKG;mBAGC;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GACxC;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GACzC,aAAa;oBAOA;QACf,EAAE,EAAE,aAAa,CAAC;QAClB,EAAE,EAAE,aAAa,CAAC;QAClB,GAAG,CAAC,EAAE,QAAQ,CAAC;KACf,GAAG,aAAa;CAQjB,CAAC;AAEF,qBAAa,iBAAiB;;gBAIjB,MAAM,EAAE,gBAAgB;IASpC,qFAAqF;IACrF,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,YAAY;CAsBhC"}
|
package/dist/StoreManager.js
CHANGED
|
@@ -18,13 +18,23 @@ import { CacheManager } from "./CacheManager.js";
|
|
|
18
18
|
import { MemoryDriver } from "./drivers/MemoryDriver.js";
|
|
19
19
|
import { RedisDriver } from "./drivers/RedisDriver.js";
|
|
20
20
|
import { TieredDriver } from "./drivers/TieredDriver.js";
|
|
21
|
+
import { quasarConnection } from "./quasar.js";
|
|
21
22
|
/** Driver factory helpers (bento `drivers.memory` / `drivers.redis`). */
|
|
22
23
|
export const drivers = {
|
|
23
24
|
memory(options) {
|
|
24
25
|
return () => new MemoryDriver(options?.sweepIntervalMs);
|
|
25
26
|
},
|
|
27
|
+
/**
|
|
28
|
+
* Either hand it a client, or name a quasar connection — the AdonisJS shape,
|
|
29
|
+
* where a store says `connection: "cache"` and the Redis module owns the
|
|
30
|
+
* socket. Naming a connection loads @c9up/quasar on the first command, so a
|
|
31
|
+
* memory-only app never pays for it.
|
|
32
|
+
*/
|
|
26
33
|
redis(options) {
|
|
27
|
-
|
|
34
|
+
if ("client" in options) {
|
|
35
|
+
return () => new RedisDriver(options.client, options.prefix);
|
|
36
|
+
}
|
|
37
|
+
return () => new RedisDriver(quasarConnection(options.connection), options.prefix);
|
|
28
38
|
},
|
|
29
39
|
tiered(options) {
|
|
30
40
|
return () => new TieredDriver({
|
package/dist/StoreManager.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StoreManager.js","sourceRoot":"","sources":["../src/StoreManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAoB,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAiB,YAAY,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"StoreManager.js","sourceRoot":"","sources":["../src/StoreManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAoB,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAiB,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAExE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAwB/C,yEAAyE;AACzE,MAAM,CAAC,MAAM,OAAO,GAAG;IACtB,MAAM,CAAC,OAAsC;QAC5C,OAAO,GAAG,EAAE,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACzD,CAAC;IACD;;;;;OAKG;IACH,KAAK,CACJ,OAE2C;QAE3C,IAAI,QAAQ,IAAI,OAAO,EAAE,CAAC;YACzB,OAAO,GAAG,EAAE,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,GAAG,EAAE,CACX,IAAI,WAAW,CAAC,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,CAAC,OAIN;QACA,OAAO,GAAG,EAAE,CACX,IAAI,YAAY,CAAC;YAChB,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE;YAChB,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE;YAChB,GAAG,EAAE,OAAO,CAAC,GAAG;SAChB,CAAC,CAAC;IACL,CAAC;CACD,CAAC;AAEF,MAAM,OAAO,iBAAiB;IAC7B,OAAO,CAAmB;IAC1B,MAAM,GAA8B,IAAI,GAAG,EAAE,CAAC;IAE9C,YAAY,MAAwB;QACnC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CACd,wBAAwB,MAAM,CAAC,OAAO,4BAA4B,CAClE,CAAC;QACH,CAAC;IACF,CAAC;IAED,qFAAqF;IACrF,GAAG,CAAC,IAAa;QAChB,MAAM,KAAK,GAAG,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAE9B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,GAAG,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,GAAG,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE;YAC9C,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;SAC7B,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAChC,OAAO,OAAO,CAAC;IAChB,CAAC;CACD"}
|
|
@@ -26,9 +26,16 @@ export interface RedisClient {
|
|
|
26
26
|
ttl(key: string): Promise<number>;
|
|
27
27
|
scan?(cursor: string, matchOption: "MATCH", pattern: string, countOption: "COUNT", count: number): Promise<[string, string[]]>;
|
|
28
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Where the client comes from. A resolver is what lets a store name its
|
|
31
|
+
* connection (`drivers.redis({ connection: "cache" })`) instead of being handed
|
|
32
|
+
* a client: the store is built synchronously, but the first command that needs
|
|
33
|
+
* the client is not.
|
|
34
|
+
*/
|
|
35
|
+
export type RedisClientSource = RedisClient | (() => RedisClient | Promise<RedisClient>);
|
|
29
36
|
export declare class RedisDriver implements TaggableDriver {
|
|
30
37
|
#private;
|
|
31
|
-
constructor(
|
|
38
|
+
constructor(source: RedisClientSource, prefix?: string);
|
|
32
39
|
delete(key: string): Promise<boolean>;
|
|
33
40
|
get<T = unknown>(key: string): Promise<T | null>;
|
|
34
41
|
getEntry<T = unknown>(key: string): Promise<CacheEntry<T> | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RedisDriver.d.ts","sourceRoot":"","sources":["../../src/drivers/RedisDriver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEhF,+EAA+E;AAC/E,MAAM,WAAW,WAAW;IAC3B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACzD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACzD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,CAAC,CACJ,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,OAAO,EACpB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,OAAO,EACpB,KAAK,EAAE,MAAM,GACX,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;CAC/B;AAiBD,qBAAa,WAAY,YAAW,cAAc;;
|
|
1
|
+
{"version":3,"file":"RedisDriver.d.ts","sourceRoot":"","sources":["../../src/drivers/RedisDriver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEhF,+EAA+E;AAC/E,MAAM,WAAW,WAAW;IAC3B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACzD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACzD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,CAAC,CACJ,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,OAAO,EACpB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,OAAO,EACpB,KAAK,EAAE,MAAM,GACX,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;CAC/B;AAiBD;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAC1B,WAAW,GACX,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;AAE9C,qBAAa,WAAY,YAAW,cAAc;;gBAMrC,MAAM,EAAE,iBAAiB,EAAE,MAAM,SAAW;IAuClD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBrC,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAMhD,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAmDjE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpE,QAAQ,CACb,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,gBAAgB,GACvB,OAAO,CAAC,IAAI,CAAC;IAwBV,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyBtB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAkDxC,0EAA0E;IACpE,WAAW,CAChB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,MAAM,EAAE,EACd,UAAU,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IAMhB;;;;OAIG;IACG,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BhD,gDAAgD;IAC1C,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAG9C"}
|
|
@@ -19,12 +19,35 @@ function isEnvelope(x) {
|
|
|
19
19
|
typeof Reflect.get(x, "e") === "number");
|
|
20
20
|
}
|
|
21
21
|
export class RedisDriver {
|
|
22
|
-
#
|
|
22
|
+
#source;
|
|
23
|
+
#resolved;
|
|
24
|
+
#pending;
|
|
23
25
|
#prefix;
|
|
24
|
-
constructor(
|
|
25
|
-
this.#
|
|
26
|
+
constructor(source, prefix = "cache:") {
|
|
27
|
+
this.#source = source;
|
|
26
28
|
this.#prefix = prefix;
|
|
27
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* The client, resolved once. Two commands racing on a cold store must not
|
|
32
|
+
* each open their own connection, so the in-flight promise is shared.
|
|
33
|
+
*/
|
|
34
|
+
async #client() {
|
|
35
|
+
if (this.#resolved)
|
|
36
|
+
return this.#resolved;
|
|
37
|
+
if (typeof this.#source !== "function") {
|
|
38
|
+
this.#resolved = this.#source;
|
|
39
|
+
return this.#resolved;
|
|
40
|
+
}
|
|
41
|
+
if (!this.#pending) {
|
|
42
|
+
const resolver = this.#source;
|
|
43
|
+
this.#pending = Promise.resolve(resolver()).then((client) => {
|
|
44
|
+
this.#resolved = client;
|
|
45
|
+
this.#pending = undefined;
|
|
46
|
+
return client;
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
return this.#pending;
|
|
50
|
+
}
|
|
28
51
|
#key(k) {
|
|
29
52
|
return `${this.#prefix}${k}`;
|
|
30
53
|
}
|
|
@@ -37,17 +60,18 @@ export class RedisDriver {
|
|
|
37
60
|
return `${this.#prefix}meta:tags:${k}`;
|
|
38
61
|
}
|
|
39
62
|
async delete(key) {
|
|
63
|
+
const client = await this.#client();
|
|
40
64
|
const fullKey = this.#key(key);
|
|
41
65
|
const metaKey = this.#metaKey(key);
|
|
42
|
-
const tags = await
|
|
66
|
+
const tags = await client.smembers(metaKey);
|
|
43
67
|
for (const tag of tags) {
|
|
44
68
|
const tagKey = `${this.#prefix}tag:${tag}`;
|
|
45
|
-
await
|
|
69
|
+
await client.srem(tagKey, fullKey);
|
|
46
70
|
}
|
|
47
71
|
if (tags.length > 0) {
|
|
48
|
-
await
|
|
72
|
+
await client.del(metaKey);
|
|
49
73
|
}
|
|
50
|
-
const count = await
|
|
74
|
+
const count = await client.del(fullKey);
|
|
51
75
|
return count > 0;
|
|
52
76
|
}
|
|
53
77
|
async get(key) {
|
|
@@ -57,7 +81,8 @@ export class RedisDriver {
|
|
|
57
81
|
return entry.value;
|
|
58
82
|
}
|
|
59
83
|
async getEntry(key) {
|
|
60
|
-
const
|
|
84
|
+
const client = await this.#client();
|
|
85
|
+
const raw = await client.get(this.#key(key));
|
|
61
86
|
if (raw === null)
|
|
62
87
|
return null;
|
|
63
88
|
const parsed = JSON.parse(raw);
|
|
@@ -72,6 +97,7 @@ export class RedisDriver {
|
|
|
72
97
|
}
|
|
73
98
|
/** Write the value envelope with a physical (grace-inclusive) TTL in seconds. */
|
|
74
99
|
async #writeEnvelope(fullKey, value, logicalTtlSeconds, physicalTtlSeconds, logicalExpiresAtOverride) {
|
|
100
|
+
const client = await this.#client();
|
|
75
101
|
// An absolute override (e.g. `expire()` marking stale-now) wins over the
|
|
76
102
|
// ttl-derived logical expiry; a past value flags the entry stale on read.
|
|
77
103
|
const expiresAt = logicalExpiresAtOverride !== undefined
|
|
@@ -82,20 +108,21 @@ export class RedisDriver {
|
|
|
82
108
|
const envelope = { v: value, e: expiresAt };
|
|
83
109
|
const serialized = JSON.stringify(envelope);
|
|
84
110
|
if (physicalTtlSeconds > 0) {
|
|
85
|
-
await
|
|
111
|
+
await client.set(fullKey, serialized, "EX", physicalTtlSeconds);
|
|
86
112
|
}
|
|
87
113
|
else {
|
|
88
|
-
await
|
|
114
|
+
await client.set(fullKey, serialized);
|
|
89
115
|
}
|
|
90
116
|
}
|
|
91
117
|
/** Drop a key from its previous tag memberships (reconcile before re-tagging). */
|
|
92
118
|
async #dropTags(fullKey, metaKey) {
|
|
93
|
-
const
|
|
119
|
+
const client = await this.#client();
|
|
120
|
+
const prevTags = await client.smembers(metaKey);
|
|
94
121
|
for (const tag of prevTags) {
|
|
95
|
-
await
|
|
122
|
+
await client.srem(`${this.#prefix}tag:${tag}`, fullKey);
|
|
96
123
|
}
|
|
97
124
|
if (prevTags.length > 0)
|
|
98
|
-
await
|
|
125
|
+
await client.del(metaKey);
|
|
99
126
|
return prevTags;
|
|
100
127
|
}
|
|
101
128
|
async set(key, value, ttlSeconds) {
|
|
@@ -126,14 +153,15 @@ export class RedisDriver {
|
|
|
126
153
|
await this.#applyTags(key, tags, physical);
|
|
127
154
|
}
|
|
128
155
|
async flush() {
|
|
129
|
-
const
|
|
156
|
+
const client = await this.#client();
|
|
157
|
+
const scan = client.scan;
|
|
130
158
|
if (typeof scan === "function") {
|
|
131
159
|
let cursor = "0";
|
|
132
160
|
do {
|
|
133
161
|
const [nextCursor, keys] = await scan(cursor, "MATCH", `${this.#prefix}*`, "COUNT", 100);
|
|
134
162
|
cursor = nextCursor;
|
|
135
163
|
if (keys.length > 0) {
|
|
136
|
-
await
|
|
164
|
+
await client.del(keys);
|
|
137
165
|
}
|
|
138
166
|
} while (cursor !== "0");
|
|
139
167
|
}
|
|
@@ -149,35 +177,36 @@ export class RedisDriver {
|
|
|
149
177
|
* tag-set / meta TTLs to the physical (grace-inclusive) retention.
|
|
150
178
|
*/
|
|
151
179
|
async #applyTags(key, tags, physicalTtlSeconds) {
|
|
180
|
+
const client = await this.#client();
|
|
152
181
|
const fullKey = this.#key(key);
|
|
153
182
|
const metaKey = this.#metaKey(key);
|
|
154
|
-
const oldTags = await
|
|
183
|
+
const oldTags = await client.smembers(metaKey);
|
|
155
184
|
const newTagSet = new Set(tags);
|
|
156
185
|
const oldTagSet = new Set(oldTags);
|
|
157
186
|
const removedTags = oldTags.filter((t) => !newTagSet.has(t));
|
|
158
187
|
const addedTags = tags.filter((t) => !oldTagSet.has(t));
|
|
159
188
|
for (const tag of removedTags) {
|
|
160
|
-
await
|
|
189
|
+
await client.srem(`${this.#prefix}tag:${tag}`, fullKey);
|
|
161
190
|
}
|
|
162
191
|
for (const tag of tags) {
|
|
163
192
|
const tagKey = `${this.#prefix}tag:${tag}`;
|
|
164
193
|
if (addedTags.includes(tag)) {
|
|
165
|
-
await
|
|
194
|
+
await client.sadd(tagKey, fullKey);
|
|
166
195
|
}
|
|
167
196
|
if (physicalTtlSeconds > 0) {
|
|
168
|
-
const currentTtl = await
|
|
197
|
+
const currentTtl = await client.ttl(tagKey);
|
|
169
198
|
if (currentTtl < 0 || physicalTtlSeconds > currentTtl) {
|
|
170
|
-
await
|
|
199
|
+
await client.expire(tagKey, physicalTtlSeconds);
|
|
171
200
|
}
|
|
172
201
|
}
|
|
173
202
|
}
|
|
174
203
|
if (oldTags.length > 0) {
|
|
175
|
-
await
|
|
204
|
+
await client.del(metaKey);
|
|
176
205
|
}
|
|
177
206
|
if (tags.length > 0) {
|
|
178
|
-
await
|
|
207
|
+
await client.sadd(metaKey, ...tags);
|
|
179
208
|
if (physicalTtlSeconds > 0) {
|
|
180
|
-
await
|
|
209
|
+
await client.expire(metaKey, physicalTtlSeconds);
|
|
181
210
|
}
|
|
182
211
|
}
|
|
183
212
|
}
|
|
@@ -193,29 +222,30 @@ export class RedisDriver {
|
|
|
193
222
|
* via one tag is also removed from the others.
|
|
194
223
|
*/
|
|
195
224
|
async deleteByTag(tags) {
|
|
225
|
+
const client = await this.#client();
|
|
196
226
|
for (const tag of tags) {
|
|
197
227
|
const tagKey = `${this.#prefix}tag:${tag}`;
|
|
198
|
-
const members = await
|
|
228
|
+
const members = await client.smembers(tagKey);
|
|
199
229
|
for (const fullKey of members) {
|
|
200
230
|
const userKey = fullKey.startsWith(this.#prefix)
|
|
201
231
|
? fullKey.slice(this.#prefix.length)
|
|
202
232
|
: fullKey;
|
|
203
233
|
const metaKey = this.#metaKey(userKey);
|
|
204
|
-
const allTags = await
|
|
234
|
+
const allTags = await client.smembers(metaKey);
|
|
205
235
|
for (const otherTag of allTags) {
|
|
206
236
|
if (otherTag === tag)
|
|
207
237
|
continue;
|
|
208
238
|
const otherTagKey = `${this.#prefix}tag:${otherTag}`;
|
|
209
|
-
await
|
|
239
|
+
await client.srem(otherTagKey, fullKey);
|
|
210
240
|
}
|
|
211
241
|
if (allTags.length > 0) {
|
|
212
|
-
await
|
|
242
|
+
await client.del(metaKey);
|
|
213
243
|
}
|
|
214
244
|
}
|
|
215
245
|
if (members.length > 0) {
|
|
216
|
-
await
|
|
246
|
+
await client.del(members);
|
|
217
247
|
}
|
|
218
|
-
await
|
|
248
|
+
await client.del(tagKey);
|
|
219
249
|
}
|
|
220
250
|
}
|
|
221
251
|
/** @deprecated alias of {@link deleteByTag}. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RedisDriver.js","sourceRoot":"","sources":["../../src/drivers/RedisDriver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AA8BH,SAAS,UAAU,CAAC,CAAU;IAC7B,OAAO,CACN,OAAO,CAAC,KAAK,QAAQ;QACrB,CAAC,KAAK,IAAI;QACV,GAAG,IAAI,CAAC;QACR,GAAG,IAAI,CAAC;QACR,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,QAAQ,CACvC,CAAC;AACH,CAAC;
|
|
1
|
+
{"version":3,"file":"RedisDriver.js","sourceRoot":"","sources":["../../src/drivers/RedisDriver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AA8BH,SAAS,UAAU,CAAC,CAAU;IAC7B,OAAO,CACN,OAAO,CAAC,KAAK,QAAQ;QACrB,CAAC,KAAK,IAAI;QACV,GAAG,IAAI,CAAC;QACR,GAAG,IAAI,CAAC;QACR,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,QAAQ,CACvC,CAAC;AACH,CAAC;AAYD,MAAM,OAAO,WAAW;IACvB,OAAO,CAAoB;IAC3B,SAAS,CAA0B;IACnC,QAAQ,CAAmC;IAC3C,OAAO,CAAS;IAEhB,YAAY,MAAyB,EAAE,MAAM,GAAG,QAAQ;QACvD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO;QACZ,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC,SAAS,CAAC;QAC1C,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YACxC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC;YAC9B,OAAO,IAAI,CAAC,SAAS,CAAC;QACvB,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC;YAC9B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC3D,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;gBACxB,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;gBAC1B,OAAO,MAAM,CAAC;YACf,CAAC,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED,IAAI,CAAC,CAAS;QACb,OAAO,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACH,QAAQ,CAAC,CAAS;QACjB,OAAO,GAAG,IAAI,CAAC,OAAO,aAAa,CAAC,EAAE,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC5C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,OAAO,GAAG,EAAE,CAAC;YAC3C,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxC,OAAO,KAAK,GAAG,CAAC,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,GAAG,CAAc,GAAW;QACjC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAI,GAAG,CAAC,CAAC;QAC1C,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAC/C,OAAO,KAAK,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAc,GAAW;QACtC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7C,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC9B,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QACrC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACpD,0EAA0E;QAC1E,wEAAwE;QACxE,2DAA2D;QAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,CAAM,CAAC;QAC5B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;IAC9C,CAAC;IAED,iFAAiF;IACjF,KAAK,CAAC,cAAc,CACnB,OAAe,EACf,KAAc,EACd,iBAAyB,EACzB,kBAA0B,EAC1B,wBAAiC;QAEjC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,yEAAyE;QACzE,0EAA0E;QAC1E,MAAM,SAAS,GACd,wBAAwB,KAAK,SAAS;YACrC,CAAC,CAAC,wBAAwB;YAC1B,CAAC,CAAC,iBAAiB,GAAG,CAAC;gBACtB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,iBAAiB,GAAG,IAAI;gBACvC,CAAC,CAAC,CAAC,CAAC;QACP,MAAM,QAAQ,GAAa,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC;QACtD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,kBAAkB,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACP,MAAM,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACvC,CAAC;IACF,CAAC;IAED,kFAAkF;IAClF,KAAK,CAAC,SAAS,CAAC,OAAe,EAAE,OAAe;QAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAChD,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,OAAO,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACnD,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAc,EAAE,UAAmB;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,UAAU,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,QAAQ,CACb,GAAW,EACX,KAAc,EACd,OAAyB;QAEzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,GAAG,GACR,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,MAAM,KAAK,GACV,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY,GAAG,CAAC;YAC/C,CAAC,CAAC,OAAO,CAAC,YAAY;YACtB,CAAC,CAAC,CAAC,CAAC;QACN,2EAA2E;QAC3E,yEAAyE;QACzE,sEAAsE;QACtE,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,MAAM,QAAQ,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACvC,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACnE,OAAO;QACR,CAAC;QACD,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACnE,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,KAAK;QACV,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACzB,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE,CAAC;YAChC,IAAI,MAAM,GAAG,GAAG,CAAC;YACjB,GAAG,CAAC;gBACH,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,MAAM,IAAI,CACpC,MAAM,EACN,OAAO,EACP,GAAG,IAAI,CAAC,OAAO,GAAG,EAClB,OAAO,EACP,GAAG,CACH,CAAC;gBACF,MAAM,GAAG,UAAU,CAAC;gBACpB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACrB,MAAM,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACxB,CAAC;YACF,CAAC,QAAQ,MAAM,KAAK,GAAG,EAAE;QAC1B,CAAC;aAAM,CAAC;YACP,MAAM,IAAI,KAAK,CACd,uGAAuG,CACvG,CAAC;QACH,CAAC;IACF,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACpB,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC;IACvC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CACf,GAAW,EACX,IAAc,EACd,kBAA0B;QAE1B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAExD,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC/B,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,OAAO,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;QACzD,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,OAAO,GAAG,EAAE,CAAC;YAC3C,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACpC,CAAC;YACD,IAAI,kBAAkB,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC5C,IAAI,UAAU,GAAG,CAAC,IAAI,kBAAkB,GAAG,UAAU,EAAE,CAAC;oBACvD,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;gBACjD,CAAC;YACF,CAAC;QACF,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;YACpC,IAAI,kBAAkB,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;YAClD,CAAC;QACF,CAAC;IACF,CAAC;IAED,0EAA0E;IAC1E,KAAK,CAAC,WAAW,CAChB,GAAW,EACX,KAAc,EACd,IAAc,EACd,UAAmB;QAEnB,MAAM,GAAG,GAAG,UAAU,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAC3D,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,WAAW,CAAC,IAAc;QAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,OAAO,GAAG,EAAE,CAAC;YAC3C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC9C,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE,CAAC;gBAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;oBAC/C,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;oBACpC,CAAC,CAAC,OAAO,CAAC;gBACX,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACvC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC/C,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;oBAChC,IAAI,QAAQ,KAAK,GAAG;wBAAE,SAAS;oBAC/B,MAAM,WAAW,GAAG,GAAG,IAAI,CAAC,OAAO,OAAO,QAAQ,EAAE,CAAC;oBACrD,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;gBACzC,CAAC;gBACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACxB,MAAM,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC3B,CAAC;YACF,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC3B,CAAC;YACD,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;IACF,CAAC;IAED,gDAAgD;IAChD,KAAK,CAAC,SAAS,CAAC,IAAc;QAC7B,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;CACD"}
|
package/dist/quasar.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolving a Redis connection by name, from `@c9up/quasar`.
|
|
3
|
+
*
|
|
4
|
+
* Echo does not depend on quasar: it is an optional peer, and this module
|
|
5
|
+
* never imports it statically. The specifier is built at runtime so the
|
|
6
|
+
* TypeScript build stays free of it too — a hard type import would make echo
|
|
7
|
+
* unbuildable for anyone who caches in memory.
|
|
8
|
+
*
|
|
9
|
+
* The shape is checked before use rather than asserted, the same way echo
|
|
10
|
+
* duck-types its host framework.
|
|
11
|
+
*/
|
|
12
|
+
import type { RedisClient } from "./drivers/RedisDriver.js";
|
|
13
|
+
/**
|
|
14
|
+
* A resolver for `drivers.redis({ connection })` — quasar is loaded on the
|
|
15
|
+
* first cache command, not at config time.
|
|
16
|
+
*/
|
|
17
|
+
export declare function quasarConnection(name?: string): () => Promise<RedisClient>;
|
|
18
|
+
//# sourceMappingURL=quasar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quasar.d.ts","sourceRoot":"","sources":["../src/quasar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAoC5D;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,CA+B1E"}
|
package/dist/quasar.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolving a Redis connection by name, from `@c9up/quasar`.
|
|
3
|
+
*
|
|
4
|
+
* Echo does not depend on quasar: it is an optional peer, and this module
|
|
5
|
+
* never imports it statically. The specifier is built at runtime so the
|
|
6
|
+
* TypeScript build stays free of it too — a hard type import would make echo
|
|
7
|
+
* unbuildable for anyone who caches in memory.
|
|
8
|
+
*
|
|
9
|
+
* The shape is checked before use rather than asserted, the same way echo
|
|
10
|
+
* duck-types its host framework.
|
|
11
|
+
*/
|
|
12
|
+
function isConnectionSource(value) {
|
|
13
|
+
return (typeof value === "object" &&
|
|
14
|
+
value !== null &&
|
|
15
|
+
typeof Reflect.get(value, "connection") === "function");
|
|
16
|
+
}
|
|
17
|
+
function isRedisClient(value) {
|
|
18
|
+
if (typeof value !== "object" || value === null)
|
|
19
|
+
return false;
|
|
20
|
+
// The commands this driver actually issues. A connection missing one of
|
|
21
|
+
// them would fail on the first cache write, far from the cause.
|
|
22
|
+
const required = [
|
|
23
|
+
"get",
|
|
24
|
+
"set",
|
|
25
|
+
"del",
|
|
26
|
+
"exists",
|
|
27
|
+
"keys",
|
|
28
|
+
"sadd",
|
|
29
|
+
"srem",
|
|
30
|
+
"smembers",
|
|
31
|
+
"expire",
|
|
32
|
+
"ttl",
|
|
33
|
+
];
|
|
34
|
+
return required.every((name) => typeof Reflect.get(value, name) === "function");
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* A resolver for `drivers.redis({ connection })` — quasar is loaded on the
|
|
38
|
+
* first cache command, not at config time.
|
|
39
|
+
*/
|
|
40
|
+
export function quasarConnection(name) {
|
|
41
|
+
return async () => {
|
|
42
|
+
const specifier = "@c9up/quasar/services/main";
|
|
43
|
+
let loaded;
|
|
44
|
+
try {
|
|
45
|
+
loaded = await import(/* @vite-ignore */ specifier);
|
|
46
|
+
}
|
|
47
|
+
catch (cause) {
|
|
48
|
+
throw new Error(`Echo: the "${name ?? "default"}" cache store asks for a quasar connection, but @c9up/quasar is not installed.\n` +
|
|
49
|
+
" pnpm add @c9up/quasar", { cause });
|
|
50
|
+
}
|
|
51
|
+
const manager = isConnectionSource(loaded)
|
|
52
|
+
? loaded
|
|
53
|
+
: Reflect.get(Object(loaded), "default");
|
|
54
|
+
if (!isConnectionSource(manager)) {
|
|
55
|
+
throw new Error("Echo: @c9up/quasar/services/main did not expose a connection() manager");
|
|
56
|
+
}
|
|
57
|
+
const connection = manager.connection(name);
|
|
58
|
+
if (!isRedisClient(connection)) {
|
|
59
|
+
throw new Error(`Echo: quasar connection "${name ?? "default"}" does not carry the commands this cache needs`);
|
|
60
|
+
}
|
|
61
|
+
return connection;
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=quasar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quasar.js","sourceRoot":"","sources":["../src/quasar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,SAAS,kBAAkB,CAAC,KAAc;IACzC,OAAO,CACN,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,UAAU,CACtD,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,wEAAwE;IACxE,gEAAgE;IAChE,MAAM,QAAQ,GAAG;QAChB,KAAK;QACL,KAAK;QACL,KAAK;QACL,QAAQ;QACR,MAAM;QACN,MAAM;QACN,MAAM;QACN,UAAU;QACV,QAAQ;QACR,KAAK;KACL,CAAC;IACF,OAAO,QAAQ,CAAC,KAAK,CACpB,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,UAAU,CACxD,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAa;IAC7C,OAAO,KAAK,IAAI,EAAE;QACjB,MAAM,SAAS,GAAG,4BAA4B,CAAC;QAC/C,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACJ,MAAM,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CACd,cAAc,IAAI,IAAI,SAAS,kFAAkF;gBAChH,yBAAyB,EAC1B,EAAE,KAAK,EAAE,CACT,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC;YACzC,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CACd,wEAAwE,CACxE,CAAC;QACH,CAAC;QAED,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CACd,4BAA4B,IAAI,IAAI,SAAS,gDAAgD,CAC7F,CAAC;QACH,CAAC;QACD,OAAO,UAAU,CAAC;IACnB,CAAC,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/services/main.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD,2EAA2E;AAC3E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAElD;AAED,8DAA8D;AAC9D,wBAAgB,QAAQ,IAAI,YAAY,GAAG,SAAS,CAEnD;AAED,QAAA,MAAM,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/services/main.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD,2EAA2E;AAC3E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAElD;AAED,8DAA8D;AAC9D,wBAAgB,QAAQ,IAAI,YAAY,GAAG,SAAS,CAEnD;AAED,QAAA,MAAM,KAAK,EAAE,YAoBX,CAAC;AAEH,eAAe,KAAK,CAAC"}
|
package/dist/services/main.js
CHANGED
|
@@ -21,6 +21,15 @@ export function getCache() {
|
|
|
21
21
|
}
|
|
22
22
|
const cache = new Proxy({}, {
|
|
23
23
|
get(_target, prop) {
|
|
24
|
+
// A module loader inspects what it imports before anyone uses it: it reads
|
|
25
|
+
// `then` to decide whether the namespace is thenable, and various symbols
|
|
26
|
+
// for interop and formatting. Throwing on those turns a plain
|
|
27
|
+
// `import { setX } from ".../services/main"` into a crash at import time,
|
|
28
|
+
// far from any real use. They are not members of what this stands in for,
|
|
29
|
+
// so answer undefined and let a genuine access be the one that reports.
|
|
30
|
+
if (typeof prop === "symbol" || prop === "then") {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
24
33
|
if (!instance) {
|
|
25
34
|
throw new Error("[echo] CacheManager singleton accessed before EchoProvider.boot() ran " +
|
|
26
35
|
"or `setCache(myCache)` was called. Wire one of them first.");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/services/main.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,IAAI,QAAkC,CAAC;AAEvC,2EAA2E;AAC3E,MAAM,UAAU,QAAQ,CAAC,KAAmB;IAC3C,QAAQ,GAAG,KAAK,CAAC;AAClB,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,QAAQ;IACvB,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,MAAM,KAAK,GAAiB,IAAI,KAAK,CAAC,EAAkB,EAAE;IACzD,GAAG,CAAC,OAAO,EAAE,IAAI;QAChB,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACd,wEAAwE;gBACvE,4DAA4D,CAC7D,CAAC;QACH,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QACpD,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACnE,CAAC;CACD,CAAC,CAAC;AAEH,eAAe,KAAK,CAAC"}
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/services/main.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,IAAI,QAAkC,CAAC;AAEvC,2EAA2E;AAC3E,MAAM,UAAU,QAAQ,CAAC,KAAmB;IAC3C,QAAQ,GAAG,KAAK,CAAC;AAClB,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,QAAQ;IACvB,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,MAAM,KAAK,GAAiB,IAAI,KAAK,CAAC,EAAkB,EAAE;IACzD,GAAG,CAAC,OAAO,EAAE,IAAI;QAChB,2EAA2E;QAC3E,0EAA0E;QAC1E,8DAA8D;QAC9D,0EAA0E;QAC1E,0EAA0E;QAC1E,wEAAwE;QACxE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACjD,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACd,wEAAwE;gBACvE,4DAA4D,CAC7D,CAAC;QACH,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QACpD,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACnE,CAAC;CACD,CAAC,CAAC;AAEH,eAAe,KAAK,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@c9up/echo",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.8",
|
|
4
4
|
"description": "Cache — pluggable cache contract with memory + Redis drivers for the Ream framework",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -25,10 +25,12 @@
|
|
|
25
25
|
}
|
|
26
26
|
},
|
|
27
27
|
"peerDependencies": {
|
|
28
|
-
"@c9up/ream": "^0.1.0"
|
|
28
|
+
"@c9up/ream": "^0.1.0",
|
|
29
|
+
"@c9up/quasar": "^0.1.0"
|
|
29
30
|
},
|
|
30
31
|
"devDependencies": {
|
|
31
32
|
"@biomejs/biome": "^2.4.10",
|
|
33
|
+
"@c9up/quasar": "^0.1.0",
|
|
32
34
|
"@types/node": "^22.19.15",
|
|
33
35
|
"typescript": "^6.0.2",
|
|
34
36
|
"vitest": "^4.1.2"
|
|
@@ -48,6 +50,9 @@
|
|
|
48
50
|
"peerDependenciesMeta": {
|
|
49
51
|
"@c9up/ream": {
|
|
50
52
|
"optional": true
|
|
53
|
+
},
|
|
54
|
+
"@c9up/quasar": {
|
|
55
|
+
"optional": true
|
|
51
56
|
}
|
|
52
57
|
},
|
|
53
58
|
"repository": {
|
package/src/CacheManager.ts
CHANGED
|
@@ -212,7 +212,7 @@ export class CacheManager {
|
|
|
212
212
|
});
|
|
213
213
|
return entry.value;
|
|
214
214
|
}
|
|
215
|
-
if (entry
|
|
215
|
+
if (entry?.stale && graceSeconds > 0) {
|
|
216
216
|
this.#emit("cache:hit", {
|
|
217
217
|
key,
|
|
218
218
|
value: entry.value,
|
|
@@ -513,7 +513,7 @@ export class CacheManager {
|
|
|
513
513
|
return entry.value;
|
|
514
514
|
}
|
|
515
515
|
|
|
516
|
-
const hasStale = entry
|
|
516
|
+
const hasStale = entry?.stale === true && o.graceSeconds > 0;
|
|
517
517
|
const staleValue = hasStale ? entry.value : undefined;
|
|
518
518
|
|
|
519
519
|
let record = this.#shared.inflight.get(prefixed);
|
package/src/EchoProvider.ts
CHANGED
|
@@ -11,7 +11,7 @@ import type { CacheEmitter } from "./types.js";
|
|
|
11
11
|
*/
|
|
12
12
|
interface EchoContainer {
|
|
13
13
|
singleton(token: unknown, factory: () => unknown): void;
|
|
14
|
-
resolve<T = unknown>(token: unknown): T
|
|
14
|
+
resolve<T = unknown>(token: unknown): Promise<T>;
|
|
15
15
|
}
|
|
16
16
|
interface EchoConfigStore {
|
|
17
17
|
get<T = unknown>(key: string): T | undefined;
|
|
@@ -73,9 +73,9 @@ function isMultiStoreConfig(value: unknown): value is MultiStoreConfig {
|
|
|
73
73
|
export default class EchoProvider {
|
|
74
74
|
constructor(protected app: EchoAppContext) {}
|
|
75
75
|
|
|
76
|
-
#resolveEmitter(): CacheEmitter | undefined {
|
|
76
|
+
async #resolveEmitter(): Promise<CacheEmitter | undefined> {
|
|
77
77
|
try {
|
|
78
|
-
const candidate = this.app.container.resolve<unknown>("emitter");
|
|
78
|
+
const candidate = await this.app.container.resolve<unknown>("emitter");
|
|
79
79
|
if (isEmitter(candidate)) return candidate;
|
|
80
80
|
} catch {
|
|
81
81
|
// No emitter bound — events are simply not emitted.
|
|
@@ -84,8 +84,8 @@ export default class EchoProvider {
|
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
register(): void {
|
|
87
|
-
this.app.container.singleton(CacheManager, () => {
|
|
88
|
-
const emitter = this.#resolveEmitter();
|
|
87
|
+
this.app.container.singleton(CacheManager, async () => {
|
|
88
|
+
const emitter = await this.#resolveEmitter();
|
|
89
89
|
const raw = this.app.config.get<unknown>("cache");
|
|
90
90
|
|
|
91
91
|
if (isMultiStoreConfig(raw)) {
|
|
@@ -110,7 +110,7 @@ export default class EchoProvider {
|
|
|
110
110
|
}
|
|
111
111
|
|
|
112
112
|
async boot(): Promise<void> {
|
|
113
|
-
setCache(this.app.container.resolve<CacheManager>(CacheManager));
|
|
113
|
+
setCache(await this.app.container.resolve<CacheManager>(CacheManager));
|
|
114
114
|
}
|
|
115
115
|
|
|
116
116
|
async shutdown(): Promise<void> {}
|
package/src/StoreManager.ts
CHANGED
|
@@ -20,6 +20,7 @@ import { MemoryDriver } from "./drivers/MemoryDriver.js";
|
|
|
20
20
|
import { type RedisClient, RedisDriver } from "./drivers/RedisDriver.js";
|
|
21
21
|
import { type CacheBus, TieredDriver } from "./drivers/TieredDriver.js";
|
|
22
22
|
import type { Duration } from "./duration.js";
|
|
23
|
+
import { quasarConnection } from "./quasar.js";
|
|
23
24
|
import type { CacheDriver, CacheEmitter } from "./types.js";
|
|
24
25
|
|
|
25
26
|
/** A lazily-instantiated driver (built once per store, on first `use`). */
|
|
@@ -48,8 +49,22 @@ export const drivers = {
|
|
|
48
49
|
memory(options?: { sweepIntervalMs?: number }): DriverFactory {
|
|
49
50
|
return () => new MemoryDriver(options?.sweepIntervalMs);
|
|
50
51
|
},
|
|
51
|
-
|
|
52
|
-
|
|
52
|
+
/**
|
|
53
|
+
* Either hand it a client, or name a quasar connection — the AdonisJS shape,
|
|
54
|
+
* where a store says `connection: "cache"` and the Redis module owns the
|
|
55
|
+
* socket. Naming a connection loads @c9up/quasar on the first command, so a
|
|
56
|
+
* memory-only app never pays for it.
|
|
57
|
+
*/
|
|
58
|
+
redis(
|
|
59
|
+
options:
|
|
60
|
+
| { client: RedisClient; prefix?: string }
|
|
61
|
+
| { connection?: string; prefix?: string },
|
|
62
|
+
): DriverFactory {
|
|
63
|
+
if ("client" in options) {
|
|
64
|
+
return () => new RedisDriver(options.client, options.prefix);
|
|
65
|
+
}
|
|
66
|
+
return () =>
|
|
67
|
+
new RedisDriver(quasarConnection(options.connection), options.prefix);
|
|
53
68
|
},
|
|
54
69
|
tiered(options: {
|
|
55
70
|
l1: DriverFactory;
|
|
@@ -50,15 +50,48 @@ function isEnvelope(x: unknown): x is Envelope {
|
|
|
50
50
|
);
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
+
/**
|
|
54
|
+
* Where the client comes from. A resolver is what lets a store name its
|
|
55
|
+
* connection (`drivers.redis({ connection: "cache" })`) instead of being handed
|
|
56
|
+
* a client: the store is built synchronously, but the first command that needs
|
|
57
|
+
* the client is not.
|
|
58
|
+
*/
|
|
59
|
+
export type RedisClientSource =
|
|
60
|
+
| RedisClient
|
|
61
|
+
| (() => RedisClient | Promise<RedisClient>);
|
|
62
|
+
|
|
53
63
|
export class RedisDriver implements TaggableDriver {
|
|
54
|
-
#
|
|
64
|
+
#source: RedisClientSource;
|
|
65
|
+
#resolved: RedisClient | undefined;
|
|
66
|
+
#pending: Promise<RedisClient> | undefined;
|
|
55
67
|
#prefix: string;
|
|
56
68
|
|
|
57
|
-
constructor(
|
|
58
|
-
this.#
|
|
69
|
+
constructor(source: RedisClientSource, prefix = "cache:") {
|
|
70
|
+
this.#source = source;
|
|
59
71
|
this.#prefix = prefix;
|
|
60
72
|
}
|
|
61
73
|
|
|
74
|
+
/**
|
|
75
|
+
* The client, resolved once. Two commands racing on a cold store must not
|
|
76
|
+
* each open their own connection, so the in-flight promise is shared.
|
|
77
|
+
*/
|
|
78
|
+
async #client(): Promise<RedisClient> {
|
|
79
|
+
if (this.#resolved) return this.#resolved;
|
|
80
|
+
if (typeof this.#source !== "function") {
|
|
81
|
+
this.#resolved = this.#source;
|
|
82
|
+
return this.#resolved;
|
|
83
|
+
}
|
|
84
|
+
if (!this.#pending) {
|
|
85
|
+
const resolver = this.#source;
|
|
86
|
+
this.#pending = Promise.resolve(resolver()).then((client) => {
|
|
87
|
+
this.#resolved = client;
|
|
88
|
+
this.#pending = undefined;
|
|
89
|
+
return client;
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
return this.#pending;
|
|
93
|
+
}
|
|
94
|
+
|
|
62
95
|
#key(k: string): string {
|
|
63
96
|
return `${this.#prefix}${k}`;
|
|
64
97
|
}
|
|
@@ -73,17 +106,18 @@ export class RedisDriver implements TaggableDriver {
|
|
|
73
106
|
}
|
|
74
107
|
|
|
75
108
|
async delete(key: string): Promise<boolean> {
|
|
109
|
+
const client = await this.#client();
|
|
76
110
|
const fullKey = this.#key(key);
|
|
77
111
|
const metaKey = this.#metaKey(key);
|
|
78
|
-
const tags = await
|
|
112
|
+
const tags = await client.smembers(metaKey);
|
|
79
113
|
for (const tag of tags) {
|
|
80
114
|
const tagKey = `${this.#prefix}tag:${tag}`;
|
|
81
|
-
await
|
|
115
|
+
await client.srem(tagKey, fullKey);
|
|
82
116
|
}
|
|
83
117
|
if (tags.length > 0) {
|
|
84
|
-
await
|
|
118
|
+
await client.del(metaKey);
|
|
85
119
|
}
|
|
86
|
-
const count = await
|
|
120
|
+
const count = await client.del(fullKey);
|
|
87
121
|
return count > 0;
|
|
88
122
|
}
|
|
89
123
|
|
|
@@ -94,7 +128,8 @@ export class RedisDriver implements TaggableDriver {
|
|
|
94
128
|
}
|
|
95
129
|
|
|
96
130
|
async getEntry<T = unknown>(key: string): Promise<CacheEntry<T> | null> {
|
|
97
|
-
const
|
|
131
|
+
const client = await this.#client();
|
|
132
|
+
const raw = await client.get(this.#key(key));
|
|
98
133
|
if (raw === null) return null;
|
|
99
134
|
const parsed: unknown = JSON.parse(raw);
|
|
100
135
|
if (!isEnvelope(parsed)) return null;
|
|
@@ -114,6 +149,7 @@ export class RedisDriver implements TaggableDriver {
|
|
|
114
149
|
physicalTtlSeconds: number,
|
|
115
150
|
logicalExpiresAtOverride?: number,
|
|
116
151
|
): Promise<void> {
|
|
152
|
+
const client = await this.#client();
|
|
117
153
|
// An absolute override (e.g. `expire()` marking stale-now) wins over the
|
|
118
154
|
// ttl-derived logical expiry; a past value flags the entry stale on read.
|
|
119
155
|
const expiresAt =
|
|
@@ -125,19 +161,20 @@ export class RedisDriver implements TaggableDriver {
|
|
|
125
161
|
const envelope: Envelope = { v: value, e: expiresAt };
|
|
126
162
|
const serialized = JSON.stringify(envelope);
|
|
127
163
|
if (physicalTtlSeconds > 0) {
|
|
128
|
-
await
|
|
164
|
+
await client.set(fullKey, serialized, "EX", physicalTtlSeconds);
|
|
129
165
|
} else {
|
|
130
|
-
await
|
|
166
|
+
await client.set(fullKey, serialized);
|
|
131
167
|
}
|
|
132
168
|
}
|
|
133
169
|
|
|
134
170
|
/** Drop a key from its previous tag memberships (reconcile before re-tagging). */
|
|
135
171
|
async #dropTags(fullKey: string, metaKey: string): Promise<string[]> {
|
|
136
|
-
const
|
|
172
|
+
const client = await this.#client();
|
|
173
|
+
const prevTags = await client.smembers(metaKey);
|
|
137
174
|
for (const tag of prevTags) {
|
|
138
|
-
await
|
|
175
|
+
await client.srem(`${this.#prefix}tag:${tag}`, fullKey);
|
|
139
176
|
}
|
|
140
|
-
if (prevTags.length > 0) await
|
|
177
|
+
if (prevTags.length > 0) await client.del(metaKey);
|
|
141
178
|
return prevTags;
|
|
142
179
|
}
|
|
143
180
|
|
|
@@ -177,7 +214,8 @@ export class RedisDriver implements TaggableDriver {
|
|
|
177
214
|
}
|
|
178
215
|
|
|
179
216
|
async flush(): Promise<void> {
|
|
180
|
-
const
|
|
217
|
+
const client = await this.#client();
|
|
218
|
+
const scan = client.scan;
|
|
181
219
|
if (typeof scan === "function") {
|
|
182
220
|
let cursor = "0";
|
|
183
221
|
do {
|
|
@@ -190,7 +228,7 @@ export class RedisDriver implements TaggableDriver {
|
|
|
190
228
|
);
|
|
191
229
|
cursor = nextCursor;
|
|
192
230
|
if (keys.length > 0) {
|
|
193
|
-
await
|
|
231
|
+
await client.del(keys);
|
|
194
232
|
}
|
|
195
233
|
} while (cursor !== "0");
|
|
196
234
|
} else {
|
|
@@ -213,38 +251,39 @@ export class RedisDriver implements TaggableDriver {
|
|
|
213
251
|
tags: string[],
|
|
214
252
|
physicalTtlSeconds: number,
|
|
215
253
|
): Promise<void> {
|
|
254
|
+
const client = await this.#client();
|
|
216
255
|
const fullKey = this.#key(key);
|
|
217
256
|
const metaKey = this.#metaKey(key);
|
|
218
|
-
const oldTags = await
|
|
257
|
+
const oldTags = await client.smembers(metaKey);
|
|
219
258
|
const newTagSet = new Set(tags);
|
|
220
259
|
const oldTagSet = new Set(oldTags);
|
|
221
260
|
const removedTags = oldTags.filter((t) => !newTagSet.has(t));
|
|
222
261
|
const addedTags = tags.filter((t) => !oldTagSet.has(t));
|
|
223
262
|
|
|
224
263
|
for (const tag of removedTags) {
|
|
225
|
-
await
|
|
264
|
+
await client.srem(`${this.#prefix}tag:${tag}`, fullKey);
|
|
226
265
|
}
|
|
227
266
|
|
|
228
267
|
for (const tag of tags) {
|
|
229
268
|
const tagKey = `${this.#prefix}tag:${tag}`;
|
|
230
269
|
if (addedTags.includes(tag)) {
|
|
231
|
-
await
|
|
270
|
+
await client.sadd(tagKey, fullKey);
|
|
232
271
|
}
|
|
233
272
|
if (physicalTtlSeconds > 0) {
|
|
234
|
-
const currentTtl = await
|
|
273
|
+
const currentTtl = await client.ttl(tagKey);
|
|
235
274
|
if (currentTtl < 0 || physicalTtlSeconds > currentTtl) {
|
|
236
|
-
await
|
|
275
|
+
await client.expire(tagKey, physicalTtlSeconds);
|
|
237
276
|
}
|
|
238
277
|
}
|
|
239
278
|
}
|
|
240
279
|
|
|
241
280
|
if (oldTags.length > 0) {
|
|
242
|
-
await
|
|
281
|
+
await client.del(metaKey);
|
|
243
282
|
}
|
|
244
283
|
if (tags.length > 0) {
|
|
245
|
-
await
|
|
284
|
+
await client.sadd(metaKey, ...tags);
|
|
246
285
|
if (physicalTtlSeconds > 0) {
|
|
247
|
-
await
|
|
286
|
+
await client.expire(metaKey, physicalTtlSeconds);
|
|
248
287
|
}
|
|
249
288
|
}
|
|
250
289
|
}
|
|
@@ -267,28 +306,29 @@ export class RedisDriver implements TaggableDriver {
|
|
|
267
306
|
* via one tag is also removed from the others.
|
|
268
307
|
*/
|
|
269
308
|
async deleteByTag(tags: string[]): Promise<void> {
|
|
309
|
+
const client = await this.#client();
|
|
270
310
|
for (const tag of tags) {
|
|
271
311
|
const tagKey = `${this.#prefix}tag:${tag}`;
|
|
272
|
-
const members = await
|
|
312
|
+
const members = await client.smembers(tagKey);
|
|
273
313
|
for (const fullKey of members) {
|
|
274
314
|
const userKey = fullKey.startsWith(this.#prefix)
|
|
275
315
|
? fullKey.slice(this.#prefix.length)
|
|
276
316
|
: fullKey;
|
|
277
317
|
const metaKey = this.#metaKey(userKey);
|
|
278
|
-
const allTags = await
|
|
318
|
+
const allTags = await client.smembers(metaKey);
|
|
279
319
|
for (const otherTag of allTags) {
|
|
280
320
|
if (otherTag === tag) continue;
|
|
281
321
|
const otherTagKey = `${this.#prefix}tag:${otherTag}`;
|
|
282
|
-
await
|
|
322
|
+
await client.srem(otherTagKey, fullKey);
|
|
283
323
|
}
|
|
284
324
|
if (allTags.length > 0) {
|
|
285
|
-
await
|
|
325
|
+
await client.del(metaKey);
|
|
286
326
|
}
|
|
287
327
|
}
|
|
288
328
|
if (members.length > 0) {
|
|
289
|
-
await
|
|
329
|
+
await client.del(members);
|
|
290
330
|
}
|
|
291
|
-
await
|
|
331
|
+
await client.del(tagKey);
|
|
292
332
|
}
|
|
293
333
|
}
|
|
294
334
|
|
package/src/quasar.ts
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolving a Redis connection by name, from `@c9up/quasar`.
|
|
3
|
+
*
|
|
4
|
+
* Echo does not depend on quasar: it is an optional peer, and this module
|
|
5
|
+
* never imports it statically. The specifier is built at runtime so the
|
|
6
|
+
* TypeScript build stays free of it too — a hard type import would make echo
|
|
7
|
+
* unbuildable for anyone who caches in memory.
|
|
8
|
+
*
|
|
9
|
+
* The shape is checked before use rather than asserted, the same way echo
|
|
10
|
+
* duck-types its host framework.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import type { RedisClient } from "./drivers/RedisDriver.js";
|
|
14
|
+
|
|
15
|
+
/** The slice of quasar's manager this needs: a connection, by name. */
|
|
16
|
+
interface ConnectionSource {
|
|
17
|
+
connection(name?: string): unknown;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function isConnectionSource(value: unknown): value is ConnectionSource {
|
|
21
|
+
return (
|
|
22
|
+
typeof value === "object" &&
|
|
23
|
+
value !== null &&
|
|
24
|
+
typeof Reflect.get(value, "connection") === "function"
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function isRedisClient(value: unknown): value is RedisClient {
|
|
29
|
+
if (typeof value !== "object" || value === null) return false;
|
|
30
|
+
// The commands this driver actually issues. A connection missing one of
|
|
31
|
+
// them would fail on the first cache write, far from the cause.
|
|
32
|
+
const required = [
|
|
33
|
+
"get",
|
|
34
|
+
"set",
|
|
35
|
+
"del",
|
|
36
|
+
"exists",
|
|
37
|
+
"keys",
|
|
38
|
+
"sadd",
|
|
39
|
+
"srem",
|
|
40
|
+
"smembers",
|
|
41
|
+
"expire",
|
|
42
|
+
"ttl",
|
|
43
|
+
];
|
|
44
|
+
return required.every(
|
|
45
|
+
(name) => typeof Reflect.get(value, name) === "function",
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* A resolver for `drivers.redis({ connection })` — quasar is loaded on the
|
|
51
|
+
* first cache command, not at config time.
|
|
52
|
+
*/
|
|
53
|
+
export function quasarConnection(name?: string): () => Promise<RedisClient> {
|
|
54
|
+
return async () => {
|
|
55
|
+
const specifier = "@c9up/quasar/services/main";
|
|
56
|
+
let loaded: unknown;
|
|
57
|
+
try {
|
|
58
|
+
loaded = await import(/* @vite-ignore */ specifier);
|
|
59
|
+
} catch (cause) {
|
|
60
|
+
throw new Error(
|
|
61
|
+
`Echo: the "${name ?? "default"}" cache store asks for a quasar connection, but @c9up/quasar is not installed.\n` +
|
|
62
|
+
" pnpm add @c9up/quasar",
|
|
63
|
+
{ cause },
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const manager = isConnectionSource(loaded)
|
|
68
|
+
? loaded
|
|
69
|
+
: Reflect.get(Object(loaded), "default");
|
|
70
|
+
if (!isConnectionSource(manager)) {
|
|
71
|
+
throw new Error(
|
|
72
|
+
"Echo: @c9up/quasar/services/main did not expose a connection() manager",
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const connection = manager.connection(name);
|
|
77
|
+
if (!isRedisClient(connection)) {
|
|
78
|
+
throw new Error(
|
|
79
|
+
`Echo: quasar connection "${name ?? "default"}" does not carry the commands this cache needs`,
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
return connection;
|
|
83
|
+
};
|
|
84
|
+
}
|
package/src/services/main.ts
CHANGED
|
@@ -27,6 +27,15 @@ export function getCache(): CacheManager | undefined {
|
|
|
27
27
|
|
|
28
28
|
const cache: CacheManager = new Proxy({} as CacheManager, {
|
|
29
29
|
get(_target, prop) {
|
|
30
|
+
// A module loader inspects what it imports before anyone uses it: it reads
|
|
31
|
+
// `then` to decide whether the namespace is thenable, and various symbols
|
|
32
|
+
// for interop and formatting. Throwing on those turns a plain
|
|
33
|
+
// `import { setX } from ".../services/main"` into a crash at import time,
|
|
34
|
+
// far from any real use. They are not members of what this stands in for,
|
|
35
|
+
// so answer undefined and let a genuine access be the one that reports.
|
|
36
|
+
if (typeof prop === "symbol" || prop === "then") {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
30
39
|
if (!instance) {
|
|
31
40
|
throw new Error(
|
|
32
41
|
"[echo] CacheManager singleton accessed before EchoProvider.boot() ran " +
|