@lobu/core 5.0.0 → 6.0.1
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/__tests__/fixtures/index.d.ts +0 -1
- package/dist/__tests__/fixtures/index.d.ts.map +1 -1
- package/dist/__tests__/fixtures/index.js +1 -3
- package/dist/__tests__/fixtures/index.js.map +1 -1
- package/dist/__tests__/fixtures/mock-queue.d.ts +0 -3
- package/dist/__tests__/fixtures/mock-queue.d.ts.map +1 -1
- package/dist/__tests__/fixtures/mock-queue.js +0 -5
- package/dist/__tests__/fixtures/mock-queue.js.map +1 -1
- package/dist/agent-store.d.ts +8 -8
- package/dist/agent-store.d.ts.map +1 -1
- package/dist/agent-store.js +4 -0
- package/dist/agent-store.js.map +1 -1
- package/dist/api-types.d.ts +2 -22
- package/dist/api-types.d.ts.map +1 -1
- package/dist/constants.d.ts +1 -15
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +2 -17
- package/dist/constants.js.map +1 -1
- package/dist/errors.d.ts +0 -3
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +0 -5
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +5 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -4
- package/dist/index.js.map +1 -1
- package/dist/lobu-toml-schema.d.ts +8 -87
- package/dist/lobu-toml-schema.d.ts.map +1 -1
- package/dist/lobu-toml-schema.js +8 -62
- package/dist/lobu-toml-schema.js.map +1 -1
- package/dist/sentry.d.ts.map +1 -1
- package/dist/sentry.js +0 -1
- package/dist/sentry.js.map +1 -1
- package/dist/trace.d.ts +1 -1
- package/dist/trace.js +1 -1
- package/dist/types.d.ts +4 -61
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/env.d.ts +1 -0
- package/dist/utils/env.d.ts.map +1 -1
- package/dist/utils/env.js +0 -3
- package/dist/utils/env.js.map +1 -1
- package/dist/worker/auth.d.ts +0 -10
- package/dist/worker/auth.d.ts.map +1 -1
- package/dist/worker/auth.js +0 -5
- package/dist/worker/auth.js.map +1 -1
- package/package.json +1 -2
- package/dist/__tests__/fixtures/mock-redis.d.ts +0 -60
- package/dist/__tests__/fixtures/mock-redis.d.ts.map +0 -1
- package/dist/__tests__/fixtures/mock-redis.js +0 -295
- package/dist/__tests__/fixtures/mock-redis.js.map +0 -1
- package/dist/redis/base-store.d.ts +0 -60
- package/dist/redis/base-store.d.ts.map +0 -1
- package/dist/redis/base-store.js +0 -156
- package/dist/redis/base-store.js.map +0 -1
- package/dist/redis/json-helpers.d.ts +0 -8
- package/dist/redis/json-helpers.d.ts.map +0 -1
- package/dist/redis/json-helpers.js +0 -52
- package/dist/redis/json-helpers.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lobu/core",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "6.0.1",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"description": "Core types and utilities for Lobu agent platform",
|
|
6
6
|
"repository": {
|
|
@@ -38,7 +38,6 @@
|
|
|
38
38
|
"@opentelemetry/resources": "^1.30.0",
|
|
39
39
|
"@opentelemetry/semantic-conventions": "^1.28.0",
|
|
40
40
|
"@sentry/node": "^10.23.0",
|
|
41
|
-
"ioredis": "^5.4.1",
|
|
42
41
|
"winston": "^3.17.0",
|
|
43
42
|
"zod": "^4.1.12"
|
|
44
43
|
},
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unified in-memory Redis mock for testing.
|
|
3
|
-
*
|
|
4
|
-
* Replaces three duplicated implementations:
|
|
5
|
-
* - MockRedisClient in gateway setup.ts
|
|
6
|
-
* - FakeRedis in system-message-limiter.test.ts
|
|
7
|
-
* - queue mock getRedisClient
|
|
8
|
-
*
|
|
9
|
-
* Supports string, set, list, and hash operations with TTL tracking.
|
|
10
|
-
*/
|
|
11
|
-
type SetMode = "NX" | undefined;
|
|
12
|
-
export declare class MockRedisClient {
|
|
13
|
-
private store;
|
|
14
|
-
private sets;
|
|
15
|
-
private lists;
|
|
16
|
-
private currentTime;
|
|
17
|
-
on(_event: string, _callback: (...args: any[]) => void): this;
|
|
18
|
-
once(event: string, callback: (...args: any[]) => void): this;
|
|
19
|
-
get status(): string;
|
|
20
|
-
exists(key: string): Promise<number>;
|
|
21
|
-
get(key: string): Promise<string | null>;
|
|
22
|
-
/**
|
|
23
|
-
* ioredis-compatible set with optional EX / NX flags.
|
|
24
|
-
* Supports: set(key, value), set(key, value, "EX", sec), set(key, value, "EX", sec, "NX")
|
|
25
|
-
*/
|
|
26
|
-
set(key: string, value: string, exTokenOrTtl?: "EX" | number, exSeconds?: number, mode?: SetMode): Promise<"OK" | null>;
|
|
27
|
-
setex(key: string, ttlSeconds: number, value: string): Promise<void>;
|
|
28
|
-
incr(key: string): Promise<number>;
|
|
29
|
-
del(...keys: string[]): Promise<number>;
|
|
30
|
-
getdel(key: string): Promise<string | null>;
|
|
31
|
-
expire(key: string, seconds: number): Promise<number>;
|
|
32
|
-
ttl(key: string): Promise<number>;
|
|
33
|
-
sadd(key: string, ...members: string[]): Promise<number>;
|
|
34
|
-
srem(key: string, ...members: string[]): Promise<number>;
|
|
35
|
-
smembers(key: string): Promise<string[]>;
|
|
36
|
-
sismember(key: string, member: string): Promise<number>;
|
|
37
|
-
rpush(key: string, ...values: string[]): Promise<number>;
|
|
38
|
-
lrange(key: string, start: number, stop: number): Promise<string[]>;
|
|
39
|
-
scan(_cursor: string, ...args: (string | number)[]): Promise<[string, string[]]>;
|
|
40
|
-
mget(...keys: string[]): Promise<(string | null)[]>;
|
|
41
|
-
watch(..._keys: string[]): Promise<"OK">;
|
|
42
|
-
unwatch(): Promise<"OK">;
|
|
43
|
-
multi(): {
|
|
44
|
-
set(key: string, value: string): any;
|
|
45
|
-
exec(): Promise<[null, string][]>;
|
|
46
|
-
};
|
|
47
|
-
pipeline(): {
|
|
48
|
-
set(key: string, value: string): any;
|
|
49
|
-
setex(key: string, ttl: number, value: string): any;
|
|
50
|
-
sadd(key: string, ...members: string[]): any;
|
|
51
|
-
srem(key: string, ...members: string[]): any;
|
|
52
|
-
del(...keys: string[]): any;
|
|
53
|
-
exec(): Promise<Array<[null, any]>>;
|
|
54
|
-
};
|
|
55
|
-
advanceTime(ms: number): void;
|
|
56
|
-
has(key: string): boolean;
|
|
57
|
-
clear(): void;
|
|
58
|
-
}
|
|
59
|
-
export {};
|
|
60
|
-
//# sourceMappingURL=mock-redis.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mock-redis.d.ts","sourceRoot":"","sources":["../../../src/__tests__/fixtures/mock-redis.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,295 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Unified in-memory Redis mock for testing.
|
|
4
|
-
*
|
|
5
|
-
* Replaces three duplicated implementations:
|
|
6
|
-
* - MockRedisClient in gateway setup.ts
|
|
7
|
-
* - FakeRedis in system-message-limiter.test.ts
|
|
8
|
-
* - queue mock getRedisClient
|
|
9
|
-
*
|
|
10
|
-
* Supports string, set, list, and hash operations with TTL tracking.
|
|
11
|
-
*/
|
|
12
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
-
exports.MockRedisClient = void 0;
|
|
14
|
-
class MockRedisClient {
|
|
15
|
-
constructor() {
|
|
16
|
-
this.store = new Map();
|
|
17
|
-
this.sets = new Map();
|
|
18
|
-
this.lists = new Map();
|
|
19
|
-
this.currentTime = Date.now();
|
|
20
|
-
}
|
|
21
|
-
// --- ioredis event surface (used by state-ioredis adapter) ---
|
|
22
|
-
on(_event, _callback) {
|
|
23
|
-
// No-op for mock events
|
|
24
|
-
return this;
|
|
25
|
-
}
|
|
26
|
-
once(event, callback) {
|
|
27
|
-
// Fire "ready" synchronously so the adapter's initial-connection wait
|
|
28
|
-
// resolves immediately instead of timing out against a real socket.
|
|
29
|
-
if (event === "ready") {
|
|
30
|
-
setTimeout(callback, 0);
|
|
31
|
-
}
|
|
32
|
-
return this;
|
|
33
|
-
}
|
|
34
|
-
get status() {
|
|
35
|
-
return "ready";
|
|
36
|
-
}
|
|
37
|
-
// --- String operations ---
|
|
38
|
-
async exists(key) {
|
|
39
|
-
const entry = this.store.get(key);
|
|
40
|
-
if (!entry)
|
|
41
|
-
return 0;
|
|
42
|
-
if (entry.ttl && entry.ttl < this.currentTime) {
|
|
43
|
-
this.store.delete(key);
|
|
44
|
-
return 0;
|
|
45
|
-
}
|
|
46
|
-
return 1;
|
|
47
|
-
}
|
|
48
|
-
async get(key) {
|
|
49
|
-
const entry = this.store.get(key);
|
|
50
|
-
if (!entry)
|
|
51
|
-
return null;
|
|
52
|
-
if (entry.ttl && entry.ttl < this.currentTime) {
|
|
53
|
-
this.store.delete(key);
|
|
54
|
-
return null;
|
|
55
|
-
}
|
|
56
|
-
return entry.value;
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* ioredis-compatible set with optional EX / NX flags.
|
|
60
|
-
* Supports: set(key, value), set(key, value, "EX", sec), set(key, value, "EX", sec, "NX")
|
|
61
|
-
*/
|
|
62
|
-
async set(key, value, exTokenOrTtl, exSeconds, mode) {
|
|
63
|
-
// NX check must be synchronous to avoid TOCTOU race
|
|
64
|
-
if (mode === "NX") {
|
|
65
|
-
const entry = this.store.get(key);
|
|
66
|
-
const alive = entry && (!entry.ttl || entry.ttl >= this.currentTime);
|
|
67
|
-
if (alive)
|
|
68
|
-
return null;
|
|
69
|
-
}
|
|
70
|
-
let ttl;
|
|
71
|
-
if (exTokenOrTtl === "EX" && typeof exSeconds === "number") {
|
|
72
|
-
ttl = this.currentTime + exSeconds * 1000;
|
|
73
|
-
}
|
|
74
|
-
else if (typeof exTokenOrTtl === "number") {
|
|
75
|
-
ttl = this.currentTime + exTokenOrTtl * 1000;
|
|
76
|
-
}
|
|
77
|
-
this.store.set(key, { value, ttl });
|
|
78
|
-
return "OK";
|
|
79
|
-
}
|
|
80
|
-
async setex(key, ttlSeconds, value) {
|
|
81
|
-
const ttl = this.currentTime + ttlSeconds * 1000;
|
|
82
|
-
this.store.set(key, { value, ttl });
|
|
83
|
-
}
|
|
84
|
-
async incr(key) {
|
|
85
|
-
const current = await this.get(key);
|
|
86
|
-
const nextValue = (current ? Number.parseInt(current, 10) : 0) + 1;
|
|
87
|
-
const entry = this.store.get(key);
|
|
88
|
-
this.store.set(key, {
|
|
89
|
-
value: String(nextValue),
|
|
90
|
-
ttl: entry?.ttl,
|
|
91
|
-
});
|
|
92
|
-
return nextValue;
|
|
93
|
-
}
|
|
94
|
-
async del(...keys) {
|
|
95
|
-
let deleted = 0;
|
|
96
|
-
for (const key of keys) {
|
|
97
|
-
const existed = this.store.has(key) || this.sets.has(key) || this.lists.has(key);
|
|
98
|
-
this.store.delete(key);
|
|
99
|
-
this.sets.delete(key);
|
|
100
|
-
this.lists.delete(key);
|
|
101
|
-
if (existed)
|
|
102
|
-
deleted++;
|
|
103
|
-
}
|
|
104
|
-
return deleted;
|
|
105
|
-
}
|
|
106
|
-
async getdel(key) {
|
|
107
|
-
const value = await this.get(key);
|
|
108
|
-
if (value !== null) {
|
|
109
|
-
await this.del(key);
|
|
110
|
-
}
|
|
111
|
-
return value;
|
|
112
|
-
}
|
|
113
|
-
async expire(key, seconds) {
|
|
114
|
-
if (this.store.has(key)) {
|
|
115
|
-
const entry = this.store.get(key);
|
|
116
|
-
entry.ttl = this.currentTime + seconds * 1000;
|
|
117
|
-
return 1;
|
|
118
|
-
}
|
|
119
|
-
return 0;
|
|
120
|
-
}
|
|
121
|
-
async ttl(key) {
|
|
122
|
-
const entry = this.store.get(key);
|
|
123
|
-
if (!entry)
|
|
124
|
-
return -2;
|
|
125
|
-
if (!entry.ttl)
|
|
126
|
-
return -1;
|
|
127
|
-
if (entry.ttl < this.currentTime) {
|
|
128
|
-
this.store.delete(key);
|
|
129
|
-
return -2;
|
|
130
|
-
}
|
|
131
|
-
return Math.max(0, Math.ceil((entry.ttl - this.currentTime) / 1000));
|
|
132
|
-
}
|
|
133
|
-
// --- Set operations ---
|
|
134
|
-
async sadd(key, ...members) {
|
|
135
|
-
if (!this.sets.has(key))
|
|
136
|
-
this.sets.set(key, new Set());
|
|
137
|
-
const set = this.sets.get(key);
|
|
138
|
-
let added = 0;
|
|
139
|
-
for (const m of members) {
|
|
140
|
-
if (!set.has(m)) {
|
|
141
|
-
set.add(m);
|
|
142
|
-
added++;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
return added;
|
|
146
|
-
}
|
|
147
|
-
async srem(key, ...members) {
|
|
148
|
-
const set = this.sets.get(key);
|
|
149
|
-
if (!set)
|
|
150
|
-
return 0;
|
|
151
|
-
let removed = 0;
|
|
152
|
-
for (const m of members) {
|
|
153
|
-
if (set.delete(m))
|
|
154
|
-
removed++;
|
|
155
|
-
}
|
|
156
|
-
return removed;
|
|
157
|
-
}
|
|
158
|
-
async smembers(key) {
|
|
159
|
-
const set = this.sets.get(key);
|
|
160
|
-
return set ? Array.from(set) : [];
|
|
161
|
-
}
|
|
162
|
-
async sismember(key, member) {
|
|
163
|
-
const set = this.sets.get(key);
|
|
164
|
-
return set?.has(member) ? 1 : 0;
|
|
165
|
-
}
|
|
166
|
-
// --- List operations ---
|
|
167
|
-
async rpush(key, ...values) {
|
|
168
|
-
if (!this.lists.has(key))
|
|
169
|
-
this.lists.set(key, []);
|
|
170
|
-
const list = this.lists.get(key);
|
|
171
|
-
list.push(...values);
|
|
172
|
-
return list.length;
|
|
173
|
-
}
|
|
174
|
-
async lrange(key, start, stop) {
|
|
175
|
-
const list = this.lists.get(key);
|
|
176
|
-
if (!list)
|
|
177
|
-
return [];
|
|
178
|
-
const end = stop === -1 ? list.length : stop + 1;
|
|
179
|
-
return list.slice(start, end);
|
|
180
|
-
}
|
|
181
|
-
// --- Scan ---
|
|
182
|
-
async scan(_cursor, ...args) {
|
|
183
|
-
// Extract pattern from args: "MATCH", pattern, "COUNT", count
|
|
184
|
-
let pattern = "*";
|
|
185
|
-
for (let i = 0; i < args.length - 1; i++) {
|
|
186
|
-
if (String(args[i]).toUpperCase() === "MATCH") {
|
|
187
|
-
pattern = String(args[i + 1]);
|
|
188
|
-
break;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
const allKeys = new Set();
|
|
192
|
-
for (const key of this.store.keys())
|
|
193
|
-
allKeys.add(key);
|
|
194
|
-
for (const key of this.sets.keys())
|
|
195
|
-
allKeys.add(key);
|
|
196
|
-
for (const key of this.lists.keys())
|
|
197
|
-
allKeys.add(key);
|
|
198
|
-
const matching = [];
|
|
199
|
-
for (const key of allKeys) {
|
|
200
|
-
if (pattern === "*") {
|
|
201
|
-
matching.push(key);
|
|
202
|
-
}
|
|
203
|
-
else if (pattern.endsWith("*")) {
|
|
204
|
-
const prefix = pattern.slice(0, -1);
|
|
205
|
-
if (key.startsWith(prefix))
|
|
206
|
-
matching.push(key);
|
|
207
|
-
}
|
|
208
|
-
else if (key === pattern) {
|
|
209
|
-
matching.push(key);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
return ["0", matching];
|
|
213
|
-
}
|
|
214
|
-
// --- Batch get ---
|
|
215
|
-
async mget(...keys) {
|
|
216
|
-
return Promise.all(keys.map((key) => this.get(key)));
|
|
217
|
-
}
|
|
218
|
-
// --- Watch / Unwatch (no-ops) ---
|
|
219
|
-
async watch(..._keys) {
|
|
220
|
-
return "OK";
|
|
221
|
-
}
|
|
222
|
-
async unwatch() {
|
|
223
|
-
return "OK";
|
|
224
|
-
}
|
|
225
|
-
// --- Multi ---
|
|
226
|
-
multi() {
|
|
227
|
-
const pending = [];
|
|
228
|
-
const self = this;
|
|
229
|
-
const chain = {
|
|
230
|
-
set(key, value) {
|
|
231
|
-
pending.push({ key, value });
|
|
232
|
-
return chain;
|
|
233
|
-
},
|
|
234
|
-
async exec() {
|
|
235
|
-
const results = [];
|
|
236
|
-
for (const op of pending) {
|
|
237
|
-
self.store.set(op.key, { value: op.value });
|
|
238
|
-
results.push([null, "OK"]);
|
|
239
|
-
}
|
|
240
|
-
return results;
|
|
241
|
-
},
|
|
242
|
-
};
|
|
243
|
-
return chain;
|
|
244
|
-
}
|
|
245
|
-
// --- Pipeline ---
|
|
246
|
-
pipeline() {
|
|
247
|
-
const ops = [];
|
|
248
|
-
const self = this;
|
|
249
|
-
const chain = {
|
|
250
|
-
set(key, value) {
|
|
251
|
-
ops.push(() => self.set(key, value));
|
|
252
|
-
return chain;
|
|
253
|
-
},
|
|
254
|
-
setex(key, ttl, value) {
|
|
255
|
-
ops.push(() => self.setex(key, ttl, value));
|
|
256
|
-
return chain;
|
|
257
|
-
},
|
|
258
|
-
sadd(key, ...members) {
|
|
259
|
-
ops.push(() => self.sadd(key, ...members));
|
|
260
|
-
return chain;
|
|
261
|
-
},
|
|
262
|
-
srem(key, ...members) {
|
|
263
|
-
ops.push(() => self.srem(key, ...members));
|
|
264
|
-
return chain;
|
|
265
|
-
},
|
|
266
|
-
del(...keys) {
|
|
267
|
-
ops.push(() => self.del(...keys));
|
|
268
|
-
return chain;
|
|
269
|
-
},
|
|
270
|
-
async exec() {
|
|
271
|
-
const results = [];
|
|
272
|
-
for (const op of ops) {
|
|
273
|
-
const result = await op();
|
|
274
|
-
results.push([null, result ?? "OK"]);
|
|
275
|
-
}
|
|
276
|
-
return results;
|
|
277
|
-
},
|
|
278
|
-
};
|
|
279
|
-
return chain;
|
|
280
|
-
}
|
|
281
|
-
// --- Test helpers ---
|
|
282
|
-
advanceTime(ms) {
|
|
283
|
-
this.currentTime += ms;
|
|
284
|
-
}
|
|
285
|
-
has(key) {
|
|
286
|
-
return this.store.has(key);
|
|
287
|
-
}
|
|
288
|
-
clear() {
|
|
289
|
-
this.store.clear();
|
|
290
|
-
this.sets.clear();
|
|
291
|
-
this.lists.clear();
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
exports.MockRedisClient = MockRedisClient;
|
|
295
|
-
//# sourceMappingURL=mock-redis.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mock-redis.js","sourceRoot":"","sources":["../../../src/__tests__/fixtures/mock-redis.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import type Redis from "ioredis";
|
|
2
|
-
import { type Logger } from "../logger";
|
|
3
|
-
export interface RedisStoreConfig {
|
|
4
|
-
redis: Redis;
|
|
5
|
-
keyPrefix: string;
|
|
6
|
-
loggerName: string;
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* Base class for all Redis-backed stores
|
|
10
|
-
* Provides common CRUD operations with JSON serialization
|
|
11
|
-
*/
|
|
12
|
-
export declare abstract class BaseRedisStore<T> {
|
|
13
|
-
protected logger: Logger;
|
|
14
|
-
protected redis: Redis;
|
|
15
|
-
protected keyPrefix: string;
|
|
16
|
-
constructor(config: RedisStoreConfig);
|
|
17
|
-
/**
|
|
18
|
-
* Build Redis key from parts
|
|
19
|
-
*/
|
|
20
|
-
protected buildKey(...parts: string[]): string;
|
|
21
|
-
/**
|
|
22
|
-
* Get value from Redis
|
|
23
|
-
* Returns null if not found or validation fails
|
|
24
|
-
*/
|
|
25
|
-
protected get(key: string): Promise<T | null>;
|
|
26
|
-
/**
|
|
27
|
-
* Set value in Redis
|
|
28
|
-
*/
|
|
29
|
-
protected set(key: string, value: T, ttlSeconds?: number): Promise<void>;
|
|
30
|
-
/**
|
|
31
|
-
* Delete value from Redis
|
|
32
|
-
*/
|
|
33
|
-
protected delete(key: string): Promise<void>;
|
|
34
|
-
/**
|
|
35
|
-
* Scan for all keys matching a prefix (cursor-based, production-safe).
|
|
36
|
-
* Returns full key strings matching `{prefix}*`.
|
|
37
|
-
*/
|
|
38
|
-
protected scanByPrefix(prefix: string): Promise<string[]>;
|
|
39
|
-
/**
|
|
40
|
-
* Check if key exists in Redis
|
|
41
|
-
*/
|
|
42
|
-
protected exists(key: string): Promise<boolean>;
|
|
43
|
-
/**
|
|
44
|
-
* Serialize value to string
|
|
45
|
-
* Override for custom serialization
|
|
46
|
-
*/
|
|
47
|
-
protected serialize(value: T): string;
|
|
48
|
-
/**
|
|
49
|
-
* Deserialize string to value
|
|
50
|
-
* Override for custom deserialization
|
|
51
|
-
*/
|
|
52
|
-
protected deserialize(data: string): T;
|
|
53
|
-
/**
|
|
54
|
-
* Validate value after deserialization
|
|
55
|
-
* Override to add custom validation logic
|
|
56
|
-
* Return false to reject invalid data
|
|
57
|
-
*/
|
|
58
|
-
protected validate(_value: T): boolean;
|
|
59
|
-
}
|
|
60
|
-
//# sourceMappingURL=base-store.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"base-store.d.ts","sourceRoot":"","sources":["../../src/redis/base-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AAOtD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,8BAAsB,cAAc,CAAC,CAAC;IACpC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC;IACvB,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC;gBAEhB,MAAM,EAAE,gBAAgB;IAMpC;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM;IAI9C;;;OAGG;cACa,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAyBnD;;OAEG;cACa,GAAG,CACjB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,CAAC,EACR,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;IAiBhB;;OAEG;cACa,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWlD;;;OAGG;cACa,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAwB/D;;OAEG;cACa,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAarD;;;OAGG;IACH,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM;IAQrC;;;OAGG;IACH,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC;IAQtC;;;;OAIG;IACH,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,OAAO;CAGvC"}
|
package/dist/redis/base-store.js
DELETED
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.BaseRedisStore = void 0;
|
|
4
|
-
const logger_1 = require("../logger");
|
|
5
|
-
const json_1 = require("../utils/json");
|
|
6
|
-
function errMsg(error) {
|
|
7
|
-
return error instanceof Error ? error.message : String(error);
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Base class for all Redis-backed stores
|
|
11
|
-
* Provides common CRUD operations with JSON serialization
|
|
12
|
-
*/
|
|
13
|
-
class BaseRedisStore {
|
|
14
|
-
constructor(config) {
|
|
15
|
-
this.redis = config.redis;
|
|
16
|
-
this.keyPrefix = config.keyPrefix;
|
|
17
|
-
this.logger = (0, logger_1.createLogger)(config.loggerName);
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Build Redis key from parts
|
|
21
|
-
*/
|
|
22
|
-
buildKey(...parts) {
|
|
23
|
-
return [this.keyPrefix, ...parts].join(":");
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Get value from Redis
|
|
27
|
-
* Returns null if not found or validation fails
|
|
28
|
-
*/
|
|
29
|
-
async get(key) {
|
|
30
|
-
try {
|
|
31
|
-
const data = await this.redis.get(key);
|
|
32
|
-
if (!data) {
|
|
33
|
-
return null;
|
|
34
|
-
}
|
|
35
|
-
const value = this.deserialize(data);
|
|
36
|
-
// Validate after deserialization
|
|
37
|
-
if (!this.validate(value)) {
|
|
38
|
-
this.logger.warn("Invalid data after deserialization", { key });
|
|
39
|
-
return null;
|
|
40
|
-
}
|
|
41
|
-
return value;
|
|
42
|
-
}
|
|
43
|
-
catch (error) {
|
|
44
|
-
this.logger.error("Failed to get from Redis", {
|
|
45
|
-
error: errMsg(error),
|
|
46
|
-
key,
|
|
47
|
-
});
|
|
48
|
-
return null;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Set value in Redis
|
|
53
|
-
*/
|
|
54
|
-
async set(key, value, ttlSeconds) {
|
|
55
|
-
try {
|
|
56
|
-
const data = this.serialize(value);
|
|
57
|
-
if (ttlSeconds) {
|
|
58
|
-
await this.redis.setex(key, ttlSeconds, data);
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
await this.redis.set(key, data);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
catch (error) {
|
|
65
|
-
this.logger.error("Failed to set in Redis", {
|
|
66
|
-
error: errMsg(error),
|
|
67
|
-
key,
|
|
68
|
-
});
|
|
69
|
-
throw error;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Delete value from Redis
|
|
74
|
-
*/
|
|
75
|
-
async delete(key) {
|
|
76
|
-
try {
|
|
77
|
-
await this.redis.del(key);
|
|
78
|
-
}
|
|
79
|
-
catch (error) {
|
|
80
|
-
this.logger.error("Failed to delete from Redis", {
|
|
81
|
-
error: errMsg(error),
|
|
82
|
-
key,
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Scan for all keys matching a prefix (cursor-based, production-safe).
|
|
88
|
-
* Returns full key strings matching `{prefix}*`.
|
|
89
|
-
*/
|
|
90
|
-
async scanByPrefix(prefix) {
|
|
91
|
-
const results = [];
|
|
92
|
-
let cursor = "0";
|
|
93
|
-
try {
|
|
94
|
-
do {
|
|
95
|
-
const [nextCursor, keys] = await this.redis.scan(cursor, "MATCH", `${prefix}*`, "COUNT", 100);
|
|
96
|
-
cursor = nextCursor;
|
|
97
|
-
results.push(...keys);
|
|
98
|
-
} while (cursor !== "0");
|
|
99
|
-
}
|
|
100
|
-
catch (error) {
|
|
101
|
-
this.logger.error("Failed to scan by prefix", {
|
|
102
|
-
error: errMsg(error),
|
|
103
|
-
prefix,
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
return results;
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Check if key exists in Redis
|
|
110
|
-
*/
|
|
111
|
-
async exists(key) {
|
|
112
|
-
try {
|
|
113
|
-
const result = await this.redis.exists(key);
|
|
114
|
-
return result === 1;
|
|
115
|
-
}
|
|
116
|
-
catch (error) {
|
|
117
|
-
this.logger.error("Failed to check existence in Redis", {
|
|
118
|
-
error: errMsg(error),
|
|
119
|
-
key,
|
|
120
|
-
});
|
|
121
|
-
return false;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Serialize value to string
|
|
126
|
-
* Override for custom serialization
|
|
127
|
-
*/
|
|
128
|
-
serialize(value) {
|
|
129
|
-
const result = (0, json_1.safeJsonStringify)(value);
|
|
130
|
-
if (result === null) {
|
|
131
|
-
throw new Error("Failed to serialize value to JSON");
|
|
132
|
-
}
|
|
133
|
-
return result;
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Deserialize string to value
|
|
137
|
-
* Override for custom deserialization
|
|
138
|
-
*/
|
|
139
|
-
deserialize(data) {
|
|
140
|
-
const result = (0, json_1.safeJsonParse)(data);
|
|
141
|
-
if (result === null) {
|
|
142
|
-
throw new Error("Failed to deserialize JSON data");
|
|
143
|
-
}
|
|
144
|
-
return result;
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Validate value after deserialization
|
|
148
|
-
* Override to add custom validation logic
|
|
149
|
-
* Return false to reject invalid data
|
|
150
|
-
*/
|
|
151
|
-
validate(_value) {
|
|
152
|
-
return true;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
exports.BaseRedisStore = BaseRedisStore;
|
|
156
|
-
//# sourceMappingURL=base-store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"base-store.js","sourceRoot":"","sources":["../../src/redis/base-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type Redis from "ioredis";
|
|
2
|
-
export type RedisJsonClient = Pick<Redis, "get" | "getdel" | "set" | "setex" | "mget" | "scan">;
|
|
3
|
-
export declare function getJsonValue<T>(redis: Pick<Redis, "get">, key: string): Promise<T | null>;
|
|
4
|
-
export declare function getdelJsonValue<T>(redis: Pick<Redis, "getdel">, key: string): Promise<T | null>;
|
|
5
|
-
export declare function setJsonValue<T>(redis: Pick<Redis, "set" | "setex">, key: string, value: T, ttlSeconds?: number): Promise<void>;
|
|
6
|
-
export declare function mgetJsonValues<T>(redis: Pick<Redis, "mget">, keys: string[]): Promise<Array<T | null>>;
|
|
7
|
-
export declare function scanKeysByPattern(redis: Pick<Redis, "scan">, pattern: string, count?: number): Promise<string[]>;
|
|
8
|
-
//# sourceMappingURL=json-helpers.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"json-helpers.d.ts","sourceRoot":"","sources":["../../src/redis/json-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AAGjC,MAAM,MAAM,eAAe,GAAG,IAAI,CAChC,KAAK,EACL,KAAK,GAAG,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CACrD,CAAC;AAUF,wBAAsB,YAAY,CAAC,CAAC,EAClC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,EACzB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAInB;AAED,wBAAsB,eAAe,CAAC,CAAC,EACrC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,EAC5B,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAInB;AAED,wBAAsB,YAAY,CAAC,CAAC,EAClC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,EACnC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,CAAC,EACR,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,wBAAsB,cAAc,CAAC,CAAC,EACpC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,EAC1B,IAAI,EAAE,MAAM,EAAE,GACb,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAI1B;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,EAC1B,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,MAAY,GAClB,OAAO,CAAC,MAAM,EAAE,CAAC,CAiBnB"}
|