@mono-labs/dev 0.1.251 → 0.1.256
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/cache-relay.d.ts +162 -0
- package/dist/cache-relay.d.ts.map +1 -0
- package/dist/cache-relay.js +302 -0
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -3
- package/dist/local-server/index.d.ts.map +1 -1
- package/dist/local-server/index.js +7 -1
- package/dist/local-server/types.d.ts +2 -0
- package/dist/local-server/types.d.ts.map +1 -1
- package/dist/websocket/channel-store.d.ts +28 -0
- package/dist/websocket/channel-store.d.ts.map +1 -0
- package/dist/websocket/channel-store.js +91 -0
- package/dist/websocket/index.d.ts +9 -2
- package/dist/websocket/index.d.ts.map +1 -1
- package/dist/websocket/index.js +31 -5
- package/dist/websocket/socket-emitter.d.ts +25 -0
- package/dist/websocket/socket-emitter.d.ts.map +1 -0
- package/dist/websocket/socket-emitter.js +49 -0
- package/dist/websocket/socket-gateway-client.d.ts +20 -0
- package/dist/websocket/socket-gateway-client.d.ts.map +1 -0
- package/dist/websocket/socket-gateway-client.js +76 -0
- package/dist/websocket/types.d.ts +9 -0
- package/dist/websocket/types.d.ts.map +1 -1
- package/package.json +13 -1
- package/src/cache-relay.ts +490 -0
- package/src/index.ts +25 -1
- package/src/local-server/index.ts +7 -1
- package/src/local-server/types.ts +2 -0
- package/src/websocket/channel-store.ts +116 -0
- package/src/websocket/index.ts +30 -4
- package/src/websocket/socket-emitter.ts +64 -0
- package/src/websocket/socket-gateway-client.ts +83 -0
- package/src/websocket/types.ts +10 -0
- package/src/websocket/local-gateway-client.ts +0 -31
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
type RedisClient = any;
|
|
2
|
+
export interface StringOps {
|
|
3
|
+
get(key: string): Promise<string | null>;
|
|
4
|
+
set(key: string, value: string, ttlSeconds?: number): Promise<void>;
|
|
5
|
+
mget(...keys: string[]): Promise<(string | null)[]>;
|
|
6
|
+
mset(pairs: Record<string, string>): Promise<void>;
|
|
7
|
+
incr(key: string): Promise<number>;
|
|
8
|
+
incrby(key: string, increment: number): Promise<number>;
|
|
9
|
+
decr(key: string): Promise<number>;
|
|
10
|
+
decrby(key: string, decrement: number): Promise<number>;
|
|
11
|
+
append(key: string, value: string): Promise<number>;
|
|
12
|
+
strlen(key: string): Promise<number>;
|
|
13
|
+
}
|
|
14
|
+
export interface HashOps {
|
|
15
|
+
get(key: string, field: string): Promise<string | null>;
|
|
16
|
+
set(key: string, field: string, value: string): Promise<void>;
|
|
17
|
+
getAll(key: string): Promise<Record<string, string>>;
|
|
18
|
+
del(key: string, ...fields: string[]): Promise<number>;
|
|
19
|
+
exists(key: string, field: string): Promise<boolean>;
|
|
20
|
+
keys(key: string): Promise<string[]>;
|
|
21
|
+
vals(key: string): Promise<string[]>;
|
|
22
|
+
len(key: string): Promise<number>;
|
|
23
|
+
mset(key: string, pairs: Record<string, string>): Promise<void>;
|
|
24
|
+
mget(key: string, ...fields: string[]): Promise<(string | null)[]>;
|
|
25
|
+
incrby(key: string, field: string, increment: number): Promise<number>;
|
|
26
|
+
}
|
|
27
|
+
export interface ListOps {
|
|
28
|
+
push(key: string, ...values: string[]): Promise<number>;
|
|
29
|
+
lpush(key: string, ...values: string[]): Promise<number>;
|
|
30
|
+
pop(key: string): Promise<string | null>;
|
|
31
|
+
lpop(key: string): Promise<string | null>;
|
|
32
|
+
range(key: string, start: number, stop: number): Promise<string[]>;
|
|
33
|
+
len(key: string): Promise<number>;
|
|
34
|
+
trim(key: string, start: number, stop: number): Promise<void>;
|
|
35
|
+
index(key: string, index: number): Promise<string | null>;
|
|
36
|
+
set(key: string, index: number, value: string): Promise<void>;
|
|
37
|
+
rem(key: string, count: number, value: string): Promise<number>;
|
|
38
|
+
}
|
|
39
|
+
export interface SetOps {
|
|
40
|
+
add(key: string, ...members: string[]): Promise<number>;
|
|
41
|
+
rem(key: string, ...members: string[]): Promise<number>;
|
|
42
|
+
members(key: string): Promise<string[]>;
|
|
43
|
+
isMember(key: string, member: string): Promise<boolean>;
|
|
44
|
+
card(key: string): Promise<number>;
|
|
45
|
+
union(...keys: string[]): Promise<string[]>;
|
|
46
|
+
inter(...keys: string[]): Promise<string[]>;
|
|
47
|
+
diff(...keys: string[]): Promise<string[]>;
|
|
48
|
+
}
|
|
49
|
+
export interface SortedSetOps {
|
|
50
|
+
add(key: string, score: number, member: string): Promise<number>;
|
|
51
|
+
rem(key: string, ...members: string[]): Promise<number>;
|
|
52
|
+
range(key: string, start: number, stop: number): Promise<string[]>;
|
|
53
|
+
rangeWithScores(key: string, start: number, stop: number): Promise<{
|
|
54
|
+
member: string;
|
|
55
|
+
score: number;
|
|
56
|
+
}[]>;
|
|
57
|
+
rangeByScore(key: string, min: number | string, max: number | string): Promise<string[]>;
|
|
58
|
+
revRange(key: string, start: number, stop: number): Promise<string[]>;
|
|
59
|
+
score(key: string, member: string): Promise<number | null>;
|
|
60
|
+
rank(key: string, member: string): Promise<number | null>;
|
|
61
|
+
card(key: string): Promise<number>;
|
|
62
|
+
incrby(key: string, increment: number, member: string): Promise<number>;
|
|
63
|
+
remRangeByRank(key: string, start: number, stop: number): Promise<number>;
|
|
64
|
+
remRangeByScore(key: string, min: number | string, max: number | string): Promise<number>;
|
|
65
|
+
}
|
|
66
|
+
export interface KeyOps {
|
|
67
|
+
exists(...keys: string[]): Promise<number>;
|
|
68
|
+
expire(key: string, seconds: number): Promise<boolean>;
|
|
69
|
+
ttl(key: string): Promise<number>;
|
|
70
|
+
pttl(key: string): Promise<number>;
|
|
71
|
+
persist(key: string): Promise<boolean>;
|
|
72
|
+
rename(key: string, newKey: string): Promise<void>;
|
|
73
|
+
type(key: string): Promise<string>;
|
|
74
|
+
scan(cursor: number, options?: {
|
|
75
|
+
match?: string;
|
|
76
|
+
count?: number;
|
|
77
|
+
}): Promise<{
|
|
78
|
+
cursor: number;
|
|
79
|
+
keys: string[];
|
|
80
|
+
}>;
|
|
81
|
+
}
|
|
82
|
+
export interface PubSubOps {
|
|
83
|
+
publish(channel: string, message: string): Promise<number>;
|
|
84
|
+
subscribe(channel: string, callback: (message: string, channel: string) => void): Promise<void>;
|
|
85
|
+
unsubscribe(channel: string): Promise<void>;
|
|
86
|
+
}
|
|
87
|
+
export interface TransactionOps {
|
|
88
|
+
multi(): RedisClient;
|
|
89
|
+
exec(pipeline: RedisClient): Promise<unknown[]>;
|
|
90
|
+
}
|
|
91
|
+
export interface ScriptOps {
|
|
92
|
+
eval(script: string, keys: string[], args: string[]): Promise<unknown>;
|
|
93
|
+
evalsha(sha: string, keys: string[], args: string[]): Promise<unknown>;
|
|
94
|
+
}
|
|
95
|
+
export interface GeoOps {
|
|
96
|
+
add(key: string, longitude: number, latitude: number, member: string): Promise<number>;
|
|
97
|
+
pos(key: string, ...members: string[]): Promise<([number, number] | null)[]>;
|
|
98
|
+
dist(key: string, member1: string, member2: string, unit?: string): Promise<string | null>;
|
|
99
|
+
radius(key: string, longitude: number, latitude: number, radius: number, unit: string): Promise<string[]>;
|
|
100
|
+
}
|
|
101
|
+
export interface HyperLogLogOps {
|
|
102
|
+
add(key: string, ...elements: string[]): Promise<number>;
|
|
103
|
+
count(...keys: string[]): Promise<number>;
|
|
104
|
+
merge(destKey: string, ...sourceKeys: string[]): Promise<void>;
|
|
105
|
+
}
|
|
106
|
+
export interface BitmapOps {
|
|
107
|
+
setbit(key: string, offset: number, value: 0 | 1): Promise<number>;
|
|
108
|
+
getbit(key: string, offset: number): Promise<number>;
|
|
109
|
+
count(key: string, start?: number, end?: number): Promise<number>;
|
|
110
|
+
op(operation: 'AND' | 'OR' | 'XOR' | 'NOT', destKey: string, ...keys: string[]): Promise<number>;
|
|
111
|
+
}
|
|
112
|
+
export interface StreamOps {
|
|
113
|
+
add(key: string, id: string, fields: Record<string, string>): Promise<string>;
|
|
114
|
+
read(key: string, id: string, count?: number): Promise<unknown[]>;
|
|
115
|
+
len(key: string): Promise<number>;
|
|
116
|
+
range(key: string, start: string, end: string, count?: number): Promise<unknown[]>;
|
|
117
|
+
trim(key: string, maxLen: number): Promise<number>;
|
|
118
|
+
}
|
|
119
|
+
export interface CacheRelay {
|
|
120
|
+
/** Get a raw string value */
|
|
121
|
+
get(key: string): Promise<string | null>;
|
|
122
|
+
/** Get and JSON-parse a value */
|
|
123
|
+
gett<T = unknown>(key: string): Promise<T | null>;
|
|
124
|
+
/** Set a value (objects are JSON-stringified) */
|
|
125
|
+
set(key: string, value: unknown, options?: {
|
|
126
|
+
ttlSeconds?: number;
|
|
127
|
+
}): Promise<void>;
|
|
128
|
+
/** Delete one or more keys */
|
|
129
|
+
del(...keys: string[]): Promise<number>;
|
|
130
|
+
/** Raw ioredis client for advanced usage */
|
|
131
|
+
raw: RedisClient;
|
|
132
|
+
strings: StringOps;
|
|
133
|
+
hashes: HashOps;
|
|
134
|
+
lists: ListOps;
|
|
135
|
+
sets: SetOps;
|
|
136
|
+
sortedSets: SortedSetOps;
|
|
137
|
+
keys: KeyOps;
|
|
138
|
+
pubsub: PubSubOps;
|
|
139
|
+
transactions: TransactionOps;
|
|
140
|
+
scripts: ScriptOps;
|
|
141
|
+
geo: GeoOps;
|
|
142
|
+
hyperloglog: HyperLogLogOps;
|
|
143
|
+
bitmaps: BitmapOps;
|
|
144
|
+
streams: StreamOps;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Initialize (or reinitialize) the CacheRelay singleton.
|
|
148
|
+
*
|
|
149
|
+
* @param connectionString — `host:port` (default `localhost:6379`)
|
|
150
|
+
* @returns the CacheRelay instance
|
|
151
|
+
*
|
|
152
|
+
* Only creates a new Redis connection when the connection string changes.
|
|
153
|
+
* Requires `ioredis` as a peer dependency — throws a clear error if missing.
|
|
154
|
+
*/
|
|
155
|
+
export declare function initCacheRelay(connectionString?: string): CacheRelay;
|
|
156
|
+
/**
|
|
157
|
+
* Get the current CacheRelay singleton.
|
|
158
|
+
* Lazily initializes with default settings (`localhost:6379`) if not yet created.
|
|
159
|
+
*/
|
|
160
|
+
export declare function getCacheRelay(): CacheRelay;
|
|
161
|
+
export {};
|
|
162
|
+
//# sourceMappingURL=cache-relay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-relay.d.ts","sourceRoot":"","sources":["../src/cache-relay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// CacheRelay — full Redis abstraction over ioredis
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.initCacheRelay = initCacheRelay;
|
|
7
|
+
exports.getCacheRelay = getCacheRelay;
|
|
8
|
+
// ---- Singleton state -------------------------------------------------------
|
|
9
|
+
let _cacheRelay;
|
|
10
|
+
let _currentConnectionString;
|
|
11
|
+
// ---- Builder ---------------------------------------------------------------
|
|
12
|
+
function buildCacheRelay(redis) {
|
|
13
|
+
const relay = {
|
|
14
|
+
raw: redis,
|
|
15
|
+
// -- Top-level convenience ------------------------------------------------
|
|
16
|
+
async get(key) {
|
|
17
|
+
return redis.get(key);
|
|
18
|
+
},
|
|
19
|
+
async gett(key) {
|
|
20
|
+
const raw = await redis.get(key);
|
|
21
|
+
if (raw === null || raw === undefined)
|
|
22
|
+
return null;
|
|
23
|
+
try {
|
|
24
|
+
return JSON.parse(raw);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
async set(key, value, options) {
|
|
31
|
+
const serialized = typeof value === 'string' ? value : JSON.stringify(value);
|
|
32
|
+
if (options?.ttlSeconds) {
|
|
33
|
+
await redis.set(key, serialized, 'EX', options.ttlSeconds);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
await redis.set(key, serialized);
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
async del(...keys) {
|
|
40
|
+
if (keys.length === 0)
|
|
41
|
+
return 0;
|
|
42
|
+
return redis.del(...keys);
|
|
43
|
+
},
|
|
44
|
+
// -- Strings --------------------------------------------------------------
|
|
45
|
+
strings: {
|
|
46
|
+
get: (key) => redis.get(key),
|
|
47
|
+
async set(key, value, ttlSeconds) {
|
|
48
|
+
if (ttlSeconds) {
|
|
49
|
+
await redis.set(key, value, 'EX', ttlSeconds);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
await redis.set(key, value);
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
mget: (...keys) => redis.mget(...keys),
|
|
56
|
+
async mset(pairs) {
|
|
57
|
+
const args = [];
|
|
58
|
+
for (const [k, v] of Object.entries(pairs)) {
|
|
59
|
+
args.push(k, v);
|
|
60
|
+
}
|
|
61
|
+
await redis.mset(...args);
|
|
62
|
+
},
|
|
63
|
+
incr: (key) => redis.incr(key),
|
|
64
|
+
incrby: (key, inc) => redis.incrby(key, inc),
|
|
65
|
+
decr: (key) => redis.decr(key),
|
|
66
|
+
decrby: (key, dec) => redis.decrby(key, dec),
|
|
67
|
+
append: (key, value) => redis.append(key, value),
|
|
68
|
+
strlen: (key) => redis.strlen(key),
|
|
69
|
+
},
|
|
70
|
+
// -- Hashes ---------------------------------------------------------------
|
|
71
|
+
hashes: {
|
|
72
|
+
get: (key, field) => redis.hget(key, field),
|
|
73
|
+
async set(key, field, value) {
|
|
74
|
+
await redis.hset(key, field, value);
|
|
75
|
+
},
|
|
76
|
+
async getAll(key) {
|
|
77
|
+
return redis.hgetall(key);
|
|
78
|
+
},
|
|
79
|
+
del: (key, ...fields) => redis.hdel(key, ...fields),
|
|
80
|
+
async exists(key, field) {
|
|
81
|
+
return (await redis.hexists(key, field)) === 1;
|
|
82
|
+
},
|
|
83
|
+
keys: (key) => redis.hkeys(key),
|
|
84
|
+
vals: (key) => redis.hvals(key),
|
|
85
|
+
len: (key) => redis.hlen(key),
|
|
86
|
+
async mset(key, pairs) {
|
|
87
|
+
const args = [];
|
|
88
|
+
for (const [f, v] of Object.entries(pairs)) {
|
|
89
|
+
args.push(f, v);
|
|
90
|
+
}
|
|
91
|
+
await redis.hmset(key, ...args);
|
|
92
|
+
},
|
|
93
|
+
mget: (key, ...fields) => redis.hmget(key, ...fields),
|
|
94
|
+
incrby: (key, field, inc) => redis.hincrby(key, field, inc),
|
|
95
|
+
},
|
|
96
|
+
// -- Lists ----------------------------------------------------------------
|
|
97
|
+
lists: {
|
|
98
|
+
push: (key, ...values) => redis.rpush(key, ...values),
|
|
99
|
+
lpush: (key, ...values) => redis.lpush(key, ...values),
|
|
100
|
+
pop: (key) => redis.rpop(key),
|
|
101
|
+
lpop: (key) => redis.lpop(key),
|
|
102
|
+
range: (key, start, stop) => redis.lrange(key, start, stop),
|
|
103
|
+
len: (key) => redis.llen(key),
|
|
104
|
+
async trim(key, start, stop) {
|
|
105
|
+
await redis.ltrim(key, start, stop);
|
|
106
|
+
},
|
|
107
|
+
index: (key, idx) => redis.lindex(key, idx),
|
|
108
|
+
async set(key, idx, value) {
|
|
109
|
+
await redis.lset(key, idx, value);
|
|
110
|
+
},
|
|
111
|
+
rem: (key, count, value) => redis.lrem(key, count, value),
|
|
112
|
+
},
|
|
113
|
+
// -- Sets -----------------------------------------------------------------
|
|
114
|
+
sets: {
|
|
115
|
+
add: (key, ...members) => redis.sadd(key, ...members),
|
|
116
|
+
rem: (key, ...members) => redis.srem(key, ...members),
|
|
117
|
+
members: (key) => redis.smembers(key),
|
|
118
|
+
async isMember(key, member) {
|
|
119
|
+
return (await redis.sismember(key, member)) === 1;
|
|
120
|
+
},
|
|
121
|
+
card: (key) => redis.scard(key),
|
|
122
|
+
union: (...keys) => redis.sunion(...keys),
|
|
123
|
+
inter: (...keys) => redis.sinter(...keys),
|
|
124
|
+
diff: (...keys) => redis.sdiff(...keys),
|
|
125
|
+
},
|
|
126
|
+
// -- Sorted Sets ----------------------------------------------------------
|
|
127
|
+
sortedSets: {
|
|
128
|
+
add: (key, score, member) => redis.zadd(key, score, member),
|
|
129
|
+
rem: (key, ...members) => redis.zrem(key, ...members),
|
|
130
|
+
range: (key, start, stop) => redis.zrange(key, start, stop),
|
|
131
|
+
async rangeWithScores(key, start, stop) {
|
|
132
|
+
const raw = await redis.zrange(key, start, stop, 'WITHSCORES');
|
|
133
|
+
const result = [];
|
|
134
|
+
for (let i = 0; i < raw.length; i += 2) {
|
|
135
|
+
result.push({ member: raw[i], score: parseFloat(raw[i + 1]) });
|
|
136
|
+
}
|
|
137
|
+
return result;
|
|
138
|
+
},
|
|
139
|
+
rangeByScore: (key, min, max) => redis.zrangebyscore(key, min, max),
|
|
140
|
+
revRange: (key, start, stop) => redis.zrevrange(key, start, stop),
|
|
141
|
+
async score(key, member) {
|
|
142
|
+
const s = await redis.zscore(key, member);
|
|
143
|
+
return s === null ? null : parseFloat(s);
|
|
144
|
+
},
|
|
145
|
+
rank: (key, member) => redis.zrank(key, member),
|
|
146
|
+
card: (key) => redis.zcard(key),
|
|
147
|
+
incrby: (key, inc, member) => redis.zincrby(key, inc, member),
|
|
148
|
+
remRangeByRank: (key, start, stop) => redis.zremrangebyrank(key, start, stop),
|
|
149
|
+
remRangeByScore: (key, min, max) => redis.zremrangebyscore(key, min, max),
|
|
150
|
+
},
|
|
151
|
+
// -- Keys -----------------------------------------------------------------
|
|
152
|
+
keys: {
|
|
153
|
+
exists: (...keys) => redis.exists(...keys),
|
|
154
|
+
async expire(key, seconds) {
|
|
155
|
+
return (await redis.expire(key, seconds)) === 1;
|
|
156
|
+
},
|
|
157
|
+
ttl: (key) => redis.ttl(key),
|
|
158
|
+
pttl: (key) => redis.pttl(key),
|
|
159
|
+
async persist(key) {
|
|
160
|
+
return (await redis.persist(key)) === 1;
|
|
161
|
+
},
|
|
162
|
+
async rename(key, newKey) {
|
|
163
|
+
await redis.rename(key, newKey);
|
|
164
|
+
},
|
|
165
|
+
type: (key) => redis.type(key),
|
|
166
|
+
async scan(cursor, options) {
|
|
167
|
+
const args = [cursor];
|
|
168
|
+
if (options?.match)
|
|
169
|
+
args.push('MATCH', options.match);
|
|
170
|
+
if (options?.count)
|
|
171
|
+
args.push('COUNT', options.count);
|
|
172
|
+
const [nextCursor, keys] = await redis.scan(...args);
|
|
173
|
+
return { cursor: parseInt(nextCursor, 10), keys };
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
// -- Pub/Sub --------------------------------------------------------------
|
|
177
|
+
pubsub: {
|
|
178
|
+
publish: (channel, message) => redis.publish(channel, message),
|
|
179
|
+
async subscribe(channel, callback) {
|
|
180
|
+
const sub = redis.duplicate();
|
|
181
|
+
await sub.subscribe(channel);
|
|
182
|
+
sub.on('message', (ch, msg) => {
|
|
183
|
+
if (ch === channel)
|
|
184
|
+
callback(msg, ch);
|
|
185
|
+
});
|
|
186
|
+
},
|
|
187
|
+
async unsubscribe(channel) {
|
|
188
|
+
await redis.unsubscribe(channel);
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
// -- Transactions ---------------------------------------------------------
|
|
192
|
+
transactions: {
|
|
193
|
+
multi() {
|
|
194
|
+
return redis.multi();
|
|
195
|
+
},
|
|
196
|
+
async exec(pipeline) {
|
|
197
|
+
return pipeline.exec();
|
|
198
|
+
},
|
|
199
|
+
},
|
|
200
|
+
// -- Scripts --------------------------------------------------------------
|
|
201
|
+
scripts: {
|
|
202
|
+
eval: (script, keys, args) => redis.eval(script, keys.length, ...keys, ...args),
|
|
203
|
+
evalsha: (sha, keys, args) => redis.evalsha(sha, keys.length, ...keys, ...args),
|
|
204
|
+
},
|
|
205
|
+
// -- Geo ------------------------------------------------------------------
|
|
206
|
+
geo: {
|
|
207
|
+
add: (key, lon, lat, member) => redis.geoadd(key, lon, lat, member),
|
|
208
|
+
pos: (key, ...members) => redis.geopos(key, ...members),
|
|
209
|
+
dist: (key, m1, m2, unit) => {
|
|
210
|
+
if (unit)
|
|
211
|
+
return redis.geodist(key, m1, m2, unit);
|
|
212
|
+
return redis.geodist(key, m1, m2);
|
|
213
|
+
},
|
|
214
|
+
radius: (key, lon, lat, r, unit) => redis.georadius(key, lon, lat, r, unit),
|
|
215
|
+
},
|
|
216
|
+
// -- HyperLogLog ----------------------------------------------------------
|
|
217
|
+
hyperloglog: {
|
|
218
|
+
add: (key, ...elements) => redis.pfadd(key, ...elements),
|
|
219
|
+
count: (...keys) => redis.pfcount(...keys),
|
|
220
|
+
async merge(destKey, ...sourceKeys) {
|
|
221
|
+
await redis.pfmerge(destKey, ...sourceKeys);
|
|
222
|
+
},
|
|
223
|
+
},
|
|
224
|
+
// -- Bitmaps --------------------------------------------------------------
|
|
225
|
+
bitmaps: {
|
|
226
|
+
setbit: (key, offset, value) => redis.setbit(key, offset, value),
|
|
227
|
+
getbit: (key, offset) => redis.getbit(key, offset),
|
|
228
|
+
count(key, start, end) {
|
|
229
|
+
if (start !== undefined && end !== undefined) {
|
|
230
|
+
return redis.bitcount(key, start, end);
|
|
231
|
+
}
|
|
232
|
+
return redis.bitcount(key);
|
|
233
|
+
},
|
|
234
|
+
op: (operation, destKey, ...keys) => redis.bitop(operation, destKey, ...keys),
|
|
235
|
+
},
|
|
236
|
+
// -- Streams --------------------------------------------------------------
|
|
237
|
+
streams: {
|
|
238
|
+
add(key, id, fields) {
|
|
239
|
+
const args = [];
|
|
240
|
+
for (const [f, v] of Object.entries(fields)) {
|
|
241
|
+
args.push(f, v);
|
|
242
|
+
}
|
|
243
|
+
return redis.xadd(key, id, ...args);
|
|
244
|
+
},
|
|
245
|
+
read(key, id, count) {
|
|
246
|
+
if (count)
|
|
247
|
+
return redis.xread('COUNT', count, 'STREAMS', key, id);
|
|
248
|
+
return redis.xread('STREAMS', key, id);
|
|
249
|
+
},
|
|
250
|
+
len: (key) => redis.xlen(key),
|
|
251
|
+
range(key, start, end, count) {
|
|
252
|
+
if (count)
|
|
253
|
+
return redis.xrange(key, start, end, 'COUNT', count);
|
|
254
|
+
return redis.xrange(key, start, end);
|
|
255
|
+
},
|
|
256
|
+
trim: (key, maxLen) => redis.xtrim(key, 'MAXLEN', maxLen),
|
|
257
|
+
},
|
|
258
|
+
};
|
|
259
|
+
return relay;
|
|
260
|
+
}
|
|
261
|
+
// ---- Public API ------------------------------------------------------------
|
|
262
|
+
/**
|
|
263
|
+
* Initialize (or reinitialize) the CacheRelay singleton.
|
|
264
|
+
*
|
|
265
|
+
* @param connectionString — `host:port` (default `localhost:6379`)
|
|
266
|
+
* @returns the CacheRelay instance
|
|
267
|
+
*
|
|
268
|
+
* Only creates a new Redis connection when the connection string changes.
|
|
269
|
+
* Requires `ioredis` as a peer dependency — throws a clear error if missing.
|
|
270
|
+
*/
|
|
271
|
+
function initCacheRelay(connectionString) {
|
|
272
|
+
const raw = connectionString ?? 'localhost:6379';
|
|
273
|
+
// Normalize: bare hostname (no port) → hostname:6379
|
|
274
|
+
const connStr = raw.includes(':') ? raw : `${raw}:6379`;
|
|
275
|
+
// Reuse existing instance when the connection string hasn't changed
|
|
276
|
+
if (_cacheRelay && _currentConnectionString === connStr)
|
|
277
|
+
return _cacheRelay;
|
|
278
|
+
// Dynamic require — gives a clear error when ioredis isn't installed
|
|
279
|
+
let Redis;
|
|
280
|
+
try {
|
|
281
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
282
|
+
Redis = require('ioredis');
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
throw new Error('CacheRelay requires "ioredis" as a peer dependency. Install it with: npm install ioredis');
|
|
286
|
+
}
|
|
287
|
+
const [host, portStr] = connStr.split(':');
|
|
288
|
+
const port = parseInt(portStr ?? '6379', 10);
|
|
289
|
+
const redis = new Redis(port, host || 'localhost');
|
|
290
|
+
_cacheRelay = buildCacheRelay(redis);
|
|
291
|
+
_currentConnectionString = connStr;
|
|
292
|
+
return _cacheRelay;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Get the current CacheRelay singleton.
|
|
296
|
+
* Lazily initializes with default settings (`localhost:6379`) if not yet created.
|
|
297
|
+
*/
|
|
298
|
+
function getCacheRelay() {
|
|
299
|
+
if (!_cacheRelay)
|
|
300
|
+
return initCacheRelay();
|
|
301
|
+
return _cacheRelay;
|
|
302
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,6 +3,12 @@ export type { ApiGatewayHandler, ALBHandler, LocalServerConfig } from './local-s
|
|
|
3
3
|
export { attachSocketAdapter } from './websocket';
|
|
4
4
|
export { ConnectionRegistry } from './websocket/connection-registry';
|
|
5
5
|
export { ActionRouter } from './websocket/action-router';
|
|
6
|
-
export {
|
|
7
|
-
export
|
|
6
|
+
export { SocketGatewayClient } from './websocket/socket-gateway-client';
|
|
7
|
+
export { InMemoryChannelStore, RedisChannelStore } from './websocket/channel-store';
|
|
8
|
+
export { SocketEmitter } from './websocket/socket-emitter';
|
|
9
|
+
export type { ConnectionId, PostToConnectionFn, SocketAdapterConfig, RedisConfig, ConnectHandlerFn, DisconnectHandlerFn, ActionHandler, ActionHandlerContext, ActionHandlerResult, LocalRequestContext, WebSocketUserContext, } from './websocket/types';
|
|
10
|
+
export type { ChannelStore } from './websocket/channel-store';
|
|
11
|
+
export type { EmitTarget } from './websocket/socket-emitter';
|
|
12
|
+
export { initCacheRelay, getCacheRelay } from './cache-relay';
|
|
13
|
+
export type { CacheRelay, StringOps, HashOps, ListOps, SetOps, SortedSetOps, KeyOps, PubSubOps, TransactionOps, ScriptOps, GeoOps, HyperLogLogOps, BitmapOps, StreamOps, } from './cache-relay';
|
|
8
14
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAG5F,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAG5F,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAA;AACvE,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AACnF,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC1D,YAAY,EACX,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,EACX,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,GACpB,MAAM,mBAAmB,CAAA;AAC1B,YAAY,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC7D,YAAY,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAG5D,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC7D,YAAY,EACX,UAAU,EACV,SAAS,EACT,OAAO,EACP,OAAO,EACP,MAAM,EACN,YAAY,EACZ,MAAM,EACN,SAAS,EACT,cAAc,EACd,SAAS,EACT,MAAM,EACN,cAAc,EACd,SAAS,EACT,SAAS,GACT,MAAM,eAAe,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.getCacheRelay = exports.initCacheRelay = exports.SocketEmitter = exports.RedisChannelStore = exports.InMemoryChannelStore = exports.SocketGatewayClient = exports.ActionRouter = exports.ConnectionRegistry = exports.attachSocketAdapter = exports.LocalServer = void 0;
|
|
4
4
|
// Core
|
|
5
5
|
var local_server_1 = require("./local-server");
|
|
6
6
|
Object.defineProperty(exports, "LocalServer", { enumerable: true, get: function () { return local_server_1.LocalServer; } });
|
|
@@ -11,5 +11,14 @@ var connection_registry_1 = require("./websocket/connection-registry");
|
|
|
11
11
|
Object.defineProperty(exports, "ConnectionRegistry", { enumerable: true, get: function () { return connection_registry_1.ConnectionRegistry; } });
|
|
12
12
|
var action_router_1 = require("./websocket/action-router");
|
|
13
13
|
Object.defineProperty(exports, "ActionRouter", { enumerable: true, get: function () { return action_router_1.ActionRouter; } });
|
|
14
|
-
var
|
|
15
|
-
Object.defineProperty(exports, "
|
|
14
|
+
var socket_gateway_client_1 = require("./websocket/socket-gateway-client");
|
|
15
|
+
Object.defineProperty(exports, "SocketGatewayClient", { enumerable: true, get: function () { return socket_gateway_client_1.SocketGatewayClient; } });
|
|
16
|
+
var channel_store_1 = require("./websocket/channel-store");
|
|
17
|
+
Object.defineProperty(exports, "InMemoryChannelStore", { enumerable: true, get: function () { return channel_store_1.InMemoryChannelStore; } });
|
|
18
|
+
Object.defineProperty(exports, "RedisChannelStore", { enumerable: true, get: function () { return channel_store_1.RedisChannelStore; } });
|
|
19
|
+
var socket_emitter_1 = require("./websocket/socket-emitter");
|
|
20
|
+
Object.defineProperty(exports, "SocketEmitter", { enumerable: true, get: function () { return socket_emitter_1.SocketEmitter; } });
|
|
21
|
+
// CacheRelay
|
|
22
|
+
var cache_relay_1 = require("./cache-relay");
|
|
23
|
+
Object.defineProperty(exports, "initCacheRelay", { enumerable: true, get: function () { return cache_relay_1.initCacheRelay; } });
|
|
24
|
+
Object.defineProperty(exports, "getCacheRelay", { enumerable: true, get: function () { return cache_relay_1.getCacheRelay; } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/local-server/index.ts"],"names":[],"mappings":"AAEA,OAAO,OAAO,MAAM,SAAS,CAAA;AAO7B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAC7D,OAAO,KAAK,EACX,iBAAiB,EACjB,UAAU,EACV,uBAAuB,EACvB,gBAAgB,EAChB,iBAAiB,EACjB,MAAM,SAAS,CAAA;AAEhB,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAE/E,qBAAa,WAAW;IACvB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAA;IAC7B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,MAAM,CAAmB;gBAErB,MAAM,CAAC,EAAE,iBAAiB;IAgBtC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI;IACtD,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,uBAAuB,GAAG,IAAI;IACxF,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAgC1E,YAAY,CACX,SAAS,EAAE,OAAO,mBAAmB,EACrC,MAAM,CAAC,EAAE,mBAAmB,GAC1B,UAAU,CAAC,OAAO,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/local-server/index.ts"],"names":[],"mappings":"AAEA,OAAO,OAAO,MAAM,SAAS,CAAA;AAO7B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAC7D,OAAO,KAAK,EACX,iBAAiB,EACjB,UAAU,EACV,uBAAuB,EACvB,gBAAgB,EAChB,iBAAiB,EACjB,MAAM,SAAS,CAAA;AAEhB,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAE/E,qBAAa,WAAW;IACvB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAA;IAC7B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,MAAM,CAAmB;gBAErB,MAAM,CAAC,EAAE,iBAAiB;IAgBtC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI;IACtD,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,uBAAuB,GAAG,IAAI;IACxF,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAgC1E,YAAY,CACX,SAAS,EAAE,OAAO,mBAAmB,EACrC,MAAM,CAAC,EAAE,mBAAmB,GAC1B,UAAU,CAAC,OAAO,mBAAmB,CAAC;IAWzC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;CAS7C"}
|
|
@@ -51,7 +51,13 @@ class LocalServer {
|
|
|
51
51
|
}
|
|
52
52
|
attachSocket(adapterFn, config) {
|
|
53
53
|
const wss = new ws_1.WebSocketServer({ server: this.httpServer });
|
|
54
|
-
|
|
54
|
+
const mergedConfig = {
|
|
55
|
+
...config,
|
|
56
|
+
useRedis: config?.useRedis ?? this.config.useRedis,
|
|
57
|
+
redis: config?.redis ?? this.config.redis,
|
|
58
|
+
debug: config?.debug ?? this.config.debug,
|
|
59
|
+
};
|
|
60
|
+
return adapterFn(wss, mergedConfig);
|
|
55
61
|
}
|
|
56
62
|
listen(port, hostname) {
|
|
57
63
|
const host = hostname ?? '0.0.0.0';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/local-server/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,KAAK,EACX,sBAAsB,EACtB,iCAAiC,EACjC,QAAQ,EACR,SAAS,EACT,MAAM,YAAY,CAAA;AAInB,MAAM,MAAM,iBAAiB,GAAG,CAC/B,KAAK,EAAE,sBAAsB,EAC7B,OAAO,EAAE,OAAO,KACZ,OAAO,CAAC,iCAAiC,CAAC,CAAA;AAE/C,MAAM,MAAM,UAAU,GAAG,CACxB,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,OAAO,KACZ,OAAO,CAAC,SAAS,CAAC,CAAA;AAIvB,MAAM,WAAW,uBAAuB;IACvC,SAAS,CAAC,EAAE,aAAa,CAAA;CACzB;AAED,MAAM,WAAW,gBAAgB;IAChC,SAAS,EAAE,KAAK,CAAA;CAChB;AAID,MAAM,WAAW,iBAAiB;IACjC,KAAK,CAAC,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/local-server/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,KAAK,EACX,sBAAsB,EACtB,iCAAiC,EACjC,QAAQ,EACR,SAAS,EACT,MAAM,YAAY,CAAA;AAInB,MAAM,MAAM,iBAAiB,GAAG,CAC/B,KAAK,EAAE,sBAAsB,EAC7B,OAAO,EAAE,OAAO,KACZ,OAAO,CAAC,iCAAiC,CAAC,CAAA;AAE/C,MAAM,MAAM,UAAU,GAAG,CACxB,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,OAAO,KACZ,OAAO,CAAC,SAAS,CAAC,CAAA;AAIvB,MAAM,WAAW,uBAAuB;IACvC,SAAS,CAAC,EAAE,aAAa,CAAA;CACzB;AAED,MAAM,WAAW,gBAAgB;IAChC,SAAS,EAAE,KAAK,CAAA;CAChB;AAID,MAAM,WAAW,iBAAiB;IACjC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,OAAO,oBAAoB,EAAE,WAAW,CAAA;CAChD"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ConnectionId } from './types';
|
|
2
|
+
export interface ChannelStore {
|
|
3
|
+
subscribe(connectionId: ConnectionId, channel: string): Promise<void>;
|
|
4
|
+
unsubscribe(connectionId: ConnectionId, channel: string): Promise<void>;
|
|
5
|
+
getSubscribers(channel: string): Promise<ConnectionId[]>;
|
|
6
|
+
removeAll(connectionId: ConnectionId): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
export declare class InMemoryChannelStore implements ChannelStore {
|
|
9
|
+
private channelToConnections;
|
|
10
|
+
private connectionToChannels;
|
|
11
|
+
subscribe(connectionId: ConnectionId, channel: string): Promise<void>;
|
|
12
|
+
unsubscribe(connectionId: ConnectionId, channel: string): Promise<void>;
|
|
13
|
+
getSubscribers(channel: string): Promise<ConnectionId[]>;
|
|
14
|
+
removeAll(connectionId: ConnectionId): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
export declare class RedisChannelStore implements ChannelStore {
|
|
17
|
+
private channelKeyPrefix;
|
|
18
|
+
private connChannelsPrefix;
|
|
19
|
+
constructor(options?: {
|
|
20
|
+
keyPrefix?: string;
|
|
21
|
+
});
|
|
22
|
+
private getRelay;
|
|
23
|
+
subscribe(connectionId: ConnectionId, channel: string): Promise<void>;
|
|
24
|
+
unsubscribe(connectionId: ConnectionId, channel: string): Promise<void>;
|
|
25
|
+
getSubscribers(channel: string): Promise<ConnectionId[]>;
|
|
26
|
+
removeAll(connectionId: ConnectionId): Promise<void>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=channel-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel-store.d.ts","sourceRoot":"","sources":["../../src/websocket/channel-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAI3C,MAAM,WAAW,YAAY;IAC5B,SAAS,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACrE,WAAW,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACvE,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAA;IACxD,SAAS,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACpD;AAID,qBAAa,oBAAqB,YAAW,YAAY;IACxD,OAAO,CAAC,oBAAoB,CAAuC;IACnE,OAAO,CAAC,oBAAoB,CAAuC;IAE7D,SAAS,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBrE,WAAW,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcvE,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAKxD,SAAS,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;CAc1D;AAID,qBAAa,iBAAkB,YAAW,YAAY;IACrD,OAAO,CAAC,gBAAgB,CAAQ;IAChC,OAAO,CAAC,kBAAkB,CAAQ;gBAEtB,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE;IAM5C,OAAO,CAAC,QAAQ;IAMV,SAAS,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMrE,WAAW,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMvE,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAKxD,SAAS,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;CAY1D"}
|