{"version":3,"sources":["../src/config/config.ts","../src/locker/interface.ts","../src/locker/redis-factory.ts","../src/locker/redlock.ts","../src/utils/lib.ts","../src/decorator/redlock.ts","../src/process/locker.ts","../src/decorator/scheduled.ts","../src/process/schedule.ts","../src/index.ts"],"names":["validateCronExpression","cron","Error","cronParts","trim","split","length","hasSecs","offset","seconds","minutes","hours","dayOfMonth","month","dayOfWeek","validateCronField","field","min","max","fieldName","fieldNameCN","allowedStrings","some","str","toUpperCase","includes","range","step","stepValue","parseInt","isNaN","start","end","startValue","endValue","values","value","numValue","validateRedLockMethodOptions","options","lockTimeOut","undefined","clockDriftFactor","maxRetries","retryDelayMs","validateRedLockOptions","retryCount","retryDelay","retryJitter","setGlobalScheduledOptions","globalScheduledOptions","getGlobalScheduledOptions","getEffectiveTimezone","userTimezone","timezone","getEffectiveRedLockOptions","methodOptions","globalOptions","COMPONENT_SCHEDULED","COMPONENT_REDLOCK","DecoratorType","RedisMode","RedisClientAdapter","RedisFactory","client","status","call","command","args","set","key","mode","duration","get","del","keys","exists","eval","script","numKeys","quit","disconnect","getClient","createClient","config","STANDALONE","logger","Debug","createStandaloneClient","SENTINEL","createSentinelClient","CLUSTER","createClusterClient","host","port","password","db","keyPrefix","connectTimeout","commandTimeout","maxRetriesPerRequest","retryStrategy","times","delay","Math","reconnectOnError","err","Warn","message","Redis","on","Info","name","sentinels","sentinelPassword","nodes","clusterOptions","redisOptions","clusterRetryStrategy","cluster","Cluster","address","validateConfig","validateStandaloneConfig","validateSentinelConfig","validateClusterConfig","defaultRedLockConfig","defaultRedlockSettings","RedLocker","redisConfig","driftFactor","automaticExtensionThreshold","instance","instanceLock","redlock","redisClient","isInitialized","initializationPromise","registerInContainer","RedLockerClass","IOCContainer","saveClass","setExistingInstance","_error","getInstance","containerInstance","resetInstance","close","catch","initialize","performInitialization","error","existingRedis","underlyingClient","userSettings","redlockSettings","Redlock","acquire","resources","ttl","Array","isArray","lockTtl","prefixedResources","map","resource","join","lock","release","extend","extendedLock","isReady","getConfig","updateConfig","getContainerInfo","registered","identifier","healthCheck","redisStatus","details","initialized","redisMode","redlockReady","containerRegistered","timeoutPromise","ms","timeoutId","promise","Promise","resolve","reject","setTimeout","cancel","clearTimeout","wrappedPromise","fn","result","initRedLock","app","Helper","isFunction","once","isEmpty","redLocker","redLockerDescriptor","descriptor","method","configurable","enumerable","valueFunction","self","initialLock","lockTime","timeout","props","currentLock","remainingTime","maxExtensions","extensionCount","timeoutHandler","race","apply","extendError","releaseError","writable","lockOptions","generateLockName","configName","methodName","target","targetObj","getIdentifier","targetWithConstructor","className","RedLock","lockName","createDecorator","context","addInitializer","targetClass","componentType","getType","originalMethod","Lock","resolvedLockName","Object","getPrototypeOf","finalLockName","enhancedDescriptor","Scheduled","attachClassMetadata","SCHEDULED","initSchedule","injectSchedule","totalScheduled","componentList","listClass","component","classMetadata","getClassMetadata","id","scheduleData","targetMethod","taskName","tz","CronJob","then","SchedulerLock","defaultOptions","KoattyScheduled"],"mappings":"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","file":"index.mjs","sourcesContent":["/*\n * @Description: Configuration management for koatty_schedule\n * @Usage: \n * @Author: richen\n * @Date: 2024-01-17 15:30:00\n * @LastEditTime: 2024-01-17 16:30:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { RedLockOptions } from \"../locker/redlock\";\n\nexport const COMPONENT_SCHEDULED = 'COMPONENT_SCHEDULED';\nexport const COMPONENT_REDLOCK = 'COMPONENT_REDLOCK';\n\n/**\n * Scheduled global options interface\n */\nexport interface ScheduledOptions extends RedLockOptions {\n  timezone?: string;\n}\n\n/**\n * RedLock method-level options (excluding Redis connection config)\n */\nexport interface RedLockMethodOptions {\n  lockTimeOut?: number;        // Lock timeout in milliseconds\n  clockDriftFactor?: number;   // Clock drift factor for lock timeout calculation\n  maxRetries?: number;         // Maximum number of retry attempts\n  retryDelayMs?: number;       // Delay between retry attempts in milliseconds\n}\n\n/**\n * RedLock decorator configuration  \n */\nexport interface RedLockConfig {\n  name?: string;\n  options?: RedLockOptions;\n}\n\n/**\n * Decorator types supported by the system\n */\nexport enum DecoratorType {\n  SCHEDULED = 'SCHEDULED',\n  REDLOCK = 'REDLOCK'\n}\n\n/**\n * Validate cron expression format (supports both 5-part and 6-part formats)\n * \n * 6-part format: second minute hour day month weekday\n * 5-part format: minute hour day month weekday\n * \n * @param cron - Cron expression to validate\n * @throws {Error} When cron expression is invalid\n */\nexport function validateCronExpression(cron: string): void {\n  if (!cron || typeof cron !== 'string') {\n    throw new Error('Cron expression must be a non-empty string');\n  }\n\n  const cronParts = cron.trim().split(/\\s+/);\n  \n  // Cron expressions should have 5 or 6 parts (with or without seconds)\n  if (cronParts.length < 5 || cronParts.length > 6) {\n    throw new Error(`Invalid cron format. Expected 5 or 6 parts, got ${cronParts.length}`);\n  }\n\n  // Determine if this is a 6-part (with seconds) or 5-part expression\n  const hasSecs = cronParts.length === 6;\n  const offset = hasSecs ? 0 : -1;\n\n  // Extract parts with proper indexing\n  const seconds = hasSecs ? cronParts[0] : null;\n  const minutes = cronParts[offset + 1];\n  const hours = cronParts[offset + 2];\n  const dayOfMonth = cronParts[offset + 3];\n  const month = cronParts[offset + 4];\n  const dayOfWeek = cronParts[offset + 5];\n\n  // Validate seconds (0-59) if present\n  if (seconds !== null) {\n    validateCronField(seconds, 0, 59, 'seconds', '秒');\n  }\n\n  // Validate minutes (0-59)\n  validateCronField(minutes, 0, 59, 'minutes', '分钟');\n\n  // Validate hours (0-23)\n  validateCronField(hours, 0, 23, 'hours', '小时');\n\n  // Validate day of month (1-31)\n  validateCronField(dayOfMonth, 1, 31, 'day of month', '日期');\n\n  // Validate month (1-12 or JAN-DEC)\n  validateCronField(month, 1, 12, 'month', '月份', ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC']);\n\n  // Validate day of week (0-7 or SUN-SAT, where 0 and 7 both represent Sunday)\n  validateCronField(dayOfWeek, 0, 7, 'day of week', '星期', ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT']);\n}\n\n/**\n * Validate individual cron field\n * @param field - Field value to validate\n * @param min - Minimum allowed value\n * @param max - Maximum allowed value\n * @param fieldName - English field name for error messages\n * @param fieldNameCN - Chinese field name for error messages\n * @param allowedStrings - Optional array of allowed string values (e.g., month/weekday names)\n */\nfunction validateCronField(\n  field: string,\n  min: number,\n  max: number,\n  fieldName: string,\n  fieldNameCN: string,\n  allowedStrings?: string[]\n): void {\n  // Allow wildcard\n  if (field === '*') {\n    return;\n  }\n\n  // Allow question mark (for day of month / day of week)\n  if (field === '?') {\n    return;\n  }\n\n  // Check for allowed string values (month/weekday names)\n  if (allowedStrings && allowedStrings.some(str => field.toUpperCase().includes(str))) {\n    return;\n  }\n\n  // Step values (e.g., */5, 0-30/5)\n  if (field.includes('/')) {\n    const [range, step] = field.split('/');\n    const stepValue = parseInt(step);\n    \n    if (isNaN(stepValue) || stepValue <= 0) {\n      throw new Error(`Invalid step value for ${fieldName}: ${step}`);\n    }\n    \n    if (range !== '*') {\n      validateCronField(range, min, max, fieldName, fieldNameCN, allowedStrings);\n    }\n    return;\n  }\n\n  // Range values (e.g., 1-5)\n  if (field.includes('-')) {\n    const [start, end] = field.split('-');\n    const startValue = parseInt(start);\n    const endValue = parseInt(end);\n    \n    if (isNaN(startValue) || startValue < min || startValue > max) {\n      throw new Error(`Invalid range start for ${fieldName}: ${start}, must be between ${min}-${max}`);\n    }\n    \n    if (isNaN(endValue) || endValue < min || endValue > max) {\n      throw new Error(`Invalid range end for ${fieldName}: ${end}, must be between ${min}-${max}`);\n    }\n    \n    if (startValue > endValue) {\n      throw new Error(`Invalid range for ${fieldName}: ${start}-${end}, start cannot be greater than end`);\n    }\n    return;\n  }\n\n  // List values (e.g., 1,3,5)\n  if (field.includes(',')) {\n    const values = field.split(',');\n    for (const value of values) {\n      validateCronField(value.trim(), min, max, fieldName, fieldNameCN, allowedStrings);\n    }\n    return;\n  }\n\n  // Single numeric value\n  const numValue = parseInt(field);\n  if (isNaN(numValue) || numValue < min || numValue > max) {\n    throw new Error(`Invalid ${fieldName} value: ${field}, must be between ${min}-${max}`);\n  }\n}\n\n/**\n * Validate RedLock method-level options\n * @param options - RedLock method options to validate\n * @throws {Error} When options are invalid\n */\nexport function validateRedLockMethodOptions(options: RedLockMethodOptions): void {\n  if (!options || typeof options !== 'object') {\n    throw new Error('RedLock method options must be an object');\n  }\n\n  if (options.lockTimeOut !== undefined) {\n    if (typeof options.lockTimeOut !== 'number' || options.lockTimeOut <= 0) {\n      throw new Error('lockTimeOut must be a positive number');\n    }\n  }\n\n  if (options.clockDriftFactor !== undefined) {\n    if (typeof options.clockDriftFactor !== 'number' || options.clockDriftFactor < 0 || options.clockDriftFactor > 1) {\n      throw new Error('clockDriftFactor must be a number between 0 and 1');\n    }\n  }\n\n  if (options.maxRetries !== undefined) {\n    if (typeof options.maxRetries !== 'number' || options.maxRetries < 0) {\n      throw new Error('maxRetries must be a non-negative number');\n    }\n  }\n\n  if (options.retryDelayMs !== undefined) {\n    if (typeof options.retryDelayMs !== 'number' || options.retryDelayMs < 0) {\n      throw new Error('retryDelayMs must be a non-negative number');\n    }\n  }\n}\n\n/**\n * Validate RedLock options\n * @param options - RedLock options to validate\n * @throws {Error} When options are invalid\n */\nexport function validateRedLockOptions(options: RedLockOptions): void {\n  if (!options || typeof options !== 'object') {\n    throw new Error('RedLock options must be an object');\n  }\n\n  if (options.lockTimeOut !== undefined) {\n    if (typeof options.lockTimeOut !== 'number' || options.lockTimeOut <= 0) {\n      throw new Error('lockTimeOut must be a positive number');\n    }\n  }\n\n  if (options.retryCount !== undefined) {\n    if (typeof options.retryCount !== 'number' || options.retryCount < 0) {\n      throw new Error('retryCount must be a non-negative number');\n    }\n  }\n\n  if (options.retryDelay !== undefined) {\n    if (typeof options.retryDelay !== 'number' || options.retryDelay < 0) {\n      throw new Error('retryDelay must be a non-negative number');\n    }\n  }\n\n  if (options.retryJitter !== undefined) {\n    if (typeof options.retryJitter !== 'number' || options.retryJitter < 0) {\n      throw new Error('retryJitter must be a non-negative number');\n    }\n  }\n}\n\n//==================== Global Configuration Management ====================\n\n/**\n * Global configuration storage\n */\nlet globalScheduledOptions: ScheduledOptions = {};\n\n/**\n * Set global scheduled options\n * @param options - Global scheduled options\n */\nexport function setGlobalScheduledOptions(options: ScheduledOptions): void {\n  globalScheduledOptions = { ...options };\n}\n\n/**\n * Get global scheduled options\n * @returns Global scheduled options\n */\nexport function getGlobalScheduledOptions(): ScheduledOptions {\n  return globalScheduledOptions;\n}\n\n/**\n * Get effective timezone with priority: user specified > global > default\n * @param userTimezone - User specified timezone\n * @returns Effective timezone\n */\nexport function getEffectiveTimezone(options: ScheduledOptions, userTimezone?: string): string {\n  return userTimezone || options.timezone || 'Asia/Beijing';\n}\n\n\n\n/**\n * Get effective RedLock method options with priority: method options > global options > defaults\n * @param methodOptions - Method-level RedLock options\n * @returns Effective RedLock method options with all defaults applied\n */\nexport function getEffectiveRedLockOptions(methodOptions?: RedLockMethodOptions): RedLockMethodOptions {\n  const globalOptions = getGlobalScheduledOptions();\n  \n  return {\n    lockTimeOut: methodOptions?.lockTimeOut || globalOptions.lockTimeOut || 10000,\n    clockDriftFactor: methodOptions?.clockDriftFactor || globalOptions.clockDriftFactor || 0.01,\n    maxRetries: methodOptions?.maxRetries || globalOptions.maxRetries || 3,\n    retryDelayMs: methodOptions?.retryDelayMs || globalOptions.retryDelayMs || 200\n  };\n} ","/*\n * @Description: Abstract interfaces for Redis client and distributed lock\n * @Usage: \n * @Author: richen\n * @Date: 2025-10-30 12:00:00\n * @LastEditTime: 2025-10-30 12:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport type { Lock, Settings } from \"@sesamecare-oss/redlock\";\n\n/**\n * Redis connection mode\n */\nexport enum RedisMode {\n  STANDALONE = 'standalone',  // 单机模式\n  SENTINEL = 'sentinel',       // 哨兵模式\n  CLUSTER = 'cluster'          // 集群模式\n}\n\n/**\n * Base Redis configuration\n */\nexport interface BaseRedisConfig {\n  mode?: RedisMode;\n  host?: string;\n  port?: number;\n  password?: string;\n  db?: number;\n  keyPrefix?: string;\n  connectTimeout?: number;\n  commandTimeout?: number;\n  maxRetriesPerRequest?: number;\n}\n\n/**\n * Sentinel configuration\n */\nexport interface RedisSentinelConfig extends BaseRedisConfig {\n  mode: RedisMode.SENTINEL;\n  sentinels: Array<{ host: string; port: number }>;\n  name: string;  // sentinel master name\n  sentinelPassword?: string;\n}\n\n/**\n * Cluster configuration\n */\nexport interface RedisClusterConfig extends BaseRedisConfig {\n  mode: RedisMode.CLUSTER;\n  nodes: Array<{ host: string; port: number }>;\n  redisOptions?: {\n    password?: string;\n    db?: number;\n  };\n}\n\n/**\n * Standalone configuration\n */\nexport interface RedisStandaloneConfig extends BaseRedisConfig {\n  mode?: RedisMode.STANDALONE;\n  host: string;\n  port: number;\n}\n\n/**\n * Union type for all Redis configurations\n */\nexport type RedisConfig = RedisStandaloneConfig | RedisSentinelConfig | RedisClusterConfig;\n\n/**\n * Abstract Redis client interface\n * Provides unified interface for different Redis implementations\n */\nexport interface IRedisClient {\n  /**\n   * Get connection status\n   */\n  readonly status: string;\n\n  /**\n   * Execute Redis command\n   * @param command - Command name\n   * @param args - Command arguments\n   */\n  call(command: string, ...args: any[]): Promise<any>;\n\n  /**\n   * Set a key-value pair\n   * @param key - Key name\n   * @param value - Value\n   * @param mode - Optional mode (e.g., 'EX' for expiration)\n   * @param duration - Optional duration in seconds\n   */\n  set(key: string, value: string | Buffer, mode?: string, duration?: number): Promise<'OK' | null>;\n\n  /**\n   * Get value by key\n   * @param key - Key name\n   */\n  get(key: string): Promise<string | null>;\n\n  /**\n   * Delete one or more keys\n   * @param keys - Key names\n   */\n  del(...keys: string[]): Promise<number>;\n\n  /**\n   * Check if key exists\n   * @param key - Key name\n   */\n  exists(key: string): Promise<number>;\n\n  /**\n   * Evaluate Lua script\n   * @param script - Lua script\n   * @param numKeys - Number of keys\n   * @param args - Script arguments\n   */\n  eval(script: string, numKeys: number, ...args: any[]): Promise<any>;\n\n  /**\n   * Close the connection\n   */\n  quit(): Promise<'OK'>;\n\n  /**\n   * Disconnect immediately\n   */\n  disconnect(): void;\n}\n\n/**\n * Abstract distributed lock interface\n * Allows for different lock implementations (RedLock, Zookeeper, etc.)\n */\nexport interface IDistributedLock {\n  /**\n   * Initialize the lock system\n   */\n  initialize(): Promise<void>;\n\n  /**\n   * Acquire a distributed lock\n   * @param resources - Resource identifiers\n   * @param ttl - Time to live in milliseconds\n   */\n  acquire(resources: string[], ttl: number): Promise<Lock>;\n\n  /**\n   * Release a lock\n   * @param lock - Lock instance\n   */\n  release(lock: Lock): Promise<void>;\n\n  /**\n   * Extend lock TTL\n   * @param lock - Lock instance\n   * @param ttl - New TTL in milliseconds\n   */\n  extend(lock: Lock, ttl: number): Promise<Lock>;\n\n  /**\n   * Check if the lock system is ready\n   */\n  isReady(): boolean;\n\n  /**\n   * Get current configuration\n   */\n  getConfig(): any;\n\n  /**\n   * Close and cleanup\n   */\n  close(): Promise<void>;\n\n  /**\n   * Health check\n   */\n  healthCheck(): Promise<{ status: 'healthy' | 'unhealthy'; details: Record<string, any> }>;\n}\n\n/**\n * Lock configuration options\n */\nexport interface ILockOptions extends Partial<Settings> {\n  lockTimeOut?: number;\n  clockDriftFactor?: number;\n  maxRetries?: number;\n  retryDelayMs?: number;\n  redisConfig?: RedisConfig;\n}\n\n","/*\n * @Description: Redis client factory supporting multiple modes\n * @Usage: \n * @Author: richen\n * @Date: 2025-10-30 12:00:00\n * @LastEditTime: 2025-10-30 12:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport Redis, { Cluster, RedisOptions, ClusterOptions } from \"ioredis\";\nimport { DefaultLogger as logger } from \"koatty_logger\";\nimport {\n  IRedisClient,\n  RedisConfig,\n  RedisMode,\n  RedisStandaloneConfig,\n  RedisSentinelConfig,\n  RedisClusterConfig\n} from \"./interface\";\n\n/**\n * Redis client wrapper that implements IRedisClient interface\n * Wraps ioredis client to provide unified interface\n */\nclass RedisClientAdapter implements IRedisClient {\n  constructor(private client: Redis | Cluster) {}\n\n  get status(): string {\n    return this.client.status;\n  }\n\n  async call(command: string, ...args: any[]): Promise<any> {\n    return this.client.call(command, ...args);\n  }\n\n  async set(key: string, value: string | Buffer, mode?: string, duration?: number): Promise<'OK' | null> {\n    if (mode && duration) {\n      // Use type assertion for mode parameter due to ioredis strict typing\n      return this.client.set(key, value, mode as any, duration) as Promise<'OK' | null>;\n    }\n    return this.client.set(key, value);\n  }\n\n  async get(key: string): Promise<string | null> {\n    return this.client.get(key);\n  }\n\n  async del(...keys: string[]): Promise<number> {\n    return this.client.del(...keys);\n  }\n\n  async exists(key: string): Promise<number> {\n    return this.client.exists(key);\n  }\n\n  async eval(script: string, numKeys: number, ...args: any[]): Promise<any> {\n    return this.client.eval(script, numKeys, ...args);\n  }\n\n  async quit(): Promise<'OK'> {\n    return this.client.quit();\n  }\n\n  disconnect(): void {\n    this.client.disconnect();\n  }\n\n  /**\n   * Get underlying Redis/Cluster instance\n   * Used for RedLock initialization\n   */\n  getClient(): Redis | Cluster {\n    return this.client;\n  }\n}\n\n/**\n * Redis client factory\n * Creates appropriate Redis client based on configuration\n */\nexport class RedisFactory {\n  /**\n   * Create Redis client based on configuration mode\n   * @param config - Redis configuration\n   * @returns Redis client adapter\n   */\n  static createClient(config: RedisConfig): RedisClientAdapter {\n    const mode = config.mode || RedisMode.STANDALONE;\n\n    logger.Debug(`Creating Redis client in ${mode} mode`);\n\n    switch (mode) {\n      case RedisMode.STANDALONE:\n        return this.createStandaloneClient(config as RedisStandaloneConfig);\n      \n      case RedisMode.SENTINEL:\n        return this.createSentinelClient(config as RedisSentinelConfig);\n      \n      case RedisMode.CLUSTER:\n        return this.createClusterClient(config as RedisClusterConfig);\n      \n      default:\n        throw new Error(`Unsupported Redis mode: ${mode}`);\n    }\n  }\n\n  /**\n   * Create standalone Redis client\n   * @param config - Standalone configuration\n   */\n  private static createStandaloneClient(config: RedisStandaloneConfig): RedisClientAdapter {\n    logger.Debug(`Creating standalone Redis client: ${config.host}:${config.port}`);\n\n    const options: RedisOptions = {\n      host: config.host,\n      port: config.port,\n      password: config.password || undefined,\n      db: config.db || 0,\n      keyPrefix: config.keyPrefix || '',\n      connectTimeout: config.connectTimeout || 10000,\n      commandTimeout: config.commandTimeout || 5000,\n      maxRetriesPerRequest: config.maxRetriesPerRequest || 3,\n      retryStrategy: (times: number) => {\n        const delay = Math.min(times * 50, 2000);\n        logger.Debug(`Redis reconnecting, attempt ${times}, delay ${delay}ms`);\n        return delay;\n      },\n      reconnectOnError: (err: Error) => {\n        logger.Warn('Redis connection error, attempting reconnect:', err.message);\n        return true;\n      }\n    };\n\n    const client = new Redis(options);\n\n    client.on('connect', () => {\n      logger.Info('Redis standalone client connected successfully');\n    });\n\n    client.on('error', (err: Error) => {\n      logger.Error('Redis standalone client error:', err);\n    });\n\n    return new RedisClientAdapter(client);\n  }\n\n  /**\n   * Create sentinel Redis client\n   * @param config - Sentinel configuration\n   */\n  private static createSentinelClient(config: RedisSentinelConfig): RedisClientAdapter {\n    logger.Debug(`Creating sentinel Redis client for master: ${config.name}`);\n\n    const options: RedisOptions = {\n      sentinels: config.sentinels,\n      name: config.name,\n      password: config.password || undefined,\n      sentinelPassword: config.sentinelPassword || undefined,\n      db: config.db || 0,\n      keyPrefix: config.keyPrefix || '',\n      connectTimeout: config.connectTimeout || 10000,\n      commandTimeout: config.commandTimeout || 5000,\n      maxRetriesPerRequest: config.maxRetriesPerRequest || 3,\n      retryStrategy: (times: number) => {\n        const delay = Math.min(times * 50, 2000);\n        logger.Debug(`Sentinel Redis reconnecting, attempt ${times}, delay ${delay}ms`);\n        return delay;\n      }\n    };\n\n    const client = new Redis(options);\n\n    client.on('connect', () => {\n      logger.Info(`Redis sentinel client connected to master: ${config.name}`);\n    });\n\n    client.on('error', (err: Error) => {\n      logger.Error('Redis sentinel client error:', err);\n    });\n\n    return new RedisClientAdapter(client);\n  }\n\n  /**\n   * Create cluster Redis client\n   * @param config - Cluster configuration\n   */\n  private static createClusterClient(config: RedisClusterConfig): RedisClientAdapter {\n    logger.Debug(`Creating cluster Redis client with ${config.nodes.length} nodes`);\n\n    const clusterOptions: ClusterOptions = {\n      redisOptions: {\n        password: config.redisOptions?.password || config.password || undefined,\n        db: config.redisOptions?.db || config.db || 0,\n        keyPrefix: config.keyPrefix || '',\n        connectTimeout: config.connectTimeout || 10000,\n        commandTimeout: config.commandTimeout || 5000,\n        maxRetriesPerRequest: config.maxRetriesPerRequest || 3\n      },\n      clusterRetryStrategy: (times: number) => {\n        const delay = Math.min(times * 50, 2000);\n        logger.Debug(`Cluster Redis reconnecting, attempt ${times}, delay ${delay}ms`);\n        return delay;\n      }\n    };\n\n    const cluster = new Cluster(config.nodes, clusterOptions);\n\n    cluster.on('connect', () => {\n      logger.Info('Redis cluster client connected successfully');\n    });\n\n    cluster.on('error', (err: Error) => {\n      logger.Error('Redis cluster client error:', err);\n    });\n\n    cluster.on('node error', (err: Error, address: string) => {\n      logger.Error(`Redis cluster node error at ${address}:`, err);\n    });\n\n    return new RedisClientAdapter(cluster);\n  }\n\n  /**\n   * Validate Redis configuration\n   * @param config - Redis configuration to validate\n   */\n  static validateConfig(config: RedisConfig): void {\n    if (!config) {\n      throw new Error('Redis configuration cannot be empty');\n    }\n\n    const mode = config.mode || RedisMode.STANDALONE;\n\n    switch (mode) {\n      case RedisMode.STANDALONE:\n        this.validateStandaloneConfig(config as RedisStandaloneConfig);\n        break;\n      \n      case RedisMode.SENTINEL:\n        this.validateSentinelConfig(config as RedisSentinelConfig);\n        break;\n      \n      case RedisMode.CLUSTER:\n        this.validateClusterConfig(config as RedisClusterConfig);\n        break;\n      \n      default:\n        throw new Error(`Unsupported Redis mode: ${mode}`);\n    }\n  }\n\n  private static validateStandaloneConfig(config: RedisStandaloneConfig): void {\n    if (!config.host) {\n      throw new Error('Standalone mode requires host configuration');\n    }\n    if (!config.port) {\n      throw new Error('Standalone mode requires port configuration');\n    }\n  }\n\n  private static validateSentinelConfig(config: RedisSentinelConfig): void {\n    if (!config.sentinels || config.sentinels.length === 0) {\n      throw new Error('Sentinel mode requires at least one sentinel node');\n    }\n    if (!config.name) {\n      throw new Error('Sentinel mode requires master name');\n    }\n  }\n\n  private static validateClusterConfig(config: RedisClusterConfig): void {\n    if (!config.nodes || config.nodes.length === 0) {\n      throw new Error('Cluster mode requires at least one node');\n    }\n  }\n}\n\nexport { RedisClientAdapter };\n\n","/*\n * @Description: RedLock utility for distributed locks\n * @Usage: \n * @Author: richen\n * @Date: 2021-11-17 16:18:33\n * @LastEditTime: 2024-01-17 15:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { Redlock, Lock, Settings } from \"@sesamecare-oss/redlock\";\nimport { DefaultLogger as logger } from \"koatty_logger\";\nimport { IOCContainer } from \"koatty_container\";\nimport { IDistributedLock, ILockOptions, RedisConfig, RedisMode } from \"./interface\";\nimport { RedisFactory, RedisClientAdapter } from \"./redis-factory\";\n\n/**\n * Configuration options for RedLock\n * @deprecated Use ILockOptions from interface instead\n */\nexport interface RedLockOptions extends ILockOptions {\n  redisConfig?: RedisConfig;\n}\n\n/**\n * Default RedLock configuration\n */\nconst defaultRedLockConfig: RedLockOptions = {\n  lockTimeOut: 10000,\n  clockDriftFactor: 0.01,\n  maxRetries: 3,\n  retryDelayMs: 200,\n  redisConfig: {\n    mode: RedisMode.STANDALONE,\n    host: '127.0.0.1',\n    port: 6379,\n    password: '',\n    db: 0,\n    keyPrefix: 'redlock:'\n  }\n};\n\n/**\n * Default Redlock Settings for @sesamecare-oss/redlock\n */\nconst defaultRedlockSettings: Partial<Settings> = {\n  driftFactor: 0.01,\n  retryCount: 3,\n  retryDelay: 200,\n  retryJitter: 200,\n  automaticExtensionThreshold: 500\n};\n\n/**\n * RedLock distributed lock manager\n * Integrated with koatty IOC container\n * Implements singleton pattern for safe instance management\n * Implements IDistributedLock interface for abstraction\n */\nexport class RedLocker implements IDistributedLock {\n  private static instance: RedLocker | null = null;\n  private static readonly instanceLock = Symbol('RedLocker.instanceLock');\n  \n  private redlock: Redlock | null = null;\n  private redisClient: RedisClientAdapter | null = null;\n  private config: RedLockOptions;\n  private isInitialized = false;\n  private initializationPromise: Promise<void> | null = null;\n\n  // 私有构造函数防止外部直接实例化\n  private constructor(options?: RedLockOptions) {\n    this.config = { ...defaultRedLockConfig, ...options };\n    // Register this instance in IOC container\n    this.registerInContainer();\n  }\n\n  /**\n   * Register RedLocker in IOC container\n   * @private\n   */\n  private registerInContainer(): void {\n    try {\n      const RedLockerClass = this.constructor as Function;\n      IOCContainer.saveClass('COMPONENT', RedLockerClass, 'RedLocker');\n      IOCContainer.setExistingInstance(RedLockerClass, this);\n      logger.Debug('RedLocker registered in IOC container');\n    } catch (_error) {\n      logger.Warn('Failed to register RedLocker in IOC container:', _error);\n    }\n  }\n\n  /**\n   * Get RedLocker singleton instance with thread-safe initialization\n   * @static\n   * @param options - RedLock configuration options (only used for first initialization)\n   * @returns RedLocker singleton instance\n   */\n  public static getInstance(options?: RedLockOptions): RedLocker {\n    // 双重检查锁定模式确保线程安全\n    if (!RedLocker.instance) {\n      // 首次创建时使用选项，后续调用忽略选项参数\n      if (RedLocker.instance === null) {\n        try {\n          // 尝试从IOC容器获取已存在的实例\n          const containerInstance = IOCContainer.get('RedLocker', 'COMPONENT') as RedLocker;\n          if (containerInstance) {\n            RedLocker.instance = containerInstance;\n            logger.Debug('Retrieved existing RedLocker instance from IOC container');\n          } else {\n            // 创建新的单例实例\n            RedLocker.instance = new RedLocker(options);\n            logger.Debug('Created new RedLocker singleton instance');\n          }\n        } catch {\n          // IOC容器不可用时直接创建\n          RedLocker.instance = new RedLocker(options);\n          logger.Debug('Created new RedLocker instance outside IOC container');\n        }\n      }\n    } else if (options) {\n      // 如果实例已存在但传入了新选项，记录警告\n      logger.Warn('RedLocker instance already exists, ignoring new options. Use updateConfig() to change configuration.');\n    }\n    \n    return RedLocker.instance;\n  }\n\n  /**\n   * Reset singleton instance (主要用于测试)\n   * @static\n   */\n  public static resetInstance(): void {\n    if (RedLocker.instance) {\n      RedLocker.instance.close().catch(err => \n        logger.Warn('Error while closing RedLocker instance during reset:', err)\n      );\n      RedLocker.instance = null;\n    }\n  }\n\n  /**\n   * Initialize RedLock with Redis connection\n   * Uses cached promise to avoid duplicate initialization\n   * @private\n   */\n  public async initialize(): Promise<void> {\n    // 如果已经初始化，直接返回\n    if (this.isInitialized) {\n      return;\n    }\n    \n    // 如果正在初始化，等待现有的初始化完成\n    if (this.initializationPromise) {\n      return this.initializationPromise;\n    }\n    \n    // 创建初始化Promise并缓存\n    this.initializationPromise = this.performInitialization();\n    \n    try {\n      await this.initializationPromise;\n    } catch (error) {\n      // 初始化失败时完整清理状态，允许重试\n      this.initializationPromise = null;\n      this.isInitialized = false;\n      this.redlock = null;\n      // 注意：不清理 redis 连接，因为它可能来自 IOC 容器\n      logger.Warn('RedLocker initialization failed, state has been reset for retry');\n      throw error;\n    }\n  }\n  \n  /**\n   * 执行实际的初始化操作\n   * @private\n   */\n  private async performInitialization(): Promise<void> {\n\n    try {\n      // Validate Redis configuration\n      if (this.config.redisConfig) {\n        RedisFactory.validateConfig(this.config.redisConfig);\n      }\n\n      // Try to get Redis instance from IOC container first\n      try {\n        const existingRedis = IOCContainer.get('Redis', 'COMPONENT');\n        // If Redis instance exists in container, wrap it\n        if (existingRedis) {\n          // Check if it's already a RedisClientAdapter\n          if (existingRedis instanceof RedisClientAdapter) {\n            this.redisClient = existingRedis;\n          } else {\n            // Wrap raw Redis/Cluster instance (type assertion needed)\n            this.redisClient = new RedisClientAdapter(existingRedis as any);\n          }\n          logger.Debug('Using Redis instance from IOC container');\n        }\n      } catch {\n        // IOC container doesn't have Redis, create new connection\n      }\n\n      // Create new Redis connection if not available in container\n      if (!this.redisClient && this.config.redisConfig) {\n        this.redisClient = RedisFactory.createClient(this.config.redisConfig);\n        logger.Debug('Created new Redis connection for RedLocker');\n      }\n\n      if (!this.redisClient) {\n        throw new Error('Failed to initialize Redis connection: no configuration provided');\n      }\n\n      // Get underlying client for Redlock\n      const underlyingClient = this.redisClient.getClient();\n\n      // Merge default settings with user configuration\n      // Extract Settings properties from config (which extends Partial<Settings>)\n      const userSettings: any = this.config;\n      const redlockSettings: Partial<Settings> = {\n        ...defaultRedlockSettings,\n        ...(userSettings.driftFactor !== undefined && { driftFactor: userSettings.driftFactor }),\n        ...(userSettings.retryCount !== undefined && { retryCount: userSettings.retryCount }),\n        ...(userSettings.retryDelay !== undefined && { retryDelay: userSettings.retryDelay }),\n        ...(userSettings.retryJitter !== undefined && { retryJitter: userSettings.retryJitter }),\n        ...(userSettings.automaticExtensionThreshold !== undefined && { \n          automaticExtensionThreshold: userSettings.automaticExtensionThreshold \n        })\n      };\n\n      // Initialize Redlock with the Redis instance\n      this.redlock = new Redlock([underlyingClient], redlockSettings);\n\n      // Set up error handlers\n      this.redlock.on('clientError', (err: Error) => {\n        logger.Error('Redis client error in RedLock:', err);\n      });\n\n      this.isInitialized = true;\n      logger.Info('RedLocker initialized successfully');\n    } catch (error) {\n      this.isInitialized = false;\n      logger.Error('Failed to initialize RedLocker:', error);\n      throw new Error(`RedLocker initialization failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n    }\n  }\n\n  /**\n   * Acquire a distributed lock\n   * @param resources - Resource identifiers to lock\n   * @param ttl - Time to live in milliseconds\n   * @returns Promise<Lock>\n   */\n  async acquire(resources: string[], ttl?: number): Promise<Lock> {\n    if (!Array.isArray(resources) || resources.length === 0) {\n      throw new Error('Resources array cannot be empty');\n    }\n\n    const lockTtl = ttl || this.config.lockTimeOut;\n    if (lockTtl <= 0) {\n      throw new Error('Lock TTL must be positive');\n    }\n\n    // Ensure RedLocker is initialized\n    await this.initialize();\n\n    if (!this.redlock) {\n      throw new Error('RedLock is not initialized');\n    }\n\n    try {\n      // Add key prefix to resources\n      const prefixedResources = resources.map(resource => \n        `${this.config.redisConfig.keyPrefix}${resource}`\n      );\n\n      logger.Debug(`Acquiring lock for resources: ${prefixedResources.join(', ')} with TTL: ${lockTtl}ms`);\n      \n      const lock = await this.redlock.acquire(prefixedResources, lockTtl);\n      logger.Debug(`Lock acquired successfully for resources: ${prefixedResources.join(', ')}`);\n      \n      return lock;\n    } catch (error) {\n      logger.Error(`Failed to acquire lock for resources: ${resources.join(', ')}`, error);\n      // 保留原始错误信息，避免过度包装\n      if (error instanceof Error) {\n        error.message = `Lock acquisition failed: ${error.message}`;\n        throw error;\n      }\n      throw new Error(`Lock acquisition failed: Unknown error`);\n    }\n  }\n\n  /**\n   * Release a lock\n   * @param lock - Lock instance to release\n   */\n  async release(lock: Lock): Promise<void> {\n    if (!lock) {\n      throw new Error('Lock instance is required');\n    }\n\n    try {\n      await lock.release();\n      logger.Debug('Lock released successfully');\n    } catch (error) {\n      logger.Error('Failed to release lock:', error);\n      // 保留原始错误信息\n      if (error instanceof Error) {\n        error.message = `Lock release failed: ${error.message}`;\n        throw error;\n      }\n      throw new Error(`Lock release failed: Unknown error`);\n    }\n  }\n\n  /**\n   * Extend a lock's TTL\n   * @param lock - Lock instance to extend\n   * @param ttl - New TTL in milliseconds\n   * @returns Extended lock\n   */\n  async extend(lock: Lock, ttl: number): Promise<Lock> {\n    if (!lock) {\n      throw new Error('Lock instance is required');\n    }\n\n    if (ttl <= 0) {\n      throw new Error('TTL must be positive');\n    }\n\n    try {\n      const extendedLock = await lock.extend(ttl);\n      logger.Debug(`Lock extended successfully with TTL: ${ttl}ms`);\n      return extendedLock;\n    } catch (error) {\n      logger.Error('Failed to extend lock:', error);\n      throw new Error(`Lock extension failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n    }\n  }\n\n  /**\n   * Check if RedLocker is initialized\n   * @returns true if initialized, false otherwise\n   */\n  isReady(): boolean {\n    return this.isInitialized && !!this.redlock && !!this.redisClient;\n  }\n\n  /**\n   * Get current configuration\n   * @returns Current RedLock configuration\n   */\n  getConfig(): RedLockOptions {\n    return { ...this.config };\n  }\n\n  /**\n   * Update configuration (requires reinitialization)\n   * @param options - New RedLock options\n   */\n  updateConfig(options?: Partial<RedLockOptions>): void {\n    if (options) {\n      this.config = { ...this.config, ...options };\n    }\n\n    // 清理初始化状态，强制重新初始化\n    this.isInitialized = false;\n    this.initializationPromise = null;\n    this.redlock = null;\n    \n    logger.Debug('RedLocker configuration updated, will reinitialize on next use');\n  }\n\n  /**\n   * Close Redis connection and cleanup\n   */\n  async close(): Promise<void> {\n    try {\n      if (this.redisClient && this.redisClient.status === 'ready') {\n        await this.redisClient.quit();\n        logger.Debug('Redis connection closed');\n      }\n      \n      this.redisClient = null;\n      this.redlock = null;\n      this.isInitialized = false;\n    } catch (error) {\n      logger.Error('Error closing RedLocker:', error);\n    }\n  }\n\n  /**\n   * Get container registration status\n   * @returns Registration information\n   */\n  getContainerInfo(): { registered: boolean; identifier: string } {\n    try {\n      const instance = IOCContainer.get('RedLocker', 'COMPONENT');\n      return {\n        registered: !!instance,\n        identifier: 'RedLocker'\n      };\n    } catch {\n      return {\n        registered: false,\n        identifier: 'RedLocker'\n      };\n    }\n  }\n\n  /**\n   * Health check for RedLocker\n   * @returns Health status\n   */\n  async healthCheck(): Promise<{ status: 'healthy' | 'unhealthy'; details: Record<string, any> }> {\n    try {\n      await this.initialize();\n      \n      const redisStatus = this.redisClient?.status || 'unknown';\n      const isReady = this.isReady();\n      \n      return {\n        status: isReady ? 'healthy' : 'unhealthy',\n        details: {\n          initialized: this.isInitialized,\n          redisStatus,\n          redisMode: this.config.redisConfig?.mode || 'unknown',\n          redlockReady: !!this.redlock,\n          containerRegistered: this.getContainerInfo().registered\n        }\n      };\n    } catch (error) {\n      return {\n        status: 'unhealthy',\n        details: {\n          error: error instanceof Error ? error.message : 'Unknown error',\n          initialized: this.isInitialized\n        }\n      };\n    }\n  }\n}","/*\n * @Description: \n * @Usage: \n * @Author: richen\n * @Date: 2024-01-16 19:53:14\n * @LastEditTime: 2024-11-07 16:47:58\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\n/**\n * 返回一个可取消的 Promise，在指定时间后 reject\n * @param ms 超时时间（毫秒）\n * @returns 带有 cancel 方法的 Promise\n */\nexport interface CancelablePromise<T> extends Promise<T> {\n  cancel: () => void;\n}\n\nexport function timeoutPromise(ms: number): CancelablePromise<never> {\n  let timeoutId: NodeJS.Timeout | null = null;\n  \n  const promise = new Promise<never>((resolve, reject) => {\n    timeoutId = setTimeout(() => {\n      timeoutId = null;\n      reject(new Error('TIME_OUT_ERROR'));\n    }, ms);\n  }) as CancelablePromise<never>;\n\n  // 添加取消方法，防止内存泄漏\n  promise.cancel = () => {\n    if (timeoutId !== null) {\n      clearTimeout(timeoutId);\n      timeoutId = null;\n    }\n  };\n\n  return promise;\n}\n/**\n * @description: 使用 Promise.resolve 包装不确定的函数，并捕获错误\n * @param {Function} fn\n * @param {any} args\n * @return {*}\n */\nexport function wrappedPromise(fn: Function, args: any[]) {\n  return new Promise((resolve, reject) => {\n    try {\n      const result = fn(...args);\n      resolve(result);\n    } catch (error) {\n      reject(error);\n    }\n  });\n}\n","/*\n * @Description: \n * @Usage: \n * @Author: richen\n * @Date: 2025-06-09 16:00:00\n * @LastEditTime: 2025-06-09 16:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { IOCContainer } from \"koatty_container\";\nimport { RedLockMethodOptions, validateRedLockMethodOptions } from \"../config/config\";\nimport { redLockerDescriptor, generateLockName } from \"../process/locker\";\n\n/**\n * Redis-based distributed lock decorator\n *\n * @export\n * @param {string} [name] - The locker name. If name is duplicated, lock sharing contention will result.\n *                          If not provided, a unique name will be auto-generated using method name + random suffix.\n *                          IMPORTANT: Auto-generated names are unique per method deployment and not predictable.\n * @param {RedLockMethodOptions} [options] - Lock configuration options for this method\n * \n * @returns {MethodDecorator}\n * @throws {Error} When decorator is used on wrong class type or invalid configuration\n * \n * @example\n * ```typescript\n * class UserService {\n *   @RedLock('user_update_lock', { lockTimeOut: 5000, maxRetries: 2 })\n *   async updateUser(id: string, data: any) {\n *     // This method will be protected by a distributed lock with predictable name\n *   }\n *   \n *   @RedLock() // Auto-generated unique name like \"deleteUser_abc123_xyz789\"\n *   async deleteUser(id: string) {\n *     // This method will be protected by a distributed lock with auto-generated unique name\n *   }\n * }\n * ```\n */\nexport function RedLock(lockName?: string, options?: RedLockMethodOptions) {\n  return IOCContainer.createDecorator(({ target, methodName, descriptor, method, context }) => {\n    if (context) {\n      // TC39 path\n      if (!methodName || typeof methodName !== 'string') {\n        throw Error(\"Method name is required for @RedLock decorator\");\n      }\n\n      if (options) {\n        validateRedLockMethodOptions(options);\n      }\n\n      context.addInitializer?.(function (this: any) {\n        const targetClass = this.constructor;\n        const componentType = IOCContainer.getType(targetClass);\n        if (componentType !== \"SERVICE\" && componentType !== \"COMPONENT\") {\n          throw Error(\"@RedLock decorator can only be used on SERVICE or COMPONENT classes.\");\n        }\n        IOCContainer.saveClass(\"COMPONENT\", targetClass, targetClass.name);\n      });\n\n      const originalMethod = method!;\n      return async function (this: any, ...props: any[]): Promise<unknown> {\n        try {\n          const { RedLocker } = await import(\"../locker/redlock\");\n          const { getEffectiveRedLockOptions } = await import(\"../config/config\");\n          const { timeoutPromise } = await import(\"../utils/lib\");\n          const { Lock } = await import(\"@sesamecare-oss/redlock\");\n\n          const resolvedLockName = lockName || generateLockName(lockName, methodName, Object.getPrototypeOf(this));\n\n          const redlock = RedLocker.getInstance();\n          const lockOptions = getEffectiveRedLockOptions(options);\n          const lockTime = lockOptions.lockTimeOut || 10000;\n          if (lockTime <= 200) {\n            throw new Error(\"Lock timeout must be greater than 200ms to allow for proper execution\");\n          }\n\n          const lock = await redlock.acquire([methodName, resolvedLockName], lockTime);\n          const timeout = lockTime - 200;\n\n          try {\n            const result = await Promise.race([\n              originalMethod.apply(this, props),\n              timeoutPromise(timeout)\n            ]);\n            return result;\n          } catch (error) {\n            throw error;\n          } finally {\n            try {\n              await lock.release();\n            } catch (releaseError) {\n              // Ignore release errors\n            }\n          }\n        } catch (error) {\n          throw error;\n        }\n      };\n    } else {\n      // Legacy path\n      // 验证装饰器使用的类型（从原型对象获取类构造函数）\n      const targetClass = (target as any).constructor;\n      const componentType = IOCContainer.getType(targetClass);\n      if (componentType !== \"SERVICE\" && componentType !== \"COMPONENT\") {\n        throw Error(\"@RedLock decorator can only be used on SERVICE or COMPONENT classes.\");\n      }\n\n      // 验证方法名\n      if (!methodName || typeof methodName !== 'string') {\n        throw Error(\"Method name is required for @RedLock decorator\");\n      }\n\n      // 验证方法描述符\n      if (!descriptor || typeof descriptor.value !== 'function') {\n        throw Error(\"@RedLock decorator can only be applied to methods\");\n      }\n\n      // 生成锁名称：用户指定的 > 基于类名和方法名生成\n      const finalLockName = lockName || generateLockName(lockName, methodName, target);\n\n      // 验证选项\n      if (options) {\n        validateRedLockMethodOptions(options);\n      }\n\n      // 保存类到IOC容器\n      IOCContainer.saveClass(\"COMPONENT\", targetClass, targetClass.name);\n\n      try {\n        // 直接在装饰器中包装方法，而不是延迟处理\n        const enhancedDescriptor = redLockerDescriptor(\n          descriptor,\n          finalLockName,\n          methodName,\n          options\n        );\n\n        return enhancedDescriptor;\n      } catch (error) {\n        throw new Error(`Failed to apply RedLock to ${methodName}: ${(error as Error).message}`);\n      }\n    }\n  }, 'method');\n}","/*\n * @Description: Decorator preprocessing mechanism for koatty_schedule\n * @Usage: \n * @Author: richen\n * @Date: 2024-01-17 16:00:00\n * @LastEditTime: 2024-01-17 16:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { IOCContainer } from \"koatty_container\";\nimport { RedLocker, RedLockOptions } from \"../locker/redlock\";\nimport { Helper } from \"koatty_lib\";\nimport { DefaultLogger as logger } from \"koatty_logger\";\nimport { Lock } from \"@sesamecare-oss/redlock\";\nimport { timeoutPromise } from \"../utils/lib\";\nimport { Koatty } from \"koatty_core\";\nimport { RedLockMethodOptions, getEffectiveRedLockOptions } from \"../config/config\";\n\n/**\n * Initiation schedule locker client.\n *\n * @param {RedLockOptions} options - RedLock 配置选项\n * @param {Koatty} app - Koatty 应用实例\n * @returns {Promise<void>}  \n */\nexport async function initRedLock(options: RedLockOptions, app: Koatty): Promise<void> {\n  if (!app || !Helper.isFunction(app.once)) {\n    logger.Warn(`RedLock initialization skipped: Koatty app not available or not initialized`);\n    return;\n  }\n  try {\n    if (Helper.isEmpty(options)) {\n      throw Error(`Missing RedLock configuration. Please write a configuration item with the key name 'RedLock' in the db.ts file.`);\n    }\n    // 获取RedLocker实例，在首次使用时自动初始化\n    const redLocker = RedLocker.getInstance(options);\n    await redLocker.initialize();\n    logger.Info('RedLock initialized successfully');\n  } catch (error) {\n    logger.Error('Failed to initialize RedLock:', error);\n    throw error;\n  }\n}\n\n/**\n * Create redLocker Descriptor with improved error handling and type safety\n * @param descriptor - Property descriptor\n * @param name - Lock name\n * @param method - Method name\n * @param methodOptions - Method-level RedLock options\n * @returns Enhanced property descriptor\n */\nexport function redLockerDescriptor(\n  descriptor: PropertyDescriptor,\n  name: string,\n  method: string,\n  methodOptions?: RedLockMethodOptions\n): PropertyDescriptor {\n  // 参数验证\n  if (!descriptor) {\n    throw new Error('Property descriptor is required');\n  }\n  if (!name || typeof name !== 'string') {\n    throw new Error('Lock name must be a non-empty string');\n  }\n  if (!method || typeof method !== 'string') {\n    throw new Error('Method name must be a non-empty string');\n  }\n\n  const { value, configurable, enumerable } = descriptor;\n\n  // 验证原始函数\n  if (typeof value !== 'function') {\n    throw new Error('Descriptor value must be a function');\n  }\n\n  /**\n   * Enhanced function wrapper with proper lock renewal and safety\n   */\n  const valueFunction = async (\n    self: unknown,\n    initialLock: Lock,\n    lockTime: number,\n    timeout: number,\n    props: unknown[]\n  ): Promise<unknown> => {\n    let currentLock = initialLock;\n    let remainingTime = timeout;\n    const maxExtensions = 3; // 限制续期次数防止无限循环\n    let extensionCount = 0;\n    \n    try {\n      while (remainingTime > 0 && extensionCount < maxExtensions) {\n        // 创建可取消的超时 Promise\n        const timeoutHandler = timeoutPromise(remainingTime);\n        \n        try {\n          // 执行业务方法，与超时竞争\n          const result = await Promise.race([\n            value.apply(self, props),\n            timeoutHandler\n          ]);\n          \n          // 成功执行，取消超时定时器防止内存泄漏\n          timeoutHandler.cancel();\n          return result;\n        } catch (error) {\n          // 无论什么错误，都要取消超时定时器\n          timeoutHandler.cancel();\n          \n          // 处理超时错误，尝试续期锁\n          if (error instanceof Error && error.message === 'TIME_OUT_ERROR') {\n            extensionCount++;\n            logger.Debug(`Method ${method} execution timeout, attempting lock extension ${extensionCount}/${maxExtensions}`);\n            \n            try {\n              // 续期锁，获得新的锁实例\n              currentLock = await currentLock.extend(lockTime);\n              remainingTime = lockTime - 200; // 预留200ms用于锁操作\n              logger.Debug(`Lock extended for method: ${method}, remaining time: ${remainingTime}ms`);\n              \n              // 继续循环，重新执行业务方法\n              continue;\n            } catch (extendError) {\n              logger.Error(`Failed to extend lock for method: ${method}`, extendError);\n              throw new Error(`Lock extension failed: ${extendError instanceof Error ? extendError.message : 'Unknown error'}`);\n            }\n          } else {\n            // 非超时错误，直接抛出\n            throw error;\n          }\n        }\n      }\n      \n      // 达到最大续期次数或剩余时间不足\n      throw new Error(`Method ${method} execution timeout after ${extensionCount} lock extensions`);\n    } finally {\n      // 确保锁被释放\n      try {\n        await currentLock.release();\n        logger.Debug(`Lock released for method: ${method}`);\n      } catch (releaseError) {\n        logger.Warn(`Failed to release lock for method: ${method}`, releaseError);\n      }\n    }\n  };\n\n  return {\n    configurable,\n    enumerable,\n    writable: true,\n    async value(...props: unknown[]): Promise<unknown> {\n      try {\n        const redlock = RedLocker.getInstance();\n        const lockOptions = getEffectiveRedLockOptions(methodOptions);\n        // Acquire a lock.\n        const lockTime = lockOptions.lockTimeOut || 10000;\n        if (lockTime <= 200) {\n          throw new Error(\"Lock timeout must be greater than 200ms to allow for proper execution\");\n        }\n\n        const lock = await redlock.acquire([method, name], lockTime);\n        const timeout = lockTime - 200;\n\n        logger.Debug(`Lock acquired for method: ${method}, timeout: ${timeout}ms`);\n        return await valueFunction(this, lock, lockTime, timeout, props);\n      } catch (error) {\n        logger.Error(`RedLock operation failed for method: ${method}`, error);\n        throw error;\n      }\n    },\n  };\n}\n\n/**\n * Generate lock name for RedLock decorator\n */\nexport function generateLockName(configName: string | undefined, methodName: string, target: unknown): string {\n  if (configName) {\n    return configName;\n  }\n\n  try {\n    const targetObj = target as object | Function;\n    const identifier = IOCContainer.getIdentifier(targetObj);\n    if (identifier) {\n      return `${identifier}_${methodName}`;\n    }\n  } catch {\n    // Fallback if IOC container is not available\n  }\n\n  const targetWithConstructor = target as { constructor?: Function };\n  const className = targetWithConstructor.constructor?.name || 'Unknown';\n  return `${className}_${methodName}`;\n}","/*\n * @Description: \n * @Usage: \n * @Author: richen\n * @Date: 2025-06-09 16:00:00\n * @LastEditTime: 2025-06-09 16:00:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { Helper } from \"koatty_lib\";\nimport { COMPONENT_SCHEDULED, DecoratorType, validateCronExpression } from \"../config/config\";\nimport { IOCContainer } from \"koatty_container\";\n\n/**\n * Schedule task decorator with optimized preprocessing\n *\n * @export\n * @param {string} cron - Cron expression for task scheduling\n * @param {string} [timezone='Asia/Beijing'] - Timezone for the schedule\n * \n * Cron expression format:\n * * Seconds: 0-59\n * * Minutes: 0-59\n * * Hours: 0-23\n * * Day of Month: 1-31\n * * Months: 1-12 (Jan-Dec)\n * * Day of Week: 1-7 (Sun-Sat)\n * \n * @returns {MethodDecorator}\n * @throws {Error} When cron expression is invalid or decorator is used on wrong class type\n */\nexport function Scheduled(cron: string, timezone = 'Asia/Beijing') {\n  // 参数验证\n  if (Helper.isEmpty(cron)) {\n    throw Error(\"Cron expression is required and cannot be empty\");\n  }\n\n  // 验证cron表达式格式\n  try {\n    validateCronExpression(cron);\n  } catch (error) {\n    throw Error(`Invalid cron expression: ${(error as Error).message}`);\n  }\n\n  // 验证时区\n  if (timezone && typeof timezone !== 'string') {\n    throw Error(\"Timezone must be a string\");\n  }\n\n  return IOCContainer.createDecorator(({ target, methodName, descriptor, method, context }) => {\n    if (context) {\n      // TC39 path\n      context.addInitializer?.(function (this: any) {\n        const targetClass = this.constructor;\n        const componentType = IOCContainer.getType(targetClass);\n        if (componentType !== \"SERVICE\" && componentType !== \"COMPONENT\") {\n          throw Error(\"@Scheduled decorator can only be used on SERVICE or COMPONENT classes.\");\n        }\n\n        // 验证方法名\n        if (!methodName || typeof methodName !== 'string') {\n          throw Error(\"Method name is required for @Scheduled decorator\");\n        }\n\n        // 保存类到IOC容器\n        IOCContainer.saveClass(\"COMPONENT\", targetClass, targetClass.name);\n        // 保存调度元数据到 IOC 容器\n        IOCContainer.attachClassMetadata(COMPONENT_SCHEDULED, DecoratorType.SCHEDULED, {\n          method: methodName,\n          cron,\n          timezone\n        }, this, methodName);\n      });\n\n      return method;\n    } else {\n      // Legacy path\n      // 验证装饰器使用的类型（从原型对象获取类构造函数）\n      const targetClass = (target as any).constructor;\n      const componentType = IOCContainer.getType(targetClass);\n      if (componentType !== \"SERVICE\" && componentType !== \"COMPONENT\") {\n        throw Error(\"@Scheduled decorator can only be used on SERVICE or COMPONENT classes.\");\n      }\n\n      // 验证方法名\n      if (!methodName || typeof methodName !== 'string') {\n        throw Error(\"Method name is required for @Scheduled decorator\");\n      }\n\n      // 验证方法描述符\n      if (!descriptor || typeof descriptor.value !== 'function') {\n        throw Error(\"@Scheduled decorator can only be applied to methods\");\n      }\n      // 保存类到IOC容器\n      IOCContainer.saveClass(\"COMPONENT\", targetClass, targetClass.name);\n      // 保存调度元数据到 IOC 容器\n      IOCContainer.attachClassMetadata(COMPONENT_SCHEDULED, DecoratorType.SCHEDULED, {\n        method: methodName,\n        cron,\n        timezone  // 保存确定的时区值\n      }, target as object, methodName);\n    }\n  }, 'method');\n}\n","/**\n * @ author: richen\n * @ copyright: Copyright (c) - <richenlin(at)gmail.com>\n * @ license: MIT\n * @ version: 2020-07-06 10:29:20\n */\nimport { IOCContainer } from \"koatty_container\";\nimport { Helper } from \"koatty_lib\";\nimport { DefaultLogger as logger } from \"koatty_logger\";\nimport { CronJob } from \"cron\";\nimport { COMPONENT_SCHEDULED, DecoratorType, getEffectiveTimezone } from \"../config/config\";\nimport { Koatty } from \"koatty_core\";\n\n/**\n * 初始化调度任务系统\n * 在appReady时触发批量注入调度任务，确保所有初始化工作完成\n *\n * @param {Koatty} app - Koatty 应用实例\n * @param {any} options - 调度任务配置\n */\nexport async function initSchedule(options: any, app: Koatty): Promise<void> {\n  if (!app || !Helper.isFunction(app.once)) {\n    logger.Warn(`Schedule initialization skipped: Koatty app not available or not initialized`);\n    return;\n  }\n  try {\n    await injectSchedule(options);\n    logger.Info('Schedule system initialized successfully');\n  } catch (error) {\n    logger.Error('Failed to initialize Schedule system:', error);\n    throw error;\n  }\n}\n\n/**\n * Inject schedule job with enhanced error handling and validation\n *\n * @param {unknown} target - Target class\n * @param {string} method - Method name\n * @param {string} cron - Cron expression\n * @param {string} [timezone] - Timezone\n */\n/**\n * 批量注入调度任务 - 从IOC容器读取类元数据并创建所有CronJob\n */\nexport async function injectSchedule(options: any): Promise<void> {\n  try {\n    logger.Debug('Starting batch schedule injection...');\n    let totalScheduled = 0;\n    const componentList = IOCContainer.listClass(\"COMPONENT\");\n    for (const component of componentList) {\n      const classMetadata = IOCContainer.getClassMetadata(COMPONENT_SCHEDULED, DecoratorType.SCHEDULED,\n        component.target);\n      if (!classMetadata || !Array.isArray(classMetadata)) {\n        continue;\n      }\n\n      const instance: any = IOCContainer.get(component.id);\n      if (!instance) {\n        continue;\n      }\n\n      for (const scheduleData of classMetadata) {\n        try {\n          if (!scheduleData || !scheduleData.method) {\n            continue;\n          }\n\n          const targetMethod = instance[scheduleData.method];\n          if (!Helper.isFunction(targetMethod)) {\n            logger.Warn(`Schedule injection skipped: method ${scheduleData.method} is not a function in ${component.id}`);\n            continue;\n          }\n\n          const taskName = `${component.id}_${scheduleData.method}`;\n          const tz = getEffectiveTimezone(options, scheduleData.timezone);\n\n          new CronJob(\n            scheduleData.cron,\n            () => {\n              logger.Debug(`The schedule job ${taskName} started.`);\n              Promise.resolve(targetMethod.call(instance))\n                .then(() => {\n                  logger.Debug(`The schedule job ${taskName} completed.`);\n                })\n                .catch((error) => {\n                  logger.Error(`The schedule job ${taskName} failed:`, error);\n                });\n            },\n            null,\n            true,\n            tz\n          );\n\n          totalScheduled++;\n          logger.Debug(`Schedule job ${taskName} registered with cron: ${scheduleData.cron}`);\n        } catch (error) {\n          logger.Error(`Failed to process schedule for ${component.id}:`, error);\n        }\n      }\n    }\n\n    logger.Info(`Batch schedule injection completed. ${totalScheduled} jobs registered.`);\n  } catch (error) {\n    logger.Error('Failed to inject schedules:', error);\n  }\n}\n","/**\n * @ author: richen\n * @ copyright: Copyright (c) - <richenlin(at)gmail.com>\n * @ license: MIT\n * @ version: 2020-07-06 10:30:11\n */\n\nimport { Koatty } from \"koatty_core\";\nimport { RedLock } from \"./decorator/redlock\";\nimport { Scheduled } from \"./decorator/scheduled\";\nimport { initRedLock } from \"./process/locker\";\nimport { initSchedule } from \"./process/schedule\";\nimport { ScheduledOptions } from \"./config/config\";\nimport { RedisMode } from \"./locker/interface\";\n\n// Export the decorators\nexport { RedLock, Scheduled };\n\n// Export types and interfaces\nexport { RedLocker } from \"./locker/redlock\";\nexport type { RedLockOptions } from \"./locker/redlock\";\nexport { RedisMode } from \"./locker/interface\";\nexport type { \n  IDistributedLock, \n  IRedisClient, \n  ILockOptions,\n  RedisConfig,\n  RedisStandaloneConfig,\n  RedisSentinelConfig,\n  RedisClusterConfig\n} from \"./locker/interface\";\nexport { RedisFactory, RedisClientAdapter } from \"./locker/redis-factory\";\n\n/**\n * @deprecated Use RedLock instead. This will be removed in v3.0.0\n */\nexport const SchedulerLock = RedLock;\n\n/** \n * defaultOptions\n */\n\nconst defaultOptions: ScheduledOptions = {\n  timezone: \"Asia/Beijing\",\n  lockTimeOut: 10000,\n  clockDriftFactor: 0.01,\n  maxRetries: 3,\n  retryDelayMs: 200,\n  redisConfig: {\n    mode: RedisMode.STANDALONE,\n    host: \"localhost\",\n    port: 6379,\n    password: \"\",\n    db: 0,\n    keyPrefix: \"redlock:\"\n  }\n}\n\n/**\n * @param options - The options for the scheduled job\n * @param app - The Koatty application instance\n */\nexport async function KoattyScheduled(options: ScheduledOptions, app: Koatty) {\n  options = { ...defaultOptions, ...options };\n  \n  app.once(\"appReady\", async function () {\n    // 初始化RedLock\n    await initRedLock(options, app);\n    // 初始化调度任务系统\n    await initSchedule(options, app);\n  });\n}"]}