@c9up/echo 0.1.4 → 0.1.6
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 +68 -21
- package/dist/CacheManager.d.ts.map +1 -1
- package/dist/CacheManager.js +355 -60
- package/dist/CacheManager.js.map +1 -1
- package/dist/EchoProvider.d.ts +14 -8
- package/dist/EchoProvider.d.ts.map +1 -1
- package/dist/EchoProvider.js +45 -11
- 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 +81 -56
- 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 +107 -47
- 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 +21 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -1
- 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 +505 -89
- package/src/EchoProvider.ts +55 -12
- package/src/StoreManager.ts +104 -0
- package/src/drivers/MemoryDriver.ts +109 -60
- package/src/drivers/RedisDriver.ts +139 -51
- package/src/drivers/TieredDriver.ts +186 -0
- package/src/duration.ts +86 -0
- package/src/errors.ts +33 -0
- package/src/index.ts +53 -1
- package/src/testing/main.ts +69 -0
- package/src/types.ts +156 -0
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @c9up/echo — Cache layer for the Ream framework.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* bentocache / @adonisjs/cache parity: object-argument API, grace
|
|
5
|
+
* (stale-while-revalidate), soft/hard timeouts, tags, multi-tier (L1+L2) and
|
|
6
|
+
* multi-store (`{ default, stores }` + `use(name)`) — over pluggable drivers
|
|
7
|
+
* (Memory, Redis, Tiered).
|
|
5
8
|
*
|
|
6
9
|
* @implements MISS-10
|
|
7
10
|
*/
|
|
@@ -10,4 +13,21 @@ export { CacheManager } from "./CacheManager.js";
|
|
|
10
13
|
export { MemoryDriver } from "./drivers/MemoryDriver.js";
|
|
11
14
|
export type { RedisClient } from "./drivers/RedisDriver.js";
|
|
12
15
|
export { RedisDriver } from "./drivers/RedisDriver.js";
|
|
16
|
+
export type { BusMessage, CacheBus, TieredDriverOptions, } from "./drivers/TieredDriver.js";
|
|
17
|
+
export { TieredDriver } from "./drivers/TieredDriver.js";
|
|
18
|
+
export type { Duration } from "./duration.js";
|
|
19
|
+
export { parseDuration, resolveTtlSeconds } from "./duration.js";
|
|
20
|
+
export type { EchoProviderConfig } from "./EchoProvider.js";
|
|
21
|
+
export { FactoryError, TimeoutError } from "./errors.js";
|
|
22
|
+
export { CacheStoreManager, type DriverFactory, drivers, type MultiStoreConfig, type StoreConfig, } from "./StoreManager.js";
|
|
23
|
+
export type { CacheEmitter, CacheEntry, CacheEventMap, DefaultValue, DeleteByTagOptions, DeleteManyOptions, DeleteOptions, ExpireOptions, Factory, GetOptions, GetOrSetForeverOptions, GetOrSetOptions, HasOptions, SetOptions, TaggableDriver, } from "./types.js";
|
|
24
|
+
import type { EchoProviderConfig } from "./EchoProvider.js";
|
|
25
|
+
import type { MultiStoreConfig } from "./StoreManager.js";
|
|
26
|
+
/**
|
|
27
|
+
* Author-time config helper for `config/cache.ts` — AdonisJS cache `defineConfig`
|
|
28
|
+
* parity. Identity at runtime; the generic preserves literal types for inference.
|
|
29
|
+
* Accepts both the single-store {@link EchoProviderConfig} and the multi-store
|
|
30
|
+
* {@link MultiStoreConfig} (`{ default, stores }`) shapes.
|
|
31
|
+
*/
|
|
32
|
+
export declare function defineConfig<T extends EchoProviderConfig | MultiStoreConfig>(config: T): T;
|
|
13
33
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,YAAY,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,YAAY,EACX,UAAU,EACV,QAAQ,EACR,mBAAmB,GACnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACjE,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EACN,iBAAiB,EACjB,KAAK,aAAa,EAClB,OAAO,EACP,KAAK,gBAAgB,EACrB,KAAK,WAAW,GAChB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACX,YAAY,EACZ,UAAU,EACV,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,OAAO,EACP,UAAU,EACV,sBAAsB,EACtB,eAAe,EACf,UAAU,EACV,UAAU,EACV,cAAc,GACd,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,kBAAkB,GAAG,gBAAgB,EAC3E,MAAM,EAAE,CAAC,GACP,CAAC,CAEH"}
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @c9up/echo — Cache layer for the Ream framework.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* bentocache / @adonisjs/cache parity: object-argument API, grace
|
|
5
|
+
* (stale-while-revalidate), soft/hard timeouts, tags, multi-tier (L1+L2) and
|
|
6
|
+
* multi-store (`{ default, stores }` + `use(name)`) — over pluggable drivers
|
|
7
|
+
* (Memory, Redis, Tiered).
|
|
5
8
|
*
|
|
6
9
|
* @implements MISS-10
|
|
7
10
|
*/
|
|
8
11
|
export { CacheManager } from "./CacheManager.js";
|
|
9
12
|
export { MemoryDriver } from "./drivers/MemoryDriver.js";
|
|
10
13
|
export { RedisDriver } from "./drivers/RedisDriver.js";
|
|
14
|
+
export { TieredDriver } from "./drivers/TieredDriver.js";
|
|
15
|
+
export { parseDuration, resolveTtlSeconds } from "./duration.js";
|
|
16
|
+
export { FactoryError, TimeoutError } from "./errors.js";
|
|
17
|
+
export { CacheStoreManager, drivers, } from "./StoreManager.js";
|
|
18
|
+
/**
|
|
19
|
+
* Author-time config helper for `config/cache.ts` — AdonisJS cache `defineConfig`
|
|
20
|
+
* parity. Identity at runtime; the generic preserves literal types for inference.
|
|
21
|
+
* Accepts both the single-store {@link EchoProviderConfig} and the multi-store
|
|
22
|
+
* {@link MultiStoreConfig} (`{ default, stores }`) shapes.
|
|
23
|
+
*/
|
|
24
|
+
export function defineConfig(config) {
|
|
25
|
+
return config;
|
|
26
|
+
}
|
|
11
27
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAMvD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEjE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EACN,iBAAiB,EAEjB,OAAO,GAGP,MAAM,mBAAmB,CAAC;AAsB3B;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAC3B,MAAS;IAET,OAAO,MAAM,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@c9up/echo/testing` — helpers for testing code that depends on the cache.
|
|
3
|
+
*
|
|
4
|
+
* import { createTestCache } from "@c9up/echo/testing"
|
|
5
|
+
*
|
|
6
|
+
* const { cache, events, dispose } = createTestCache()
|
|
7
|
+
* await cache.set({ key: "k", value: 1 })
|
|
8
|
+
* expect(events).toContainEqual({ event: "cache:written", payload: { key: "k", value: 1, store: "test" } })
|
|
9
|
+
* dispose()
|
|
10
|
+
*/
|
|
11
|
+
import { CacheManager } from "../CacheManager.js";
|
|
12
|
+
import { MemoryDriver } from "../drivers/MemoryDriver.js";
|
|
13
|
+
import type { Duration } from "../duration.js";
|
|
14
|
+
/** A single recorded cache event. */
|
|
15
|
+
export interface RecordedEvent {
|
|
16
|
+
event: string;
|
|
17
|
+
payload: unknown;
|
|
18
|
+
}
|
|
19
|
+
export interface CreateTestCacheOptions {
|
|
20
|
+
prefix?: string;
|
|
21
|
+
/** Default TTL in seconds. */
|
|
22
|
+
ttl?: number;
|
|
23
|
+
grace?: Duration;
|
|
24
|
+
name?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface TestCache {
|
|
27
|
+
/** A ready-to-use in-memory cache. */
|
|
28
|
+
cache: CacheManager;
|
|
29
|
+
/** The underlying driver (for direct assertions / setup). */
|
|
30
|
+
driver: MemoryDriver;
|
|
31
|
+
/** Every event emitted by the cache, in order. */
|
|
32
|
+
events: RecordedEvent[];
|
|
33
|
+
/** Stop the driver's sweep timer. Call in `afterEach`. */
|
|
34
|
+
dispose(): void;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Build an isolated in-memory {@link CacheManager} with a recording emitter, for
|
|
38
|
+
* unit tests. Each call is fully isolated (fresh driver + event log).
|
|
39
|
+
*/
|
|
40
|
+
export declare function createTestCache(options?: CreateTestCacheOptions): TestCache;
|
|
41
|
+
//# sourceMappingURL=main.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/testing/main.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,qCAAqC;AACrC,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACzB,sCAAsC;IACtC,KAAK,EAAE,YAAY,CAAC;IACpB,6DAA6D;IAC7D,MAAM,EAAE,YAAY,CAAC;IACrB,kDAAkD;IAClD,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,0DAA0D;IAC1D,OAAO,IAAI,IAAI,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,SAAS,CAuB3E"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@c9up/echo/testing` — helpers for testing code that depends on the cache.
|
|
3
|
+
*
|
|
4
|
+
* import { createTestCache } from "@c9up/echo/testing"
|
|
5
|
+
*
|
|
6
|
+
* const { cache, events, dispose } = createTestCache()
|
|
7
|
+
* await cache.set({ key: "k", value: 1 })
|
|
8
|
+
* expect(events).toContainEqual({ event: "cache:written", payload: { key: "k", value: 1, store: "test" } })
|
|
9
|
+
* dispose()
|
|
10
|
+
*/
|
|
11
|
+
import { CacheManager } from "../CacheManager.js";
|
|
12
|
+
import { MemoryDriver } from "../drivers/MemoryDriver.js";
|
|
13
|
+
/**
|
|
14
|
+
* Build an isolated in-memory {@link CacheManager} with a recording emitter, for
|
|
15
|
+
* unit tests. Each call is fully isolated (fresh driver + event log).
|
|
16
|
+
*/
|
|
17
|
+
export function createTestCache(options) {
|
|
18
|
+
const driver = new MemoryDriver();
|
|
19
|
+
const events = [];
|
|
20
|
+
const emitter = {
|
|
21
|
+
emit(event, payload) {
|
|
22
|
+
events.push({ event, payload });
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
const cache = new CacheManager(driver, {
|
|
26
|
+
prefix: options?.prefix,
|
|
27
|
+
ttl: options?.ttl,
|
|
28
|
+
grace: options?.grace,
|
|
29
|
+
name: options?.name ?? "test",
|
|
30
|
+
emitter,
|
|
31
|
+
});
|
|
32
|
+
return {
|
|
33
|
+
cache,
|
|
34
|
+
driver,
|
|
35
|
+
events,
|
|
36
|
+
dispose() {
|
|
37
|
+
driver.destroy();
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/testing/main.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AA6B1D;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,OAAgC;IAC/D,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;IAClC,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,MAAM,OAAO,GAAiB;QAC7B,IAAI,CAAC,KAAK,EAAE,OAAO;YAClB,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACjC,CAAC;KACD,CAAC;IACF,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,MAAM,EAAE;QACtC,MAAM,EAAE,OAAO,EAAE,MAAM;QACvB,GAAG,EAAE,OAAO,EAAE,GAAG;QACjB,KAAK,EAAE,OAAO,EAAE,KAAK;QACrB,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,MAAM;QAC7B,OAAO;KACP,CAAC,CAAC;IACH,OAAO;QACN,KAAK;QACL,MAAM;QACN,MAAM;QACN,OAAO;YACN,MAAM,CAAC,OAAO,EAAE,CAAC;QAClB,CAAC;KACD,CAAC;AACH,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared cache contracts — driver interface, stored-entry shape, method option
|
|
3
|
+
* objects (bentocache/@adonisjs/cache parity) and the event emitter contract.
|
|
4
|
+
*/
|
|
5
|
+
import type { Duration } from "./duration.js";
|
|
6
|
+
import type { FactoryError } from "./errors.js";
|
|
7
|
+
/**
|
|
8
|
+
* A driver-level entry. `stale` is `true` when the value is past its logical
|
|
9
|
+
* TTL but still retained under the grace period (stale-while-revalidate).
|
|
10
|
+
*/
|
|
11
|
+
export interface CacheEntry<T = unknown> {
|
|
12
|
+
value: T;
|
|
13
|
+
stale: boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Logical expiry as an epoch-ms timestamp; `0` means "never expires".
|
|
16
|
+
* `undefined` means the driver does not track expiry. Lets a composing
|
|
17
|
+
* driver (e.g. {@link TieredDriver}) preserve the remaining TTL when it
|
|
18
|
+
* promotes an entry between tiers instead of resetting it to immortal.
|
|
19
|
+
*/
|
|
20
|
+
expiresAt?: number;
|
|
21
|
+
}
|
|
22
|
+
/** Options for the grace-aware {@link CacheDriver.setEntry}. */
|
|
23
|
+
export interface DriverSetOptions {
|
|
24
|
+
/** Logical TTL in seconds; `0`/omitted means never expires. */
|
|
25
|
+
ttlSeconds?: number;
|
|
26
|
+
/** Extra retention beyond the logical TTL, in seconds (grace period). */
|
|
27
|
+
graceSeconds?: number;
|
|
28
|
+
/** Tags for grouped invalidation (only honoured by taggable drivers). */
|
|
29
|
+
tags?: string[];
|
|
30
|
+
/**
|
|
31
|
+
* Absolute logical expiry as an epoch-ms timestamp. When set it OVERRIDES
|
|
32
|
+
* `ttlSeconds` for the logical-freshness boundary (a past value makes the
|
|
33
|
+
* entry immediately stale), while `graceSeconds` still governs physical
|
|
34
|
+
* retention from now. Used by {@link CacheManager.expire} to mark a key stale
|
|
35
|
+
* at once without deleting it.
|
|
36
|
+
*/
|
|
37
|
+
expiresAt?: number;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Cache driver contract.
|
|
41
|
+
*
|
|
42
|
+
* The five core methods (`get`/`set`/`delete`/`flush`/`has`) are the minimal
|
|
43
|
+
* surface — any KV store satisfies them. `getEntry`/`setEntry` are the optional
|
|
44
|
+
* grace-aware extensions; {@link CacheManager} falls back to `get`/`set` when a
|
|
45
|
+
* driver doesn't implement them, so grace simply degrades to "no stale window"
|
|
46
|
+
* on minimal drivers (agnostic-friendly).
|
|
47
|
+
*/
|
|
48
|
+
export interface CacheDriver {
|
|
49
|
+
get<T = unknown>(key: string): Promise<T | null>;
|
|
50
|
+
set(key: string, value: unknown, ttlSeconds?: number): Promise<void>;
|
|
51
|
+
delete(key: string): Promise<boolean>;
|
|
52
|
+
flush(): Promise<void>;
|
|
53
|
+
has(key: string): Promise<boolean>;
|
|
54
|
+
/** Grace-aware read: returns the entry even if stale, or `null` if physically gone. */
|
|
55
|
+
getEntry?<T = unknown>(key: string): Promise<CacheEntry<T> | null>;
|
|
56
|
+
/** Grace-aware write. */
|
|
57
|
+
setEntry?(key: string, value: unknown, options: DriverSetOptions): Promise<void>;
|
|
58
|
+
}
|
|
59
|
+
/** A driver that supports tag-based grouped invalidation. */
|
|
60
|
+
export interface TaggableDriver extends CacheDriver {
|
|
61
|
+
setWithTags(key: string, value: unknown, tags: string[], ttlSeconds?: number): Promise<void>;
|
|
62
|
+
/** Invalidate every entry carrying any of the given tags (bento `deleteByTag`). */
|
|
63
|
+
deleteByTag(tags: string[]): Promise<void>;
|
|
64
|
+
/** @deprecated alias of {@link deleteByTag} (echo pre-0.2 name). */
|
|
65
|
+
flushTags(tags: string[]): Promise<void>;
|
|
66
|
+
}
|
|
67
|
+
/** A `getOrSet` factory. */
|
|
68
|
+
export type Factory<T> = () => T | Promise<T>;
|
|
69
|
+
/** A lazily-resolved default value for `get`. */
|
|
70
|
+
export type DefaultValue<T> = T | (() => T);
|
|
71
|
+
export interface GetOptions<T = unknown> {
|
|
72
|
+
key: string;
|
|
73
|
+
defaultValue?: DefaultValue<T>;
|
|
74
|
+
grace?: Duration;
|
|
75
|
+
}
|
|
76
|
+
export interface SetOptions {
|
|
77
|
+
key: string;
|
|
78
|
+
value: unknown;
|
|
79
|
+
ttl?: Duration;
|
|
80
|
+
grace?: Duration;
|
|
81
|
+
tags?: string[];
|
|
82
|
+
}
|
|
83
|
+
export interface GetOrSetOptions<T> {
|
|
84
|
+
key: string;
|
|
85
|
+
factory: Factory<T>;
|
|
86
|
+
ttl?: Duration;
|
|
87
|
+
grace?: Duration;
|
|
88
|
+
/** Soft timeout: on a stale hit, return the stale value if the factory is slower, then refresh in the background. */
|
|
89
|
+
timeout?: Duration;
|
|
90
|
+
/** Hard timeout: reject with {@link TimeoutError} if the factory exceeds it (even without a stale fallback). */
|
|
91
|
+
hardTimeout?: Duration;
|
|
92
|
+
/** Max time to wait on another caller's in-flight factory before falling back to stale (single-flight lock). */
|
|
93
|
+
lockTimeout?: Duration;
|
|
94
|
+
tags?: string[];
|
|
95
|
+
/** Observe factory failures (foreground and background). */
|
|
96
|
+
onFactoryError?: (error: FactoryError) => void;
|
|
97
|
+
}
|
|
98
|
+
export type GetOrSetForeverOptions<T> = Omit<GetOrSetOptions<T>, "ttl">;
|
|
99
|
+
export interface DeleteOptions {
|
|
100
|
+
key: string;
|
|
101
|
+
}
|
|
102
|
+
export interface DeleteManyOptions {
|
|
103
|
+
keys: string[];
|
|
104
|
+
}
|
|
105
|
+
export interface DeleteByTagOptions {
|
|
106
|
+
tags: string[];
|
|
107
|
+
}
|
|
108
|
+
export interface HasOptions {
|
|
109
|
+
key: string;
|
|
110
|
+
}
|
|
111
|
+
export interface ExpireOptions {
|
|
112
|
+
key: string;
|
|
113
|
+
}
|
|
114
|
+
/** Payloads for each emitted cache event (bento event-name parity). */
|
|
115
|
+
export interface CacheEventMap {
|
|
116
|
+
"cache:hit": {
|
|
117
|
+
key: string;
|
|
118
|
+
value: unknown;
|
|
119
|
+
store: string;
|
|
120
|
+
graced: boolean;
|
|
121
|
+
};
|
|
122
|
+
"cache:miss": {
|
|
123
|
+
key: string;
|
|
124
|
+
store: string;
|
|
125
|
+
};
|
|
126
|
+
"cache:written": {
|
|
127
|
+
key: string;
|
|
128
|
+
value: unknown;
|
|
129
|
+
store: string;
|
|
130
|
+
};
|
|
131
|
+
"cache:deleted": {
|
|
132
|
+
key: string;
|
|
133
|
+
store: string;
|
|
134
|
+
};
|
|
135
|
+
"cache:cleared": {
|
|
136
|
+
store: string;
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Duck-typed event emitter — any object exposing `emit(event, payload)` works
|
|
141
|
+
* (ream's emitter, Node's EventEmitter, mitt, …). echo never imports one.
|
|
142
|
+
*/
|
|
143
|
+
export interface CacheEmitter {
|
|
144
|
+
emit(event: string, payload: unknown): void;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@c9up/echo",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"description": "Cache — pluggable cache contract with memory + Redis drivers for the Ream framework",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -18,12 +18,17 @@
|
|
|
18
18
|
"./services/main": {
|
|
19
19
|
"types": "./dist/services/main.d.ts",
|
|
20
20
|
"import": "./dist/services/main.js"
|
|
21
|
+
},
|
|
22
|
+
"./testing": {
|
|
23
|
+
"types": "./dist/testing/main.d.ts",
|
|
24
|
+
"import": "./dist/testing/main.js"
|
|
21
25
|
}
|
|
22
26
|
},
|
|
23
27
|
"peerDependencies": {
|
|
24
28
|
"@c9up/ream": "^0.1.0"
|
|
25
29
|
},
|
|
26
30
|
"devDependencies": {
|
|
31
|
+
"@biomejs/biome": "^2.4.10",
|
|
27
32
|
"@types/node": "^22.19.15",
|
|
28
33
|
"typescript": "^6.0.2",
|
|
29
34
|
"vitest": "^4.1.2"
|