@medusajs/locking-redis 0.0.2-snapshot-20241013171145

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":";AAOA,wBAGE"}
package/dist/index.js ADDED
@@ -0,0 +1,15 @@
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 loaders_1 = __importDefault(require("./loaders"));
8
+ const redis_lock_1 = require("./services/redis-lock");
9
+ const services = [redis_lock_1.RedisLockingProvider];
10
+ const loaders = [loaders_1.default];
11
+ exports.default = (0, utils_1.ModuleProvider)(utils_1.Modules.LOCKING, {
12
+ services,
13
+ loaders,
14
+ });
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAAA,qDAAmE;AACnE,wDAA8B;AAC9B,sDAA4D;AAE5D,MAAM,QAAQ,GAAG,CAAC,iCAAoB,CAAC,CAAA;AACvC,MAAM,OAAO,GAAG,CAAC,iBAAM,CAAC,CAAA;AAExB,kBAAe,IAAA,sBAAc,EAAC,eAAO,CAAC,OAAO,EAAE;IAC7C,QAAQ;IACR,OAAO;CACR,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ import { ProviderLoaderOptions } from "@medusajs/types";
2
+ declare const _default: ({ container, logger, options, moduleOptions, }: ProviderLoaderOptions) => Promise<void>;
3
+ export default _default;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/loaders/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;yEAUpD,qBAAqB,KAAG,OAAO,CAAC,IAAI,CAAC;AALxC,wBAkCC"}
@@ -0,0 +1,31 @@
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 awilix_1 = require("awilix");
8
+ const ioredis_1 = __importDefault(require("ioredis"));
9
+ exports.default = async ({ container, logger, options, moduleOptions, }) => {
10
+ const { redisUrl, redisOptions, namespace } = options;
11
+ if (!redisUrl) {
12
+ throw Error(`No "redisUrl" provided in "${utils_1.Modules.LOCKING}" module, "locking-redis" provider options. It is required for the "locking-redis" Module provider.`);
13
+ }
14
+ const connection = new ioredis_1.default(redisUrl, {
15
+ // Lazy connect to properly handle connection errors
16
+ lazyConnect: true,
17
+ ...(redisOptions ?? {}),
18
+ });
19
+ try {
20
+ await connection.connect();
21
+ logger?.info(`Connection to Redis in "locking-redis" provider established`);
22
+ }
23
+ catch (err) {
24
+ logger?.error(`An error occurred while connecting to Redis in provider "locking-redis": ${err}`);
25
+ }
26
+ container.register({
27
+ redisClient: (0, awilix_1.asValue)(connection),
28
+ prefix: (0, awilix_1.asValue)(namespace ?? "medusa_lock:"),
29
+ });
30
+ };
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/loaders/index.ts"],"names":[],"mappings":";;;;;AAAA,qDAAmD;AAGnD,mCAAgC;AAChC,sDAA2B;AAE3B,kBAAe,KAAK,EAAE,EACpB,SAAS,EACT,MAAM,EACN,OAAO,EACP,aAAa,GACS,EAAiB,EAAE;IACzC,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,GACzC,OAAkC,CAAA;IAEpC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,KAAK,CACT,8BAA8B,eAAO,CAAC,OAAO,qGAAqG,CACnJ,CAAA;IACH,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,iBAAK,CAAC,QAAQ,EAAE;QACrC,oDAAoD;QACpD,WAAW,EAAE,IAAI;QACjB,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;KACxB,CAAC,CAAA;IAEF,IAAI,CAAC;QACH,MAAM,UAAU,CAAC,OAAO,EAAE,CAAA;QAC1B,MAAM,EAAE,IAAI,CAAC,6DAA6D,CAAC,CAAA;IAC7E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,EAAE,KAAK,CACX,4EAA4E,GAAG,EAAE,CAClF,CAAA;IACH,CAAC;IAED,SAAS,CAAC,QAAQ,CAAC;QACjB,WAAW,EAAE,IAAA,gBAAO,EAAC,UAAU,CAAC;QAChC,MAAM,EAAE,IAAA,gBAAO,EAAC,SAAS,IAAI,cAAc,CAAC;KAC7C,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -0,0 +1,40 @@
1
+ import { ILockingProvider } from "@medusajs/types";
2
+ import { Redis } from "ioredis";
3
+ declare const RedisLockingProvider_base: import("@medusajs/framework/utils").MedusaServiceReturnType<import("@medusajs/framework/utils").ModelConfigurationsToConfigTemplate<{}>>;
4
+ export declare class RedisLockingProvider extends RedisLockingProvider_base implements ILockingProvider {
5
+ static identifier: string;
6
+ protected redisClient: Redis & {
7
+ acquireLock: (key: string, ownerId: string, ttl: number, awaitQueue?: boolean) => Promise<number>;
8
+ releaseLock: (key: string, ownerId: string) => Promise<number>;
9
+ };
10
+ protected keyNamePrefix: string;
11
+ constructor({ redisClient, prefix }: {
12
+ redisClient: any;
13
+ prefix: any;
14
+ });
15
+ private getKeyName;
16
+ execute<T>(keys: string | string[], job: () => Promise<T>, args?: {
17
+ timeout?: number;
18
+ }): Promise<T>;
19
+ acquire(keys: string | string[], args?: {
20
+ ownerId?: string;
21
+ expire?: number;
22
+ awaitQueue?: boolean;
23
+ }): Promise<void>;
24
+ acquire_(keys: string | string[], args?: {
25
+ ownerId?: string;
26
+ expire?: number;
27
+ awaitQueue?: boolean;
28
+ }, cancellationToken?: {
29
+ cancelled: boolean;
30
+ }): Promise<void>;
31
+ release(keys: string | string[], args?: {
32
+ ownerId?: string | null;
33
+ }): Promise<boolean>;
34
+ releaseAll(args?: {
35
+ ownerId?: string | null;
36
+ }): Promise<void>;
37
+ private getTimeout;
38
+ }
39
+ export {};
40
+ //# sourceMappingURL=redis-lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-lock.d.ts","sourceRoot":"","sources":["../../src/services/redis-lock.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;;AAG/B,qBAAa,oBACX,SAAQ,yBACR,YAAW,gBAAgB;IAE3B,MAAM,CAAC,UAAU,SAAkB;IAEnC,SAAS,CAAC,WAAW,EAAE,KAAK,GAAG;QAC7B,WAAW,EAAE,CACX,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,UAAU,CAAC,EAAE,OAAO,KACjB,OAAO,CAAC,MAAM,CAAC,CAAA;QACpB,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;KAC/D,CAAA;IACD,SAAS,CAAC,aAAa,EAAE,MAAM,CAAA;gBAEnB,EAAE,WAAW,EAAE,MAAM,EAAE;;;KAAA;IAiDnC,OAAO,CAAC,UAAU;IAIZ,OAAO,CAAC,CAAC,EACb,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EACvB,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACrB,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAA;KACjB,GACA,OAAO,CAAC,CAAC,CAAC;IA6BP,OAAO,CACX,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EACvB,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,UAAU,CAAC,EAAE,OAAO,CAAA;KACrB,GACA,OAAO,CAAC,IAAI,CAAC;IAIV,QAAQ,CACZ,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EACvB,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,UAAU,CAAC,EAAE,OAAO,CAAA;KACrB,EACD,iBAAiB,CAAC,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,GACzC,OAAO,CAAC,IAAI,CAAC;IA4CV,OAAO,CACX,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EACvB,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KACxB,GACA,OAAO,CAAC,OAAO,CAAC;IAeb,UAAU,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAwCrD,UAAU;CAUzB"}
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RedisLockingProvider = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const promises_1 = require("node:timers/promises");
6
+ class RedisLockingProvider extends (0, utils_1.MedusaService)({}) {
7
+ constructor({ redisClient, prefix }) {
8
+ super(...arguments);
9
+ this.redisClient = redisClient;
10
+ this.keyNamePrefix = prefix ?? "medusa_lock:";
11
+ // Define the custom command for acquiring locks
12
+ this.redisClient.defineCommand("acquireLock", {
13
+ numberOfKeys: 1,
14
+ lua: `
15
+ local key = KEYS[1]
16
+ local ownerId = ARGV[1]
17
+ local ttl = tonumber(ARGV[2])
18
+ local awaitQueue = ARGV[3] == 'true'
19
+
20
+ local setResult = redis.call('SET', key, ownerId, 'EX', ttl, 'NX')
21
+
22
+ if setResult then
23
+ return 1
24
+ elseif not awaitQueue then
25
+ -- Key already exists; retrieve the current ownerId
26
+ local currentOwnerId = redis.call('GET', key)
27
+ if currentOwnerId == ownerId then
28
+ redis.call('SET', key, ownerId, 'EX', ttl, 'XX')
29
+ return 1
30
+ else
31
+ return 0
32
+ end
33
+ else
34
+ return 0
35
+ end
36
+ `,
37
+ });
38
+ // Define the custom command for releasing locks
39
+ this.redisClient.defineCommand("releaseLock", {
40
+ numberOfKeys: 1,
41
+ lua: `
42
+ local key = KEYS[1]
43
+ local ownerId = ARGV[1]
44
+
45
+ if redis.call('GET', key) == ownerId then
46
+ return redis.call('DEL', key)
47
+ else
48
+ return 0
49
+ end
50
+ `,
51
+ });
52
+ }
53
+ getKeyName(key) {
54
+ return `${this.keyNamePrefix}${key}`;
55
+ }
56
+ async execute(keys, job, args) {
57
+ const timeout = Math.max(args?.timeout ?? 5, 1);
58
+ const timeoutSeconds = Number.isNaN(timeout) ? 1 : timeout;
59
+ const cancellationToken = { cancelled: false };
60
+ const promises = [];
61
+ if (timeoutSeconds > 0) {
62
+ promises.push(this.getTimeout(timeoutSeconds, cancellationToken));
63
+ }
64
+ promises.push(this.acquire_(keys, {
65
+ awaitQueue: true,
66
+ }, cancellationToken));
67
+ await Promise.race(promises);
68
+ try {
69
+ return await job();
70
+ }
71
+ finally {
72
+ await this.release(keys);
73
+ }
74
+ }
75
+ async acquire(keys, args) {
76
+ return this.acquire_(keys, args);
77
+ }
78
+ async acquire_(keys, args, cancellationToken) {
79
+ keys = Array.isArray(keys) ? keys : [keys];
80
+ const timeout = Math.max(args?.expire ?? 5, 1);
81
+ const timeoutSeconds = Number.isNaN(timeout) ? 1 : timeout;
82
+ const ownerId = args?.ownerId ?? "*";
83
+ const awaitQueue = args?.awaitQueue ?? false;
84
+ const acquirePromises = keys.map(async (key) => {
85
+ const keyName = this.getKeyName(key);
86
+ const acquireLock = async () => {
87
+ while (true) {
88
+ if (cancellationToken?.cancelled) {
89
+ return;
90
+ }
91
+ const result = await this.redisClient.acquireLock(keyName, ownerId, timeoutSeconds, awaitQueue);
92
+ if (result === 1) {
93
+ break;
94
+ }
95
+ else {
96
+ if (awaitQueue) {
97
+ // Wait for a short period before retrying
98
+ await (0, promises_1.setTimeout)(100);
99
+ }
100
+ else {
101
+ throw new Error(`Failed to acquire lock for key "${key}"`);
102
+ }
103
+ }
104
+ }
105
+ };
106
+ await acquireLock();
107
+ });
108
+ await Promise.all(acquirePromises);
109
+ }
110
+ async release(keys, args) {
111
+ const ownerId = args?.ownerId ?? "*";
112
+ keys = Array.isArray(keys) ? keys : [keys];
113
+ const releasePromises = keys.map(async (key) => {
114
+ const keyName = this.getKeyName(key);
115
+ const result = await this.redisClient.releaseLock(keyName, ownerId);
116
+ return result === 1;
117
+ });
118
+ const results = await Promise.all(releasePromises);
119
+ return results.every((released) => released);
120
+ }
121
+ async releaseAll(args) {
122
+ const ownerId = args?.ownerId ?? "*";
123
+ const pattern = `${this.keyNamePrefix}*`;
124
+ let cursor = "0";
125
+ do {
126
+ const result = await this.redisClient.scan(cursor, "MATCH", pattern, "COUNT", 100);
127
+ cursor = result[0];
128
+ const keys = result[1];
129
+ if (keys.length > 0) {
130
+ const pipeline = this.redisClient.pipeline();
131
+ keys.forEach((key) => {
132
+ pipeline.get(key);
133
+ });
134
+ const currentOwners = await pipeline.exec();
135
+ const deletePipeline = this.redisClient.pipeline();
136
+ keys.forEach((key, idx) => {
137
+ const currentOwner = currentOwners?.[idx]?.[1];
138
+ if (currentOwner === ownerId) {
139
+ deletePipeline.del(key);
140
+ }
141
+ });
142
+ await deletePipeline.exec();
143
+ }
144
+ } while (cursor !== "0");
145
+ }
146
+ async getTimeout(seconds, cancellationToken) {
147
+ return new Promise(async (_, reject) => {
148
+ await (0, promises_1.setTimeout)(seconds * 1000);
149
+ cancellationToken.cancelled = true;
150
+ reject(new Error("Timed-out acquiring lock."));
151
+ });
152
+ }
153
+ }
154
+ exports.RedisLockingProvider = RedisLockingProvider;
155
+ RedisLockingProvider.identifier = "locking-redis";
156
+ //# sourceMappingURL=redis-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-lock.js","sourceRoot":"","sources":["../../src/services/redis-lock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"root":["../src/index.ts","../src/loaders/index.ts","../src/services/redis-lock.ts","../src/types/index.ts"],"version":"5.6.2"}
@@ -0,0 +1,24 @@
1
+ import { RedisOptions } from "ioredis";
2
+ /**
3
+ * Module config type
4
+ */
5
+ export type RedisCacheModuleOptions = {
6
+ /**
7
+ * Time to keep data in cache (in seconds)
8
+ */
9
+ ttl?: number;
10
+ /**
11
+ * Redis connection string
12
+ */
13
+ redisUrl?: string;
14
+ /**
15
+ * Redis client options
16
+ */
17
+ redisOptions?: RedisOptions;
18
+ /**
19
+ * Prefix for event keys
20
+ * @default `medusa_lock:`
21
+ */
22
+ namespace?: string;
23
+ };
24
+ //# 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;AAEtC;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IAEZ;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,YAAY,CAAC,EAAE,YAAY,CAAA;IAE3B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA"}
@@ -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,48 @@
1
+ {
2
+ "name": "@medusajs/locking-redis",
3
+ "version": "0.0.2-snapshot-20241013171145",
4
+ "description": "Redis Lock for Medusa",
5
+ "main": "dist/index.js",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/medusajs/medusa",
9
+ "directory": "packages/locking-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": "0.0.2-snapshot-20241013171145",
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": "0.0.2-snapshot-20241013171145"
32
+ },
33
+ "dependencies": {
34
+ "ioredis": "^5.4.1"
35
+ },
36
+ "scripts": {
37
+ "watch": "tsc --build --watch",
38
+ "watch:test": "tsc --build tsconfig.spec.json --watch",
39
+ "resolve:aliases": "tsc --showConfig -p tsconfig.json > tsconfig.resolved.json && tsc-alias -p tsconfig.resolved.json && rimraf tsconfig.resolved.json",
40
+ "build": "rimraf dist && tsc --build && npm run resolve:aliases",
41
+ "test": "jest --passWithNoTests src",
42
+ "test:integration": "jest --runInBand --forceExit -- integration-tests/**/__tests__/**/*.spec.ts"
43
+ },
44
+ "keywords": [
45
+ "medusa-providers",
46
+ "medusa-providers-locking"
47
+ ]
48
+ }