@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.
Files changed (2) hide show
  1. package/dist/index.js +201 -1
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -1 +1,201 @@
1
- import{createReactiveRedis as f,createRedisLfvTransport as L,getKeyPrefix as p,getLogger as v,prefixedKey as m,RedisAccessAssignmentStore as g,RedisAccessCatalogStore as y,RedisAccessIndex as d,RedisCustomerStore as k,RedisMagicLinkStore as u,RedisResourceStore as b,RedisSessionStore as o,RedisTenantStore as h,RedisUserStore as t,RedisWorkloadIdentityStore as a,RedisWorkloadTokenStore as l}from"@ionite/redis-core";import{chunkedMget as Z,createEvalshaRunner as _}from"@ionite/redis-core";function J(x){let O=_({eval:(R,S,K)=>x.eval(R,S.length,...S,...K),evalsha:(R,S,K)=>x.evalsha(R,S.length,...S,...K)}),I,W=new Map,B=(R,S)=>{for(let K of W.get(R)??[])K(S)},G=()=>{if(I)return I;return I=x.duplicate(),I.on("message",B),I};return{async get(R){return x.get(R)},async set(R,S){await x.set(R,S)},async setex(R,S,K){await x.setex(R,S,K)},async del(R){await x.del(R)},async ttl(R){return x.ttl(R)},async getdel(R){return x.getdel(R)},async sadd(R,...S){if(S.length>0)await x.sadd(R,...S)},async srem(R,...S){if(S.length>0)await x.srem(R,...S)},async smembers(R){return x.smembers(R)},async mget(R){return Z(R,(S)=>x.mget(...S))},async publish(R,S){await x.publish(R,S)},async subscribeChannel(R,S){let K=W.get(R)??new Set,Y=K.size===0;K.add(S),W.set(R,K);let A=G();if(Y)try{await A.subscribe(R)}catch(D){if(K.delete(S),K.size===0)W.delete(R);if(W.size===0&&I===A)A.removeListener("message",B),A.disconnect(),I=void 0;throw D}let Q=!0;return async()=>{if(!Q)return;Q=!1;let D=W.get(R);if(D?.delete(S),D&&D.size===0)W.delete(R),await A.unsubscribe(R);if(W.size===0&&I===A)A.removeListener("message",B),A.disconnect(),I=void 0}},runScript:O}}import{createReactiveRedis as $,splitIonRedisSecret as j}from"@ionite/redis-core";import T from"ioredis";function X(x){let{redisUrl:O,clientOptions:I}=j(x);return{redisUrl:O,clientOptions:I}}function q(x){let O=X(x);if(O.redisUrl)return O.redisUrl;let I=O.clientOptions.host,W=O.clientOptions.port;if(I)return`${I}:${W??6379}`;return""}async function N(x){await x.connect()}async function P(x){try{await x.quit()}catch{x.disconnect()}}function w(x,O,I={}){return $({source:x,path:O,sourceName:I.sourceName,logger:I.logger,secretOptions:I.secretOptions,subscription:I.subscription,endpointOf:(W)=>q(W.data),async createClient(W){let B=X(W.data),G={...B.clientOptions,lazyConnect:!0},R=B.redisUrl?new T(B.redisUrl,G):new T(G);return R.on("error",(S)=>{I.logger?.warn?.("Reactive ioredis client error",{path:O,sourceName:I.sourceName??"redis",error:S.message})}),await N(R),{adapter:J(R),dispose:async()=>{await P(R)}}}})}export{m as prefixedKey,w as ionRedis,v as getLogger,p as getKeyPrefix,L as createRedisLfvTransport,f as createReactiveRedis,J as createIoredisAdapter,l as RedisWorkloadTokenStore,a as RedisWorkloadIdentityStore,t as RedisUserStore,h as RedisTenantStore,o as RedisSessionStore,b as RedisResourceStore,u as RedisMagicLinkStore,k as RedisCustomerStore,d as RedisAccessIndex,y as RedisAccessCatalogStore,g as RedisAccessAssignmentStore};
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.2",
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.2"
27
+ "@ionite/redis-core": "0.0.24-beta.20260907.3"
28
28
  },
29
29
  "peerDependencies": {
30
30
  "ioredis": "*"