@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.
Files changed (56) hide show
  1. package/dist/CacheManager.d.ts +68 -21
  2. package/dist/CacheManager.d.ts.map +1 -1
  3. package/dist/CacheManager.js +355 -60
  4. package/dist/CacheManager.js.map +1 -1
  5. package/dist/EchoProvider.d.ts +14 -8
  6. package/dist/EchoProvider.d.ts.map +1 -1
  7. package/dist/EchoProvider.js +45 -11
  8. package/dist/EchoProvider.js.map +1 -1
  9. package/dist/StoreManager.d.ts +61 -0
  10. package/dist/StoreManager.d.ts.map +1 -0
  11. package/dist/StoreManager.js +70 -0
  12. package/dist/StoreManager.js.map +1 -0
  13. package/dist/drivers/MemoryDriver.d.ts +13 -6
  14. package/dist/drivers/MemoryDriver.d.ts.map +1 -1
  15. package/dist/drivers/MemoryDriver.js +81 -56
  16. package/dist/drivers/MemoryDriver.js.map +1 -1
  17. package/dist/drivers/RedisDriver.d.ts +17 -17
  18. package/dist/drivers/RedisDriver.d.ts.map +1 -1
  19. package/dist/drivers/RedisDriver.js +107 -47
  20. package/dist/drivers/RedisDriver.js.map +1 -1
  21. package/dist/drivers/TieredDriver.d.ts +41 -0
  22. package/dist/drivers/TieredDriver.d.ts.map +1 -0
  23. package/dist/drivers/TieredDriver.js +132 -0
  24. package/dist/drivers/TieredDriver.js.map +1 -0
  25. package/dist/duration.d.ts +32 -0
  26. package/dist/duration.d.ts.map +1 -0
  27. package/dist/duration.js +75 -0
  28. package/dist/duration.js.map +1 -0
  29. package/dist/errors.d.ts +21 -0
  30. package/dist/errors.d.ts.map +1 -0
  31. package/dist/errors.js +31 -0
  32. package/dist/errors.js.map +1 -0
  33. package/dist/index.d.ts +21 -1
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +17 -1
  36. package/dist/index.js.map +1 -1
  37. package/dist/testing/main.d.ts +41 -0
  38. package/dist/testing/main.d.ts.map +1 -0
  39. package/dist/testing/main.js +41 -0
  40. package/dist/testing/main.js.map +1 -0
  41. package/dist/types.d.ts +146 -0
  42. package/dist/types.d.ts.map +1 -0
  43. package/dist/types.js +6 -0
  44. package/dist/types.js.map +1 -0
  45. package/package.json +6 -1
  46. package/src/CacheManager.ts +505 -89
  47. package/src/EchoProvider.ts +55 -12
  48. package/src/StoreManager.ts +104 -0
  49. package/src/drivers/MemoryDriver.ts +109 -60
  50. package/src/drivers/RedisDriver.ts +139 -51
  51. package/src/drivers/TieredDriver.ts +186 -0
  52. package/src/duration.ts +86 -0
  53. package/src/errors.ts +33 -0
  54. package/src/index.ts +53 -1
  55. package/src/testing/main.ts +69 -0
  56. 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
- * Provides get/set/delete/flush/tags with pluggable drivers (Memory, Redis).
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
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;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"}
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
- * Provides get/set/delete/flush/tags with pluggable drivers (Memory, Redis).
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;;;;;;GAMG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC"}
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"}
@@ -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,6 @@
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
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -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.4",
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"