@ionite/ioredis 0.0.24-beta.20260907.2 → 0.0.24-beta.20260907.3
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/index.js +201 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1 +1,201 @@
|
|
|
1
|
-
|
|
1
|
+
// packages/ioredis/src/index.ts
|
|
2
|
+
import {
|
|
3
|
+
createReactiveRedis as createReactiveRedis2,
|
|
4
|
+
createRedisLfvTransport,
|
|
5
|
+
getKeyPrefix,
|
|
6
|
+
getLogger,
|
|
7
|
+
prefixedKey,
|
|
8
|
+
RedisAccessAssignmentStore,
|
|
9
|
+
RedisAccessCatalogStore,
|
|
10
|
+
RedisAccessIndex,
|
|
11
|
+
RedisCustomerStore,
|
|
12
|
+
RedisMagicLinkStore,
|
|
13
|
+
RedisResourceStore,
|
|
14
|
+
RedisSessionStore,
|
|
15
|
+
RedisTenantStore,
|
|
16
|
+
RedisUserStore,
|
|
17
|
+
RedisWorkloadIdentityStore,
|
|
18
|
+
RedisWorkloadTokenStore
|
|
19
|
+
} from "@ionite/redis-core";
|
|
20
|
+
|
|
21
|
+
// packages/ioredis/src/adapter.ts
|
|
22
|
+
import { chunkedMget, createEvalshaRunner } from "@ionite/redis-core";
|
|
23
|
+
function createIoredisAdapter(redis) {
|
|
24
|
+
const runScript = createEvalshaRunner({
|
|
25
|
+
eval: (script, keys, args) => redis.eval(script, keys.length, ...keys, ...args),
|
|
26
|
+
evalsha: (sha, keys, args) => redis.evalsha(sha, keys.length, ...keys, ...args)
|
|
27
|
+
});
|
|
28
|
+
let subscriber;
|
|
29
|
+
const channelListeners = new Map;
|
|
30
|
+
const onMessage = (channel, message) => {
|
|
31
|
+
for (const listener of channelListeners.get(channel) ?? [])
|
|
32
|
+
listener(message);
|
|
33
|
+
};
|
|
34
|
+
const getSubscriber = () => {
|
|
35
|
+
if (subscriber)
|
|
36
|
+
return subscriber;
|
|
37
|
+
subscriber = redis.duplicate();
|
|
38
|
+
subscriber.on("message", onMessage);
|
|
39
|
+
return subscriber;
|
|
40
|
+
};
|
|
41
|
+
return {
|
|
42
|
+
async get(key) {
|
|
43
|
+
return redis.get(key);
|
|
44
|
+
},
|
|
45
|
+
async set(key, value) {
|
|
46
|
+
await redis.set(key, value);
|
|
47
|
+
},
|
|
48
|
+
async setex(key, seconds, value) {
|
|
49
|
+
await redis.setex(key, seconds, value);
|
|
50
|
+
},
|
|
51
|
+
async del(key) {
|
|
52
|
+
await redis.del(key);
|
|
53
|
+
},
|
|
54
|
+
async ttl(key) {
|
|
55
|
+
return redis.ttl(key);
|
|
56
|
+
},
|
|
57
|
+
async getdel(key) {
|
|
58
|
+
return redis.getdel(key);
|
|
59
|
+
},
|
|
60
|
+
async sadd(key, ...members) {
|
|
61
|
+
if (members.length > 0)
|
|
62
|
+
await redis.sadd(key, ...members);
|
|
63
|
+
},
|
|
64
|
+
async srem(key, ...members) {
|
|
65
|
+
if (members.length > 0)
|
|
66
|
+
await redis.srem(key, ...members);
|
|
67
|
+
},
|
|
68
|
+
async smembers(key) {
|
|
69
|
+
return redis.smembers(key);
|
|
70
|
+
},
|
|
71
|
+
async mget(keys) {
|
|
72
|
+
return chunkedMget(keys, (chunk) => redis.mget(...chunk));
|
|
73
|
+
},
|
|
74
|
+
async publish(channel, message) {
|
|
75
|
+
await redis.publish(channel, message);
|
|
76
|
+
},
|
|
77
|
+
async subscribeChannel(channel, listener) {
|
|
78
|
+
const listeners = channelListeners.get(channel) ?? new Set;
|
|
79
|
+
const isFirst = listeners.size === 0;
|
|
80
|
+
listeners.add(listener);
|
|
81
|
+
channelListeners.set(channel, listeners);
|
|
82
|
+
const active = getSubscriber();
|
|
83
|
+
if (isFirst) {
|
|
84
|
+
try {
|
|
85
|
+
await active.subscribe(channel);
|
|
86
|
+
} catch (error) {
|
|
87
|
+
listeners.delete(listener);
|
|
88
|
+
if (listeners.size === 0)
|
|
89
|
+
channelListeners.delete(channel);
|
|
90
|
+
if (channelListeners.size === 0 && subscriber === active) {
|
|
91
|
+
active.removeListener("message", onMessage);
|
|
92
|
+
active.disconnect();
|
|
93
|
+
subscriber = undefined;
|
|
94
|
+
}
|
|
95
|
+
throw error;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
let subscribed = true;
|
|
99
|
+
return async () => {
|
|
100
|
+
if (!subscribed)
|
|
101
|
+
return;
|
|
102
|
+
subscribed = false;
|
|
103
|
+
const current = channelListeners.get(channel);
|
|
104
|
+
current?.delete(listener);
|
|
105
|
+
if (current && current.size === 0) {
|
|
106
|
+
channelListeners.delete(channel);
|
|
107
|
+
await active.unsubscribe(channel);
|
|
108
|
+
}
|
|
109
|
+
if (channelListeners.size === 0 && subscriber === active) {
|
|
110
|
+
active.removeListener("message", onMessage);
|
|
111
|
+
active.disconnect();
|
|
112
|
+
subscriber = undefined;
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
},
|
|
116
|
+
runScript
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
// packages/ioredis/src/ion-redis.ts
|
|
120
|
+
import {
|
|
121
|
+
createReactiveRedis,
|
|
122
|
+
splitIonRedisSecret
|
|
123
|
+
} from "@ionite/redis-core";
|
|
124
|
+
import Redis from "ioredis";
|
|
125
|
+
function normalizeClientConfig(secret) {
|
|
126
|
+
const { redisUrl, clientOptions } = splitIonRedisSecret(secret);
|
|
127
|
+
return {
|
|
128
|
+
redisUrl,
|
|
129
|
+
clientOptions
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
function endpointSignature(secret) {
|
|
133
|
+
const config = normalizeClientConfig(secret);
|
|
134
|
+
if (config.redisUrl)
|
|
135
|
+
return config.redisUrl;
|
|
136
|
+
const host = config.clientOptions.host;
|
|
137
|
+
const port = config.clientOptions.port;
|
|
138
|
+
if (host)
|
|
139
|
+
return `${host}:${port ?? 6379}`;
|
|
140
|
+
return "";
|
|
141
|
+
}
|
|
142
|
+
async function waitForReady(client) {
|
|
143
|
+
await client.connect();
|
|
144
|
+
}
|
|
145
|
+
async function closeClient(client) {
|
|
146
|
+
try {
|
|
147
|
+
await client.quit();
|
|
148
|
+
} catch {
|
|
149
|
+
client.disconnect();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function ionRedis(source, path, options = {}) {
|
|
153
|
+
return createReactiveRedis({
|
|
154
|
+
source,
|
|
155
|
+
path,
|
|
156
|
+
sourceName: options.sourceName,
|
|
157
|
+
logger: options.logger,
|
|
158
|
+
secretOptions: options.secretOptions,
|
|
159
|
+
subscription: options.subscription,
|
|
160
|
+
endpointOf: (secret) => endpointSignature(secret.data),
|
|
161
|
+
async createClient(secret) {
|
|
162
|
+
const config = normalizeClientConfig(secret.data);
|
|
163
|
+
const clientOptions = { ...config.clientOptions, lazyConnect: true };
|
|
164
|
+
const client = config.redisUrl ? new Redis(config.redisUrl, clientOptions) : new Redis(clientOptions);
|
|
165
|
+
client.on("error", (error) => {
|
|
166
|
+
options.logger?.warn?.("Reactive ioredis client error", {
|
|
167
|
+
path,
|
|
168
|
+
sourceName: options.sourceName ?? "redis",
|
|
169
|
+
error: error.message
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
await waitForReady(client);
|
|
173
|
+
return {
|
|
174
|
+
adapter: createIoredisAdapter(client),
|
|
175
|
+
dispose: async () => {
|
|
176
|
+
await closeClient(client);
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
export {
|
|
183
|
+
prefixedKey,
|
|
184
|
+
ionRedis,
|
|
185
|
+
getLogger,
|
|
186
|
+
getKeyPrefix,
|
|
187
|
+
createRedisLfvTransport,
|
|
188
|
+
createReactiveRedis2 as createReactiveRedis,
|
|
189
|
+
createIoredisAdapter,
|
|
190
|
+
RedisWorkloadTokenStore,
|
|
191
|
+
RedisWorkloadIdentityStore,
|
|
192
|
+
RedisUserStore,
|
|
193
|
+
RedisTenantStore,
|
|
194
|
+
RedisSessionStore,
|
|
195
|
+
RedisResourceStore,
|
|
196
|
+
RedisMagicLinkStore,
|
|
197
|
+
RedisCustomerStore,
|
|
198
|
+
RedisAccessIndex,
|
|
199
|
+
RedisAccessCatalogStore,
|
|
200
|
+
RedisAccessAssignmentStore
|
|
201
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ionite/ioredis",
|
|
3
|
-
"version": "0.0.24-beta.20260907.
|
|
3
|
+
"version": "0.0.24-beta.20260907.3",
|
|
4
4
|
"description": "ioredis adapter and Redis stores for ionite. Single package: install this and ioredis; import adapter and stores from here.",
|
|
5
5
|
"private": false,
|
|
6
6
|
"author": "ionite",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"./package.json": "./package.json"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@ionite/redis-core": "0.0.24-beta.20260907.
|
|
27
|
+
"@ionite/redis-core": "0.0.24-beta.20260907.3"
|
|
28
28
|
},
|
|
29
29
|
"peerDependencies": {
|
|
30
30
|
"ioredis": "*"
|