@motiadev/adapter-redis-cron 0.17.6-beta.188-784886 → 0.17.7-beta.188

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.
@@ -1 +1 @@
1
- {"version":3,"file":"redis-cron-adapter.d.mts","names":[],"sources":["../src/redis-cron-adapter.ts"],"sourcesContent":[],"mappings":";;;;;cASa,gBAAA,YAA4B;;EAA5B,QAAA,SAAA;EAWkB,QAAA,OAAA;EAAkB,QAAA,cAAA;EAA8B,QAAA,iBAAA;EA4DnB,QAAA,UAAA;EAAR,QAAA,iBAAA;EA8C1B,QAAA,SAAA;EAAW,QAAA,gBAAA;EA6Bb,WAAA,CAAA,eAAA,EAvIO,eAuIP,GAvIyB,kBAuIzB,EAAA,OAAA,CAAA,EAvIuD,uBAuIvD;EAAwB,QAAA,OAAA;EAwC3B,QAAA,eAAA;EAcD,QAAA,OAAA;EAyBc,WAAA,CAAA,OAAA,EAAA,MAAA,EAAA,GAAA,CAAA,EAAA,MAAA,CAAA,EA1JkB,OA0JlB,CA1J0B,QA0J1B,GAAA,IAAA,CAAA;EAAR,WAAA,CAAA,IAAA,EA5GA,QA4GA,CAAA,EA5GW,OA4GX,CAAA,IAAA,CAAA;EAjOe,SAAA,CAAA,IAAA,EAkJjB,QAlJiB,EAAA,GAAA,EAAA,MAAA,CAAA,EAkJO,OAlJP,CAAA,OAAA,CAAA;EAAW,SAAA,CAAA,CAAA,EA0L/B,OA1L+B,CAAA,OAAA,CAAA;cAwMhC;oBAyBM,QAAQ"}
1
+ {"version":3,"file":"redis-cron-adapter.d.mts","names":[],"sources":["../src/redis-cron-adapter.ts"],"sourcesContent":[],"mappings":";;;;;cASa,gBAAA,YAA4B;;EAA5B,QAAA,SAAA;EAWkB,QAAA,OAAA;EAAkB,QAAA,cAAA;EAA8B,QAAA,iBAAA;EA8DnB,QAAA,UAAA;EAAR,QAAA,iBAAA;EA8C1B,QAAA,SAAA;EAAW,QAAA,gBAAA;EA6Bb,WAAA,CAAA,eAAA,EAzIO,eAyIP,GAzIyB,kBAyIzB,EAAA,OAAA,CAAA,EAzIuD,uBAyIvD;EAAwB,QAAA,OAAA;EAwC3B,QAAA,eAAA;EAcD,QAAA,OAAA;EAyBc,WAAA,CAAA,OAAA,EAAA,MAAA,EAAA,GAAA,CAAA,EAAA,MAAA,CAAA,EA1JkB,OA0JlB,CA1J0B,QA0J1B,GAAA,IAAA,CAAA;EAAR,WAAA,CAAA,IAAA,EA5GA,QA4GA,CAAA,EA5GW,OA4GX,CAAA,IAAA,CAAA;EAnOe,SAAA,CAAA,IAAA,EAoJjB,QApJiB,EAAA,GAAA,EAAA,MAAA,CAAA,EAoJO,OApJP,CAAA,OAAA,CAAA;EAAW,SAAA,CAAA,CAAA,EA4L/B,OA5L+B,CAAA,OAAA,CAAA;cA0MhC;oBAyBM,QAAQ"}
@@ -23,7 +23,7 @@ var RedisCronAdapter = class {
23
23
  this.isExternalClient = false;
24
24
  this.client = createClient(config);
25
25
  this.client.on("error", (err) => {
26
- console.error("[Redis Cron] Client error:", err);
26
+ if (this.connected) console.error("[Redis Cron] Client error:", err?.message);
27
27
  });
28
28
  this.client.on("connect", () => {
29
29
  this.connected = true;
@@ -1 +1 @@
1
- {"version":3,"file":"redis-cron-adapter.mjs","names":["uuidv4","config: RedisClientOptions","lock: CronLock","renewedLock: CronLock","locks: CronLockInfo[]","keys: string[]","cursor: string | number"],"sources":["../src/redis-cron-adapter.ts"],"sourcesContent":["import type { CronAdapter, CronLock, CronLockInfo } from '@motiadev/core'\nimport { createClient, type RedisClientOptions, type RedisClientType } from 'redis'\nimport { v4 as uuidv4 } from 'uuid'\nimport type { RedisCronAdapterOptions } from './types'\n\nfunction isRedisClient(input: RedisClientType | RedisClientOptions): input is RedisClientType {\n return typeof input === 'object' && 'isOpen' in input && 'connect' in input\n}\n\nexport class RedisCronAdapter implements CronAdapter {\n private client: RedisClientType\n private keyPrefix: string\n private lockTTL: number\n private lockRetryDelay: number\n private lockRetryAttempts: number\n private instanceId: string\n private enableHealthCheck: boolean\n private connected = false\n private isExternalClient: boolean\n\n constructor(redisConnection: RedisClientType | RedisClientOptions, options?: RedisCronAdapterOptions) {\n this.keyPrefix = options?.keyPrefix || 'motia:cron:lock:'\n this.lockTTL = options?.lockTTL || 300000\n this.lockRetryDelay = options?.lockRetryDelay || 1000\n this.lockRetryAttempts = options?.lockRetryAttempts || 0\n this.instanceId = options?.instanceId || `motia-${uuidv4()}`\n this.enableHealthCheck = options?.enableHealthCheck ?? true\n\n if (isRedisClient(redisConnection)) {\n this.client = redisConnection\n this.isExternalClient = true\n this.connected = this.client.isOpen\n } else {\n const config: RedisClientOptions = redisConnection\n this.isExternalClient = false\n\n this.client = createClient(config) as RedisClientType\n\n this.client.on('error', (err) => {\n console.error('[Redis Cron] Client error:', err)\n })\n\n this.client.on('connect', () => {\n this.connected = true\n })\n\n this.client.on('disconnect', () => {\n console.warn('[Redis Cron] Disconnected')\n this.connected = false\n })\n\n this.client.on('reconnecting', () => {\n console.log('[Redis Cron] Reconnecting...')\n })\n\n this.connect()\n }\n }\n\n private async connect(): Promise<void> {\n if (!this.connected && !this.client.isOpen) {\n try {\n await this.client.connect()\n } catch (error) {\n console.error('[Redis Cron] Failed to connect:', error)\n throw error\n }\n }\n }\n\n private async ensureConnected(): Promise<void> {\n if (!this.client.isOpen) {\n await this.connect()\n }\n }\n\n private makeKey(jobName: string): string {\n return `${this.keyPrefix}${jobName}`\n }\n\n async acquireLock(jobName: string, ttl?: number): Promise<CronLock | null> {\n await this.ensureConnected()\n\n const lockTTL = ttl || this.lockTTL\n const lockId = uuidv4()\n const key = this.makeKey(jobName)\n const now = Date.now()\n const expiresAt = now + lockTTL\n\n const lock: CronLock = {\n jobName,\n lockId,\n acquiredAt: now,\n expiresAt,\n instanceId: this.instanceId,\n }\n\n const lockData = JSON.stringify(lock)\n\n const result = await this.client.set(key, lockData, {\n PX: lockTTL,\n NX: true,\n })\n\n if (result === 'OK') {\n return lock\n }\n\n if (this.lockRetryAttempts > 0) {\n for (let attempt = 0; attempt < this.lockRetryAttempts; attempt++) {\n await new Promise((resolve) => setTimeout(resolve, this.lockRetryDelay))\n\n const retryResult = await this.client.set(key, lockData, {\n PX: lockTTL,\n NX: true,\n })\n\n if (retryResult === 'OK') {\n return lock\n }\n }\n }\n\n return null\n }\n\n async releaseLock(lock: CronLock): Promise<void> {\n await this.ensureConnected()\n\n const key = this.makeKey(lock.jobName)\n\n const luaScript = `\n local current = redis.call('GET', KEYS[1])\n if not current then\n return 0\n end\n \n local lock = cjson.decode(current)\n if lock.lockId == ARGV[1] and lock.instanceId == ARGV[2] then\n return redis.call('DEL', KEYS[1])\n end\n \n return 0\n `\n\n try {\n await this.client.eval(luaScript, {\n keys: [key],\n arguments: [lock.lockId, lock.instanceId],\n })\n } catch (error) {\n console.error('[Redis Cron] Error releasing lock:', error)\n }\n }\n\n async renewLock(lock: CronLock, ttl: number): Promise<boolean> {\n await this.ensureConnected()\n\n const key = this.makeKey(lock.jobName)\n const now = Date.now()\n const expiresAt = now + ttl\n\n const renewedLock: CronLock = {\n ...lock,\n expiresAt,\n }\n\n const luaScript = `\n local current = redis.call('GET', KEYS[1])\n if not current then\n return 0\n end\n \n local lock = cjson.decode(current)\n if lock.lockId == ARGV[1] and lock.instanceId == ARGV[2] then\n redis.call('SET', KEYS[1], ARGV[3], 'PX', ARGV[4])\n return 1\n end\n \n return 0\n `\n\n try {\n const result = await this.client.eval(luaScript, {\n keys: [key],\n arguments: [lock.lockId, lock.instanceId, JSON.stringify(renewedLock), ttl.toString()],\n })\n\n return result === 1\n } catch (error) {\n console.error('[Redis Cron] Error renewing lock:', error)\n return false\n }\n }\n\n async isHealthy(): Promise<boolean> {\n if (!this.enableHealthCheck) {\n return true\n }\n\n try {\n await this.ensureConnected()\n const result = await this.client.ping()\n return result === 'PONG'\n } catch {\n return false\n }\n }\n\n async shutdown(): Promise<void> {\n await this.ensureConnected()\n\n const pattern = `${this.keyPrefix}*`\n const keys = await this.scanKeys(pattern)\n\n for (const key of keys) {\n const lockData = await this.client.get(key)\n if (lockData) {\n try {\n const lock: CronLock = JSON.parse(lockData)\n if (lock.instanceId === this.instanceId) {\n await this.client.del(key)\n }\n } catch (error) {\n console.error('[Redis Cron] Error cleaning up lock during shutdown:', error)\n }\n }\n }\n\n if (!this.isExternalClient && this.client.isOpen) {\n await this.client.quit()\n }\n }\n\n async getActiveLocks(): Promise<CronLockInfo[]> {\n await this.ensureConnected()\n\n const pattern = `${this.keyPrefix}*`\n const keys = await this.scanKeys(pattern)\n const locks: CronLockInfo[] = []\n\n for (const key of keys) {\n const lockData = await this.client.get(key)\n if (lockData) {\n try {\n const lock: CronLock = JSON.parse(lockData)\n locks.push({\n jobName: lock.jobName,\n instanceId: lock.instanceId,\n acquiredAt: lock.acquiredAt,\n expiresAt: lock.expiresAt,\n })\n } catch (error) {\n console.error('[Redis Cron] Error parsing lock data:', error)\n }\n }\n }\n\n return locks\n }\n\n private async scanKeys(pattern: string): Promise<string[]> {\n const keys: string[] = []\n let cursor: string | number = '0'\n\n do {\n const result = await this.client.scan(cursor.toString(), {\n MATCH: pattern,\n COUNT: 100,\n })\n cursor = result.cursor\n keys.push(...result.keys)\n } while (String(cursor) !== '0')\n\n return keys\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"redis-cron-adapter.mjs","names":["uuidv4","config: RedisClientOptions","lock: CronLock","renewedLock: CronLock","locks: CronLockInfo[]","keys: string[]","cursor: string | number"],"sources":["../src/redis-cron-adapter.ts"],"sourcesContent":["import type { CronAdapter, CronLock, CronLockInfo } from '@motiadev/core'\nimport { createClient, type RedisClientOptions, type RedisClientType } from 'redis'\nimport { v4 as uuidv4 } from 'uuid'\nimport type { RedisCronAdapterOptions } from './types'\n\nfunction isRedisClient(input: RedisClientType | RedisClientOptions): input is RedisClientType {\n return typeof input === 'object' && 'isOpen' in input && 'connect' in input\n}\n\nexport class RedisCronAdapter implements CronAdapter {\n private client: RedisClientType\n private keyPrefix: string\n private lockTTL: number\n private lockRetryDelay: number\n private lockRetryAttempts: number\n private instanceId: string\n private enableHealthCheck: boolean\n private connected = false\n private isExternalClient: boolean\n\n constructor(redisConnection: RedisClientType | RedisClientOptions, options?: RedisCronAdapterOptions) {\n this.keyPrefix = options?.keyPrefix || 'motia:cron:lock:'\n this.lockTTL = options?.lockTTL || 300000\n this.lockRetryDelay = options?.lockRetryDelay || 1000\n this.lockRetryAttempts = options?.lockRetryAttempts || 0\n this.instanceId = options?.instanceId || `motia-${uuidv4()}`\n this.enableHealthCheck = options?.enableHealthCheck ?? true\n\n if (isRedisClient(redisConnection)) {\n this.client = redisConnection\n this.isExternalClient = true\n this.connected = this.client.isOpen\n } else {\n const config: RedisClientOptions = redisConnection\n this.isExternalClient = false\n\n this.client = createClient(config) as RedisClientType\n\n this.client.on('error', (err) => {\n if (this.connected) {\n console.error('[Redis Cron] Client error:', err?.message)\n }\n })\n\n this.client.on('connect', () => {\n this.connected = true\n })\n\n this.client.on('disconnect', () => {\n console.warn('[Redis Cron] Disconnected')\n this.connected = false\n })\n\n this.client.on('reconnecting', () => {\n console.log('[Redis Cron] Reconnecting...')\n })\n\n this.connect()\n }\n }\n\n private async connect(): Promise<void> {\n if (!this.connected && !this.client.isOpen) {\n try {\n await this.client.connect()\n } catch (error) {\n console.error('[Redis Cron] Failed to connect:', error)\n throw error\n }\n }\n }\n\n private async ensureConnected(): Promise<void> {\n if (!this.client.isOpen) {\n await this.connect()\n }\n }\n\n private makeKey(jobName: string): string {\n return `${this.keyPrefix}${jobName}`\n }\n\n async acquireLock(jobName: string, ttl?: number): Promise<CronLock | null> {\n await this.ensureConnected()\n\n const lockTTL = ttl || this.lockTTL\n const lockId = uuidv4()\n const key = this.makeKey(jobName)\n const now = Date.now()\n const expiresAt = now + lockTTL\n\n const lock: CronLock = {\n jobName,\n lockId,\n acquiredAt: now,\n expiresAt,\n instanceId: this.instanceId,\n }\n\n const lockData = JSON.stringify(lock)\n\n const result = await this.client.set(key, lockData, {\n PX: lockTTL,\n NX: true,\n })\n\n if (result === 'OK') {\n return lock\n }\n\n if (this.lockRetryAttempts > 0) {\n for (let attempt = 0; attempt < this.lockRetryAttempts; attempt++) {\n await new Promise((resolve) => setTimeout(resolve, this.lockRetryDelay))\n\n const retryResult = await this.client.set(key, lockData, {\n PX: lockTTL,\n NX: true,\n })\n\n if (retryResult === 'OK') {\n return lock\n }\n }\n }\n\n return null\n }\n\n async releaseLock(lock: CronLock): Promise<void> {\n await this.ensureConnected()\n\n const key = this.makeKey(lock.jobName)\n\n const luaScript = `\n local current = redis.call('GET', KEYS[1])\n if not current then\n return 0\n end\n \n local lock = cjson.decode(current)\n if lock.lockId == ARGV[1] and lock.instanceId == ARGV[2] then\n return redis.call('DEL', KEYS[1])\n end\n \n return 0\n `\n\n try {\n await this.client.eval(luaScript, {\n keys: [key],\n arguments: [lock.lockId, lock.instanceId],\n })\n } catch (error) {\n console.error('[Redis Cron] Error releasing lock:', error)\n }\n }\n\n async renewLock(lock: CronLock, ttl: number): Promise<boolean> {\n await this.ensureConnected()\n\n const key = this.makeKey(lock.jobName)\n const now = Date.now()\n const expiresAt = now + ttl\n\n const renewedLock: CronLock = {\n ...lock,\n expiresAt,\n }\n\n const luaScript = `\n local current = redis.call('GET', KEYS[1])\n if not current then\n return 0\n end\n \n local lock = cjson.decode(current)\n if lock.lockId == ARGV[1] and lock.instanceId == ARGV[2] then\n redis.call('SET', KEYS[1], ARGV[3], 'PX', ARGV[4])\n return 1\n end\n \n return 0\n `\n\n try {\n const result = await this.client.eval(luaScript, {\n keys: [key],\n arguments: [lock.lockId, lock.instanceId, JSON.stringify(renewedLock), ttl.toString()],\n })\n\n return result === 1\n } catch (error) {\n console.error('[Redis Cron] Error renewing lock:', error)\n return false\n }\n }\n\n async isHealthy(): Promise<boolean> {\n if (!this.enableHealthCheck) {\n return true\n }\n\n try {\n await this.ensureConnected()\n const result = await this.client.ping()\n return result === 'PONG'\n } catch {\n return false\n }\n }\n\n async shutdown(): Promise<void> {\n await this.ensureConnected()\n\n const pattern = `${this.keyPrefix}*`\n const keys = await this.scanKeys(pattern)\n\n for (const key of keys) {\n const lockData = await this.client.get(key)\n if (lockData) {\n try {\n const lock: CronLock = JSON.parse(lockData)\n if (lock.instanceId === this.instanceId) {\n await this.client.del(key)\n }\n } catch (error) {\n console.error('[Redis Cron] Error cleaning up lock during shutdown:', error)\n }\n }\n }\n\n if (!this.isExternalClient && this.client.isOpen) {\n await this.client.quit()\n }\n }\n\n async getActiveLocks(): Promise<CronLockInfo[]> {\n await this.ensureConnected()\n\n const pattern = `${this.keyPrefix}*`\n const keys = await this.scanKeys(pattern)\n const locks: CronLockInfo[] = []\n\n for (const key of keys) {\n const lockData = await this.client.get(key)\n if (lockData) {\n try {\n const lock: CronLock = JSON.parse(lockData)\n locks.push({\n jobName: lock.jobName,\n instanceId: lock.instanceId,\n acquiredAt: lock.acquiredAt,\n expiresAt: lock.expiresAt,\n })\n } catch (error) {\n console.error('[Redis Cron] Error parsing lock data:', error)\n }\n }\n }\n\n return locks\n }\n\n private async scanKeys(pattern: string): Promise<string[]> {\n const keys: string[] = []\n let cursor: string | number = '0'\n\n do {\n const result = await this.client.scan(cursor.toString(), {\n MATCH: pattern,\n COUNT: 100,\n })\n cursor = result.cursor\n keys.push(...result.keys)\n } while (String(cursor) !== '0')\n\n return keys\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -5,11 +5,11 @@
5
5
  "main": "dist/index.mjs",
6
6
  "module": "dist/index.mjs",
7
7
  "types": "dist/index.d.mts",
8
- "version": "0.17.6-beta.188-784886",
8
+ "version": "0.17.7-beta.188",
9
9
  "dependencies": {
10
10
  "redis": "^5.9.0",
11
11
  "uuid": "^11.1.0",
12
- "@motiadev/core": "0.17.6-beta.188-784886"
12
+ "@motiadev/core": "0.17.7-beta.188"
13
13
  },
14
14
  "devDependencies": {
15
15
  "@types/node": "^22.10.2",