@acmekit/caching-redis 2.13.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.
@@ -0,0 +1,3 @@
1
+ declare const _default: import("@acmekit/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("@acmekit/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,oDAAkE;AAClE,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 "@acmekit/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,0BAA0B,CAAA;yBAK/B,iCAIG,aAAa,CACd,CACI,eAAe,CAAC,8BAA8B,GAC9C,eAAe,CAAC,6CAA6C,CAChE,GAAG;IAAE,MAAM,CAAC,EAAE,GAAG,CAAA;CAAE,CACrB,EACD,oBAAoB,yBAAyB,KAC5C,OAAO,CAAC,IAAI,CAAC;AAZhB,wBAgFC"}
@@ -0,0 +1,63 @@
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
+ const { redisUrl, ...redisOptions_ } = moduleOptions;
13
+ if (!redisUrl) {
14
+ throw new Error("[caching-redis] redisUrl is required");
15
+ }
16
+ let redisClient;
17
+ const redisOptions = {
18
+ connectTimeout: 10000,
19
+ commandTimeout: 5000,
20
+ lazyConnect: true,
21
+ maxRetriesPerRequest: 3,
22
+ enableOfflineQueue: true,
23
+ connectionName: "acmekit-cache-redis",
24
+ ...redisOptions_,
25
+ };
26
+ redisClient = new ioredis_1.default(redisUrl, redisOptions);
27
+ // Handle connection errors gracefully
28
+ redisClient.on("error", (error) => {
29
+ logger_.warn(`Redis cache connection error: ${error.message}`);
30
+ });
31
+ redisClient.on("connect", () => {
32
+ logger_.info("Redis cache connection established successfully");
33
+ });
34
+ redisClient.on("ready", () => {
35
+ logger_.info("Redis cache is ready to accept commands");
36
+ });
37
+ redisClient.on("close", () => {
38
+ logger_.warn("Redis cache connection closed");
39
+ });
40
+ redisClient.on("reconnecting", () => {
41
+ logger_.info("Redis cache attempting to reconnect...");
42
+ });
43
+ try {
44
+ // Test connection with timeout
45
+ await redisClient.ping();
46
+ logger_.info("Redis cache connection test successful");
47
+ }
48
+ catch (error) {
49
+ logger_.warn(`Redis cache connection test failed: ${error.message}, but continuing with lazy connection`);
50
+ }
51
+ container.register({
52
+ redisClient: {
53
+ resolve: () => redisClient,
54
+ },
55
+ prefix: {
56
+ resolve: () => moduleOptions.prefix ?? "mc:",
57
+ },
58
+ logger: {
59
+ resolve: () => logger_,
60
+ },
61
+ });
62
+ };
63
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/loaders/connection.ts"],"names":[],"mappings":";;;;;AAMA,sDAAkD;AAElD,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,CAA4B,CAAA;IAEhC,MAAM,EAAE,QAAQ,EAAE,GAAG,aAAa,EAAE,GAAG,aAAa,CAAA;IACpD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;IACzD,CAAC;IAED,IAAI,WAAkB,CAAA;IAEtB,MAAM,YAAY,GAAiB;QACjC,cAAc,EAAE,KAAK;QACrB,cAAc,EAAE,IAAI;QACpB,WAAW,EAAE,IAAI;QACjB,oBAAoB,EAAE,CAAC;QACvB,kBAAkB,EAAE,IAAI;QACxB,cAAc,EAAE,qBAAqB;QACrC,GAAG,aAAa;KACjB,CAAA;IAED,WAAW,GAAG,IAAI,iBAAK,CAAC,QAAS,EAAE,YAAY,CAAC,CAAA;IAEhD,sCAAsC;IACtC,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QAChC,OAAO,CAAC,IAAI,CAAC,iCAAiC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;IAEF,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QAC7B,OAAO,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;IAEF,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QAC3B,OAAO,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAA;IACzD,CAAC,CAAC,CAAA;IAEF,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QAC3B,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,WAAW,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;QAClC,OAAO,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC;QACH,+BAA+B;QAC/B,MAAM,WAAW,CAAC,IAAI,EAAE,CAAA;QACxB,OAAO,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAA;IACxD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CACV,uCAAuC,KAAK,CAAC,OAAO,uCAAuC,CAC5F,CAAA;IACH,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;QACD,MAAM,EAAE;YACN,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO;SACvB;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":"yBAEsB;;CAAa;AAAnC,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,43 @@
1
+ import { Logger } from "@acmekit/framework/types";
2
+ import { RedisCacheModuleOptions } from "../types";
3
+ import { Redis } from "ioredis";
4
+ export declare class RedisCachingProvider {
5
+ #private;
6
+ static identifier: string;
7
+ protected redisClient: Redis;
8
+ protected keyNamePrefix: string;
9
+ protected defaultTTL: number;
10
+ protected compressionThreshold: number;
11
+ protected hasher: (key: string) => string;
12
+ protected logger: Logger;
13
+ constructor({ redisClient, logger, prefix, hasher, }: {
14
+ redisClient: Redis;
15
+ prefix: string;
16
+ hasher: (key: string) => string;
17
+ logger: Logger;
18
+ }, options?: RedisCacheModuleOptions);
19
+ private isConnectionError;
20
+ private isConnectionHealthy;
21
+ get({ key, tags }: {
22
+ key?: string;
23
+ tags?: string[];
24
+ }): Promise<any>;
25
+ set({ key, data, ttl, tags, options, }: {
26
+ key: string;
27
+ data: object;
28
+ ttl?: number;
29
+ tags?: string[];
30
+ options?: {
31
+ autoInvalidate?: boolean;
32
+ };
33
+ }): Promise<void>;
34
+ clear({ key, tags, options, }: {
35
+ key?: string;
36
+ tags?: string[];
37
+ options?: {
38
+ autoInvalidate?: boolean;
39
+ };
40
+ }): Promise<void>;
41
+ flush(): Promise<void>;
42
+ }
43
+ //# 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,MAAM,EAAE,MAAM,0BAA0B,CAAA;AACjD,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;IACzC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAA;gBAGtB,EACE,WAAW,EACX,MAAM,EACN,MAAM,EACN,MAAM,GACP,EAAE;QACD,WAAW,EAAE,KAAK,CAAA;QAClB,MAAM,EAAE,MAAM,CAAA;QACd,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;QAC/B,MAAM,EAAE,MAAM,CAAA;KACf,EACD,OAAO,CAAC,EAAE,uBAAuB;IAUnC,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,mBAAmB;IAqOrB,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;IA4FnE,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;IA4DX,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;IAwRX,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAgC7B"}
@@ -0,0 +1,588 @@
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, logger, 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
+ this.logger = logger;
20
+ }
21
+ isConnectionError(error) {
22
+ return (error.code === "ECONNREFUSED" ||
23
+ error.code === "ENOTFOUND" ||
24
+ error.code === "ETIMEDOUT" ||
25
+ error.code === "ECONNRESET" ||
26
+ error.code === "EPIPE" ||
27
+ error.message?.includes("Connection is closed") ||
28
+ error.message?.includes("connect ECONNREFUSED") ||
29
+ error.message?.includes("connect ETIMEDOUT") ||
30
+ error.message?.includes("Command timed out") ||
31
+ error.message?.includes("Maximum number of retries exceeded") ||
32
+ ["connecting", "reconnecting", "disconnecting", "wait", "end"].includes(this.redisClient.status));
33
+ }
34
+ isConnectionHealthy() {
35
+ return this.redisClient.status === "ready";
36
+ }
37
+ async get({ key, tags }) {
38
+ if (!this.isConnectionHealthy()) {
39
+ return null;
40
+ }
41
+ if (key) {
42
+ try {
43
+ const keyName = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getKeyName).call(this, key);
44
+ const buffer = await this.redisClient.hgetBuffer(keyName, "data");
45
+ if (!buffer) {
46
+ return null;
47
+ }
48
+ const finalData = await __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_decompressData).call(this, buffer);
49
+ return JSON.parse(finalData);
50
+ }
51
+ catch (error) {
52
+ if (this.isConnectionError(error)) {
53
+ this.logger.warn("Redis connection error during get operation, returning null to trigger fallback to original data source");
54
+ return null;
55
+ }
56
+ throw error;
57
+ }
58
+ }
59
+ if (tags?.length) {
60
+ try {
61
+ // Get all keys associated with the tags
62
+ const pipeline = this.redisClient.pipeline();
63
+ tags.forEach((tag) => {
64
+ const tagKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagKey).call(this, tag);
65
+ pipeline.smembers(tagKey);
66
+ });
67
+ const tagResults = await pipeline.exec();
68
+ const allKeys = new Set();
69
+ tagResults?.forEach((result, index) => {
70
+ if (result && result[1]) {
71
+ ;
72
+ result[1].forEach((key) => allKeys.add(key));
73
+ }
74
+ });
75
+ if (allKeys.size === 0) {
76
+ return [];
77
+ }
78
+ // Get all hash data for the keys
79
+ const valuePipeline = this.redisClient.pipeline();
80
+ Array.from(allKeys).forEach((key) => {
81
+ valuePipeline.hgetBuffer(key, "data");
82
+ });
83
+ const valueResults = await valuePipeline.exec();
84
+ const results = [];
85
+ const decompressionPromises = (valueResults || []).map(async (result) => {
86
+ if (result && result[1]) {
87
+ const buffer = result[1];
88
+ try {
89
+ const finalData = await __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_decompressData).call(this, buffer);
90
+ return JSON.parse(finalData);
91
+ }
92
+ catch (e) {
93
+ // If JSON parsing fails, skip this entry (corrupted data)
94
+ this.logger.warn(`Skipping corrupted cache entry: ${e.message}`);
95
+ return null;
96
+ }
97
+ }
98
+ return null;
99
+ });
100
+ const decompressionResults = await Promise.all(decompressionPromises);
101
+ results.push(...decompressionResults.filter(Boolean));
102
+ return results;
103
+ }
104
+ catch (error) {
105
+ if (this.isConnectionError(error)) {
106
+ this.logger.warn("Redis connection error during get operation, returning empty array to trigger fallback to original data source");
107
+ return null;
108
+ }
109
+ throw error;
110
+ }
111
+ }
112
+ return null;
113
+ }
114
+ async set({ key, data, ttl, tags, options, }) {
115
+ try {
116
+ const keyName = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getKeyName).call(this, key);
117
+ const serializedData = JSON.stringify(data);
118
+ const effectiveTTL = ttl ?? this.defaultTTL;
119
+ const finalData = await __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_compressData).call(this, serializedData);
120
+ let tagIds = [];
121
+ if (tags?.length) {
122
+ tagIds = await __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_internTags).call(this, tags);
123
+ }
124
+ const setPipeline = this.redisClient.pipeline();
125
+ // Main data with conditional operations
126
+ setPipeline.hsetnx(keyName, "data", finalData);
127
+ if (options && Object.keys(options).length) {
128
+ setPipeline.hset(keyName, "options", JSON.stringify(options));
129
+ }
130
+ if (effectiveTTL) {
131
+ setPipeline.expire(keyName, effectiveTTL);
132
+ }
133
+ // Store tag IDs if present
134
+ if (tags?.length && tagIds.length) {
135
+ const tagsKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagsKey).call(this, key);
136
+ const buffer = Buffer.alloc(tagIds.length * 4);
137
+ tagIds.forEach((id, index) => {
138
+ buffer.writeUInt32LE(id, index * 4);
139
+ });
140
+ if (effectiveTTL) {
141
+ setPipeline.set(tagsKey, buffer, "EX", effectiveTTL + 60, "NX");
142
+ }
143
+ else {
144
+ setPipeline.setnx(tagsKey, buffer);
145
+ }
146
+ // Add tag operations to the same pipeline
147
+ tags.forEach((tag) => {
148
+ const tagKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagKey).call(this, tag);
149
+ setPipeline.sadd(tagKey, keyName);
150
+ if (effectiveTTL) {
151
+ setPipeline.expire(tagKey, effectiveTTL + 60);
152
+ }
153
+ });
154
+ }
155
+ await setPipeline.exec();
156
+ }
157
+ catch (error) {
158
+ if (this.isConnectionError(error)) {
159
+ this.logger.warn("Redis connection error during set operation, relying on IORedis retry mechanism");
160
+ return;
161
+ }
162
+ throw error;
163
+ }
164
+ }
165
+ async clear({ key, tags, options, }) {
166
+ try {
167
+ if (key) {
168
+ const keyName = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getKeyName).call(this, key);
169
+ const tagsKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagsKey).call(this, key);
170
+ const clearPipeline = this.redisClient.pipeline();
171
+ // Get tags for cleanup and delete main key in same pipeline
172
+ clearPipeline.getBuffer(tagsKey);
173
+ clearPipeline.unlink(keyName);
174
+ const results = await clearPipeline.exec();
175
+ const tagsBuffer = results?.[0]?.[1];
176
+ if (tagsBuffer?.length) {
177
+ try {
178
+ // Binary format: array of 32-bit integers
179
+ const tagIds = [];
180
+ for (let i = 0; i < tagsBuffer.length; i += 4) {
181
+ tagIds.push(tagsBuffer.readUInt32LE(i));
182
+ }
183
+ if (tagIds.length) {
184
+ const entryTags = await __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_resolveTagIds).call(this, tagIds);
185
+ const tagCleanupPipeline = this.redisClient.pipeline();
186
+ entryTags.forEach((tag) => {
187
+ const tagKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagKey).call(this, tag, { isHashed: true });
188
+ tagCleanupPipeline.srem(tagKey, keyName);
189
+ });
190
+ tagCleanupPipeline.unlink(tagsKey);
191
+ await tagCleanupPipeline.exec();
192
+ // Decrement reference counts and cleanup unused tags
193
+ await __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_decrementTagRefs).call(this, tagIds);
194
+ }
195
+ }
196
+ catch (e) {
197
+ // noop - corrupted tag data, skip cleanup
198
+ }
199
+ }
200
+ return;
201
+ }
202
+ if (tags?.length) {
203
+ // Handle wildcard tag to clear all cache data
204
+ if (tags.includes("*")) {
205
+ await this.flush();
206
+ return;
207
+ }
208
+ // Get all keys associated with the tags
209
+ const pipeline = this.redisClient.pipeline();
210
+ tags.forEach((tag) => {
211
+ const tagKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagKey).call(this, tag);
212
+ pipeline.smembers(tagKey);
213
+ });
214
+ const tagResults = await pipeline.exec();
215
+ const allKeys = new Set();
216
+ tagResults?.forEach((result) => {
217
+ if (result && result[1]) {
218
+ ;
219
+ result[1].forEach((key) => allKeys.add(key));
220
+ }
221
+ });
222
+ if (allKeys.size) {
223
+ // If no options provided (user explicit call), clear everything
224
+ if (!options) {
225
+ const deletePipeline = this.redisClient.pipeline();
226
+ // Delete main keys and options
227
+ Array.from(allKeys).forEach((key) => {
228
+ deletePipeline.unlink(key);
229
+ });
230
+ // Clean up tag references for each key
231
+ const tagDataPromises = Array.from(allKeys).map(async (key) => {
232
+ const keyWithoutPrefix = key.replace(this.keyNamePrefix, "");
233
+ const tagsKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagsKey).call(this, keyWithoutPrefix);
234
+ const tagsData = await this.redisClient.getBuffer(tagsKey);
235
+ return { key, tagsKey, tagsData };
236
+ });
237
+ const tagResults = await Promise.all(tagDataPromises);
238
+ // Build single pipeline for all tag cleanup operations
239
+ const tagCleanupPipeline = this.redisClient.pipeline();
240
+ const cleanupPromises = tagResults.map(async ({ key, tagsKey, tagsData }) => {
241
+ if (tagsData) {
242
+ try {
243
+ // Binary format: array of 32-bit integers
244
+ const tagIds = [];
245
+ for (let i = 0; i < tagsData.length; i += 4) {
246
+ tagIds.push(tagsData.readUInt32LE(i));
247
+ }
248
+ if (tagIds.length) {
249
+ const entryTags = await __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_resolveTagIds).call(this, tagIds);
250
+ entryTags.forEach((tag) => {
251
+ const tagKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagKey).call(this, tag, { isHashed: true });
252
+ tagCleanupPipeline.srem(tagKey, key);
253
+ });
254
+ tagCleanupPipeline.unlink(tagsKey);
255
+ // Decrement reference counts and cleanup unused tags
256
+ await __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_decrementTagRefs).call(this, tagIds);
257
+ }
258
+ }
259
+ catch (e) {
260
+ // noop
261
+ }
262
+ }
263
+ });
264
+ await Promise.all(cleanupPromises);
265
+ await tagCleanupPipeline.exec();
266
+ await deletePipeline.exec();
267
+ // Clean up empty tag sets
268
+ const allTagKeys = await this.redisClient.keys(`${this.keyNamePrefix}tag:*`);
269
+ if (allTagKeys.length) {
270
+ const cardinalityPipeline = this.redisClient.pipeline();
271
+ allTagKeys.forEach((tagKey) => {
272
+ cardinalityPipeline.scard(tagKey);
273
+ });
274
+ const cardinalityResults = await cardinalityPipeline.exec();
275
+ // Delete empty tag keys
276
+ const emptyTagPipeline = this.redisClient.pipeline();
277
+ cardinalityResults?.forEach((result, index) => {
278
+ if (result && result[1] === 0) {
279
+ emptyTagPipeline.unlink(allTagKeys[index]);
280
+ }
281
+ });
282
+ await emptyTagPipeline.exec();
283
+ }
284
+ return;
285
+ }
286
+ // If autoInvalidate is true (strategy call), only clear entries with autoInvalidate=true (default)
287
+ if (options.autoInvalidate === true) {
288
+ const optionsPipeline = this.redisClient.pipeline();
289
+ Array.from(allKeys).forEach((key) => {
290
+ optionsPipeline.hget(key, "options");
291
+ });
292
+ const optionsResults = await optionsPipeline.exec();
293
+ const keysToDelete = [];
294
+ Array.from(allKeys).forEach((key, index) => {
295
+ const optionsResult = optionsResults?.[index];
296
+ if (optionsResult && optionsResult[1]) {
297
+ try {
298
+ const entryOptions = JSON.parse(optionsResult[1]);
299
+ // Delete if entry has autoInvalidate=true or no setting (default true)
300
+ const shouldAutoInvalidate = entryOptions.autoInvalidate ?? true;
301
+ if (shouldAutoInvalidate) {
302
+ keysToDelete.push(key);
303
+ }
304
+ }
305
+ catch (e) {
306
+ // If can't parse options, assume it's safe to delete (default true)
307
+ keysToDelete.push(key);
308
+ }
309
+ }
310
+ else {
311
+ // No options stored, default to true
312
+ keysToDelete.push(key);
313
+ }
314
+ });
315
+ if (keysToDelete.length) {
316
+ const deletePipeline = this.redisClient.pipeline();
317
+ keysToDelete.forEach((key) => {
318
+ deletePipeline.unlink(key);
319
+ });
320
+ // Clean up tag references for each key to delete
321
+ const tagDataPromises = keysToDelete.map(async (key) => {
322
+ const keyWithoutPrefix = key.replace(this.keyNamePrefix, "");
323
+ const tagsKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagsKey).call(this, keyWithoutPrefix);
324
+ const tagsData = await this.redisClient.getBuffer(tagsKey);
325
+ return { key, tagsKey, tagsData };
326
+ });
327
+ // Wait for all tag data fetches
328
+ const tagResults = await Promise.all(tagDataPromises);
329
+ // Build single pipeline for all tag cleanup operations
330
+ const tagCleanupPipeline = this.redisClient.pipeline();
331
+ const cleanupPromises = tagResults.map(async ({ key, tagsKey, tagsData }) => {
332
+ if (tagsData) {
333
+ try {
334
+ // Binary format: array of 32-bit integers
335
+ const tagIds = [];
336
+ for (let i = 0; i < tagsData.length; i += 4) {
337
+ tagIds.push(tagsData.readUInt32LE(i));
338
+ }
339
+ if (tagIds.length) {
340
+ const entryTags = await __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_resolveTagIds).call(this, tagIds);
341
+ entryTags.forEach((tag) => {
342
+ const tagKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagKey).call(this, tag, {
343
+ isHashed: true,
344
+ });
345
+ tagCleanupPipeline.srem(tagKey, key);
346
+ });
347
+ tagCleanupPipeline.unlink(tagsKey); // Delete the tags key
348
+ // Decrement reference counts and cleanup unused tags
349
+ await __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_decrementTagRefs).call(this, tagIds);
350
+ }
351
+ }
352
+ catch (e) {
353
+ // noop
354
+ }
355
+ }
356
+ });
357
+ await Promise.all(cleanupPromises);
358
+ await tagCleanupPipeline.exec();
359
+ await deletePipeline.exec();
360
+ // Clean up empty tag sets
361
+ const allTagKeys = await this.redisClient.keys(`${this.keyNamePrefix}tag:*`);
362
+ if (allTagKeys.length) {
363
+ const cleanupPipeline = this.redisClient.pipeline();
364
+ allTagKeys.forEach((tagKey) => {
365
+ cleanupPipeline.scard(tagKey);
366
+ });
367
+ const cardinalityResults = await cleanupPipeline.exec();
368
+ // Delete tag keys that are now empty
369
+ const emptyTagDeletePipeline = this.redisClient.pipeline();
370
+ cardinalityResults?.forEach((result, index) => {
371
+ if (result && result[1] === 0) {
372
+ emptyTagDeletePipeline.unlink(allTagKeys[index]);
373
+ }
374
+ });
375
+ await emptyTagDeletePipeline.exec();
376
+ }
377
+ return;
378
+ }
379
+ }
380
+ }
381
+ }
382
+ }
383
+ catch (error) {
384
+ if (this.isConnectionError(error)) {
385
+ this.logger.warn("Redis connection error during clear operation, relying on IORedis retry mechanism");
386
+ return;
387
+ }
388
+ throw error;
389
+ }
390
+ }
391
+ async flush() {
392
+ try {
393
+ // Use SCAN to find ALL keys with our prefix and delete them
394
+ // This includes main cache keys, tag keys (tag:*), and tags keys (tags:*)
395
+ const pattern = `${this.keyNamePrefix}*`;
396
+ let cursor = "0";
397
+ do {
398
+ const result = await this.redisClient.scan(cursor, "MATCH", pattern, "COUNT", 1000);
399
+ cursor = result[0];
400
+ const keys = result[1];
401
+ if (keys.length) {
402
+ await this.redisClient.unlink(...keys);
403
+ }
404
+ } while (cursor !== "0");
405
+ }
406
+ catch (error) {
407
+ if (this.isConnectionError(error)) {
408
+ this.logger.warn("Redis connection error during flush operation, relying on IORedis retry mechanism");
409
+ return;
410
+ }
411
+ throw error;
412
+ }
413
+ }
414
+ }
415
+ exports.RedisCachingProvider = RedisCachingProvider;
416
+ _RedisCachingProvider_instances = new WeakSet(), _RedisCachingProvider_getKeyName = function _RedisCachingProvider_getKeyName(key) {
417
+ return `${this.keyNamePrefix}${key}`;
418
+ }, _RedisCachingProvider_getTagKey = function _RedisCachingProvider_getTagKey(tag, { isHashed = false } = {}) {
419
+ return `${this.keyNamePrefix}tag:${isHashed ? tag : this.hasher(tag)}`;
420
+ }, _RedisCachingProvider_getTagsKey = function _RedisCachingProvider_getTagsKey(key) {
421
+ return `${this.keyNamePrefix}tags:${key}`;
422
+ }, _RedisCachingProvider_getTagDictionaryKey = function _RedisCachingProvider_getTagDictionaryKey() {
423
+ return `${this.keyNamePrefix}tag:dictionary`;
424
+ }, _RedisCachingProvider_getTagNextIdKey = function _RedisCachingProvider_getTagNextIdKey() {
425
+ return `${this.keyNamePrefix}tag:next_id`;
426
+ }, _RedisCachingProvider_getTagRefCountKey = function _RedisCachingProvider_getTagRefCountKey() {
427
+ return `${this.keyNamePrefix}tag:refs`;
428
+ }, _RedisCachingProvider_getTagReverseDictionaryKey = function _RedisCachingProvider_getTagReverseDictionaryKey() {
429
+ return `${this.keyNamePrefix}tag:reverse_dict`;
430
+ }, _RedisCachingProvider_internTags = async function _RedisCachingProvider_internTags(tags) {
431
+ const pipeline = this.redisClient.pipeline();
432
+ const dictionaryKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagDictionaryKey).call(this);
433
+ const hashedTags = tags.map((tag) => this.hasher(tag));
434
+ // Get existing tag IDs
435
+ hashedTags.forEach((tag) => {
436
+ pipeline.hget(dictionaryKey, tag);
437
+ });
438
+ const results = await pipeline.exec();
439
+ const tagIds = [];
440
+ const newTags = [];
441
+ for (let i = 0; i < hashedTags.length; i++) {
442
+ const result = results?.[i];
443
+ if (result && result[1]) {
444
+ tagIds[i] = parseInt(result[1]);
445
+ }
446
+ else {
447
+ const hashedTag = hashedTags[i];
448
+ newTags.push(hashedTag);
449
+ tagIds[i] = -1; // Placeholder for new tags
450
+ }
451
+ }
452
+ // Create IDs for new tags
453
+ if (newTags.length) {
454
+ const nextIdKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagNextIdKey).call(this);
455
+ const reverseDictKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagReverseDictionaryKey).call(this);
456
+ const refCountKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagRefCountKey).call(this);
457
+ const startId = await this.redisClient.incrby(nextIdKey, newTags.length);
458
+ const batchPipeline = this.redisClient.pipeline();
459
+ newTags.forEach((tag, index) => {
460
+ const newId = startId - newTags.length + index + 1;
461
+ // Store in both forward and reverse dictionaries
462
+ batchPipeline.hset(dictionaryKey, tag, newId.toString());
463
+ batchPipeline.hset(reverseDictKey, newId.toString(), tag);
464
+ // Update the tagIds array
465
+ const originalIndex = hashedTags.indexOf(tag);
466
+ tagIds[originalIndex] = newId;
467
+ });
468
+ // Add reference count increments to the same pipeline
469
+ tagIds.forEach((id) => {
470
+ if (id !== -1) {
471
+ batchPipeline.hincrby(refCountKey, id.toString(), 1);
472
+ }
473
+ });
474
+ await batchPipeline.exec();
475
+ }
476
+ else {
477
+ // Only increment reference count for existing tags
478
+ const refCountKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagRefCountKey).call(this);
479
+ const refPipeline = this.redisClient.pipeline();
480
+ tagIds.forEach((id) => {
481
+ refPipeline.hincrby(refCountKey, id.toString(), 1);
482
+ });
483
+ await refPipeline.exec();
484
+ }
485
+ return tagIds;
486
+ }, _RedisCachingProvider_resolveTagIds = async function _RedisCachingProvider_resolveTagIds(tagIds) {
487
+ if (tagIds.length === 0)
488
+ return [];
489
+ const reverseDictKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagReverseDictionaryKey).call(this);
490
+ const pipeline = this.redisClient.pipeline();
491
+ tagIds.forEach((id) => {
492
+ pipeline.hget(reverseDictKey, id.toString());
493
+ });
494
+ const results = await pipeline.exec();
495
+ return results?.map((result) => result?.[1]).filter(Boolean) || [];
496
+ }, _RedisCachingProvider_decrementTagRefs = async function _RedisCachingProvider_decrementTagRefs(tagIds) {
497
+ if (tagIds.length === 0)
498
+ return;
499
+ const refCountKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagRefCountKey).call(this);
500
+ const dictionaryKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagDictionaryKey).call(this);
501
+ // Decrement reference counts and collect tags with zero refs
502
+ const pipeline = this.redisClient.pipeline();
503
+ tagIds.forEach((id) => {
504
+ pipeline.hincrby(refCountKey, id.toString(), -1);
505
+ });
506
+ const results = await pipeline.exec();
507
+ const tagsToCleanup = [];
508
+ // Find tags that now have zero references
509
+ results?.forEach((result, index) => {
510
+ if (result && result[1] === 0) {
511
+ tagsToCleanup.push(tagIds[index]);
512
+ }
513
+ });
514
+ // Clean up tags with zero references
515
+ if (tagsToCleanup.length) {
516
+ const cleanupPipeline = this.redisClient.pipeline();
517
+ const reverseDictKey = __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_getTagReverseDictionaryKey).call(this);
518
+ // Get tag names before deleting them
519
+ const tagNames = await __classPrivateFieldGet(this, _RedisCachingProvider_instances, "m", _RedisCachingProvider_resolveTagIds).call(this, tagsToCleanup);
520
+ tagsToCleanup.forEach((id, index) => {
521
+ const idStr = id.toString();
522
+ // Remove from reference count hash
523
+ cleanupPipeline.hdel(refCountKey, idStr);
524
+ // Remove from reverse dictionary
525
+ cleanupPipeline.hdel(reverseDictKey, idStr);
526
+ // Remove from forward dictionary
527
+ if (tagNames[index]) {
528
+ cleanupPipeline.hdel(dictionaryKey, tagNames[index]);
529
+ }
530
+ });
531
+ await cleanupPipeline.exec();
532
+ }
533
+ }, _RedisCachingProvider_compressData = async function _RedisCachingProvider_compressData(data) {
534
+ if (data.length <= this.compressionThreshold) {
535
+ const buffer = Buffer.from(data, "utf8");
536
+ const prefix = Buffer.from([0]); // 0 = uncompressed
537
+ return Buffer.concat([prefix, buffer]);
538
+ }
539
+ return new Promise((resolve, reject) => {
540
+ const chunks = [];
541
+ const gzip = (0, zlib_1.createGzip)();
542
+ gzip.on("data", (chunk) => chunks.push(chunk));
543
+ gzip.on("end", () => {
544
+ const compressedBuffer = Buffer.concat(chunks);
545
+ const prefix = Buffer.from([1]); // 1 = compressed
546
+ resolve(Buffer.concat([prefix, compressedBuffer]));
547
+ });
548
+ gzip.on("error", (error) => {
549
+ const buffer = Buffer.from(data, "utf8");
550
+ const prefix = Buffer.from([0]);
551
+ resolve(Buffer.concat([prefix, buffer]));
552
+ });
553
+ gzip.write(data, "utf8");
554
+ gzip.end();
555
+ });
556
+ }, _RedisCachingProvider_decompressData = async function _RedisCachingProvider_decompressData(buffer) {
557
+ if (buffer.length === 0) {
558
+ return "";
559
+ }
560
+ const formatByte = buffer[0];
561
+ const dataBuffer = buffer.subarray(1);
562
+ if (formatByte === 0) {
563
+ // Uncompressed
564
+ return dataBuffer.toString("utf8");
565
+ }
566
+ if (formatByte === 1) {
567
+ // Compressed with gzip
568
+ return new Promise((resolve, reject) => {
569
+ const chunks = [];
570
+ const gunzip = (0, zlib_1.createGunzip)();
571
+ gunzip.on("data", (chunk) => chunks.push(chunk));
572
+ gunzip.on("end", () => {
573
+ const decompressed = Buffer.concat(chunks).toString("utf8");
574
+ resolve(decompressed);
575
+ });
576
+ gunzip.on("error", (error) => {
577
+ // Fallback: return as-is if decompression fails
578
+ resolve(dataBuffer.toString("utf8"));
579
+ });
580
+ gunzip.write(dataBuffer);
581
+ gunzip.end();
582
+ });
583
+ }
584
+ // Unknown format, return as UTF-8
585
+ return buffer.toString("utf8");
586
+ };
587
+ RedisCachingProvider.identifier = "cache-redis";
588
+ //# 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.9.3"}
@@ -0,0 +1,20 @@
1
+ import { RedisOptions } from "ioredis";
2
+ export interface RedisCacheModuleOptions extends RedisOptions {
3
+ /**
4
+ * Redis connection string
5
+ */
6
+ redisUrl?: string;
7
+ /**
8
+ * TTL in milliseconds
9
+ */
10
+ ttl?: number;
11
+ /**
12
+ * Key prefix for all cache keys
13
+ */
14
+ prefix?: string;
15
+ /**
16
+ * Minimum size in bytes to compress data (default: 1024)
17
+ */
18
+ compressionThreshold?: number;
19
+ }
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,MAAM,WAAW,uBAAwB,SAAQ,YAAY;IAC3D;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;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,44 @@
1
+ {
2
+ "name": "@acmekit/caching-redis",
3
+ "version": "2.13.1",
4
+ "description": "Redis Caching for AcmeKit",
5
+ "main": "dist/index.js",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/acmekit/acmekit",
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": "AcmeKit",
21
+ "license": "MIT",
22
+ "devDependencies": {
23
+ "@acmekit/framework": "2.13.1"
24
+ },
25
+ "peerDependencies": {
26
+ "@acmekit/framework": "2.13.1"
27
+ },
28
+ "dependencies": {
29
+ "ioredis": "^5.4.1",
30
+ "xxhash-wasm": "^1.1.0"
31
+ },
32
+ "scripts": {
33
+ "watch": "yarn run -T tsc --build --watch",
34
+ "watch:test": "yarn run -T tsc --build tsconfig.spec.json --watch",
35
+ "resolve:aliases": "yarn run -T tsc --showConfig -p tsconfig.json > tsconfig.resolved.json && yarn run -T tsc-alias -p tsconfig.resolved.json && yarn run -T rimraf tsconfig.resolved.json",
36
+ "build": "yarn run -T rimraf dist && yarn run -T tsc --build && npm run resolve:aliases",
37
+ "test": "../../../../node_modules/.bin/jest --passWithNoTests src",
38
+ "test:integration": "../../../../node_modules/.bin/jest --forceExit --passWithNoTests"
39
+ },
40
+ "keywords": [
41
+ "acmekit-providers",
42
+ "acmekit-providers-cache"
43
+ ]
44
+ }