@hyperttp/cache 1.0.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/LICENSE +21 -0
- package/README.md +96 -0
- package/dist/plugin.d.ts +16 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +34 -0
- package/dist/plugin.js.map +1 -0
- package/dist/types/cache.d.ts +29 -0
- package/dist/types/cache.d.ts.map +1 -0
- package/dist/types/cache.js +2 -0
- package/dist/types/cache.js.map +1 -0
- package/dist/utils/CacheManager.d.ts +84 -0
- package/dist/utils/CacheManager.d.ts.map +1 -0
- package/dist/utils/CacheManager.js +105 -0
- package/dist/utils/CacheManager.js.map +1 -0
- package/package.json +24 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 IT IF OR
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# @hyperttp/cache
|
|
2
|
+
|
|
3
|
+
Высокопроизводительный плагин кэширования для HTTP-клиента **Hyperttp**,
|
|
4
|
+
работающий на базе `lru-cache`.
|
|
5
|
+
Перехватывает идемпотентные запросы на фазе управления (`CONTROL`),
|
|
6
|
+
сводя к нулю нагрузку на сеть при повторных вызовах.
|
|
7
|
+
|
|
8
|
+
## Особенности
|
|
9
|
+
|
|
10
|
+
- ⚡ **Нулевая задержка**: Проверяет кэш на фазе `CONTROL`,
|
|
11
|
+
полностью минуя сетевой стек.
|
|
12
|
+
- 📦 **LRU Стратегия**:
|
|
13
|
+
Автоматически вытесняет старые данные при достижении лимитов (благодаря `lru-cache`).
|
|
14
|
+
- 📊 **Прозрачная статистика**: Интегрируется в системный вызов `client.getStats()`,
|
|
15
|
+
добавляя метрику `cacheSize`.
|
|
16
|
+
- 🧹 **Ручное управление**:
|
|
17
|
+
Добавляет метод `client.clearCache()` для принудительного сброса данных.
|
|
18
|
+
- 🔒 **Строгая типизация**:
|
|
19
|
+
Полная поддержка TypeScript «из коробки» через Module Augmentation.
|
|
20
|
+
|
|
21
|
+
## Установка
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# Использованием bun (рекомендуется)
|
|
25
|
+
bun add @hyperttp/cache
|
|
26
|
+
|
|
27
|
+
# Или через npm/pnpm
|
|
28
|
+
npm install @hyperttp/cache
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Использование
|
|
33
|
+
|
|
34
|
+
Плагин автоматически обнаруживается менеджером плагинов `Hyperttp`
|
|
35
|
+
(если настроен автоскан `package.json`), либо его можно передать явно.
|
|
36
|
+
|
|
37
|
+
### Настройка при инициализации клиента
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
import { HyperClient } from "@hyperttp/core";
|
|
41
|
+
// Импорт нужен для того, чтобы TypeScript подтянул расширение типов для HttpClientOptions
|
|
42
|
+
import "@hyperttp/cache";
|
|
43
|
+
|
|
44
|
+
const client = new HyperClient({
|
|
45
|
+
verbose: true,
|
|
46
|
+
cache: {
|
|
47
|
+
enabled: true,
|
|
48
|
+
max: 500, // Максимальное количество объектов в кэше
|
|
49
|
+
ttl: 1000 * 60 * 5, // Время жизни кэша (5 минут)
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
// Первый запрос пойдет в сеть
|
|
54
|
+
const data1 = await client.get("https://api.example.com/data");
|
|
55
|
+
|
|
56
|
+
// Второй запрос вернется мгновенно из кэша
|
|
57
|
+
const data2 = await client.get("https://api.example.com/data");
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Метрики и управление кэшем
|
|
62
|
+
|
|
63
|
+
Плагин динамически расширяет инстанс ядра, добавляя методы управления:
|
|
64
|
+
|
|
65
|
+
```typescript
|
|
66
|
+
// Получить текущий размер кэша вместе с общими метриками ядра
|
|
67
|
+
console.log(client.getStats());
|
|
68
|
+
// Выведет: { requests: 2, ..., cacheSize: 1 }
|
|
69
|
+
|
|
70
|
+
// Полная очистка кэша вручную
|
|
71
|
+
(client as any).clearCache();
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Как это работает (Архитектура)
|
|
76
|
+
|
|
77
|
+
Плагин встраивается в «луковичную» (onion) архитектуру запроса на фазе **`CONTROL`**:
|
|
78
|
+
|
|
79
|
+
```mermaid
|
|
80
|
+
graph LR
|
|
81
|
+
Req([Запрос]) --> MONITOR --> LOGIC --> CONTROL{Проверка кэша}
|
|
82
|
+
|
|
83
|
+
CONTROL -- Кэш-хит --> Return([Возврат данных])
|
|
84
|
+
CONTROL -- Кэш-мисс --> FORMAT --> NETWORK --> Save[Запись в Кэш] --> Return
|
|
85
|
+
|
|
86
|
+
style CONTROL fill:#f9f,stroke:#333,stroke-width:2px
|
|
87
|
+
style Return fill:#bbf,stroke:#333,stroke-width:2px
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Он перехватывает исключительно `GET` запросы (проверка через флаг `req.isGet`).
|
|
91
|
+
Если URL уже есть в памяти, выполнение сетевой цепочки прерывается,
|
|
92
|
+
и клиент моментально возвращает сохраненный результат.
|
|
93
|
+
|
|
94
|
+
## Лицензия
|
|
95
|
+
|
|
96
|
+
MIT © dirold2
|
package/dist/plugin.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { HyperCore, HyperPlugin } from "@hyperttp/core";
|
|
2
|
+
import type { CacheManagerOptions } from "./types/cache.js";
|
|
3
|
+
interface CacheableHyperCore extends HyperCore {
|
|
4
|
+
clearCache?: () => void;
|
|
5
|
+
}
|
|
6
|
+
export declare function withCache(client: HyperCore, options: CacheManagerOptions): CacheableHyperCore;
|
|
7
|
+
declare module "@hyperttp/core" {
|
|
8
|
+
interface HyperttpPluginsExtension {
|
|
9
|
+
cache?: CacheManagerOptions & {
|
|
10
|
+
enabled: boolean;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export declare const CachePlugin: HyperPlugin;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EAGZ,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAG5D,UAAU,kBAAmB,SAAQ,SAAS;IAC5C,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB;AAED,wBAAgB,SAAS,CACvB,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,mBAAmB,GAC3B,kBAAkB,CA0BpB;AAED,OAAO,QAAQ,gBAAgB,CAAC;IAC9B,UAAU,wBAAwB;QAChC,KAAK,CAAC,EAAE,mBAAmB,GAAG;YAC5B,OAAO,EAAE,OAAO,CAAC;SAClB,CAAC;KACH;CACF;AAED,eAAO,MAAM,WAAW,EAAE,WAQzB,CAAC"}
|
package/dist/plugin.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { CacheManager } from "./utils/CacheManager.js";
|
|
2
|
+
export function withCache(client, options) {
|
|
3
|
+
const cache = new CacheManager(options);
|
|
4
|
+
const next = client.dispatch;
|
|
5
|
+
const originalGetStats = client.getStats.bind(client);
|
|
6
|
+
client.getStats = () => ({
|
|
7
|
+
...originalGetStats(),
|
|
8
|
+
cacheSize: cache.size ?? 0,
|
|
9
|
+
});
|
|
10
|
+
client.dispatch = async (req) => {
|
|
11
|
+
if (!req.isGet)
|
|
12
|
+
return next(req);
|
|
13
|
+
const urlString = typeof req.url === "string" ? req.url : req.url.getURL();
|
|
14
|
+
const cached = await cache.get(urlString);
|
|
15
|
+
if (cached !== undefined)
|
|
16
|
+
return cached;
|
|
17
|
+
const result = await next(req);
|
|
18
|
+
if (result !== undefined)
|
|
19
|
+
cache.set(urlString, result);
|
|
20
|
+
return result;
|
|
21
|
+
};
|
|
22
|
+
const extendedClient = client;
|
|
23
|
+
extendedClient.clearCache = () => cache.clear();
|
|
24
|
+
return extendedClient;
|
|
25
|
+
}
|
|
26
|
+
export const CachePlugin = {
|
|
27
|
+
name: "hyperttp-cache",
|
|
28
|
+
phase: "CONTROL",
|
|
29
|
+
enabled: (config) => !!config.cache?.enabled,
|
|
30
|
+
apply: (client, config) => {
|
|
31
|
+
return withCache(client, config.cache);
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAMvD,MAAM,UAAU,SAAS,CACvB,MAAiB,EACjB,OAA4B;IAE5B,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC7B,MAAM,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEtD,MAAM,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,CAAC;QACvB,GAAG,gBAAgB,EAAE;QACrB,SAAS,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC;KAC3B,CAAC,CAAC;IAEH,MAAM,CAAC,QAAQ,GAAG,KAAK,EAAW,GAAoB,EAAc,EAAE;QACpE,IAAI,CAAC,GAAG,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,GAAG,CAAM,CAAC;QAEtC,MAAM,SAAS,GAAG,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAC3E,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAW,CAAC;QAE7C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,MAAM,KAAK,SAAS;YAAE,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACvD,OAAO,MAAW,CAAC;IACrB,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,MAA4B,CAAC;IACpD,cAAc,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAEhD,OAAO,cAAc,CAAC;AACxB,CAAC;AAUD,MAAM,CAAC,MAAM,WAAW,GAAgB;IACtC,IAAI,EAAE,gBAAgB;IACtB,KAAK,EAAE,SAAS;IAChB,OAAO,EAAE,CAAC,MAAyB,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO;IAE/D,KAAK,EAAE,CAAC,MAAiB,EAAE,MAAyB,EAAE,EAAE;QACtD,OAAO,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,KAAM,CAAC,CAAC;IAC1C,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type Method = "GET" | "POST" | "PUT" | "PATCH" | "OPTIONS" | "DELETE" | "HEAD";
|
|
2
|
+
export interface CacheManagerOptions {
|
|
3
|
+
/**
|
|
4
|
+
* @ru Включить кэш
|
|
5
|
+
* @en Enable cache
|
|
6
|
+
*/
|
|
7
|
+
enabled?: boolean;
|
|
8
|
+
/**
|
|
9
|
+
* @ru Время жизни кэша (мс)
|
|
10
|
+
* @en Cache time-to-live in milliseconds
|
|
11
|
+
*/
|
|
12
|
+
ttl?: number;
|
|
13
|
+
/**
|
|
14
|
+
* @ru Максимальный размер кэша
|
|
15
|
+
* @en Maximum cache size
|
|
16
|
+
*/
|
|
17
|
+
maxSize?: number;
|
|
18
|
+
/**
|
|
19
|
+
* @ru HTTP методы, которые можно кэшировать
|
|
20
|
+
* @en HTTP methods allowed to be cached
|
|
21
|
+
*/
|
|
22
|
+
methods?: readonly Method[];
|
|
23
|
+
}
|
|
24
|
+
export interface CacheEntry<T> {
|
|
25
|
+
data: T;
|
|
26
|
+
etag?: string;
|
|
27
|
+
lastModified?: string;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/types/cache.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GACd,KAAK,GACL,MAAM,GACN,KAAK,GACL,OAAO,GACP,SAAS,GACT,QAAQ,GACR,MAAM,CAAC;AAEX,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,IAAI,EAAE,CAAC,CAAC;IACR,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/types/cache.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { CacheManagerOptions } from "../types/cache.ts";
|
|
2
|
+
/**
|
|
3
|
+
* @class CacheManager
|
|
4
|
+
* @en High-performance in-memory cache based on LRU strategy.
|
|
5
|
+
* Provides TTL support, metadata storage (etag, lastModified) and fast key-value access.
|
|
6
|
+
*
|
|
7
|
+
* @ru Высокопроизводительный in-memory кэш на основе LRU стратегии.
|
|
8
|
+
* Поддерживает TTL, хранение метаданных (etag, lastModified) и быстрый доступ по ключу.
|
|
9
|
+
*/
|
|
10
|
+
export declare class CacheManager {
|
|
11
|
+
private readonly cache;
|
|
12
|
+
constructor(options?: CacheManagerOptions);
|
|
13
|
+
/**
|
|
14
|
+
* @en Retrieves cached value by key.
|
|
15
|
+
* @ru Получает значение из кэша по ключу.
|
|
16
|
+
*
|
|
17
|
+
* @template T
|
|
18
|
+
* @param key Cache key
|
|
19
|
+
* @returns Cached value or undefined if not found
|
|
20
|
+
*/
|
|
21
|
+
get<T>(key: string): T | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* @en Stores value in cache.
|
|
24
|
+
* @ru Сохраняет значение в кэш.
|
|
25
|
+
*
|
|
26
|
+
* @template T
|
|
27
|
+
* @param key Cache key
|
|
28
|
+
* @param value Value to store
|
|
29
|
+
*/
|
|
30
|
+
set<T>(key: string, value: T): void;
|
|
31
|
+
/**
|
|
32
|
+
* @en Retrieves cached entry with metadata (etag, lastModified).
|
|
33
|
+
* @ru Получает запись кэша вместе с метаданными (etag, lastModified).
|
|
34
|
+
*
|
|
35
|
+
* @template T
|
|
36
|
+
* @param key Cache key
|
|
37
|
+
* @returns Cached entry with metadata or undefined
|
|
38
|
+
*/
|
|
39
|
+
getWithMetadata<T>(key: string): {
|
|
40
|
+
data: T;
|
|
41
|
+
etag?: string;
|
|
42
|
+
lastModified?: string;
|
|
43
|
+
} | undefined;
|
|
44
|
+
/**
|
|
45
|
+
* @en Stores value with optional HTTP metadata (etag, lastModified).
|
|
46
|
+
* @ru Сохраняет значение с дополнительными HTTP метаданными (etag, lastModified).
|
|
47
|
+
*
|
|
48
|
+
* @template T
|
|
49
|
+
* @param key Cache key
|
|
50
|
+
* @param data Value to store
|
|
51
|
+
* @param meta Optional HTTP metadata
|
|
52
|
+
*/
|
|
53
|
+
setWithMetadata<T>(key: string, data: T, meta?: {
|
|
54
|
+
etag?: string;
|
|
55
|
+
lastModified?: string;
|
|
56
|
+
}): void;
|
|
57
|
+
/**
|
|
58
|
+
* @en Checks if key exists in cache.
|
|
59
|
+
* @ru Проверяет наличие ключа в кэше.
|
|
60
|
+
*
|
|
61
|
+
* @param key Cache key
|
|
62
|
+
* @returns true if exists, otherwise false
|
|
63
|
+
*/
|
|
64
|
+
has(key: string): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* @en Deletes value from cache by key.
|
|
67
|
+
* @ru Удаляет значение из кэша по ключу.
|
|
68
|
+
*
|
|
69
|
+
* @param key Cache key
|
|
70
|
+
* @returns true if value was removed
|
|
71
|
+
*/
|
|
72
|
+
delete(key: string): boolean;
|
|
73
|
+
/**
|
|
74
|
+
* @en Clears entire cache.
|
|
75
|
+
* @ru Очищает весь кэш.
|
|
76
|
+
*/
|
|
77
|
+
clear(): void;
|
|
78
|
+
/**
|
|
79
|
+
* @en Returns current cache size.
|
|
80
|
+
* @ru Возвращает текущий размер кэша.
|
|
81
|
+
*/
|
|
82
|
+
get size(): number;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=CacheManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CacheManager.d.ts","sourceRoot":"","sources":["../../src/utils/CacheManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAc,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAEzE;;;;;;;GAOG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoC;gBAE9C,OAAO,CAAC,EAAE,mBAAmB;IAQzC;;;;;;;OAOG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAIlC;;;;;;;OAOG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAMnC;;;;;;;OAOG;IACH,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAC1B;QACE,IAAI,EAAE,CAAC,CAAC;QACR,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GACD,SAAS;IAIb;;;;;;;;OAQG;IACH,eAAe,CAAC,CAAC,EACf,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,CAAC,EACP,IAAI,CAAC,EAAE;QACL,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GACA,IAAI;IAQP;;;;;;OAMG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB;;;;;;OAMG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5B;;;OAGG;IACH,KAAK,IAAI,IAAI;IAIb;;;OAGG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { LRUCache } from "lru-cache";
|
|
2
|
+
/**
|
|
3
|
+
* @class CacheManager
|
|
4
|
+
* @en High-performance in-memory cache based on LRU strategy.
|
|
5
|
+
* Provides TTL support, metadata storage (etag, lastModified) and fast key-value access.
|
|
6
|
+
*
|
|
7
|
+
* @ru Высокопроизводительный in-memory кэш на основе LRU стратегии.
|
|
8
|
+
* Поддерживает TTL, хранение метаданных (etag, lastModified) и быстрый доступ по ключу.
|
|
9
|
+
*/
|
|
10
|
+
export class CacheManager {
|
|
11
|
+
cache;
|
|
12
|
+
constructor(options) {
|
|
13
|
+
this.cache = new LRUCache({
|
|
14
|
+
max: options?.maxSize ?? 500,
|
|
15
|
+
ttl: options?.ttl ?? 300_000,
|
|
16
|
+
updateAgeOnGet: true,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* @en Retrieves cached value by key.
|
|
21
|
+
* @ru Получает значение из кэша по ключу.
|
|
22
|
+
*
|
|
23
|
+
* @template T
|
|
24
|
+
* @param key Cache key
|
|
25
|
+
* @returns Cached value or undefined if not found
|
|
26
|
+
*/
|
|
27
|
+
get(key) {
|
|
28
|
+
return this.cache.get(key)?.data;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* @en Stores value in cache.
|
|
32
|
+
* @ru Сохраняет значение в кэш.
|
|
33
|
+
*
|
|
34
|
+
* @template T
|
|
35
|
+
* @param key Cache key
|
|
36
|
+
* @param value Value to store
|
|
37
|
+
*/
|
|
38
|
+
set(key, value) {
|
|
39
|
+
this.cache.set(key, {
|
|
40
|
+
data: value,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* @en Retrieves cached entry with metadata (etag, lastModified).
|
|
45
|
+
* @ru Получает запись кэша вместе с метаданными (etag, lastModified).
|
|
46
|
+
*
|
|
47
|
+
* @template T
|
|
48
|
+
* @param key Cache key
|
|
49
|
+
* @returns Cached entry with metadata or undefined
|
|
50
|
+
*/
|
|
51
|
+
getWithMetadata(key) {
|
|
52
|
+
return this.cache.get(key);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* @en Stores value with optional HTTP metadata (etag, lastModified).
|
|
56
|
+
* @ru Сохраняет значение с дополнительными HTTP метаданными (etag, lastModified).
|
|
57
|
+
*
|
|
58
|
+
* @template T
|
|
59
|
+
* @param key Cache key
|
|
60
|
+
* @param data Value to store
|
|
61
|
+
* @param meta Optional HTTP metadata
|
|
62
|
+
*/
|
|
63
|
+
setWithMetadata(key, data, meta) {
|
|
64
|
+
this.cache.set(key, {
|
|
65
|
+
data,
|
|
66
|
+
etag: meta?.etag,
|
|
67
|
+
lastModified: meta?.lastModified,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* @en Checks if key exists in cache.
|
|
72
|
+
* @ru Проверяет наличие ключа в кэше.
|
|
73
|
+
*
|
|
74
|
+
* @param key Cache key
|
|
75
|
+
* @returns true if exists, otherwise false
|
|
76
|
+
*/
|
|
77
|
+
has(key) {
|
|
78
|
+
return this.cache.has(key);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* @en Deletes value from cache by key.
|
|
82
|
+
* @ru Удаляет значение из кэша по ключу.
|
|
83
|
+
*
|
|
84
|
+
* @param key Cache key
|
|
85
|
+
* @returns true if value was removed
|
|
86
|
+
*/
|
|
87
|
+
delete(key) {
|
|
88
|
+
return this.cache.delete(key);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* @en Clears entire cache.
|
|
92
|
+
* @ru Очищает весь кэш.
|
|
93
|
+
*/
|
|
94
|
+
clear() {
|
|
95
|
+
this.cache.clear();
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* @en Returns current cache size.
|
|
99
|
+
* @ru Возвращает текущий размер кэша.
|
|
100
|
+
*/
|
|
101
|
+
get size() {
|
|
102
|
+
return this.cache.size;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=CacheManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CacheManager.js","sourceRoot":"","sources":["../../src/utils/CacheManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGrC;;;;;;;GAOG;AACH,MAAM,OAAO,YAAY;IACN,KAAK,CAAoC;IAE1D,YAAY,OAA6B;QACvC,IAAI,CAAC,KAAK,GAAG,IAAI,QAAQ,CAAC;YACxB,GAAG,EAAE,OAAO,EAAE,OAAO,IAAI,GAAG;YAC5B,GAAG,EAAE,OAAO,EAAE,GAAG,IAAI,OAAO;YAC5B,cAAc,EAAE,IAAI;SACrB,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;OAOG;IACH,GAAG,CAAI,GAAW;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC;IACnC,CAAC;IAED;;;;;;;OAOG;IACH,GAAG,CAAI,GAAW,EAAE,KAAQ;QAC1B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YAClB,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;OAOG;IACH,eAAe,CAAI,GAAW;QAO5B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED;;;;;;;;OAQG;IACH,eAAe,CACb,GAAW,EACX,IAAO,EACP,IAGC;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YAClB,IAAI;YACJ,IAAI,EAAE,IAAI,EAAE,IAAI;YAChB,YAAY,EAAE,IAAI,EAAE,YAAY;SACjC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,GAAW;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;CACF"}
|
package/package.json
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hyperttp/cache",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "High-performance LRU caching plugin for Hyperttp client",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist"
|
|
10
|
+
],
|
|
11
|
+
"keywords": [
|
|
12
|
+
"hyperttp"
|
|
13
|
+
],
|
|
14
|
+
"author": "dirold2",
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "git+https://github.com/IT-IF-OR/hyperttp-cache.git"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@hyperttp/core": "^1.0.5",
|
|
22
|
+
"lru-cache": "^11.5.0"
|
|
23
|
+
}
|
|
24
|
+
}
|