@tyravel/cache 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,10 @@
1
+ import type { CacheStore } from './types.js';
2
+ export declare class ArrayStore implements CacheStore {
3
+ private readonly data;
4
+ get<T = unknown>(key: string): Promise<T | null>;
5
+ put(key: string, value: unknown, ttlSeconds?: number): Promise<void>;
6
+ forget(key: string): Promise<boolean>;
7
+ has(key: string): Promise<boolean>;
8
+ flush(): Promise<void>;
9
+ }
10
+ //# sourceMappingURL=array-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"array-store.d.ts","sourceRoot":"","sources":["../src/array-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAO7C,qBAAa,UAAW,YAAW,UAAU;IAC3C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA4B;IAE3C,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAYhD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMpE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIrC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
@@ -0,0 +1,28 @@
1
+ export class ArrayStore {
2
+ data = new Map();
3
+ async get(key) {
4
+ const entry = this.data.get(key);
5
+ if (!entry) {
6
+ return null;
7
+ }
8
+ if (entry.expiresAt !== null && entry.expiresAt <= Date.now()) {
9
+ this.data.delete(key);
10
+ return null;
11
+ }
12
+ return entry.value;
13
+ }
14
+ async put(key, value, ttlSeconds) {
15
+ const expiresAt = ttlSeconds && ttlSeconds > 0 ? Date.now() + ttlSeconds * 1000 : null;
16
+ this.data.set(key, { value, expiresAt });
17
+ }
18
+ async forget(key) {
19
+ return this.data.delete(key);
20
+ }
21
+ async has(key) {
22
+ return (await this.get(key)) !== null;
23
+ }
24
+ async flush() {
25
+ this.data.clear();
26
+ }
27
+ }
28
+ //# sourceMappingURL=array-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"array-store.js","sourceRoot":"","sources":["../src/array-store.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,UAAU;IACJ,IAAI,GAAG,IAAI,GAAG,EAAiB,CAAC;IAEjD,KAAK,CAAC,GAAG,CAAc,GAAW;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,IAAI,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAC9D,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC,KAAU,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAc,EAAE,UAAmB;QACxD,MAAM,SAAS,GACb,UAAU,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACvE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import type { CacheConfig, CacheStore } from './types.js';
2
+ export declare class CacheManager {
3
+ private readonly config;
4
+ private readonly stores;
5
+ constructor(config: CacheConfig);
6
+ store(name?: string): CacheStore;
7
+ private buildStore;
8
+ prefixKey(key: string): string;
9
+ }
10
+ //# sourceMappingURL=cache-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-manager.d.ts","sourceRoot":"","sources":["../src/cache-manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAyB,UAAU,EAAE,MAAM,YAAY,CAAC;AAEjF,qBAAa,YAAY;IAGX,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;gBAE3B,MAAM,EAAE,WAAW;IAEhD,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU;IAiBhC,OAAO,CAAC,UAAU;IAWlB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAI/B"}
@@ -0,0 +1,38 @@
1
+ import { ArrayStore } from './array-store.js';
2
+ import { FileStore } from './file-store.js';
3
+ export class CacheManager {
4
+ config;
5
+ stores = new Map();
6
+ constructor(config) {
7
+ this.config = config;
8
+ }
9
+ store(name) {
10
+ const connection = name ?? this.config.default;
11
+ const existing = this.stores.get(connection);
12
+ if (existing) {
13
+ return existing;
14
+ }
15
+ const config = this.config.connections[connection];
16
+ if (!config) {
17
+ throw new Error(`Cache connection [${connection}] is not configured.`);
18
+ }
19
+ const store = this.buildStore(config);
20
+ this.stores.set(connection, store);
21
+ return store;
22
+ }
23
+ buildStore(config) {
24
+ switch (config.driver) {
25
+ case 'array':
26
+ return new ArrayStore();
27
+ case 'file':
28
+ return new FileStore(config.path);
29
+ default:
30
+ throw new Error(`Unsupported cache driver.`);
31
+ }
32
+ }
33
+ prefixKey(key) {
34
+ const prefix = this.config.prefix ?? '';
35
+ return prefix ? `${prefix}:${key}` : key;
36
+ }
37
+ }
38
+ //# sourceMappingURL=cache-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-manager.js","sourceRoot":"","sources":["../src/cache-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,MAAM,OAAO,YAAY;IAGM;IAFZ,MAAM,GAAG,IAAI,GAAG,EAAsB,CAAC;IAExD,YAA6B,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAEpD,KAAK,CAAC,IAAa;QACjB,MAAM,UAAU,GAAG,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC7C,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,UAAU,sBAAsB,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACnC,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,UAAU,CAAC,MAA6B;QAC9C,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;YACtB,KAAK,OAAO;gBACV,OAAO,IAAI,UAAU,EAAE,CAAC;YAC1B,KAAK,MAAM;gBACT,OAAO,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACpC;gBACE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,SAAS,CAAC,GAAW;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;QACxC,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IAC3C,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ import { CacheManager } from './cache-manager.js';
2
+ import type { CacheStore } from './types.js';
3
+ export declare class CacheRepository implements CacheStore {
4
+ private readonly manager;
5
+ private readonly connection?;
6
+ constructor(manager: CacheManager, connection?: string | undefined);
7
+ private store;
8
+ private key;
9
+ get<T = unknown>(key: string): Promise<T | null>;
10
+ put(key: string, value: unknown, ttlSeconds?: number): Promise<void>;
11
+ forget(key: string): Promise<boolean>;
12
+ has(key: string): Promise<boolean>;
13
+ flush(): Promise<void>;
14
+ remember<T>(key: string, ttlSeconds: number, callback: () => T | Promise<T>): Promise<T>;
15
+ }
16
+ //# sourceMappingURL=cache-repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-repository.d.ts","sourceRoot":"","sources":["../src/cache-repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,qBAAa,eAAgB,YAAW,UAAU;IAE9C,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;gBADX,OAAO,EAAE,YAAY,EACrB,UAAU,CAAC,EAAE,MAAM,YAAA;IAGtC,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,GAAG;IAIL,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAIhD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIrC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAS/F"}
@@ -0,0 +1,39 @@
1
+ export class CacheRepository {
2
+ manager;
3
+ connection;
4
+ constructor(manager, connection) {
5
+ this.manager = manager;
6
+ this.connection = connection;
7
+ }
8
+ store() {
9
+ return this.manager.store(this.connection);
10
+ }
11
+ key(key) {
12
+ return this.manager.prefixKey(key);
13
+ }
14
+ async get(key) {
15
+ return this.store().get(this.key(key));
16
+ }
17
+ async put(key, value, ttlSeconds) {
18
+ await this.store().put(this.key(key), value, ttlSeconds);
19
+ }
20
+ async forget(key) {
21
+ return this.store().forget(this.key(key));
22
+ }
23
+ async has(key) {
24
+ return this.store().has(this.key(key));
25
+ }
26
+ async flush() {
27
+ await this.store().flush();
28
+ }
29
+ async remember(key, ttlSeconds, callback) {
30
+ const existing = await this.get(key);
31
+ if (existing !== null) {
32
+ return existing;
33
+ }
34
+ const value = await callback();
35
+ await this.put(key, value, ttlSeconds);
36
+ return value;
37
+ }
38
+ }
39
+ //# sourceMappingURL=cache-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-repository.js","sourceRoot":"","sources":["../src/cache-repository.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,eAAe;IAEP;IACA;IAFnB,YACmB,OAAqB,EACrB,UAAmB;QADnB,YAAO,GAAP,OAAO,CAAc;QACrB,eAAU,GAAV,UAAU,CAAS;IACnC,CAAC;IAEI,KAAK;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;IAEO,GAAG,CAAC,GAAW;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,GAAG,CAAc,GAAW;QAChC,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAc,EAAE,UAAmB;QACxD,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAI,GAAW,EAAE,UAAkB,EAAE,QAA8B;QAC/E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAI,GAAG,CAAC,CAAC;QACxC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QACvC,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cache.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.test.d.ts","sourceRoot":"","sources":["../src/cache.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { CacheManager, CacheRepository } from './index.js';
3
+ describe('CacheRepository', () => {
4
+ it('remembers values with ttl', async () => {
5
+ const manager = new CacheManager({
6
+ default: 'array',
7
+ connections: { array: { driver: 'array' } },
8
+ });
9
+ const cache = new CacheRepository(manager);
10
+ let calls = 0;
11
+ const value = await cache.remember('key', 60, () => {
12
+ calls += 1;
13
+ return 'cached';
14
+ });
15
+ expect(value).toBe('cached');
16
+ expect(calls).toBe(1);
17
+ expect(await cache.get('key')).toBe('cached');
18
+ expect(await cache.remember('key', 60, () => {
19
+ calls += 1;
20
+ return 'other';
21
+ })).toBe('cached');
22
+ expect(calls).toBe(1);
23
+ });
24
+ });
25
+ //# sourceMappingURL=cache.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.test.js","sourceRoot":"","sources":["../src/cache.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE3D,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;YAC/B,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;SAC5C,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE;YACjD,KAAK,IAAI,CAAC,CAAC;YACX,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,CACJ,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE;YACnC,KAAK,IAAI,CAAC,CAAC;YACX,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CACH,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjB,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { CacheStore } from './types.js';
2
+ export declare class FileStore implements CacheStore {
3
+ private readonly directory;
4
+ constructor(directory: string);
5
+ get<T = unknown>(key: string): Promise<T | null>;
6
+ put(key: string, value: unknown, ttlSeconds?: number): Promise<void>;
7
+ forget(key: string): Promise<boolean>;
8
+ has(key: string): Promise<boolean>;
9
+ flush(): Promise<void>;
10
+ private pathFor;
11
+ }
12
+ //# sourceMappingURL=file-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-store.d.ts","sourceRoot":"","sources":["../src/file-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAO7C,qBAAa,SAAU,YAAW,UAAU;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,MAAM;IAExC,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAehD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASpE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUrC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,OAAO,CAAC,OAAO;CAIhB"}
@@ -0,0 +1,55 @@
1
+ import { mkdir, readFile, rm, writeFile } from 'node:fs/promises';
2
+ import { dirname, join } from 'node:path';
3
+ import { createHash } from 'node:crypto';
4
+ export class FileStore {
5
+ directory;
6
+ constructor(directory) {
7
+ this.directory = directory;
8
+ }
9
+ async get(key) {
10
+ const path = this.pathFor(key);
11
+ try {
12
+ const raw = await readFile(path, 'utf8');
13
+ const payload = JSON.parse(raw);
14
+ if (payload.expiresAt !== null && payload.expiresAt <= Date.now()) {
15
+ await rm(path, { force: true });
16
+ return null;
17
+ }
18
+ return payload.value;
19
+ }
20
+ catch {
21
+ return null;
22
+ }
23
+ }
24
+ async put(key, value, ttlSeconds) {
25
+ const path = this.pathFor(key);
26
+ await mkdir(dirname(path), { recursive: true });
27
+ const expiresAt = ttlSeconds && ttlSeconds > 0 ? Date.now() + ttlSeconds * 1000 : null;
28
+ const payload = { value, expiresAt };
29
+ await writeFile(path, JSON.stringify(payload), 'utf8');
30
+ }
31
+ async forget(key) {
32
+ const path = this.pathFor(key);
33
+ try {
34
+ await rm(path, { force: true });
35
+ return true;
36
+ }
37
+ catch {
38
+ return false;
39
+ }
40
+ }
41
+ async has(key) {
42
+ return (await this.get(key)) !== null;
43
+ }
44
+ async flush() {
45
+ await mkdir(this.directory, { recursive: true });
46
+ const { readdir } = await import('node:fs/promises');
47
+ const entries = await readdir(this.directory);
48
+ await Promise.all(entries.map((name) => rm(join(this.directory, name), { force: true })));
49
+ }
50
+ pathFor(key) {
51
+ const hash = createHash('sha256').update(key).digest('hex');
52
+ return join(this.directory, hash.slice(0, 2), hash);
53
+ }
54
+ }
55
+ //# sourceMappingURL=file-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-store.js","sourceRoot":"","sources":["../src/file-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export type { CacheConfig, CacheConnectionConfig, CacheStore } from './types.js';
2
+ export { ArrayStore } from './array-store.js';
3
+ export { FileStore } from './file-store.js';
4
+ export { CacheManager } from './cache-manager.js';
5
+ export { CacheRepository } from './cache-repository.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { ArrayStore } from './array-store.js';
2
+ export { FileStore } from './file-store.js';
3
+ export { CacheManager } from './cache-manager.js';
4
+ export { CacheRepository } from './cache-repository.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,21 @@
1
+ export interface CacheStore {
2
+ get<T = unknown>(key: string): Promise<T | null>;
3
+ put(key: string, value: unknown, ttlSeconds?: number): Promise<void>;
4
+ forget(key: string): Promise<boolean>;
5
+ has(key: string): Promise<boolean>;
6
+ flush(): Promise<void>;
7
+ }
8
+ export interface ArrayStoreConfig {
9
+ driver: 'array';
10
+ }
11
+ export interface FileStoreConfig {
12
+ driver: 'file';
13
+ path: string;
14
+ }
15
+ export type CacheConnectionConfig = ArrayStoreConfig | FileStoreConfig;
16
+ export interface CacheConfig {
17
+ default: string;
18
+ prefix?: string;
19
+ connections: Record<string, CacheConnectionConfig>;
20
+ }
21
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACjD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,qBAAqB,GAAG,gBAAgB,GAAG,eAAe,CAAC;AAEvE,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;CACpD"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@tyravel/cache",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "import": "./dist/index.js"
11
+ }
12
+ },
13
+ "scripts": {
14
+ "build": "tsc -p tsconfig.json",
15
+ "typecheck": "tsc -p tsconfig.json --noEmit"
16
+ },
17
+ "files": [
18
+ "dist"
19
+ ],
20
+ "engines": {
21
+ "node": ">=22"
22
+ },
23
+ "devDependencies": {
24
+ "@types/node": "^22.15.30"
25
+ },
26
+ "description": "Cache stores and repository for Tyravel",
27
+ "license": "MIT",
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "git+https://github.com/thesimonharms/tyravel.git",
31
+ "directory": "packages/cache"
32
+ },
33
+ "publishConfig": {
34
+ "access": "public"
35
+ }
36
+ }