@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.
- package/dist/array-store.d.ts +10 -0
- package/dist/array-store.d.ts.map +1 -0
- package/dist/array-store.js +28 -0
- package/dist/array-store.js.map +1 -0
- package/dist/cache-manager.d.ts +10 -0
- package/dist/cache-manager.d.ts.map +1 -0
- package/dist/cache-manager.js +38 -0
- package/dist/cache-manager.js.map +1 -0
- package/dist/cache-repository.d.ts +16 -0
- package/dist/cache-repository.d.ts.map +1 -0
- package/dist/cache-repository.js +39 -0
- package/dist/cache-repository.js.map +1 -0
- package/dist/cache.test.d.ts +2 -0
- package/dist/cache.test.d.ts.map +1 -0
- package/dist/cache.test.js +25 -0
- package/dist/cache.test.js.map +1 -0
- package/dist/file-store.d.ts +12 -0
- package/dist/file-store.d.ts.map +1 -0
- package/dist/file-store.js +55 -0
- package/dist/file-store.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +21 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +36 -0
|
@@ -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 @@
|
|
|
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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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 @@
|
|
|
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
|
+
}
|