@medusajs/caching-redis 2.10.4-preview-20250930180200

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.
@@ -0,0 +1,3 @@
1
+ declare const _default: import("@medusajs/types").ModuleProviderExports;
2
+ export default _default;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAQA,wBAGE"}
package/dist/index.js ADDED
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const utils_1 = require("@medusajs/framework/utils");
7
+ const connection_1 = __importDefault(require("./loaders/connection"));
8
+ const hash_1 = __importDefault(require("./loaders/hash"));
9
+ const redis_cache_1 = require("./services/redis-cache");
10
+ const services = [redis_cache_1.RedisCachingProvider];
11
+ const loaders = [connection_1.default, hash_1.default];
12
+ exports.default = (0, utils_1.ModuleProvider)(utils_1.Modules.CACHING, {
13
+ services,
14
+ loaders,
15
+ });
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAAA,qDAAmE;AACnE,sEAA6C;AAC7C,0DAAiC;AACjC,wDAA6D;AAE7D,MAAM,QAAQ,GAAG,CAAC,kCAAoB,CAAC,CAAA;AACvC,MAAM,OAAO,GAAG,CAAC,oBAAU,EAAE,cAAI,CAAC,CAAA;AAElC,kBAAe,IAAA,sBAAc,EAAC,eAAO,CAAC,OAAO,EAAE;IAC7C,QAAQ;IACR,OAAO;CACR,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ import type { InternalModuleDeclaration, LoaderOptions, ModulesSdkTypes } from "@medusajs/framework/types";
2
+ declare const _default: ({ container, logger, options, }: LoaderOptions<(ModulesSdkTypes.ModuleServiceInitializeOptions | ModulesSdkTypes.ModuleServiceInitializeCustomDataLayerOptions) & {
3
+ logger?: any;
4
+ }>, moduleDeclaration?: InternalModuleDeclaration) => Promise<void>;
5
+ export default _default;
6
+ //# sourceMappingURL=connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/loaders/connection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EACzB,aAAa,EACb,eAAe,EAChB,MAAM,2BAA2B,CAAA;0DAS7B,aAAa,CACd,CACI,eAAe,CAAC,8BAA8B,GAC9C,eAAe,CAAC,6CAA6C,CAChE,GAAG;IAAE,MAAM,CAAC,EAAE,GAAG,CAAA;CAAE,CACrB,sBACmB,yBAAyB,KAC5C,OAAO,CAAC,IAAI,CAAC;AAZhB,wBAyDC"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const ioredis_1 = __importDefault(require("ioredis"));
7
+ exports.default = async ({ container, logger, options, }, moduleDeclaration) => {
8
+ const logger_ = logger || console;
9
+ const moduleOptions = (options ??
10
+ moduleDeclaration?.options ??
11
+ {});
12
+ if (!moduleOptions.redisUrl) {
13
+ throw new Error("[caching-redis] redisUrl is required");
14
+ }
15
+ let redisClient;
16
+ try {
17
+ redisClient = new ioredis_1.default(moduleOptions.redisUrl, {
18
+ connectTimeout: 10000,
19
+ lazyConnect: true,
20
+ retryDelayOnFailover: 100,
21
+ connectionName: "medusa-cache-redis",
22
+ ...moduleOptions,
23
+ });
24
+ // Test connection
25
+ await redisClient.ping();
26
+ logger_.info("Redis cache connection established successfully");
27
+ }
28
+ catch (error) {
29
+ logger_.error(`Failed to connect to Redis cache: ${error.message}`);
30
+ redisClient = new ioredis_1.default(moduleOptions.redisUrl, {
31
+ connectTimeout: 10000,
32
+ lazyConnect: true,
33
+ retryDelayOnFailover: 100,
34
+ ...moduleOptions,
35
+ });
36
+ }
37
+ container.register({
38
+ redisClient: {
39
+ resolve: () => redisClient,
40
+ },
41
+ prefix: {
42
+ resolve: () => moduleOptions.prefix ?? "mc:",
43
+ },
44
+ });
45
+ };
46
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/loaders/connection.ts"],"names":[],"mappings":";;;;;AAMA,sDAA2B;AAE3B,kBAAe,KAAK,EAClB,EACE,SAAS,EACT,MAAM,EACN,OAAO,GAMR,EACD,iBAA6C,EAC9B,EAAE;IACjB,MAAM,OAAO,GAAG,MAAM,IAAI,OAAO,CAAA;IAEjC,MAAM,aAAa,GAAG,CAAC,OAAO;QAC5B,iBAAiB,EAAE,OAAO;QAC1B,EAAE,CAEH,CAAA;IAED,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;IACzD,CAAC;IAED,IAAI,WAAkB,CAAA;IAEtB,IAAI,CAAC;QACH,WAAW,GAAG,IAAI,iBAAK,CAAC,aAAa,CAAC,QAAS,EAAE;YAC/C,cAAc,EAAE,KAAK;YACrB,WAAW,EAAE,IAAI;YACjB,oBAAoB,EAAE,GAAG;YACzB,cAAc,EAAE,oBAAoB;YACpC,GAAG,aAAa;SACjB,CAAC,CAAA;QAEF,kBAAkB;QAClB,MAAM,WAAW,CAAC,IAAI,EAAE,CAAA;QACxB,OAAO,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA;IACjE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,qCAAqC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QACnE,WAAW,GAAG,IAAI,iBAAK,CAAC,aAAa,CAAC,QAAS,EAAE;YAC/C,cAAc,EAAE,KAAK;YACrB,WAAW,EAAE,IAAI;YACjB,oBAAoB,EAAE,GAAG;YACzB,GAAG,aAAa;SACjB,CAAC,CAAA;IACJ,CAAC;IAED,SAAS,CAAC,QAAQ,CAAC;QACjB,WAAW,EAAE;YACX,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW;SAC3B;QACD,MAAM,EAAE;YACN,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,IAAI,KAAK;SAC7C;KACF,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ declare const _default: ({ container }: {
2
+ container: any;
3
+ }) => Promise<void>;
4
+ export default _default;
5
+ //# sourceMappingURL=hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/loaders/hash.ts"],"names":[],"mappings":";;;AAEA,wBAKC"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const awilix_1 = require("awilix");
4
+ exports.default = async ({ container }) => {
5
+ const xxhashhWasm = await import("xxhash-wasm");
6
+ const { h32ToString } = await xxhashhWasm.default();
7
+ container.register("hasher", (0, awilix_1.asValue)(h32ToString));
8
+ };
9
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/loaders/hash.ts"],"names":[],"mappings":";;AAAA,mCAAgC;AAEhC,kBAAe,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;IACrC,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAA;IAC/C,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,CAAA;IAEnD,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAA,gBAAO,EAAC,WAAW,CAAC,CAAC,CAAA;AACpD,CAAC,CAAA"}
@@ -0,0 +1,38 @@
1
+ import { RedisCacheModuleOptions } from "../types";
2
+ import { Redis } from "ioredis";
3
+ export declare class RedisCachingProvider {
4
+ #private;
5
+ static identifier: string;
6
+ protected redisClient: Redis;
7
+ protected keyNamePrefix: string;
8
+ protected defaultTTL: number;
9
+ protected compressionThreshold: number;
10
+ protected hasher: (key: string) => string;
11
+ constructor({ redisClient, prefix, hasher, }: {
12
+ redisClient: Redis;
13
+ prefix: string;
14
+ hasher: (key: string) => string;
15
+ }, options?: RedisCacheModuleOptions);
16
+ get({ key, tags }: {
17
+ key?: string;
18
+ tags?: string[];
19
+ }): Promise<any>;
20
+ set({ key, data, ttl, tags, options, }: {
21
+ key: string;
22
+ data: object;
23
+ ttl?: number;
24
+ tags?: string[];
25
+ options?: {
26
+ autoInvalidate?: boolean;
27
+ };
28
+ }): Promise<void>;
29
+ clear({ key, tags, options, }: {
30
+ key?: string;
31
+ tags?: string[];
32
+ options?: {
33
+ autoInvalidate?: boolean;
34
+ };
35
+ }): Promise<void>;
36
+ flush(): Promise<void>;
37
+ }
38
+ //# sourceMappingURL=redis-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-cache.d.ts","sourceRoot":"","sources":["../../src/services/redis-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,QAAQ,CAAA;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAG/B,qBAAa,oBAAoB;;IAC/B,MAAM,CAAC,UAAU,SAAgB;IAEjC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAA;IAC5B,SAAS,CAAC,aAAa,EAAE,MAAM,CAAA;IAC/B,SAAS,CAAC,UAAU,EAAE,MAAM,CAAA;IAC5B,SAAS,CAAC,oBAAoB,EAAE,MAAM,CAAA;IACtC,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;gBAGvC,EACE,WAAW,EACX,MAAM,EACN,MAAM,GACP,EAAE;QAAE,WAAW,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;KAAE,EAC1E,OAAO,CAAC,EAAE,uBAAuB;IA0O7B,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAkEnE,GAAG,CAAC,EACR,GAAG,EACH,IAAI,EACJ,GAAG,EACH,IAAI,EACJ,OAAO,GACR,EAAE;QACD,GAAG,EAAE,MAAM,CAAA;QACX,IAAI,EAAE,MAAM,CAAA;QACZ,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;QACf,OAAO,CAAC,EAAE;YACR,cAAc,CAAC,EAAE,OAAO,CAAA;SACzB,CAAA;KACF,GAAG,OAAO,CAAC,IAAI,CAAC;IAkDX,KAAK,CAAC,EACV,GAAG,EACH,IAAI,EACJ,OAAO,GACR,EAAE;QACD,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;QACf,OAAO,CAAC,EAAE;YACR,cAAc,CAAC,EAAE,OAAO,CAAA;SACzB,CAAA;KACF,GAAG,OAAO,CAAC,IAAI,CAAC;IA2QX,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAsB7B"}
@@ -0,0 +1,521 @@
1
+ "use strict";
2
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
5
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
6
+ };
7
+ var _RedisCachingProvider_instances, _RedisCachingProvider_getKeyName, _RedisCachingProvider_getTagKey, _RedisCachingProvider_getTagsKey, _RedisCachingProvider_getTagDictionaryKey, _RedisCachingProvider_getTagNextIdKey, _RedisCachingProvider_getTagRefCountKey, _RedisCachingProvider_getTagReverseDictionaryKey, _RedisCachingProvider_internTags, _RedisCachingProvider_resolveTagIds, _RedisCachingProvider_decrementTagRefs, _RedisCachingProvider_compressData, _RedisCachingProvider_decompressData;
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.RedisCachingProvider = void 0;
10
+ const zlib_1 = require("zlib");
11
+ class RedisCachingProvider {
12
+ constructor({ redisClient, prefix, hasher, }, options) {
13
+ _RedisCachingProvider_instances.add(this);
14
+ this.redisClient = redisClient;
15
+ this.keyNamePrefix = prefix;
16
+ this.defaultTTL = options?.ttl ?? 3600; // 1 hour default
17
+ this.compressionThreshold = options?.compressionThreshold ?? 2048; // 2KB default
18
+ this.hasher = hasher;
19
+ }
20
+ async get({ key, tags }) {
21
+ if (key) {
22
+ const keyName = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getKeyName).call(this, key);
23
+ const buffer = await this.redisClient.hgetBuffer(keyName, "data");
24
+ if (!buffer) {
25
+ return null;
26
+ }
27
+ const finalData = await __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_decompressData).call(this, buffer);
28
+ return JSON.parse(finalData);
29
+ }
30
+ if (tags?.length) {
31
+ // Get all keys associated with the tags
32
+ const pipeline = this.redisClient.pipeline();
33
+ tags.forEach((tag) => {
34
+ const tagKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagKey).call(this, tag);
35
+ pipeline.smembers(tagKey);
36
+ });
37
+ const tagResults = await pipeline.exec();
38
+ const allKeys = new Set();
39
+ tagResults?.forEach((result, index) => {
40
+ if (result && result[1]) {
41
+ ;
42
+ result[1].forEach((key) => allKeys.add(key));
43
+ }
44
+ });
45
+ if (allKeys.size === 0) {
46
+ return [];
47
+ }
48
+ // Get all hash data for the keys
49
+ const valuePipeline = this.redisClient.pipeline();
50
+ Array.from(allKeys).forEach((key) => {
51
+ valuePipeline.hgetBuffer(key, "data");
52
+ });
53
+ const valueResults = await valuePipeline.exec();
54
+ const results = [];
55
+ const decompressionPromises = (valueResults || []).map(async (result) => {
56
+ if (result && result[1]) {
57
+ const buffer = result[1];
58
+ try {
59
+ const finalData = await __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_decompressData).call(this, buffer);
60
+ return JSON.parse(finalData);
61
+ }
62
+ catch (e) {
63
+ // If JSON parsing fails, skip this entry (corrupted data)
64
+ console.warn(`Skipping corrupted cache entry: ${e.message}`);
65
+ return null;
66
+ }
67
+ }
68
+ return null;
69
+ });
70
+ const decompressionResults = await Promise.all(decompressionPromises);
71
+ results.push(...decompressionResults.filter(Boolean));
72
+ return results;
73
+ }
74
+ return null;
75
+ }
76
+ async set({ key, data, ttl, tags, options, }) {
77
+ const keyName = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getKeyName).call(this, key);
78
+ const serializedData = JSON.stringify(data);
79
+ const effectiveTTL = ttl ?? this.defaultTTL;
80
+ const finalData = await __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_compressData).call(this, serializedData);
81
+ let tagIds = [];
82
+ if (tags?.length) {
83
+ tagIds = await __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_internTags).call(this, tags);
84
+ }
85
+ const setPipeline = this.redisClient.pipeline();
86
+ // Main data with conditional operations
87
+ setPipeline.hsetnx(keyName, "data", finalData);
88
+ if (options && Object.keys(options).length) {
89
+ setPipeline.hset(keyName, "options", JSON.stringify(options));
90
+ }
91
+ if (effectiveTTL) {
92
+ setPipeline.expire(keyName, effectiveTTL);
93
+ }
94
+ // Store tag IDs if present
95
+ if (tags?.length && tagIds.length) {
96
+ const tagsKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagsKey).call(this, key);
97
+ const buffer = Buffer.alloc(tagIds.length * 4);
98
+ tagIds.forEach((id, index) => {
99
+ buffer.writeUInt32LE(id, index * 4);
100
+ });
101
+ if (effectiveTTL) {
102
+ setPipeline.set(tagsKey, buffer, "EX", effectiveTTL + 60, "NX");
103
+ }
104
+ else {
105
+ setPipeline.setnx(tagsKey, buffer);
106
+ }
107
+ // Add tag operations to the same pipeline
108
+ tags.forEach((tag) => {
109
+ const tagKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagKey).call(this, tag);
110
+ setPipeline.sadd(tagKey, keyName);
111
+ if (effectiveTTL) {
112
+ setPipeline.expire(tagKey, effectiveTTL + 60);
113
+ }
114
+ });
115
+ }
116
+ await setPipeline.exec();
117
+ }
118
+ async clear({ key, tags, options, }) {
119
+ if (key) {
120
+ const keyName = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getKeyName).call(this, key);
121
+ const tagsKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagsKey).call(this, key);
122
+ const clearPipeline = this.redisClient.pipeline();
123
+ // Get tags for cleanup and delete main key in same pipeline
124
+ clearPipeline.getBuffer(tagsKey);
125
+ clearPipeline.unlink(keyName);
126
+ const results = await clearPipeline.exec();
127
+ const tagsBuffer = results?.[0]?.[1];
128
+ if (tagsBuffer?.length) {
129
+ try {
130
+ // Binary format: array of 32-bit integers
131
+ const tagIds = [];
132
+ for (let i = 0; i < tagsBuffer.length; i += 4) {
133
+ tagIds.push(tagsBuffer.readUInt32LE(i));
134
+ }
135
+ if (tagIds.length) {
136
+ const entryTags = await __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_resolveTagIds).call(this, tagIds);
137
+ const tagCleanupPipeline = this.redisClient.pipeline();
138
+ entryTags.forEach((tag) => {
139
+ const tagKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagKey).call(this, tag, { isHashed: true });
140
+ tagCleanupPipeline.srem(tagKey, keyName);
141
+ });
142
+ tagCleanupPipeline.unlink(tagsKey);
143
+ await tagCleanupPipeline.exec();
144
+ // Decrement reference counts and cleanup unused tags
145
+ await __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_decrementTagRefs).call(this, tagIds);
146
+ }
147
+ }
148
+ catch (e) {
149
+ // noop - corrupted tag data, skip cleanup
150
+ }
151
+ }
152
+ return;
153
+ }
154
+ if (tags?.length) {
155
+ // Handle wildcard tag to clear all cache data
156
+ if (tags.includes("*")) {
157
+ await this.flush();
158
+ return;
159
+ }
160
+ // Get all keys associated with the tags
161
+ const pipeline = this.redisClient.pipeline();
162
+ tags.forEach((tag) => {
163
+ const tagKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagKey).call(this, tag);
164
+ pipeline.smembers(tagKey);
165
+ });
166
+ const tagResults = await pipeline.exec();
167
+ const allKeys = new Set();
168
+ tagResults?.forEach((result) => {
169
+ if (result && result[1]) {
170
+ ;
171
+ result[1].forEach((key) => allKeys.add(key));
172
+ }
173
+ });
174
+ if (allKeys.size) {
175
+ // If no options provided (user explicit call), clear everything
176
+ if (!options) {
177
+ const deletePipeline = this.redisClient.pipeline();
178
+ // Delete main keys and options
179
+ Array.from(allKeys).forEach((key) => {
180
+ deletePipeline.unlink(key);
181
+ });
182
+ // Clean up tag references for each key
183
+ const tagDataPromises = Array.from(allKeys).map(async (key) => {
184
+ const keyWithoutPrefix = key.replace(this.keyNamePrefix, "");
185
+ const tagsKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagsKey).call(this, keyWithoutPrefix);
186
+ const tagsData = await this.redisClient.getBuffer(tagsKey);
187
+ return { key, tagsKey, tagsData };
188
+ });
189
+ const tagResults = await Promise.all(tagDataPromises);
190
+ // Build single pipeline for all tag cleanup operations
191
+ const tagCleanupPipeline = this.redisClient.pipeline();
192
+ const cleanupPromises = tagResults.map(async ({ key, tagsKey, tagsData }) => {
193
+ if (tagsData) {
194
+ try {
195
+ // Binary format: array of 32-bit integers
196
+ const tagIds = [];
197
+ for (let i = 0; i < tagsData.length; i += 4) {
198
+ tagIds.push(tagsData.readUInt32LE(i));
199
+ }
200
+ if (tagIds.length) {
201
+ const entryTags = await __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_resolveTagIds).call(this, tagIds);
202
+ entryTags.forEach((tag) => {
203
+ const tagKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagKey).call(this, tag, { isHashed: true });
204
+ tagCleanupPipeline.srem(tagKey, key);
205
+ });
206
+ tagCleanupPipeline.unlink(tagsKey);
207
+ // Decrement reference counts and cleanup unused tags
208
+ await __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_decrementTagRefs).call(this, tagIds);
209
+ }
210
+ }
211
+ catch (e) {
212
+ // noop
213
+ }
214
+ }
215
+ });
216
+ await Promise.all(cleanupPromises);
217
+ await tagCleanupPipeline.exec();
218
+ await deletePipeline.exec();
219
+ // Clean up empty tag sets
220
+ const allTagKeys = await this.redisClient.keys(`${this.keyNamePrefix}tag:*`);
221
+ if (allTagKeys.length) {
222
+ const cardinalityPipeline = this.redisClient.pipeline();
223
+ allTagKeys.forEach((tagKey) => {
224
+ cardinalityPipeline.scard(tagKey);
225
+ });
226
+ const cardinalityResults = await cardinalityPipeline.exec();
227
+ // Delete empty tag keys
228
+ const emptyTagPipeline = this.redisClient.pipeline();
229
+ cardinalityResults?.forEach((result, index) => {
230
+ if (result && result[1] === 0) {
231
+ emptyTagPipeline.unlink(allTagKeys[index]);
232
+ }
233
+ });
234
+ await emptyTagPipeline.exec();
235
+ }
236
+ return;
237
+ }
238
+ // If autoInvalidate is true (strategy call), only clear entries with autoInvalidate=true (default)
239
+ if (options.autoInvalidate === true) {
240
+ const optionsPipeline = this.redisClient.pipeline();
241
+ Array.from(allKeys).forEach((key) => {
242
+ optionsPipeline.hget(key, "options");
243
+ });
244
+ const optionsResults = await optionsPipeline.exec();
245
+ const keysToDelete = [];
246
+ Array.from(allKeys).forEach((key, index) => {
247
+ const optionsResult = optionsResults?.[index];
248
+ if (optionsResult && optionsResult[1]) {
249
+ try {
250
+ const entryOptions = JSON.parse(optionsResult[1]);
251
+ // Delete if entry has autoInvalidate=true or no setting (default true)
252
+ const shouldAutoInvalidate = entryOptions.autoInvalidate ?? true;
253
+ if (shouldAutoInvalidate) {
254
+ keysToDelete.push(key);
255
+ }
256
+ }
257
+ catch (e) {
258
+ // If can't parse options, assume it's safe to delete (default true)
259
+ keysToDelete.push(key);
260
+ }
261
+ }
262
+ else {
263
+ // No options stored, default to true
264
+ keysToDelete.push(key);
265
+ }
266
+ });
267
+ if (keysToDelete.length) {
268
+ const deletePipeline = this.redisClient.pipeline();
269
+ keysToDelete.forEach((key) => {
270
+ deletePipeline.unlink(key);
271
+ });
272
+ // Clean up tag references for each key to delete
273
+ const tagDataPromises = keysToDelete.map(async (key) => {
274
+ const keyWithoutPrefix = key.replace(this.keyNamePrefix, "");
275
+ const tagsKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagsKey).call(this, keyWithoutPrefix);
276
+ const tagsData = await this.redisClient.getBuffer(tagsKey);
277
+ return { key, tagsKey, tagsData };
278
+ });
279
+ // Wait for all tag data fetches
280
+ const tagResults = await Promise.all(tagDataPromises);
281
+ // Build single pipeline for all tag cleanup operations
282
+ const tagCleanupPipeline = this.redisClient.pipeline();
283
+ const cleanupPromises = tagResults.map(async ({ key, tagsKey, tagsData }) => {
284
+ if (tagsData) {
285
+ try {
286
+ // Binary format: array of 32-bit integers
287
+ const tagIds = [];
288
+ for (let i = 0; i < tagsData.length; i += 4) {
289
+ tagIds.push(tagsData.readUInt32LE(i));
290
+ }
291
+ if (tagIds.length) {
292
+ const entryTags = await __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_resolveTagIds).call(this, tagIds);
293
+ entryTags.forEach((tag) => {
294
+ const tagKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagKey).call(this, tag, { isHashed: true });
295
+ tagCleanupPipeline.srem(tagKey, key);
296
+ });
297
+ tagCleanupPipeline.unlink(tagsKey); // Delete the tags key
298
+ // Decrement reference counts and cleanup unused tags
299
+ await __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_decrementTagRefs).call(this, tagIds);
300
+ }
301
+ }
302
+ catch (e) {
303
+ // noop
304
+ }
305
+ }
306
+ });
307
+ await Promise.all(cleanupPromises);
308
+ await tagCleanupPipeline.exec();
309
+ await deletePipeline.exec();
310
+ // Clean up empty tag sets
311
+ const allTagKeys = await this.redisClient.keys(`${this.keyNamePrefix}tag:*`);
312
+ if (allTagKeys.length) {
313
+ const cleanupPipeline = this.redisClient.pipeline();
314
+ allTagKeys.forEach((tagKey) => {
315
+ cleanupPipeline.scard(tagKey);
316
+ });
317
+ const cardinalityResults = await cleanupPipeline.exec();
318
+ // Delete tag keys that are now empty
319
+ const emptyTagDeletePipeline = this.redisClient.pipeline();
320
+ cardinalityResults?.forEach((result, index) => {
321
+ if (result && result[1] === 0) {
322
+ emptyTagDeletePipeline.unlink(allTagKeys[index]);
323
+ }
324
+ });
325
+ await emptyTagDeletePipeline.exec();
326
+ }
327
+ return;
328
+ }
329
+ }
330
+ }
331
+ }
332
+ }
333
+ async flush() {
334
+ // Use SCAN to find ALL keys with our prefix and delete them
335
+ // This includes main cache keys, tag keys (tag:*), and tags keys (tags:*)
336
+ const pattern = `${this.keyNamePrefix}*`;
337
+ let cursor = "0";
338
+ do {
339
+ const result = await this.redisClient.scan(cursor, "MATCH", pattern, "COUNT", 1000);
340
+ cursor = result[0];
341
+ const keys = result[1];
342
+ if (keys.length) {
343
+ await this.redisClient.unlink(...keys);
344
+ }
345
+ } while (cursor !== "0");
346
+ }
347
+ }
348
+ exports.RedisCachingProvider = RedisCachingProvider;
349
+ _RedisCachingProvider_instances = new WeakSet(), _RedisCachingProvider_getKeyName = function _RedisCachingProvider_getKeyName(key) {
350
+ return `${this.keyNamePrefix}${key}`;
351
+ }, _RedisCachingProvider_getTagKey = function _RedisCachingProvider_getTagKey(tag, { isHashed = false } = {}) {
352
+ return `${this.keyNamePrefix}tag:${isHashed ? tag : this.hasher(tag)}`;
353
+ }, _RedisCachingProvider_getTagsKey = function _RedisCachingProvider_getTagsKey(key) {
354
+ return `${this.keyNamePrefix}tags:${key}`;
355
+ }, _RedisCachingProvider_getTagDictionaryKey = function _RedisCachingProvider_getTagDictionaryKey() {
356
+ return `${this.keyNamePrefix}tag:dictionary`;
357
+ }, _RedisCachingProvider_getTagNextIdKey = function _RedisCachingProvider_getTagNextIdKey() {
358
+ return `${this.keyNamePrefix}tag:next_id`;
359
+ }, _RedisCachingProvider_getTagRefCountKey = function _RedisCachingProvider_getTagRefCountKey() {
360
+ return `${this.keyNamePrefix}tag:refs`;
361
+ }, _RedisCachingProvider_getTagReverseDictionaryKey = function _RedisCachingProvider_getTagReverseDictionaryKey() {
362
+ return `${this.keyNamePrefix}tag:reverse_dict`;
363
+ }, _RedisCachingProvider_internTags = async function _RedisCachingProvider_internTags(tags) {
364
+ const pipeline = this.redisClient.pipeline();
365
+ const dictionaryKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagDictionaryKey).call(this);
366
+ const hashedTags = tags.map((tag) => this.hasher(tag));
367
+ // Get existing tag IDs
368
+ hashedTags.forEach((tag) => {
369
+ pipeline.hget(dictionaryKey, tag);
370
+ });
371
+ const results = await pipeline.exec();
372
+ const tagIds = [];
373
+ const newTags = [];
374
+ for (let i = 0; i < hashedTags.length; i++) {
375
+ const result = results?.[i];
376
+ if (result && result[1]) {
377
+ tagIds[i] = parseInt(result[1]);
378
+ }
379
+ else {
380
+ const hashedTag = hashedTags[i];
381
+ newTags.push(hashedTag);
382
+ tagIds[i] = -1; // Placeholder for new tags
383
+ }
384
+ }
385
+ // Create IDs for new tags
386
+ if (newTags.length) {
387
+ const nextIdKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagNextIdKey).call(this);
388
+ const reverseDictKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagReverseDictionaryKey).call(this);
389
+ const refCountKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagRefCountKey).call(this);
390
+ const startId = await this.redisClient.incrby(nextIdKey, newTags.length);
391
+ const batchPipeline = this.redisClient.pipeline();
392
+ newTags.forEach((tag, index) => {
393
+ const newId = startId - newTags.length + index + 1;
394
+ // Store in both forward and reverse dictionaries
395
+ batchPipeline.hset(dictionaryKey, tag, newId.toString());
396
+ batchPipeline.hset(reverseDictKey, newId.toString(), tag);
397
+ // Update the tagIds array
398
+ const originalIndex = hashedTags.indexOf(tag);
399
+ tagIds[originalIndex] = newId;
400
+ });
401
+ // Add reference count increments to the same pipeline
402
+ tagIds.forEach((id) => {
403
+ if (id !== -1) {
404
+ batchPipeline.hincrby(refCountKey, id.toString(), 1);
405
+ }
406
+ });
407
+ await batchPipeline.exec();
408
+ }
409
+ else {
410
+ // Only increment reference count for existing tags
411
+ const refCountKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagRefCountKey).call(this);
412
+ const refPipeline = this.redisClient.pipeline();
413
+ tagIds.forEach((id) => {
414
+ refPipeline.hincrby(refCountKey, id.toString(), 1);
415
+ });
416
+ await refPipeline.exec();
417
+ }
418
+ return tagIds;
419
+ }, _RedisCachingProvider_resolveTagIds = async function _RedisCachingProvider_resolveTagIds(tagIds) {
420
+ if (tagIds.length === 0)
421
+ return [];
422
+ const reverseDictKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagReverseDictionaryKey).call(this);
423
+ const pipeline = this.redisClient.pipeline();
424
+ tagIds.forEach((id) => {
425
+ pipeline.hget(reverseDictKey, id.toString());
426
+ });
427
+ const results = await pipeline.exec();
428
+ return results?.map((result) => result?.[1]).filter(Boolean) || [];
429
+ }, _RedisCachingProvider_decrementTagRefs = async function _RedisCachingProvider_decrementTagRefs(tagIds) {
430
+ if (tagIds.length === 0)
431
+ return;
432
+ const refCountKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagRefCountKey).call(this);
433
+ const dictionaryKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagDictionaryKey).call(this);
434
+ // Decrement reference counts and collect tags with zero refs
435
+ const pipeline = this.redisClient.pipeline();
436
+ tagIds.forEach((id) => {
437
+ pipeline.hincrby(refCountKey, id.toString(), -1);
438
+ });
439
+ const results = await pipeline.exec();
440
+ const tagsToCleanup = [];
441
+ // Find tags that now have zero references
442
+ results?.forEach((result, index) => {
443
+ if (result && result[1] === 0) {
444
+ tagsToCleanup.push(tagIds[index]);
445
+ }
446
+ });
447
+ // Clean up tags with zero references
448
+ if (tagsToCleanup.length) {
449
+ const cleanupPipeline = this.redisClient.pipeline();
450
+ const reverseDictKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagReverseDictionaryKey).call(this);
451
+ // Get tag names before deleting them
452
+ const tagNames = await __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_resolveTagIds).call(this, tagsToCleanup);
453
+ tagsToCleanup.forEach((id, index) => {
454
+ const idStr = id.toString();
455
+ // Remove from reference count hash
456
+ cleanupPipeline.hdel(refCountKey, idStr);
457
+ // Remove from reverse dictionary
458
+ cleanupPipeline.hdel(reverseDictKey, idStr);
459
+ // Remove from forward dictionary
460
+ if (tagNames[index]) {
461
+ cleanupPipeline.hdel(dictionaryKey, tagNames[index]);
462
+ }
463
+ });
464
+ await cleanupPipeline.exec();
465
+ }
466
+ }, _RedisCachingProvider_compressData = async function _RedisCachingProvider_compressData(data) {
467
+ if (data.length <= this.compressionThreshold) {
468
+ const buffer = Buffer.from(data, "utf8");
469
+ const prefix = Buffer.from([0]); // 0 = uncompressed
470
+ return Buffer.concat([prefix, buffer]);
471
+ }
472
+ return new Promise((resolve, reject) => {
473
+ const chunks = [];
474
+ const gzip = (0, zlib_1.createGzip)();
475
+ gzip.on("data", (chunk) => chunks.push(chunk));
476
+ gzip.on("end", () => {
477
+ const compressedBuffer = Buffer.concat(chunks);
478
+ const prefix = Buffer.from([1]); // 1 = compressed
479
+ resolve(Buffer.concat([prefix, compressedBuffer]));
480
+ });
481
+ gzip.on("error", (error) => {
482
+ const buffer = Buffer.from(data, "utf8");
483
+ const prefix = Buffer.from([0]);
484
+ resolve(Buffer.concat([prefix, buffer]));
485
+ });
486
+ gzip.write(data, "utf8");
487
+ gzip.end();
488
+ });
489
+ }, _RedisCachingProvider_decompressData = async function _RedisCachingProvider_decompressData(buffer) {
490
+ if (buffer.length === 0) {
491
+ return "";
492
+ }
493
+ const formatByte = buffer[0];
494
+ const dataBuffer = buffer.subarray(1);
495
+ if (formatByte === 0) {
496
+ // Uncompressed
497
+ return dataBuffer.toString("utf8");
498
+ }
499
+ if (formatByte === 1) {
500
+ // Compressed with gzip
501
+ return new Promise((resolve, reject) => {
502
+ const chunks = [];
503
+ const gunzip = (0, zlib_1.createGunzip)();
504
+ gunzip.on("data", (chunk) => chunks.push(chunk));
505
+ gunzip.on("end", () => {
506
+ const decompressed = Buffer.concat(chunks).toString("utf8");
507
+ resolve(decompressed);
508
+ });
509
+ gunzip.on("error", (error) => {
510
+ // Fallback: return as-is if decompression fails
511
+ resolve(dataBuffer.toString("utf8"));
512
+ });
513
+ gunzip.write(dataBuffer);
514
+ gunzip.end();
515
+ });
516
+ }
517
+ // Unknown format, return as UTF-8
518
+ return buffer.toString("utf8");
519
+ };
520
+ RedisCachingProvider.identifier = "cache-redis";
521
+ //# sourceMappingURL=redis-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-cache.js","sourceRoot":"","sources":["../../src/services/redis-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"root":["../src/index.ts","../src/loaders/connection.ts","../src/loaders/hash.ts","../src/services/redis-cache.ts","../src/types/index.ts"],"version":"5.6.2"}
@@ -0,0 +1,27 @@
1
+ export interface RedisCacheModuleOptions {
2
+ /**
3
+ * TTL in milliseconds
4
+ */
5
+ ttl?: number;
6
+ /**
7
+ * Connection timeout in milliseconds
8
+ */
9
+ connectTimeout?: number;
10
+ /**
11
+ * Lazyload connections
12
+ */
13
+ lazyConnect?: boolean;
14
+ /**
15
+ * Connection retries
16
+ */
17
+ retryDelayOnFailover?: number;
18
+ /**
19
+ * Key prefix for all cache keys
20
+ */
21
+ prefix?: string;
22
+ /**
23
+ * Minimum size in bytes to compress data (default: 1024)
24
+ */
25
+ compressionThreshold?: number;
26
+ }
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;OAEG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;OAEG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@medusajs/caching-redis",
3
+ "version": "2.10.4-preview-20250930180200",
4
+ "description": "Redis Caching for Medusa",
5
+ "main": "dist/index.js",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/medusajs/medusa",
9
+ "directory": "packages/modules/providers/caching-redis"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "!dist/**/__tests__",
14
+ "!dist/**/__mocks__",
15
+ "!dist/**/__fixtures__"
16
+ ],
17
+ "engines": {
18
+ "node": ">=20"
19
+ },
20
+ "author": "Medusa",
21
+ "license": "MIT",
22
+ "devDependencies": {
23
+ "@medusajs/framework": "2.10.4-preview-20250930180200",
24
+ "@swc/core": "^1.7.28",
25
+ "@swc/jest": "^0.2.36",
26
+ "jest": "^29.7.0",
27
+ "rimraf": "^5.0.1",
28
+ "typescript": "^5.6.2"
29
+ },
30
+ "peerDependencies": {
31
+ "@medusajs/framework": "2.10.4-preview-20250930180200"
32
+ },
33
+ "dependencies": {
34
+ "ioredis": "^5.4.1",
35
+ "xxhash-wasm": "^1.1.0"
36
+ },
37
+ "scripts": {
38
+ "watch": "tsc --build --watch",
39
+ "watch:test": "tsc --build tsconfig.spec.json --watch",
40
+ "resolve:aliases": "tsc --showConfig -p tsconfig.json > tsconfig.resolved.json && tsc-alias -p tsconfig.resolved.json && rimraf tsconfig.resolved.json",
41
+ "build": "rimraf dist && tsc --build && npm run resolve:aliases",
42
+ "test": "jest --passWithNoTests src",
43
+ "test:integration": "jest --forceExit --passWithNoTests"
44
+ },
45
+ "keywords": [
46
+ "medusa-providers",
47
+ "medusa-providers-cache"
48
+ ]
49
+ }