@onlineapps/conn-base-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/API.md +692 -0
- package/README.md +383 -0
- package/coverage/clover.xml +205 -0
- package/coverage/coverage-final.json +2 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +116 -0
- package/coverage/lcov-report/index.js.html +2851 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +210 -0
- package/coverage/lcov.info +370 -0
- package/package.json +36 -0
- package/src/index.js +923 -0
- package/test/component/cache.component.test.js +428 -0
- package/test/integration/cache.integration.test.js +356 -0
- package/test/unit/CacheConnector.edge.test.js +532 -0
- package/test/unit/CacheConnector.test.js +811 -0
package/API.md
ADDED
|
@@ -0,0 +1,692 @@
|
|
|
1
|
+
<a name="module_@onlineapps/conn-base-cache"></a>
|
|
2
|
+
|
|
3
|
+
## @onlineapps/conn-base-cache
|
|
4
|
+
Redis cache connector with TTL, invalidation, and namespace support for OA Drive microservices.
|
|
5
|
+
This connector provides a high-level abstraction over Redis operations with automatic key prefixing,
|
|
6
|
+
statistics tracking, and namespace isolation.
|
|
7
|
+
|
|
8
|
+
IMPORTANT: This connector uses "cache:" prefix for all keys.
|
|
9
|
+
Never accesses "obs:" namespace (reserved for monitoring).
|
|
10
|
+
|
|
11
|
+
**See**: [GitHub Repository](https://github.com/onlineapps/oa-drive/tree/main/shared/connector/conn-base-cache)
|
|
12
|
+
**Since**: 1.0.0
|
|
13
|
+
**Author**: OA Drive Team
|
|
14
|
+
**License**: MIT
|
|
15
|
+
|
|
16
|
+
* [@onlineapps/conn-base-cache](#module_@onlineapps/conn-base-cache)
|
|
17
|
+
* _static_
|
|
18
|
+
* [.VERSION](#module_@onlineapps/conn-base-cache.VERSION) : <code>string</code>
|
|
19
|
+
* _inner_
|
|
20
|
+
* [~CacheConnector](#module_@onlineapps/conn-base-cache..CacheConnector)
|
|
21
|
+
* [new CacheConnector()](#new_module_@onlineapps/conn-base-cache..CacheConnector_new)
|
|
22
|
+
* [new CacheConnector([config])](#new_module_@onlineapps/conn-base-cache..CacheConnector_new)
|
|
23
|
+
* [~CacheConnector](#module_@onlineapps/conn-base-cache..CacheConnector)
|
|
24
|
+
* [new CacheConnector()](#new_module_@onlineapps/conn-base-cache..CacheConnector_new)
|
|
25
|
+
* [new CacheConnector([config])](#new_module_@onlineapps/conn-base-cache..CacheConnector_new)
|
|
26
|
+
* [~connect()](#module_@onlineapps/conn-base-cache..connect) ⇒ <code>Promise.<boolean></code>
|
|
27
|
+
* [~disconnect()](#module_@onlineapps/conn-base-cache..disconnect) ⇒ <code>Promise.<void></code>
|
|
28
|
+
* [~get(key)](#module_@onlineapps/conn-base-cache..get) ⇒ <code>Promise.<(\*\|null)></code>
|
|
29
|
+
* [~set(key, value, [ttl])](#module_@onlineapps/conn-base-cache..set) ⇒ <code>Promise.<boolean></code>
|
|
30
|
+
* [~delete(key)](#module_@onlineapps/conn-base-cache..delete) ⇒ <code>Promise.<boolean></code>
|
|
31
|
+
* [~deleteByPattern(pattern)](#module_@onlineapps/conn-base-cache..deleteByPattern) ⇒ <code>Promise.<number></code>
|
|
32
|
+
* [~exists(key)](#module_@onlineapps/conn-base-cache..exists) ⇒ <code>Promise.<boolean></code>
|
|
33
|
+
* [~ttl(key)](#module_@onlineapps/conn-base-cache..ttl) ⇒ <code>Promise.<number></code>
|
|
34
|
+
* [~expire(key, ttl)](#module_@onlineapps/conn-base-cache..expire) ⇒ <code>Promise.<boolean></code>
|
|
35
|
+
* [~incr(key, [increment])](#module_@onlineapps/conn-base-cache..incr) ⇒ <code>Promise.<number></code>
|
|
36
|
+
* [~decr(key, [decrement])](#module_@onlineapps/conn-base-cache..decr) ⇒ <code>Promise.<number></code>
|
|
37
|
+
* [~mget(keys)](#module_@onlineapps/conn-base-cache..mget) ⇒ <code>Promise.<Object></code>
|
|
38
|
+
* [~mset(keyValues, [ttl])](#module_@onlineapps/conn-base-cache..mset) ⇒ <code>Promise.<boolean></code>
|
|
39
|
+
* [~flush([confirm])](#module_@onlineapps/conn-base-cache..flush) ⇒ <code>Promise.<boolean></code>
|
|
40
|
+
* [~getStats()](#module_@onlineapps/conn-base-cache..getStats) ⇒ <code>CacheStats</code> \| <code>number</code> \| <code>number</code> \| <code>number</code> \| <code>number</code> \| <code>number</code> \| <code>string</code>
|
|
41
|
+
* [~resetStats()](#module_@onlineapps/conn-base-cache..resetStats) ⇒ <code>void</code>
|
|
42
|
+
* [~withNamespace(namespace)](#module_@onlineapps/conn-base-cache..withNamespace) ⇒ <code>CacheConnector</code>
|
|
43
|
+
* [~wrap(fn, [options])](#module_@onlineapps/conn-base-cache..wrap) ⇒ <code>function</code>
|
|
44
|
+
* [~healthCheck()](#module_@onlineapps/conn-base-cache..healthCheck) ⇒ <code>Promise.<boolean></code>
|
|
45
|
+
* [~create(config)](#module_@onlineapps/conn-base-cache..create) ⇒ <code>CacheConnector</code>
|
|
46
|
+
* [~CacheConfig](#module_@onlineapps/conn-base-cache..CacheConfig) : <code>Object</code>
|
|
47
|
+
* [~CacheStats](#module_@onlineapps/conn-base-cache..CacheStats) : <code>Object</code>
|
|
48
|
+
|
|
49
|
+
<a name="module_@onlineapps/conn-base-cache.VERSION"></a>
|
|
50
|
+
|
|
51
|
+
### @onlineapps/conn-base-cache.VERSION : <code>string</code>
|
|
52
|
+
Current version
|
|
53
|
+
|
|
54
|
+
**Kind**: static constant of [<code>@onlineapps/conn-base-cache</code>](#module_@onlineapps/conn-base-cache)
|
|
55
|
+
<a name="module_@onlineapps/conn-base-cache..CacheConnector"></a>
|
|
56
|
+
|
|
57
|
+
### @onlineapps/conn-base-cache~CacheConnector
|
|
58
|
+
**Kind**: inner class of [<code>@onlineapps/conn-base-cache</code>](#module_@onlineapps/conn-base-cache)
|
|
59
|
+
|
|
60
|
+
* [~CacheConnector](#module_@onlineapps/conn-base-cache..CacheConnector)
|
|
61
|
+
* [new CacheConnector()](#new_module_@onlineapps/conn-base-cache..CacheConnector_new)
|
|
62
|
+
* [new CacheConnector([config])](#new_module_@onlineapps/conn-base-cache..CacheConnector_new)
|
|
63
|
+
|
|
64
|
+
<a name="new_module_@onlineapps/conn-base-cache..CacheConnector_new"></a>
|
|
65
|
+
|
|
66
|
+
#### new CacheConnector()
|
|
67
|
+
Redis cache connector providing caching operations with automatic key management
|
|
68
|
+
|
|
69
|
+
**Example** *(Basic Usage)*
|
|
70
|
+
```js
|
|
71
|
+
const cache = new CacheConnector({
|
|
72
|
+
host: 'localhost',
|
|
73
|
+
port: 6379,
|
|
74
|
+
defaultTTL: 3600
|
|
75
|
+
});
|
|
76
|
+
await cache.connect();
|
|
77
|
+
await cache.set('user:123', { name: 'John' }, 600);
|
|
78
|
+
const user = await cache.get('user:123');
|
|
79
|
+
```
|
|
80
|
+
**Example** *(With Namespace)*
|
|
81
|
+
```js
|
|
82
|
+
const cache = new CacheConnector({
|
|
83
|
+
namespace: 'invoice-service'
|
|
84
|
+
});
|
|
85
|
+
await cache.set('inv:123', data); // Actual key: cache:invoice-service:inv:123
|
|
86
|
+
```
|
|
87
|
+
<a name="new_module_@onlineapps/conn-base-cache..CacheConnector_new"></a>
|
|
88
|
+
|
|
89
|
+
#### new CacheConnector([config])
|
|
90
|
+
Creates a new CacheConnector instance
|
|
91
|
+
|
|
92
|
+
**Throws**:
|
|
93
|
+
|
|
94
|
+
- <code>TypeError</code> If configuration is invalid
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
| Param | Type | Default | Description |
|
|
98
|
+
| --- | --- | --- | --- |
|
|
99
|
+
| [config] | <code>Object</code> | <code>{}</code> | Configuration options |
|
|
100
|
+
| [config.host] | <code>string</code> | <code>"'localhost'"</code> | Redis server host |
|
|
101
|
+
| [config.port] | <code>number</code> | <code>6379</code> | Redis server port |
|
|
102
|
+
| [config.password] | <code>string</code> | | Redis password for authentication |
|
|
103
|
+
| [config.db] | <code>number</code> | <code>0</code> | Redis database number to use |
|
|
104
|
+
| [config.defaultTTL] | <code>number</code> | <code>3600</code> | Default TTL in seconds for cached items |
|
|
105
|
+
| [config.namespace] | <code>string</code> | <code>"''"</code> | Namespace prefix for all keys |
|
|
106
|
+
| [config.maxRetries] | <code>number</code> | <code>3</code> | Maximum connection retry attempts |
|
|
107
|
+
| [config.retryDelay] | <code>number</code> | <code>100</code> | Initial retry delay in milliseconds |
|
|
108
|
+
| [config.enableOfflineQueue] | <code>boolean</code> | <code>true</code> | Queue commands when disconnected |
|
|
109
|
+
| [config.lazyConnect] | <code>boolean</code> | <code>false</code> | Delay connection until first operation |
|
|
110
|
+
|
|
111
|
+
**Example** *(Full Configuration)*
|
|
112
|
+
```js
|
|
113
|
+
const cache = new CacheConnector({
|
|
114
|
+
host: 'redis.example.com',
|
|
115
|
+
port: 6380,
|
|
116
|
+
password: 'secret',
|
|
117
|
+
namespace: 'my-service',
|
|
118
|
+
defaultTTL: 1800,
|
|
119
|
+
maxRetries: 5,
|
|
120
|
+
enableOfflineQueue: false
|
|
121
|
+
});
|
|
122
|
+
```
|
|
123
|
+
<a name="module_@onlineapps/conn-base-cache..CacheConnector"></a>
|
|
124
|
+
|
|
125
|
+
### @onlineapps/conn-base-cache~CacheConnector
|
|
126
|
+
**Kind**: inner class of [<code>@onlineapps/conn-base-cache</code>](#module_@onlineapps/conn-base-cache)
|
|
127
|
+
|
|
128
|
+
* [~CacheConnector](#module_@onlineapps/conn-base-cache..CacheConnector)
|
|
129
|
+
* [new CacheConnector()](#new_module_@onlineapps/conn-base-cache..CacheConnector_new)
|
|
130
|
+
* [new CacheConnector([config])](#new_module_@onlineapps/conn-base-cache..CacheConnector_new)
|
|
131
|
+
|
|
132
|
+
<a name="new_module_@onlineapps/conn-base-cache..CacheConnector_new"></a>
|
|
133
|
+
|
|
134
|
+
#### new CacheConnector()
|
|
135
|
+
Redis cache connector providing caching operations with automatic key management
|
|
136
|
+
|
|
137
|
+
**Example** *(Basic Usage)*
|
|
138
|
+
```js
|
|
139
|
+
const cache = new CacheConnector({
|
|
140
|
+
host: 'localhost',
|
|
141
|
+
port: 6379,
|
|
142
|
+
defaultTTL: 3600
|
|
143
|
+
});
|
|
144
|
+
await cache.connect();
|
|
145
|
+
await cache.set('user:123', { name: 'John' }, 600);
|
|
146
|
+
const user = await cache.get('user:123');
|
|
147
|
+
```
|
|
148
|
+
**Example** *(With Namespace)*
|
|
149
|
+
```js
|
|
150
|
+
const cache = new CacheConnector({
|
|
151
|
+
namespace: 'invoice-service'
|
|
152
|
+
});
|
|
153
|
+
await cache.set('inv:123', data); // Actual key: cache:invoice-service:inv:123
|
|
154
|
+
```
|
|
155
|
+
<a name="new_module_@onlineapps/conn-base-cache..CacheConnector_new"></a>
|
|
156
|
+
|
|
157
|
+
#### new CacheConnector([config])
|
|
158
|
+
Creates a new CacheConnector instance
|
|
159
|
+
|
|
160
|
+
**Throws**:
|
|
161
|
+
|
|
162
|
+
- <code>TypeError</code> If configuration is invalid
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
| Param | Type | Default | Description |
|
|
166
|
+
| --- | --- | --- | --- |
|
|
167
|
+
| [config] | <code>Object</code> | <code>{}</code> | Configuration options |
|
|
168
|
+
| [config.host] | <code>string</code> | <code>"'localhost'"</code> | Redis server host |
|
|
169
|
+
| [config.port] | <code>number</code> | <code>6379</code> | Redis server port |
|
|
170
|
+
| [config.password] | <code>string</code> | | Redis password for authentication |
|
|
171
|
+
| [config.db] | <code>number</code> | <code>0</code> | Redis database number to use |
|
|
172
|
+
| [config.defaultTTL] | <code>number</code> | <code>3600</code> | Default TTL in seconds for cached items |
|
|
173
|
+
| [config.namespace] | <code>string</code> | <code>"''"</code> | Namespace prefix for all keys |
|
|
174
|
+
| [config.maxRetries] | <code>number</code> | <code>3</code> | Maximum connection retry attempts |
|
|
175
|
+
| [config.retryDelay] | <code>number</code> | <code>100</code> | Initial retry delay in milliseconds |
|
|
176
|
+
| [config.enableOfflineQueue] | <code>boolean</code> | <code>true</code> | Queue commands when disconnected |
|
|
177
|
+
| [config.lazyConnect] | <code>boolean</code> | <code>false</code> | Delay connection until first operation |
|
|
178
|
+
|
|
179
|
+
**Example** *(Full Configuration)*
|
|
180
|
+
```js
|
|
181
|
+
const cache = new CacheConnector({
|
|
182
|
+
host: 'redis.example.com',
|
|
183
|
+
port: 6380,
|
|
184
|
+
password: 'secret',
|
|
185
|
+
namespace: 'my-service',
|
|
186
|
+
defaultTTL: 1800,
|
|
187
|
+
maxRetries: 5,
|
|
188
|
+
enableOfflineQueue: false
|
|
189
|
+
});
|
|
190
|
+
```
|
|
191
|
+
<a name="module_@onlineapps/conn-base-cache..connect"></a>
|
|
192
|
+
|
|
193
|
+
### @onlineapps/conn-base-cache~connect() ⇒ <code>Promise.<boolean></code>
|
|
194
|
+
Establishes connection to Redis server
|
|
195
|
+
|
|
196
|
+
**Kind**: inner method of [<code>@onlineapps/conn-base-cache</code>](#module_@onlineapps/conn-base-cache)
|
|
197
|
+
**Returns**: <code>Promise.<boolean></code> - Returns true when connection is established
|
|
198
|
+
**Throws**:
|
|
199
|
+
|
|
200
|
+
- <code>Error</code> Throws error if connection fails after all retries
|
|
201
|
+
|
|
202
|
+
**Emits**: [<code>connect</code>](#CacheConnector+event_connect), [<code>error</code>](#CacheConnector+event_error), [<code>close</code>](#CacheConnector+event_close)
|
|
203
|
+
**Example** *(Simple Connection)*
|
|
204
|
+
```js
|
|
205
|
+
try {
|
|
206
|
+
await cache.connect();
|
|
207
|
+
console.log('Connected to Redis');
|
|
208
|
+
} catch (error) {
|
|
209
|
+
console.error('Failed to connect:', error);
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
**Example** *(With Event Handlers)*
|
|
213
|
+
```js
|
|
214
|
+
cache.client.on('connect', () => {
|
|
215
|
+
console.log('Redis connected');
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
cache.client.on('error', (err) => {
|
|
219
|
+
console.error('Redis error:', err);
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
await cache.connect();
|
|
223
|
+
```
|
|
224
|
+
<a name="module_@onlineapps/conn-base-cache..disconnect"></a>
|
|
225
|
+
|
|
226
|
+
### @onlineapps/conn-base-cache~disconnect() ⇒ <code>Promise.<void></code>
|
|
227
|
+
Disconnect from Redis server gracefully
|
|
228
|
+
|
|
229
|
+
**Kind**: inner method of [<code>@onlineapps/conn-base-cache</code>](#module_@onlineapps/conn-base-cache)
|
|
230
|
+
**Example**
|
|
231
|
+
```js
|
|
232
|
+
await cache.disconnect();
|
|
233
|
+
console.log('Disconnected from Redis');
|
|
234
|
+
```
|
|
235
|
+
<a name="module_@onlineapps/conn-base-cache..get"></a>
|
|
236
|
+
|
|
237
|
+
### @onlineapps/conn-base-cache~get(key) ⇒ <code>Promise.<(\*\|null)></code>
|
|
238
|
+
Retrieves a value from cache by key
|
|
239
|
+
|
|
240
|
+
**Kind**: inner method of [<code>@onlineapps/conn-base-cache</code>](#module_@onlineapps/conn-base-cache)
|
|
241
|
+
**Returns**: <code>Promise.<(\*\|null)></code> - The cached value (parsed from JSON if applicable) or null if not found
|
|
242
|
+
**Throws**:
|
|
243
|
+
|
|
244
|
+
- <code>Error</code> Throws error if Redis operation fails
|
|
245
|
+
|
|
246
|
+
**Emits**: <code>CacheConnector#event:hit - When cache hit occurs</code>, <code>CacheConnector#event:miss - When cache miss occurs</code>
|
|
247
|
+
|
|
248
|
+
| Param | Type | Description |
|
|
249
|
+
| --- | --- | --- |
|
|
250
|
+
| key | <code>string</code> | Cache key to retrieve |
|
|
251
|
+
|
|
252
|
+
**Example** *(Get Simple Value)*
|
|
253
|
+
```js
|
|
254
|
+
const value = await cache.get('user:123');
|
|
255
|
+
if (value) {
|
|
256
|
+
console.log('User found:', value);
|
|
257
|
+
}
|
|
258
|
+
```
|
|
259
|
+
**Example** *(Get with Fallback)*
|
|
260
|
+
```js
|
|
261
|
+
let user = await cache.get('user:123');
|
|
262
|
+
if (!user) {
|
|
263
|
+
user = await fetchFromDatabase(123);
|
|
264
|
+
await cache.set('user:123', user, 600);
|
|
265
|
+
}
|
|
266
|
+
```
|
|
267
|
+
<a name="module_@onlineapps/conn-base-cache..set"></a>
|
|
268
|
+
|
|
269
|
+
### @onlineapps/conn-base-cache~set(key, value, [ttl]) ⇒ <code>Promise.<boolean></code>
|
|
270
|
+
Stores a value in cache with optional TTL
|
|
271
|
+
|
|
272
|
+
**Kind**: inner method of [<code>@onlineapps/conn-base-cache</code>](#module_@onlineapps/conn-base-cache)
|
|
273
|
+
**Returns**: <code>Promise.<boolean></code> - Returns true on successful storage
|
|
274
|
+
**Throws**:
|
|
275
|
+
|
|
276
|
+
- <code>Error</code> Throws error if Redis operation fails
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
| Param | Type | Description |
|
|
280
|
+
| --- | --- | --- |
|
|
281
|
+
| key | <code>string</code> | Cache key |
|
|
282
|
+
| value | <code>\*</code> | Value to cache (will be JSON stringified if not a string) |
|
|
283
|
+
| [ttl] | <code>number</code> | Time to live in seconds (uses defaultTTL if not specified) |
|
|
284
|
+
|
|
285
|
+
**Example** *(Set with Default TTL)*
|
|
286
|
+
```js
|
|
287
|
+
await cache.set('config', { theme: 'dark' });
|
|
288
|
+
```
|
|
289
|
+
**Example** *(Set with Custom TTL)*
|
|
290
|
+
```js
|
|
291
|
+
await cache.set('session:abc', sessionData, 1800); // 30 minutes
|
|
292
|
+
```
|
|
293
|
+
**Example** *(Set Permanent (no expiry))*
|
|
294
|
+
```js
|
|
295
|
+
await cache.set('permanent:data', data, 0);
|
|
296
|
+
```
|
|
297
|
+
<a name="module_@onlineapps/conn-base-cache..delete"></a>
|
|
298
|
+
|
|
299
|
+
### @onlineapps/conn-base-cache~delete(key) ⇒ <code>Promise.<boolean></code>
|
|
300
|
+
Delete a single key from cache
|
|
301
|
+
|
|
302
|
+
**Kind**: inner method of [<code>@onlineapps/conn-base-cache</code>](#module_@onlineapps/conn-base-cache)
|
|
303
|
+
**Returns**: <code>Promise.<boolean></code> - Returns true if key was deleted
|
|
304
|
+
**Throws**:
|
|
305
|
+
|
|
306
|
+
- <code>Error</code> Throws error if Redis operation fails
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
| Param | Type | Description |
|
|
310
|
+
| --- | --- | --- |
|
|
311
|
+
| key | <code>string</code> | Cache key to delete |
|
|
312
|
+
|
|
313
|
+
**Example**
|
|
314
|
+
```js
|
|
315
|
+
const deleted = await cache.delete('user:123');
|
|
316
|
+
if (deleted) {
|
|
317
|
+
console.log('Key deleted');
|
|
318
|
+
}
|
|
319
|
+
```
|
|
320
|
+
<a name="module_@onlineapps/conn-base-cache..deleteByPattern"></a>
|
|
321
|
+
|
|
322
|
+
### @onlineapps/conn-base-cache~deleteByPattern(pattern) ⇒ <code>Promise.<number></code>
|
|
323
|
+
Deletes keys matching a pattern
|
|
324
|
+
|
|
325
|
+
**Kind**: inner method of [<code>@onlineapps/conn-base-cache</code>](#module_@onlineapps/conn-base-cache)
|
|
326
|
+
**Returns**: <code>Promise.<number></code> - Number of deleted keys
|
|
327
|
+
**Throws**:
|
|
328
|
+
|
|
329
|
+
- <code>Error</code> Throws error if pattern deletion fails
|
|
330
|
+
|
|
331
|
+
**Warning**: This operation can be expensive on large datasets
|
|
332
|
+
|
|
333
|
+
| Param | Type | Description |
|
|
334
|
+
| --- | --- | --- |
|
|
335
|
+
| pattern | <code>string</code> | Redis key pattern (e.g., "user:*", "session:*") |
|
|
336
|
+
|
|
337
|
+
**Example** *(Delete All User Cache Entries)*
|
|
338
|
+
```js
|
|
339
|
+
const deleted = await cache.deleteByPattern('user:*');
|
|
340
|
+
console.log(`Deleted ${deleted} user entries`);
|
|
341
|
+
```
|
|
342
|
+
**Example** *(Delete Specific Session Pattern)*
|
|
343
|
+
```js
|
|
344
|
+
await cache.deleteByPattern('session:user:123:*');
|
|
345
|
+
```
|
|
346
|
+
<a name="module_@onlineapps/conn-base-cache..exists"></a>
|
|
347
|
+
|
|
348
|
+
### @onlineapps/conn-base-cache~exists(key) ⇒ <code>Promise.<boolean></code>
|
|
349
|
+
Check if key exists in cache
|
|
350
|
+
|
|
351
|
+
**Kind**: inner method of [<code>@onlineapps/conn-base-cache</code>](#module_@onlineapps/conn-base-cache)
|
|
352
|
+
**Returns**: <code>Promise.<boolean></code> - Returns true if key exists
|
|
353
|
+
**Throws**:
|
|
354
|
+
|
|
355
|
+
- <code>Error</code> Throws error if Redis operation fails
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
| Param | Type | Description |
|
|
359
|
+
| --- | --- | --- |
|
|
360
|
+
| key | <code>string</code> | Cache key to check |
|
|
361
|
+
|
|
362
|
+
**Example**
|
|
363
|
+
```js
|
|
364
|
+
if (await cache.exists('user:123')) {
|
|
365
|
+
console.log('User is cached');
|
|
366
|
+
}
|
|
367
|
+
```
|
|
368
|
+
<a name="module_@onlineapps/conn-base-cache..ttl"></a>
|
|
369
|
+
|
|
370
|
+
### @onlineapps/conn-base-cache~ttl(key) ⇒ <code>Promise.<number></code>
|
|
371
|
+
Get remaining TTL for key
|
|
372
|
+
|
|
373
|
+
**Kind**: inner method of [<code>@onlineapps/conn-base-cache</code>](#module_@onlineapps/conn-base-cache)
|
|
374
|
+
**Returns**: <code>Promise.<number></code> - TTL in seconds, -1 if no TTL, -2 if not exists
|
|
375
|
+
**Throws**:
|
|
376
|
+
|
|
377
|
+
- <code>Error</code> Throws error if Redis operation fails
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
| Param | Type | Description |
|
|
381
|
+
| --- | --- | --- |
|
|
382
|
+
| key | <code>string</code> | Cache key |
|
|
383
|
+
|
|
384
|
+
**Example**
|
|
385
|
+
```js
|
|
386
|
+
const ttl = await cache.ttl('session:abc');
|
|
387
|
+
if (ttl > 0) {
|
|
388
|
+
console.log(`Session expires in ${ttl} seconds`);
|
|
389
|
+
} else if (ttl === -1) {
|
|
390
|
+
console.log('Session has no expiry');
|
|
391
|
+
} else {
|
|
392
|
+
console.log('Session does not exist');
|
|
393
|
+
}
|
|
394
|
+
```
|
|
395
|
+
<a name="module_@onlineapps/conn-base-cache..expire"></a>
|
|
396
|
+
|
|
397
|
+
### @onlineapps/conn-base-cache~expire(key, ttl) ⇒ <code>Promise.<boolean></code>
|
|
398
|
+
Update TTL for existing key
|
|
399
|
+
|
|
400
|
+
**Kind**: inner method of [<code>@onlineapps/conn-base-cache</code>](#module_@onlineapps/conn-base-cache)
|
|
401
|
+
**Returns**: <code>Promise.<boolean></code> - Returns true if TTL was set
|
|
402
|
+
**Throws**:
|
|
403
|
+
|
|
404
|
+
- <code>Error</code> Throws error if Redis operation fails
|
|
405
|
+
|
|
406
|
+
|
|
407
|
+
| Param | Type | Description |
|
|
408
|
+
| --- | --- | --- |
|
|
409
|
+
| key | <code>string</code> | Cache key |
|
|
410
|
+
| ttl | <code>number</code> | New TTL in seconds |
|
|
411
|
+
|
|
412
|
+
**Example**
|
|
413
|
+
```js
|
|
414
|
+
// Extend session by 30 minutes
|
|
415
|
+
await cache.expire('session:abc', 1800);
|
|
416
|
+
```
|
|
417
|
+
<a name="module_@onlineapps/conn-base-cache..incr"></a>
|
|
418
|
+
|
|
419
|
+
### @onlineapps/conn-base-cache~incr(key, [increment]) ⇒ <code>Promise.<number></code>
|
|
420
|
+
Increment numeric value atomically
|
|
421
|
+
|
|
422
|
+
**Kind**: inner method of [<code>@onlineapps/conn-base-cache</code>](#module_@onlineapps/conn-base-cache)
|
|
423
|
+
**Returns**: <code>Promise.<number></code> - New value after increment
|
|
424
|
+
**Throws**:
|
|
425
|
+
|
|
426
|
+
- <code>Error</code> Throws error if Redis operation fails
|
|
427
|
+
|
|
428
|
+
|
|
429
|
+
| Param | Type | Default | Description |
|
|
430
|
+
| --- | --- | --- | --- |
|
|
431
|
+
| key | <code>string</code> | | Cache key |
|
|
432
|
+
| [increment] | <code>number</code> | <code>1</code> | Increment value |
|
|
433
|
+
|
|
434
|
+
**Example** *(Simple Counter)*
|
|
435
|
+
```js
|
|
436
|
+
const count = await cache.incr('page:views');
|
|
437
|
+
console.log(`Page views: ${count}`);
|
|
438
|
+
```
|
|
439
|
+
**Example** *(Increment by Value)*
|
|
440
|
+
```js
|
|
441
|
+
const score = await cache.incr('user:score', 10);
|
|
442
|
+
```
|
|
443
|
+
<a name="module_@onlineapps/conn-base-cache..decr"></a>
|
|
444
|
+
|
|
445
|
+
### @onlineapps/conn-base-cache~decr(key, [decrement]) ⇒ <code>Promise.<number></code>
|
|
446
|
+
Decrement numeric value atomically
|
|
447
|
+
|
|
448
|
+
**Kind**: inner method of [<code>@onlineapps/conn-base-cache</code>](#module_@onlineapps/conn-base-cache)
|
|
449
|
+
**Returns**: <code>Promise.<number></code> - New value after decrement
|
|
450
|
+
**Throws**:
|
|
451
|
+
|
|
452
|
+
- <code>Error</code> Throws error if Redis operation fails
|
|
453
|
+
|
|
454
|
+
|
|
455
|
+
| Param | Type | Default | Description |
|
|
456
|
+
| --- | --- | --- | --- |
|
|
457
|
+
| key | <code>string</code> | | Cache key |
|
|
458
|
+
| [decrement] | <code>number</code> | <code>1</code> | Decrement value |
|
|
459
|
+
|
|
460
|
+
**Example**
|
|
461
|
+
```js
|
|
462
|
+
const remaining = await cache.decr('inventory:count', 1);
|
|
463
|
+
if (remaining < 0) {
|
|
464
|
+
console.log('Out of stock');
|
|
465
|
+
}
|
|
466
|
+
```
|
|
467
|
+
<a name="module_@onlineapps/conn-base-cache..mget"></a>
|
|
468
|
+
|
|
469
|
+
### @onlineapps/conn-base-cache~mget(keys) ⇒ <code>Promise.<Object></code>
|
|
470
|
+
Get multiple values at once
|
|
471
|
+
|
|
472
|
+
**Kind**: inner method of [<code>@onlineapps/conn-base-cache</code>](#module_@onlineapps/conn-base-cache)
|
|
473
|
+
**Returns**: <code>Promise.<Object></code> - Key-value object with found values
|
|
474
|
+
**Throws**:
|
|
475
|
+
|
|
476
|
+
- <code>Error</code> Throws error if Redis operation fails
|
|
477
|
+
|
|
478
|
+
|
|
479
|
+
| Param | Type | Description |
|
|
480
|
+
| --- | --- | --- |
|
|
481
|
+
| keys | <code>Array.<string></code> | Array of cache keys |
|
|
482
|
+
|
|
483
|
+
**Example**
|
|
484
|
+
```js
|
|
485
|
+
const result = await cache.mget(['user:1', 'user:2', 'user:3']);
|
|
486
|
+
// Returns: { 'user:1': {...}, 'user:2': {...} }
|
|
487
|
+
// Missing keys are not included in result
|
|
488
|
+
```
|
|
489
|
+
<a name="module_@onlineapps/conn-base-cache..mset"></a>
|
|
490
|
+
|
|
491
|
+
### @onlineapps/conn-base-cache~mset(keyValues, [ttl]) ⇒ <code>Promise.<boolean></code>
|
|
492
|
+
Set multiple values at once
|
|
493
|
+
|
|
494
|
+
**Kind**: inner method of [<code>@onlineapps/conn-base-cache</code>](#module_@onlineapps/conn-base-cache)
|
|
495
|
+
**Returns**: <code>Promise.<boolean></code> - Returns true on success
|
|
496
|
+
**Throws**:
|
|
497
|
+
|
|
498
|
+
- <code>Error</code> Throws error if Redis operation fails
|
|
499
|
+
|
|
500
|
+
|
|
501
|
+
| Param | Type | Description |
|
|
502
|
+
| --- | --- | --- |
|
|
503
|
+
| keyValues | <code>Object</code> | Key-value pairs to set |
|
|
504
|
+
| [ttl] | <code>number</code> | TTL in seconds for all keys |
|
|
505
|
+
|
|
506
|
+
**Example**
|
|
507
|
+
```js
|
|
508
|
+
await cache.mset({
|
|
509
|
+
'user:1': { name: 'Alice' },
|
|
510
|
+
'user:2': { name: 'Bob' },
|
|
511
|
+
'user:3': { name: 'Charlie' }
|
|
512
|
+
}, 3600);
|
|
513
|
+
```
|
|
514
|
+
<a name="module_@onlineapps/conn-base-cache..flush"></a>
|
|
515
|
+
|
|
516
|
+
### @onlineapps/conn-base-cache~flush([confirm]) ⇒ <code>Promise.<boolean></code>
|
|
517
|
+
Flush all cache keys (dangerous!)
|
|
518
|
+
|
|
519
|
+
**Kind**: inner method of [<code>@onlineapps/conn-base-cache</code>](#module_@onlineapps/conn-base-cache)
|
|
520
|
+
**Returns**: <code>Promise.<boolean></code> - Returns true on success
|
|
521
|
+
**Throws**:
|
|
522
|
+
|
|
523
|
+
- <code>Error</code> If confirmation not provided or flush fails
|
|
524
|
+
|
|
525
|
+
**Warning**: This will delete ALL cache keys with the configured prefix
|
|
526
|
+
|
|
527
|
+
| Param | Type | Default | Description |
|
|
528
|
+
| --- | --- | --- | --- |
|
|
529
|
+
| [confirm] | <code>boolean</code> | <code>false</code> | Must be true to execute |
|
|
530
|
+
|
|
531
|
+
**Example**
|
|
532
|
+
```js
|
|
533
|
+
// Safety check required
|
|
534
|
+
await cache.flush(true);
|
|
535
|
+
console.log('All cache cleared');
|
|
536
|
+
```
|
|
537
|
+
<a name="module_@onlineapps/conn-base-cache..getStats"></a>
|
|
538
|
+
|
|
539
|
+
### @onlineapps/conn-base-cache~getStats() ⇒ <code>CacheStats</code> \| <code>number</code> \| <code>number</code> \| <code>number</code> \| <code>number</code> \| <code>number</code> \| <code>string</code>
|
|
540
|
+
Get cache statistics
|
|
541
|
+
|
|
542
|
+
**Kind**: inner method of [<code>@onlineapps/conn-base-cache</code>](#module_@onlineapps/conn-base-cache)
|
|
543
|
+
**Returns**: <code>CacheStats</code> - Current statistics<code>number</code> - stats.hits - Number of cache hits<code>number</code> - stats.misses - Number of cache misses<code>number</code> - stats.sets - Number of set operations<code>number</code> - stats.deletes - Number of delete operations<code>number</code> - stats.errors - Number of errors<code>string</code> - stats.hitRate - Hit rate percentage
|
|
544
|
+
**Example**
|
|
545
|
+
```js
|
|
546
|
+
const stats = cache.getStats();
|
|
547
|
+
console.log(`Hit rate: ${stats.hitRate}`);
|
|
548
|
+
console.log(`Total operations: ${stats.hits + stats.misses}`);
|
|
549
|
+
```
|
|
550
|
+
<a name="module_@onlineapps/conn-base-cache..resetStats"></a>
|
|
551
|
+
|
|
552
|
+
### @onlineapps/conn-base-cache~resetStats() ⇒ <code>void</code>
|
|
553
|
+
Reset statistics counters
|
|
554
|
+
|
|
555
|
+
**Kind**: inner method of [<code>@onlineapps/conn-base-cache</code>](#module_@onlineapps/conn-base-cache)
|
|
556
|
+
**Example**
|
|
557
|
+
```js
|
|
558
|
+
cache.resetStats();
|
|
559
|
+
// All counters set to 0
|
|
560
|
+
```
|
|
561
|
+
<a name="module_@onlineapps/conn-base-cache..withNamespace"></a>
|
|
562
|
+
|
|
563
|
+
### @onlineapps/conn-base-cache~withNamespace(namespace) ⇒ <code>CacheConnector</code>
|
|
564
|
+
Creates a new CacheConnector instance with additional namespace
|
|
565
|
+
|
|
566
|
+
**Kind**: inner method of [<code>@onlineapps/conn-base-cache</code>](#module_@onlineapps/conn-base-cache)
|
|
567
|
+
**Returns**: <code>CacheConnector</code> - New instance with combined namespace
|
|
568
|
+
|
|
569
|
+
| Param | Type | Description |
|
|
570
|
+
| --- | --- | --- |
|
|
571
|
+
| namespace | <code>string</code> | Additional namespace to append |
|
|
572
|
+
|
|
573
|
+
**Example**
|
|
574
|
+
```js
|
|
575
|
+
const baseCache = new CacheConnector({ namespace: 'app' });
|
|
576
|
+
const userCache = baseCache.withNamespace('users');
|
|
577
|
+
const sessionCache = baseCache.withNamespace('sessions');
|
|
578
|
+
|
|
579
|
+
// userCache keys: cache:app:users:*
|
|
580
|
+
// sessionCache keys: cache:app:sessions:*
|
|
581
|
+
```
|
|
582
|
+
<a name="module_@onlineapps/conn-base-cache..wrap"></a>
|
|
583
|
+
|
|
584
|
+
### @onlineapps/conn-base-cache~wrap(fn, [options]) ⇒ <code>function</code>
|
|
585
|
+
Wraps a function with caching (memoization)
|
|
586
|
+
|
|
587
|
+
**Kind**: inner method of [<code>@onlineapps/conn-base-cache</code>](#module_@onlineapps/conn-base-cache)
|
|
588
|
+
**Returns**: <code>function</code> - Wrapped function with caching
|
|
589
|
+
|
|
590
|
+
| Param | Type | Default | Description |
|
|
591
|
+
| --- | --- | --- | --- |
|
|
592
|
+
| fn | <code>function</code> | | Async function to wrap |
|
|
593
|
+
| [options] | <code>Object</code> | <code>{}</code> | Wrapping options |
|
|
594
|
+
| [options.ttl] | <code>number</code> | | Cache TTL in seconds |
|
|
595
|
+
| [options.keyPrefix] | <code>string</code> | | Prefix for cache keys |
|
|
596
|
+
| [options.keyGenerator] | <code>function</code> | | Custom key generation function |
|
|
597
|
+
|
|
598
|
+
**Example** *(Basic Function Wrapping)*
|
|
599
|
+
```js
|
|
600
|
+
const expensiveOperation = async (userId) => {
|
|
601
|
+
// Complex database query
|
|
602
|
+
return await db.query('SELECT * FROM users WHERE id = ?', [userId]);
|
|
603
|
+
};
|
|
604
|
+
|
|
605
|
+
const cachedOperation = cache.wrap(expensiveOperation, {
|
|
606
|
+
ttl: 600,
|
|
607
|
+
keyPrefix: 'expensive-op'
|
|
608
|
+
});
|
|
609
|
+
|
|
610
|
+
// First call hits database
|
|
611
|
+
const result1 = await cachedOperation(123);
|
|
612
|
+
|
|
613
|
+
// Second call returns from cache
|
|
614
|
+
const result2 = await cachedOperation(123);
|
|
615
|
+
```
|
|
616
|
+
**Example** *(Custom Key Generation)*
|
|
617
|
+
```js
|
|
618
|
+
const searchUsers = cache.wrap(async (filters) => {
|
|
619
|
+
return await db.searchUsers(filters);
|
|
620
|
+
}, {
|
|
621
|
+
ttl: 300,
|
|
622
|
+
keyGenerator: (filters) => `search:${JSON.stringify(filters)}`
|
|
623
|
+
});
|
|
624
|
+
```
|
|
625
|
+
<a name="module_@onlineapps/conn-base-cache..healthCheck"></a>
|
|
626
|
+
|
|
627
|
+
### @onlineapps/conn-base-cache~healthCheck() ⇒ <code>Promise.<boolean></code>
|
|
628
|
+
Perform health check on Redis connection
|
|
629
|
+
|
|
630
|
+
**Kind**: inner method of [<code>@onlineapps/conn-base-cache</code>](#module_@onlineapps/conn-base-cache)
|
|
631
|
+
**Returns**: <code>Promise.<boolean></code> - Returns true if healthy
|
|
632
|
+
**Example**
|
|
633
|
+
```js
|
|
634
|
+
if (await cache.healthCheck()) {
|
|
635
|
+
console.log('Redis is healthy');
|
|
636
|
+
} else {
|
|
637
|
+
console.error('Redis is down');
|
|
638
|
+
}
|
|
639
|
+
```
|
|
640
|
+
<a name="module_@onlineapps/conn-base-cache..create"></a>
|
|
641
|
+
|
|
642
|
+
### @onlineapps/conn-base-cache~create(config) ⇒ <code>CacheConnector</code>
|
|
643
|
+
Factory function to create cache instance
|
|
644
|
+
|
|
645
|
+
**Kind**: inner method of [<code>@onlineapps/conn-base-cache</code>](#module_@onlineapps/conn-base-cache)
|
|
646
|
+
**Returns**: <code>CacheConnector</code> - New cache connector instance
|
|
647
|
+
|
|
648
|
+
| Param | Type | Description |
|
|
649
|
+
| --- | --- | --- |
|
|
650
|
+
| config | <code>CacheConfig</code> | Configuration object |
|
|
651
|
+
|
|
652
|
+
**Example**
|
|
653
|
+
```js
|
|
654
|
+
const cache = CacheConnector.create({
|
|
655
|
+
host: 'localhost',
|
|
656
|
+
namespace: 'my-service'
|
|
657
|
+
});
|
|
658
|
+
```
|
|
659
|
+
<a name="module_@onlineapps/conn-base-cache..CacheConfig"></a>
|
|
660
|
+
|
|
661
|
+
### @onlineapps/conn-base-cache~CacheConfig : <code>Object</code>
|
|
662
|
+
**Kind**: inner typedef of [<code>@onlineapps/conn-base-cache</code>](#module_@onlineapps/conn-base-cache)
|
|
663
|
+
**Properties**
|
|
664
|
+
|
|
665
|
+
| Name | Type | Default | Description |
|
|
666
|
+
| --- | --- | --- | --- |
|
|
667
|
+
| [host] | <code>string</code> | <code>"'localhost'"</code> | Redis host |
|
|
668
|
+
| [port] | <code>number</code> | <code>6379</code> | Redis port |
|
|
669
|
+
| [password] | <code>string</code> | | Redis password |
|
|
670
|
+
| [db] | <code>number</code> | <code>0</code> | Redis database |
|
|
671
|
+
| [defaultTTL] | <code>number</code> | <code>3600</code> | Default TTL in seconds |
|
|
672
|
+
| [namespace] | <code>string</code> | <code>"''"</code> | Key namespace |
|
|
673
|
+
| [maxRetries] | <code>number</code> | <code>3</code> | Max connection retries |
|
|
674
|
+
| [retryDelay] | <code>number</code> | <code>100</code> | Retry delay in ms |
|
|
675
|
+
| [enableOfflineQueue] | <code>boolean</code> | <code>true</code> | Queue commands when disconnected |
|
|
676
|
+
| [lazyConnect] | <code>boolean</code> | <code>false</code> | Delay connection |
|
|
677
|
+
|
|
678
|
+
<a name="module_@onlineapps/conn-base-cache..CacheStats"></a>
|
|
679
|
+
|
|
680
|
+
### @onlineapps/conn-base-cache~CacheStats : <code>Object</code>
|
|
681
|
+
**Kind**: inner typedef of [<code>@onlineapps/conn-base-cache</code>](#module_@onlineapps/conn-base-cache)
|
|
682
|
+
**Properties**
|
|
683
|
+
|
|
684
|
+
| Name | Type | Description |
|
|
685
|
+
| --- | --- | --- |
|
|
686
|
+
| hits | <code>number</code> | Number of cache hits |
|
|
687
|
+
| misses | <code>number</code> | Number of cache misses |
|
|
688
|
+
| sets | <code>number</code> | Number of set operations |
|
|
689
|
+
| deletes | <code>number</code> | Number of delete operations |
|
|
690
|
+
| errors | <code>number</code> | Number of errors |
|
|
691
|
+
| hitRate | <code>string</code> | Hit rate percentage |
|
|
692
|
+
|