@supergrowthai/tq 1.0.1-canary.a2ffe03
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.
- package/README.md +426 -0
- package/dist/core/base/interfaces.d.ts +1 -0
- package/dist/core/base/interfaces.js +2 -0
- package/dist/core/base/interfaces.js.map +1 -0
- package/dist/core/base/interfaces.mjs +2 -0
- package/dist/core/base/interfaces.mjs.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +1985 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1985 -0
- package/dist/index.mjs.map +1 -0
- package/dist/src/adapters/CronTasksAdapter.d.ts +34 -0
- package/dist/src/adapters/IDatabaseAdapter.d.ts +57 -0
- package/dist/src/adapters/MongoDbAdapter.d.ts +33 -0
- package/dist/src/adapters/database-adapter.d.ts +7 -0
- package/dist/src/adapters/index.d.ts +5 -0
- package/dist/src/core/actions/Actions.d.ts +33 -0
- package/dist/src/core/actions/AsyncActions.d.ts +17 -0
- package/dist/src/core/async/AsyncTaskManager.d.ts +19 -0
- package/dist/src/core/base/interfaces.d.ts +35 -0
- package/dist/src/core/environment.d.ts +6 -0
- package/dist/src/core/task-handler.d.ts +19 -0
- package/dist/src/core/task-runner.d.ts +19 -0
- package/dist/src/core/task-store.d.ts +74 -0
- package/dist/src/index.d.ts +46 -0
- package/dist/src/task-registry.d.ts +4 -0
- package/dist/src/types.d.ts +2 -0
- package/dist/src/utils/task-id-gen.d.ts +3 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/types.mjs +7 -0
- package/dist/types.mjs.map +1 -0
- package/package.json +101 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/adapters/CronTasksAdapter.ts","../../utils/dist/client.mjs","../../utils/dist/index.mjs","../src/adapters/MongoDbAdapter.ts","../src/adapters/database-adapter.ts","../src/core/task-store.ts","../../cache/dist/index.mjs","../../../node_modules/lodash/_baseSlice.js","../../../node_modules/lodash/eq.js","../../../node_modules/lodash/_freeGlobal.js","../../../node_modules/lodash/_root.js","../../../node_modules/lodash/_Symbol.js","../../../node_modules/lodash/_getRawTag.js","../../../node_modules/lodash/_objectToString.js","../../../node_modules/lodash/_baseGetTag.js","../../../node_modules/lodash/isObject.js","../../../node_modules/lodash/isFunction.js","../../../node_modules/lodash/isLength.js","../../../node_modules/lodash/isArrayLike.js","../../../node_modules/lodash/_isIndex.js","../../../node_modules/lodash/_isIterateeCall.js","../../../node_modules/lodash/_trimmedEndIndex.js","../../../node_modules/lodash/_baseTrim.js","../../../node_modules/lodash/isObjectLike.js","../../../node_modules/lodash/isSymbol.js","../../../node_modules/lodash/toNumber.js","../../../node_modules/lodash/toFinite.js","../../../node_modules/lodash/toInteger.js","../../../node_modules/lodash/chunk.js","../src/utils/task-id-gen.ts","../src/core/actions/Actions.ts","../src/core/actions/AsyncActions.ts","../src/core/task-runner.ts","../src/core/environment.ts","../src/core/task-handler.ts","../src/core/async/AsyncTaskManager.ts","../src/index.ts"],"sourcesContent":["import {BaseTask, ITasksAdapter} from \"@supergrowthai/mq\";\n\n/**\n * Extended task structure for cron tasks with additional fields\n */\nexport interface CronTask<T = any, ID = any> extends BaseTask<T, ID> {\n _id: ID;\n}\n\n/**\n * Extended TasksAdapter interface specifically for cron tasks\n * This extends the base ITasksAdapter with TQ-specific requirements\n */\nexport interface ICronTasksAdapter<T = any> extends ITasksAdapter<T> {\n /**\n * Insert multiple cron tasks into storage\n */\n insertTasks(tasks: CronTask<T>[]): Promise<void>;\n\n /**\n * Find cron tasks ready for processing\n */\n findScheduledTasks(queueId: string, limit: number): Promise<CronTask<T>[]>;\n}\n\n/**\n * In-memory implementation of ICronTasksAdapter for testing/development\n */\nexport class MemoryCronTasksAdapter<T = any> implements ICronTasksAdapter<T> {\n private tasks: Map<string, CronTask<T>> = new Map();\n private idCounter = 0;\n\n generateTaskId(): string {\n return `cron_task_${++this.idCounter}`;\n }\n\n async insertTasks(tasks: CronTask<T>[]): Promise<void> {\n for (const task of tasks) {\n if (!task._id) {\n task._id = this.generateTaskId();\n }\n task.created_at = task.created_at || new Date();\n task.status = task.status || 'scheduled';\n this.tasks.set(task._id, task);\n }\n }\n\n async findScheduledTasks(queueId: string, limit: number): Promise<CronTask<T>[]> {\n const now = new Date();\n const scheduled: CronTask<T>[] = [];\n\n for (const task of this.tasks.values()) {\n if (scheduled.length >= limit) break;\n\n if (task.queue_id === queueId &&\n task.status === 'scheduled' &&\n (!task.execute_at || task.execute_at <= now)) {\n scheduled.push(task);\n }\n }\n\n return scheduled;\n }\n\n async markTasksAsProcessing(taskIds: any[]): Promise<void> {\n for (const id of taskIds) {\n const task = this.tasks.get(id);\n if (task) {\n task.status = 'processing';\n task.processing_started_at = new Date();\n }\n }\n }\n\n async markTasksAsExecuted(taskIds: any[]): Promise<void> {\n for (const id of taskIds) {\n const task = this.tasks.get(id);\n if (task) {\n task.status = 'executed';\n task.updated_at = new Date();\n }\n }\n }\n\n async markTasksAsFailed(taskIds: any[]): Promise<void> {\n for (const id of taskIds) {\n const task = this.tasks.get(id);\n if (task) {\n task.status = 'failed';\n task.updated_at = new Date();\n task.retries = (task.retries || 0) + 1;\n }\n }\n }\n}","var LogLevel = /* @__PURE__ */ ((LogLevel2) => {\n LogLevel2[LogLevel2[\"DEBUG\"] = 0] = \"DEBUG\";\n LogLevel2[LogLevel2[\"INFO\"] = 1] = \"INFO\";\n LogLevel2[LogLevel2[\"WARN\"] = 2] = \"WARN\";\n LogLevel2[LogLevel2[\"ERROR\"] = 3] = \"ERROR\";\n return LogLevel2;\n})(LogLevel || {});\nclass Logger {\n constructor(prefix, initialLogLevel = 1) {\n this.prefix = prefix;\n this.logLevel = initialLogLevel;\n }\n getLogLevel() {\n return this.logLevel;\n }\n setLogLevel(level) {\n this.logLevel = level;\n }\n debug(message, ...args) {\n if (this.logLevel === 0) {\n console.debug(`[${this.prefix}] ${message}`, ...args);\n }\n }\n info(message, ...args) {\n if (this.logLevel <= 1) {\n console.info(`[${this.prefix}] ${message}`, ...args);\n }\n }\n error(message, ...args) {\n console.error(`[${this.prefix}] ${message}`, ...args);\n }\n warn(message, ...args) {\n if (this.logLevel <= 2) {\n console.warn(`[${this.prefix}] ${message}`, ...args);\n }\n }\n time(message) {\n if (this.logLevel < 1) {\n console.time(`[${this.prefix}] ${message}`);\n }\n }\n timeEnd(message) {\n if (this.logLevel < 1) {\n console.timeEnd(`[${this.prefix}] ${message}`);\n }\n }\n}\nexport {\n LogLevel,\n Logger\n};\n//# sourceMappingURL=client.mjs.map\n","import { Logger, LogLevel } from \"./client.mjs\";\nclass LockManager {\n constructor(cacheProvider, options) {\n this.cacheProvider = cacheProvider;\n this.acquireLocks = /* @__PURE__ */ new Map();\n this.logger = new Logger(\"MetricsCollector\", LogLevel.INFO);\n this.cacheProvider = cacheProvider;\n this.prefix = options?.prefix || \"lock:\";\n this.defaultTimeout = options?.defaultTimeout || 30 * 60;\n if (options?.debugLogs)\n this.logger.setLogLevel(LogLevel.INFO);\n }\n /**\n * Check if a resource is locked\n */\n async isLocked(resourceId) {\n this.logger.debug(\"isLocked\" + resourceId);\n const exists = await this.cacheProvider.get(this.getKey(resourceId));\n return !!exists;\n }\n /**\n * Filter out locked resources from an array\n */\n async filterLocked(resources, getResourceId) {\n if (!resources.length) return [];\n const lockChecks = resources.map((resource) => this.isLocked(getResourceId(resource)));\n const lockResults = await Promise.all(lockChecks);\n return resources.filter((_, index) => !lockResults[index]);\n }\n /**\n * Acquire a lock\n * @returns true if lock was acquired, false if already locked\n */\n async acquire(resourceId, timeout = this.defaultTimeout) {\n this.logger.debug(\"Acquire\" + resourceId);\n const existingLock = this.acquireLocks.get(resourceId);\n if (existingLock) {\n await existingLock;\n return false;\n }\n const lockPromise = this.acquireInternal(resourceId, timeout);\n this.acquireLocks.set(resourceId, lockPromise);\n try {\n return await lockPromise;\n } finally {\n this.acquireLocks.delete(resourceId);\n }\n }\n /**\n * Release a lock\n */\n async release(resourceId) {\n this.logger.debug(\"Release\" + resourceId);\n const key = this.getKey(resourceId);\n await this.cacheProvider.del(key);\n }\n async acquireInternal(resourceId, timeout) {\n if (await this.isLocked(resourceId)) return false;\n const key = this.getKey(resourceId);\n const result = await this.cacheProvider.set(key, \"1\", timeout);\n return result === \"OK\" || result === \"1\" || result === 1;\n }\n getKey(resourceId) {\n return `${this.prefix}${resourceId}`;\n }\n}\nclass ShutdownManager {\n constructor() {\n this.sigintListeners = [];\n this.sigint = {\n register: (listener) => this.sigintListeners.push(listener)\n };\n this.sigtermListeners = [];\n this.sigterm = {\n register: (listener) => this.sigtermListeners.push(listener)\n };\n this.sigquitListeners = [];\n this.sigquit = {\n register: (listener) => this.sigquitListeners.push(listener)\n };\n this.shuttingDown = false;\n this._runListeners = async (listeners) => {\n for (const listener of listeners) {\n try {\n await listener();\n } catch (err) {\n console.error(\"Error during shutdown task:\", err);\n }\n }\n };\n process.on(\"SIGINT\", () => {\n if (this.shuttingDown) return;\n this.shuttingDown = true;\n console.log(\"\\nSIGINT received. Running shutdown tasks...\");\n this._runListeners(this.sigintListeners).then(() => {\n console.log(\"Shutdown tasks completed.\");\n process.exit(0);\n }).catch((err) => {\n console.error(\"Error during shutdown:\", err);\n process.exit(1);\n });\n });\n process.on(\"SIGTERM\", () => {\n if (this.shuttingDown) return;\n this.shuttingDown = true;\n console.log(\"\\nSIGTERM received. Running shutdown tasks...\");\n this._runListeners(this.sigtermListeners).then(() => {\n console.log(\"Shutdown tasks completed.\");\n process.exit(0);\n }).catch((err) => {\n console.error(\"Error during shutdown:\", err);\n process.exit(1);\n });\n });\n process.on(\"SIGQUIT\", () => {\n if (this.shuttingDown) return;\n this.shuttingDown = true;\n console.log(\"\\nSIGQUIT received. Running shutdown tasks...\");\n this._runListeners(this.sigquitListeners).then(() => {\n console.log(\"Shutdown tasks completed.\");\n process.exit(0);\n }).catch((err) => {\n console.error(\"Error during shutdown:\", err);\n process.exit(1);\n });\n });\n }\n}\nexport {\n LockManager,\n LogLevel,\n Logger,\n ShutdownManager\n};\n//# sourceMappingURL=index.mjs.map\n","import {Collection, Db, MongoClient, ObjectId} from \"mongodb\";\nimport {IDatabaseAdapter} from \"./IDatabaseAdapter.js\";\nimport {CronTask} from \"./CronTasksAdapter.js\";\nimport {Logger, LogLevel} from \"@supergrowthai/utils\";\n\nconst logger = new Logger('MongoDbAdapter', LogLevel.INFO);\n\nconst TWO_DAYS_MS = 2 * 24 * 60 * 60 * 1000;\n\n/**\n * MongoDB implementation of IDatabaseAdapter\n */\nexport class MongoDbAdapter implements IDatabaseAdapter {\n private client: MongoClient | null = null;\n private db: Db | null = null;\n private tasksCollection: Collection<any> | null = null;\n private readonly uri: string;\n private readonly dbName: string;\n private readonly collectionName: string;\n\n constructor(\n uri: string = process.env.MONGODB_URI || 'mongodb://localhost:27017',\n dbName: string = process.env.DB_NAME || 'taskqueue',\n collectionName: string = 'scheduled'\n ) {\n this.uri = uri;\n this.dbName = dbName;\n this.collectionName = collectionName;\n }\n\n async initialize(): Promise<void> {\n if (this.db) return;\n\n this.client = new MongoClient(this.uri);\n await this.client.connect();\n this.db = this.client.db(this.dbName);\n this.tasksCollection = this.db.collection<CronTask<any>>(this.collectionName);\n\n // Create indexes\n await this.tasksCollection.createIndex({execute_at: 1, status: 1});\n await this.tasksCollection.createIndex({status: 1, processing_started_at: 1});\n await this.tasksCollection.createIndex({expires_at: 1}, {sparse: true});\n\n logger.info(`Connected to MongoDB at ${this.uri}/${this.dbName}`);\n }\n\n async addTasksToScheduled(tasks: CronTask<any>[]): Promise<CronTask<any>[]> {\n if (!tasks.length) return [];\n\n const collection = await this.ensureConnection();\n\n const transformedTasks: CronTask<any>[] = tasks.map((task) => ({\n _id: task._id,\n type: task.type,\n payload: task.payload,\n execute_at: task.execute_at,\n status: task.status || 'scheduled',\n retries: task.retries || 0,\n created_at: task.created_at || new Date(),\n updated_at: new Date(),\n queue_id: task.queue_id,\n processing_started_at: task.processing_started_at || new Date(),\n expires_at: task.expires_at,\n task_group: task.task_group,\n task_hash: task.task_hash,\n retry_after: task.retry_after,\n execution_stats: task.execution_stats,\n force_store: task.force_store\n }));\n\n try {\n await collection.insertMany(transformedTasks, {ordered: false});\n return transformedTasks;\n } catch (error: any) {\n if (error.writeErrors) {\n const successfulTasks = transformedTasks.filter((_, index) =>\n !error.writeErrors.some((e: any) => e.index === index)\n );\n return successfulTasks;\n }\n throw error;\n }\n }\n\n async getMatureTasks(timestamp: number): Promise<CronTask<any>[]> {\n const collection = await this.ensureConnection();\n\n // Phase 1: Reset stale processing tasks\n const staleTimestamp = Date.now() - TWO_DAYS_MS;\n await collection.updateMany(\n {\n status: 'processing',\n processing_started_at: {$lt: new Date(staleTimestamp)}\n },\n {\n $set: {status: 'scheduled'},\n $inc: {retries: 1}\n }\n );\n\n // Phase 2: Fetch and mark mature tasks\n const filter = {\n status: 'scheduled' as const,\n execute_at: {$lte: new Date(timestamp)}\n };\n\n const tasks = await collection\n .find(filter)\n .limit(1000)\n .toArray();\n\n if (tasks.length > 0) {\n const taskIds = tasks.map(t => t._id);\n await collection.updateMany(\n {_id: {$in: taskIds}},\n {\n $set: {\n status: 'processing',\n processing_started_at: new Date()\n }\n }\n );\n }\n\n return tasks;\n }\n\n async markTasksAsProcessing(taskIds: ObjectId[], processingStartedAt: Date): Promise<void> {\n const collection = await this.ensureConnection();\n\n await collection.updateMany(\n {_id: {$in: taskIds}},\n {\n $set: {\n status: 'processing',\n processing_started_at: processingStartedAt,\n updated_at: new Date()\n }\n }\n );\n }\n\n async markTasksAsExecuted(taskIds: ObjectId[]): Promise<void> {\n const collection = await this.ensureConnection();\n\n await collection.updateMany(\n {_id: {$in: taskIds}},\n {\n $set: {\n status: 'executed',\n updated_at: new Date()\n }\n }\n );\n }\n\n async markTasksAsFailed(taskIds: ObjectId[]): Promise<void> {\n const collection = await this.ensureConnection();\n\n await collection.updateMany(\n {_id: {$in: taskIds}},\n {\n $set: {\n status: 'failed',\n updated_at: new Date()\n },\n $inc: {retries: 1}\n }\n );\n }\n\n async getTasksByIds(taskIds: ObjectId[]): Promise<CronTask<any>[]> {\n const collection = await this.ensureConnection();\n\n return collection\n .find({_id: {$in: taskIds}})\n .toArray();\n }\n\n async updateTasks(updates: Array<{ id: ObjectId; updates: Partial<CronTask<any>> }>): Promise<void> {\n const collection = await this.ensureConnection();\n\n const bulkOps = updates.map(({id, updates}) => ({\n updateOne: {\n filter: {_id: id},\n update: {\n $set: {\n ...updates,\n updated_at: new Date()\n }\n }\n }\n }));\n\n if (bulkOps.length > 0) {\n await collection.bulkWrite(bulkOps);\n }\n }\n\n async getCleanupStats(): Promise<{ orphanedTasks: number; expiredTasks: number }> {\n const collection = await this.ensureConnection();\n\n const orphanedBefore = new Date(Date.now() - TWO_DAYS_MS);\n const orphanedTasks = await collection.countDocuments({\n status: 'processing',\n processing_started_at: {$lt: orphanedBefore}\n });\n\n const expiredTasks = await collection.countDocuments({\n expires_at: {$lt: new Date()}\n });\n\n return {orphanedTasks, expiredTasks};\n }\n\n async cleanupTasks(orphanedBefore: Date, expiredBefore: Date): Promise<void> {\n const collection = await this.ensureConnection();\n\n // Clean up orphaned tasks\n await collection.deleteMany({\n status: 'processing',\n processing_started_at: {$lt: orphanedBefore}\n });\n\n // Clean up expired tasks\n await collection.deleteMany({\n expires_at: {$lt: expiredBefore}\n });\n }\n\n async close(): Promise<void> {\n if (this.client) {\n await this.client.close();\n this.client = null;\n this.db = null;\n this.tasksCollection = null;\n logger.info('Disconnected from MongoDB');\n }\n }\n\n private async ensureConnection(): Promise<Collection<any>> {\n if (!this.tasksCollection) {\n await this.initialize();\n }\n return this.tasksCollection!;\n }\n}","import {MongoDbAdapter} from \"./MongoDbAdapter.js\";\nimport {IDatabaseAdapter} from \"./IDatabaseAdapter.js\";\n\n/**\n * Singleton database adapter instance\n * Can be replaced with different implementations (e.g., PostgreSQL, Redis, etc.)\n */\nconst databaseAdapter: IDatabaseAdapter = new MongoDbAdapter();\n\n// Initialize on first import\ndatabaseAdapter.initialize().catch(console.error);\n\nexport default databaseAdapter;","import {getEnvironmentQueueName} from \"@supergrowthai/mq\";\nimport {CronTask, databaseAdapter} from \"../adapters/index.js\";\nimport {ObjectId} from \"mongodb\";\n\n/**\n * Adds multiple tasks to the scheduled queue\n */\nasync function addTasksToScheduled(tasks: CronTask<any>[]): Promise<any> {\n if (!tasks.length) return [];\n\n const transformedTasks: CronTask<any>[] = tasks.map((task) => ({\n _id: task._id,\n type: task.type,\n queue_id: getEnvironmentQueueName(task.queue_id),\n payload: task.payload,\n execute_at: task.execute_at,\n expires_at: task.expires_at,\n status: 'scheduled' as const,\n task_group: task.task_group,\n task_hash: task.task_hash,\n retries: task.retries || 0,\n retry_after: task.retry_after,\n execution_stats: task.execution_stats,\n created_at: task.created_at || new Date(),\n updated_at: task.updated_at || new Date(),\n processing_started_at: task.processing_started_at || new Date(),\n force_store: task.force_store\n }));\n\n return await databaseAdapter.addTasksToScheduled(transformedTasks);\n}\n\n/**\n * Gets mature tasks that are ready to be processed\n * Implements a two-phase approach:\n * 1. Reset stale processing tasks\n * 2. Fetch and mark new mature tasks\n */\nasync function getMatureTasks(timestamp: number): Promise<CronTask<any>[]> {\n return await databaseAdapter.getMatureTasks(timestamp);\n}\n\n/**\n * Marks tasks as processing with current timestamp\n */\nasync function markTasksAsProcessing(taskIds: ObjectId[]): Promise<void> {\n await databaseAdapter.markTasksAsProcessing(taskIds, new Date());\n}\n\n/**\n * Marks tasks as executed/completed\n */\nasync function markTasksAsExecuted(taskIds: ObjectId[]): Promise<void> {\n await databaseAdapter.markTasksAsExecuted(taskIds);\n}\n\n/**\n * Marks tasks as failed and increments retry count\n */\nasync function markTasksAsFailed(taskIds: ObjectId[]): Promise<void> {\n await databaseAdapter.markTasksAsFailed(taskIds);\n}\n\n/**\n * Updates multiple tasks with specific updates\n */\nasync function updateTasks(updates: Array<{ id: ObjectId; updates: Partial<CronTask<any>> }>): Promise<void> {\n await databaseAdapter.updateTasks(updates);\n}\n\n/**\n * Gets tasks by their IDs\n */\nasync function getTasksByIds(taskIds: ObjectId[]): Promise<CronTask<any>[]> {\n return await databaseAdapter.getTasksByIds(taskIds);\n}\n\n/**\n * Gets cleanup statistics\n */\nasync function getCleanupStats(): Promise<{ orphanedTasks: number; expiredTasks: number }> {\n return await databaseAdapter.getCleanupStats();\n}\n\n/**\n * Cleans up orphaned and expired tasks\n */\nasync function cleanupTasks(): Promise<void> {\n const twoDaysAgo = new Date(Date.now() - 2 * 24 * 60 * 60 * 1000);\n const now = new Date();\n\n await databaseAdapter.cleanupTasks(twoDaysAgo, now);\n}\n\n/**\n * Updates tasks for retry with new execution time and retry count\n */\nasync function updateTasksForRetry(tasks: CronTask<any>[]): Promise<void> {\n const updates = tasks.map(task => ({\n id: task._id as ObjectId,\n updates: {\n execute_at: task.execute_at,\n status: task.status,\n execution_stats: task.execution_stats,\n updated_at: new Date()\n }\n }));\n\n await databaseAdapter.updateTasks(updates);\n}\n\n/**\n * Marks tasks as successful/completed\n */\nasync function markTasksAsSuccess(tasks: CronTask<any>[]): Promise<void> {\n const taskIds = tasks.map(task => task._id as ObjectId);\n await databaseAdapter.markTasksAsExecuted(taskIds);\n}\n\n/**\n * Marks tasks as ignored (same as failed for now)\n */\nasync function markTasksAsIgnored(tasks: CronTask<any>[]): Promise<void> {\n const taskIds = tasks.map(task => task._id as ObjectId);\n await databaseAdapter.markTasksAsFailed(taskIds);\n}\n\nconst TaskStore = {\n addTasksToScheduled,\n getMatureTasks,\n markTasksAsProcessing,\n markTasksAsExecuted,\n markTasksAsFailed,\n updateTasks,\n getTasksByIds,\n getCleanupStats,\n cleanupTasks,\n updateTasksForRetry,\n markTasksAsSuccess,\n markTasksAsIgnored\n};\n\nexport default TaskStore;","import { stats, RedisCacheProvider, CacheKeyGenerator } from \"memoose-js\";\nimport { Cluster } from \"ioredis\";\nclass DisableCachePipeline {\n constructor() {\n this.actions = [];\n }\n del(key) {\n this.actions.push([\"del\", key]);\n return this;\n }\n expire(key, new_ttl_from_now) {\n this.actions.push([\"expire\", key, new_ttl_from_now]);\n return this;\n }\n async exec() {\n return this.actions.map(([action, ...args]) => {\n switch (action) {\n case \"get\":\n case \"del\":\n case \"expire\":\n case \"set\":\n default:\n return null;\n }\n });\n }\n get(key) {\n this.actions.push([\"get\", key]);\n return this;\n }\n set(key, data, ttl) {\n this.actions.push([\"set\", key, data, ttl]);\n return this;\n }\n}\nclass DisabledCache {\n constructor() {\n this.storesAsObj = false;\n stats[this.name()] = {};\n }\n name() {\n return \"disabled-cache\";\n }\n pipeline() {\n return new DisableCachePipeline();\n }\n async get(key) {\n return null;\n }\n async mget(...key) {\n return key.map(() => null);\n }\n async mset(...key) {\n return \"OK\";\n }\n async set(key, data, ttl) {\n return \"OK\";\n }\n async del(...key) {\n return key.length;\n }\n async expire(key, new_ttl_from_now) {\n return 1;\n }\n}\nclass RedisClusterCacheProvider {\n constructor(name, config, connect = true) {\n this.storesAsObj = false;\n const { nodes, options } = config;\n this.client_client = new Cluster(nodes, options);\n this.connect = connect;\n if (connect)\n this.connected_promise = this.client_client.connect();\n else\n this.connected_promise = Promise.resolve(\"told not to connect\");\n const errorOrCloseCB = (...args) => {\n console.log(`Error in RedisClient: ${name}.`, \"\\r\\n\", ...args);\n process.exit(55666);\n };\n this.client_client.on(\"end\", errorOrCloseCB.bind(null, \"end\"));\n this.client_client.on(\"error\", errorOrCloseCB.bind(null, \"error\"));\n this.client_client.on(\"close\", errorOrCloseCB.bind(null, \"close\"));\n this.client_client.on(\"finish\", errorOrCloseCB.bind(null, \"finish\"));\n }\n get client() {\n return this.client_client;\n }\n name() {\n return \"redis\";\n }\n getClientConnectionPromise() {\n if (this.connect)\n return this.connected_promise;\n else\n throw new Error(\"shouldnt call as client initialised with connect=false\");\n }\n get(key) {\n return this.client_client.get(key);\n }\n set(key, value, ttl = -1) {\n if (ttl > 0)\n return this.client_client.set(key, value, \"EX\", ttl);\n else\n return this.client_client.set(key, value);\n }\n del(...keys) {\n return this.client_client.del(...keys);\n }\n awaitTillReady() {\n return new Promise((resolve, reject) => {\n this.client_client.once(\"ready\", resolve);\n this.client_client.once(\"error\", reject);\n });\n }\n pipeline() {\n return this.client_client.pipeline();\n }\n expire(key, ttl) {\n return this.client_client.expire(key, ttl);\n }\n mget(...keys) {\n return this.client_client.mget(...keys);\n }\n mset(...keyValues) {\n return this.client_client.mset(...keyValues);\n }\n exists(...keys) {\n return this.client_client.exists(...keys);\n }\n lpush(key, ...values) {\n return this.client_client.lpush(key, ...values);\n }\n llen(key) {\n return this.client_client.llen(key);\n }\n scard(key) {\n return this.client_client.scard(key);\n }\n sismember(key, member) {\n return this.client_client.sismember(key, member);\n }\n sadd(key, member) {\n return this.client_client.sadd(key, member);\n }\n srem(key, member) {\n return this.client_client.srem(key, member);\n }\n smembers(key) {\n return this.client_client.smembers(key);\n }\n rpush(key, ...values) {\n return this.client_client.rpush(key, ...values);\n }\n lrange(key, start, stop) {\n return this.client_client.lrange(key, start, stop);\n }\n ping() {\n return this.client_client.ping();\n }\n subscribe(...channels) {\n return this.client_client.subscribe(...channels);\n }\n on(event, listener) {\n return this.client_client.on(event, listener);\n }\n publish(channel, message) {\n return this.client_client.publish(channel, message);\n }\n flushdb() {\n return this.client_client.flushdb();\n }\n lpop(key) {\n return this.client_client.lpop(key);\n }\n decrby(key, count) {\n return this.client_client.decrby(key, count);\n }\n}\nclass MemoryPipeline {\n constructor(cache) {\n this.operations = [];\n this.cache = cache;\n }\n get(key) {\n this.operations.push(async () => {\n const entry = this.cache.get(key);\n if (!entry || entry.expiresAt && entry.expiresAt < Date.now()) {\n return null;\n }\n return entry.value;\n });\n return this;\n }\n set(key, data, ttl) {\n this.operations.push(async () => {\n const entry = {\n value: data,\n expiresAt: ttl ? Date.now() + ttl * 1e3 : void 0\n };\n this.cache.set(key, entry);\n return \"OK\";\n });\n return this;\n }\n del(key) {\n this.operations.push(async () => {\n return this.cache.delete(key) ? 1 : 0;\n });\n return this;\n }\n expire(key, new_ttl_from_now) {\n this.operations.push(async () => {\n const entry = this.cache.get(key);\n if (!entry) return 0;\n entry.expiresAt = Date.now() + new_ttl_from_now * 1e3;\n return 1;\n });\n return this;\n }\n async exec() {\n const results = await Promise.all(this.operations.map((op) => op()));\n this.operations = [];\n return results;\n }\n}\nclass InMemoryCacheProvider {\n constructor() {\n this.storesAsObj = false;\n this.cache = /* @__PURE__ */ new Map();\n }\n name() {\n return \"memory\";\n }\n async get(key) {\n const entry = this.cache.get(key);\n if (!entry || this.isExpired(entry)) {\n if (entry) this.cache.delete(key);\n return null;\n }\n return entry.value;\n }\n async mget(...keys) {\n return Promise.all(keys.map((key) => this.get(key)));\n }\n async mset(...keyValues) {\n for (const [key, value] of keyValues) {\n await this.set(key, value);\n }\n return \"OK\";\n }\n async set(key, data, ttl) {\n const entry = {\n value: data,\n expiresAt: ttl ? Date.now() + ttl * 1e3 : void 0\n };\n this.cache.set(key, entry);\n return \"OK\";\n }\n async del(...keys) {\n let count = 0;\n for (const key of keys) {\n if (this.cache.delete(key)) {\n count++;\n }\n }\n return count;\n }\n async expire(key, new_ttl_from_now) {\n const entry = this.cache.get(key);\n if (!entry) return 0;\n entry.expiresAt = Date.now() + new_ttl_from_now * 1e3;\n return 1;\n }\n pipeline() {\n return new MemoryPipeline(this.cache);\n }\n isExpired(entry) {\n return entry.expiresAt !== void 0 && entry.expiresAt < Date.now();\n }\n}\nclass CacheFactory {\n static create(config) {\n console.log(\"Creating cache with config:\", JSON.stringify(config));\n switch (config.provider) {\n case \"redis\":\n if (!config.redis)\n throw new Error(\"Redis configuration required\");\n if (config.redis.type === \"cluster\") {\n return new RedisClusterCacheProvider(\"redis\", config.redis, false);\n } else {\n return new RedisCacheProvider(\"redis\", config.redis, false);\n }\n case \"memory\":\n return new InMemoryCacheProvider();\n case \"disabled\":\n default:\n return new DisabledCache();\n }\n }\n}\nconst configs = {\n \"standalone[redis-cfg]\": {\n provider: \"redis\",\n redis: {\n type: \"cluster\",\n nodes: [{\n host: process.env.REDIS_HOST || \"localhost\",\n port: parseInt(process.env.REDIS_PORT || \"6379\")\n }],\n options: {\n dnsLookup: (address, callback) => callback(null, address),\n redisOptions: {\n tls: {}\n },\n lazyConnect: true\n }\n }\n },\n standalone: {\n provider: \"redis\",\n redis: {\n type: \"standalone\",\n host: process.env.REDIS_HOST || \"localhost\",\n port: parseInt(process.env.REDIS_PORT || \"6379\"),\n lazyConnect: false\n }\n },\n serverless: {\n provider: \"memory\"\n //redis as a service later?\n }\n};\nconst getConfig = () => {\n const env = process.env.ENV_TYPE || \"serverless\";\n return configs[env] || configs.serverless;\n};\nconst cacheProvider = CacheFactory.create(getConfig());\nclass CacheKeyGeneratorProvider extends CacheKeyGenerator {\n constructor(function_name, should_sort_args) {\n super(function_name, should_sort_args);\n this.fnName = function_name;\n }\n for(...args) {\n const key = super.for(...args);\n return `{${this.fnName}}:${key}`;\n }\n}\nconst getCacheKeyGenerator = (fn, argsOrder = false) => new CacheKeyGeneratorProvider(fn, argsOrder);\nexport {\n cacheProvider as default,\n getCacheKeyGenerator\n};\n//# sourceMappingURL=index.mjs.map\n","/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n}\n\nmodule.exports = baseSlice;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n","var isFunction = require('./isFunction'),\n isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n","var eq = require('./eq'),\n isArrayLike = require('./isArrayLike'),\n isIndex = require('./_isIndex'),\n isObject = require('./isObject');\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nmodule.exports = isIterateeCall;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nmodule.exports = trimmedEndIndex;\n","var trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nmodule.exports = baseTrim;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var baseTrim = require('./_baseTrim'),\n isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n","var toNumber = require('./toNumber');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\nmodule.exports = toFinite;\n","var toFinite = require('./toFinite');\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\nmodule.exports = toInteger;\n","var baseSlice = require('./_baseSlice'),\n isIterateeCall = require('./_isIterateeCall'),\n toInteger = require('./toInteger');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeCeil = Math.ceil,\n nativeMax = Math.max;\n\n/**\n * Creates an array of elements split into groups the length of `size`.\n * If `array` can't be split evenly, the final chunk will be the remaining\n * elements.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to process.\n * @param {number} [size=1] The length of each chunk\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the new array of chunks.\n * @example\n *\n * _.chunk(['a', 'b', 'c', 'd'], 2);\n * // => [['a', 'b'], ['c', 'd']]\n *\n * _.chunk(['a', 'b', 'c', 'd'], 3);\n * // => [['a', 'b', 'c'], ['d']]\n */\nfunction chunk(array, size, guard) {\n if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n size = 1;\n } else {\n size = nativeMax(toInteger(size), 0);\n }\n var length = array == null ? 0 : array.length;\n if (!length || size < 1) {\n return [];\n }\n var index = 0,\n resIndex = 0,\n result = Array(nativeCeil(length / size));\n\n while (index < length) {\n result[resIndex++] = baseSlice(array, index, (index += size));\n }\n return result;\n}\n\nmodule.exports = chunk;\n","import {getCacheKeyGenerator} from \"@supergrowthai/cache\";\nimport {CronTask} from \"../adapters\";\n\nconst taskIdCacheKeyGen = getCacheKeyGenerator(\"task-id-gen\")\n\nfunction tId<T>(task: CronTask<T>) {\n if (task._id) return task._id.toString();\n if (task.task_hash) return task.task_hash;\n return taskIdCacheKeyGen.for(task.type, task.queue_id, task.created_at, task.payload);\n}\n\nexport default tId","import {ExecutorActions} from \"../base/interfaces\";\nimport {Logger, LogLevel} from \"@supergrowthai/utils\";\nimport tId from \"../../utils/task-id-gen.js\";\nimport {CronTask} from \"../../adapters/index.js\";\n\nconst logger = new Logger('Actions', LogLevel.INFO);\n\ninterface ActionEntry {\n type: 'success' | 'fail' | 'addTasks';\n timestamp: number;\n task?: CronTask<any>; // The task passed to success/fail\n newTasks?: CronTask<any>[]; // Tasks to add\n}\n\ninterface TaskContext {\n task: CronTask<any>; // The task being executed\n actions: ActionEntry[];\n}\n\nexport interface ActionResults {\n failedTasks: CronTask<any>[];\n successTasks: CronTask<any>[];\n newTasks: CronTask<any>[];\n ignoredTasks: CronTask<any>[];\n}\n\nexport class Actions implements ExecutorActions<any> {\n private readonly taskRunnerId: string;\n private readonly taskContexts = new Map<string, TaskContext>();\n\n constructor(taskRunnerId: string) {\n this.taskRunnerId = taskRunnerId;\n }\n\n /**\n * Fork execution context for a specific task (for single-task executors)\n */\n forkForTask(task: CronTask<any>): ExecutorActions<any> {\n const taskId = tId(task);\n\n // Initialize context for this task\n const context: TaskContext = {task, actions: []};\n this.taskContexts.set(taskId, context);\n\n // Return a scoped actions object that tracks everything in this context\n return {\n fail: (t: CronTask<any>) => {\n context.actions.push({\n type: 'fail',\n timestamp: Date.now(),\n task: t\n });\n logger.error(`[${this.taskRunnerId}] Task failed: ${tId(t)} (${t.type})`);\n },\n\n success: (t: CronTask<any>) => {\n context.actions.push({\n type: 'success',\n timestamp: Date.now(),\n task: t\n });\n logger.info(`[${this.taskRunnerId}] Task succeeded: ${tId(t)} (${t.type})`);\n },\n\n addTasks: (tasks: CronTask<any>[]) => {\n context.actions.push({\n type: 'addTasks',\n timestamp: Date.now(),\n newTasks: tasks\n });\n logger.info(`[${this.taskRunnerId}] Task ${taskId} adding ${tasks.length} new tasks`);\n }\n };\n }\n\n // For multi-task executors - they use the root Actions directly (no forking)\n fail(task: CronTask<any>): void {\n const taskId = tId(task);\n let context = this.taskContexts.get(taskId);\n if (!context) {\n context = {task, actions: []};\n this.taskContexts.set(taskId, context);\n }\n\n context!.actions.push({\n type: 'fail',\n timestamp: Date.now(),\n task\n });\n logger.error(`[${this.taskRunnerId}] Task failed: ${taskId} (${task.type})`);\n }\n\n success(task: CronTask<any>): void {\n const taskId = tId(task);\n let context = this.taskContexts.get(taskId);\n if (!context) {\n context = {task, actions: []};\n this.taskContexts.set(taskId, context);\n }\n\n context.actions.push({\n type: 'success',\n timestamp: Date.now(),\n task\n });\n logger.info(`[${this.taskRunnerId}] Task succeeded: ${taskId} (${task.type})`);\n }\n\n addTasks(tasks: CronTask<any>[]): void {\n // For multi-task mode, store in a batch-specific context\n logger.info(`[${this.taskRunnerId}] Adding ${tasks.length} new tasks`);\n\n const batchKey = `__batch_${this.taskRunnerId}__`;\n let batchContext = this.taskContexts.get(batchKey);\n if (!batchContext) {\n batchContext = {task: null as any, actions: []};\n this.taskContexts.set(batchKey, batchContext);\n }\n batchContext.actions.push({\n type: 'addTasks',\n timestamp: Date.now(),\n newTasks: tasks\n });\n }\n\n addIgnoredTask(task: CronTask<any>): void {\n const taskId = tId(task);\n this.taskContexts.set(taskId, {task, actions: []});\n logger.warn(`[${this.taskRunnerId}] Task ignored: ${taskId} (${task.type})`);\n }\n\n /**\n * Extract actions for a single task (used by async tasks)\n */\n extractTaskActions(taskId: string): ActionResults {\n const results: ActionResults = {\n failedTasks: [],\n successTasks: [],\n newTasks: [],\n ignoredTasks: []\n };\n\n const context = this.taskContexts.get(taskId);\n if (!context) return results;\n\n if (context.actions.length === 0 && context.task) {\n // No actions = ignored task\n results.ignoredTasks.push(context.task);\n } else {\n // Process all actions\n for (const action of context.actions) {\n if (action.type === 'success' && action.task) {\n results.successTasks.push(action.task);\n // If marking a different task, remove its context\n const targetTaskId = tId(action.task);\n if (targetTaskId !== taskId) {\n this.taskContexts.delete(targetTaskId);\n }\n } else if (action.type === 'fail' && action.task) {\n results.failedTasks.push(action.task);\n const targetTaskId = tId(action.task);\n if (targetTaskId !== taskId) {\n this.taskContexts.delete(targetTaskId);\n }\n } else if (action.type === 'addTasks' && action.newTasks) {\n results.newTasks.push(...action.newTasks);\n }\n }\n }\n\n this.taskContexts.delete(taskId);\n return results;\n }\n\n /**\n * Extract sync results including batch context (for sync processing)\n */\n extractSyncResults(excludeTaskIds: string[]): ActionResults {\n const results: ActionResults = {\n failedTasks: [],\n successTasks: [],\n newTasks: [],\n ignoredTasks: []\n };\n\n const excludeSet = new Set(excludeTaskIds);\n const batchKey = `__batch_${this.taskRunnerId}__`;\n\n // Process all task contexts except excluded ones\n for (const [taskId, context] of this.taskContexts) {\n if (excludeSet.has(taskId)) continue;\n\n if (taskId === batchKey) {\n // Batch context - only has addTasks\n for (const action of context.actions) {\n if (action.type === 'addTasks' && action.newTasks) {\n results.newTasks.push(...action.newTasks);\n }\n }\n } else {\n // Regular task context\n if (context.actions.length === 0 && context.task) {\n results.ignoredTasks.push(context.task);\n } else {\n for (const action of context.actions) {\n if (action.type === 'success' && action.task) {\n results.successTasks.push(action.task);\n } else if (action.type === 'fail' && action.task) {\n results.failedTasks.push(action.task);\n } else if (action.type === 'addTasks' && action.newTasks) {\n results.newTasks.push(...action.newTasks);\n }\n }\n }\n }\n }\n\n // Clear processed contexts\n for (const [taskId] of this.taskContexts) {\n if (!excludeSet.has(taskId)) {\n this.taskContexts.delete(taskId);\n }\n }\n\n return results;\n }\n\n /**\n * Get all results (mainly for backward compatibility)\n */\n getResults(): ActionResults {\n return this.extractSyncResults([]);\n }\n}","import {ObjectId} from \"mongodb\";\nimport {Logger, LogLevel} from \"@supergrowthai/utils\";\nimport TaskStore from \"../task-store.js\";\nimport {Actions} from \"./Actions.js\";\nimport {IMessageQueue, QueueName} from \"@supergrowthai/mq\";\nimport tId from \"../../utils/task-id-gen.js\";\nimport {CronTask} from \"../../adapters/index.js\";\nimport taskQueue from \"../../index.js\";\n\nconst logger = new Logger('AsyncActions', LogLevel.INFO);\n\nexport class AsyncActions {\n private readonly actions: Actions;\n private readonly taskId: string;\n\n constructor(private messageQueue: IMessageQueue, actions: Actions, task: CronTask<any>) {\n this.actions = actions;\n this.taskId = tId(task);\n }\n\n /**\n * Called when the async promise completes to execute the collected actions\n */\n async onPromiseFulfilled(): Promise<void> {\n // Extract this task's results (NO batch context for async tasks)\n const results = this.actions.extractTaskActions(this.taskId);\n\n // Fail fast if task didn't call success or fail\n const hasCompletion = results.successTasks.length > 0 || results.failedTasks.length > 0;\n if (!hasCompletion) {\n throw new Error(`Async task ${this.taskId} completed without calling success() or fail()`);\n }\n\n logger.info(`[AsyncActions] Processing results for async task ${this.taskId}: ` +\n `${results.successTasks.length} success, ${results.failedTasks.length} failed, ` +\n `${results.newTasks.length} new tasks`);\n\n // Process all results\n if (results.failedTasks.length > 0) {\n try {\n const failedTaskIds = results.failedTasks.map(task => task._id as ObjectId);\n await TaskStore.markTasksAsFailed(failedTaskIds);\n logger.info(`[AsyncActions] Marked ${results.failedTasks.length} tasks as failed in database`);\n } catch (err) {\n logger.error(`[AsyncActions] Failed to mark tasks as failed:`, err);\n throw err;\n }\n }\n\n if (results.successTasks.length > 0) {\n try {\n await TaskStore.markTasksAsSuccess(results.successTasks);\n logger.info(`[AsyncActions] Marked ${results.successTasks.length} tasks as success in database`);\n } catch (err) {\n logger.error(`[AsyncActions] Failed to mark tasks as success:`, err);\n throw err;\n }\n }\n\n if (results.newTasks.length > 0) {\n logger.info(`[AsyncActions] Scheduling ${results.newTasks.length} new tasks`);\n await this.scheduleNewTasks(results.newTasks);\n }\n }\n\n /**\n * Schedule new tasks - replicates the logic from task-handler's addTasks\n */\n private async scheduleNewTasks(tasks: CronTask<any>[]): Promise<void> {\n const now = new Date();\n const immediate: { [key in QueueName]?: CronTask<any>[] } = {};\n const future: CronTask<any>[] = [];\n\n // Split tasks by timing\n for (const task of tasks) {\n const timeDiff = (task.execute_at.getTime() - now.getTime()) / 1000 / 60; // in minutes\n\n if (timeDiff > 2) {\n // Future task - goes to database\n future.push(task);\n } else {\n // Immediate task - goes to message queue\n const queue = task.queue_id;\n if (!immediate[queue]) {\n immediate[queue] = [];\n }\n immediate[queue].push(task);\n }\n }\n\n // Process immediate tasks\n const iQueues = Object.keys(immediate) as QueueName[];\n for (const queue of iQueues) {\n const queueTasks = immediate[queue]!.map((task) => {\n const executor = taskQueue.getExecutor(task.queue_id, task.type);\n const shouldStoreOnFailure = executor?.store_on_failure ?? false;\n const id = shouldStoreOnFailure ? {_id: new ObjectId()} : {};\n return {...id, ...task};\n });\n\n try {\n await this.messageQueue.addTasks(queue, queueTasks);\n logger.info(`[AsyncActions] Added ${queueTasks.length} immediate tasks to queue ${queue}`);\n } catch (err) {\n logger.error(`[AsyncActions] Failed to add tasks to queue ${queue}:`, err);\n throw err;\n }\n }\n\n // Process future tasks\n if (future.length > 0) {\n const futureTasks = future.map((task) => {\n const executor = taskQueue.getExecutor(task.queue_id, task.type);\n const shouldStoreOnFailure = executor?.store_on_failure ?? false;\n const id = shouldStoreOnFailure ? {_id: new ObjectId()} : {};\n return {...id, ...task};\n });\n\n try {\n await TaskStore.addTasksToScheduled(futureTasks);\n logger.info(`[AsyncActions] Added ${futureTasks.length} future tasks to database`);\n } catch (err) {\n logger.error(`[AsyncActions] Failed to add tasks to database:`, err);\n throw err;\n }\n }\n }\n}","import chunk from \"lodash/chunk\";\nimport cacheProvider from \"@supergrowthai/cache\";\nimport {LockManager} from \"@supergrowthai/utils\";\nimport {Logger, LogLevel} from \"@supergrowthai/utils/server\";\nimport tId from \"../utils/task-id-gen.js\";\nimport taskQueue from \"../index.js\";\nimport {TasksType} from \"../task-registry.js\";\nimport TaskStore from \"./task-store.js\";\nimport {ActionResults, Actions} from \"./actions/Actions.js\";\nimport {AsyncActions} from \"./actions/AsyncActions.js\";\nimport {CronTask} from \"../adapters/index.js\";\nimport {IAsyncTaskManager, IMessageQueue} from \"@supergrowthai/mq\";\n\nconst logger = new Logger('TaskRunner', LogLevel.INFO);\nconst lock = new LockManager(cacheProvider, {prefix: \"task_lock_\", defaultTimeout: 30 * 60});\n\n/**\n * Runs tasks either from a provided array or by fetching them based on task types\n * @param taskRunnerId - Unique identifier for this run\n * @param tasksRaw - Either an array of tasks to process or an array of task types to fetch\n * @returns Results of task processing\n */\nexport interface AsyncTask {\n task: CronTask<any>;\n promise: Promise<void>;\n startTime: number;\n actions: AsyncActions;\n}\n\nexport default async function taskRunner(\n messageQueue: IMessageQueue,\n taskRunnerId: string,\n tasksRaw: Array<CronTask<any>>,\n asyncTaskManager?: IAsyncTaskManager\n): Promise<ActionResults & { asyncTasks: AsyncTask[] }> {\n logger.info(`[${taskRunnerId}] Starting task runner`);\n logger.info(`[${taskRunnerId}] Processing ${tasksRaw.length} provided tasks`);\n\n const tasks = await lock.filterLocked(tasksRaw, tId);\n\n logger.info(`[${taskRunnerId}] Found ${tasks.length} not locked tasks to process`);\n await Promise.all(tasks.map((t) => lock.acquire(tId(t))));\n\n const groupedTasksObject = tasks\n .reduce((acc: any, task) => {\n acc[task.type] = acc[task.type] || [];\n acc[task.type].push(task);\n return acc;\n }, {}) as Record<TasksType, CronTask<any>[]>;\n\n const groupedTasksArray = (Object.keys(groupedTasksObject) as unknown as TasksType[]).reduce((acc: {\n type: TasksType,\n tasks: CronTask<any>[]\n }[], type: TasksType) => {\n acc.push({type, tasks: groupedTasksObject[type]})\n return acc;\n }, [] as { type: TasksType, tasks: CronTask<any>[] }[]);\n\n logger.info(`[${taskRunnerId}] Task groups: ${groupedTasksArray.map(g => `${g.type}: ${g.tasks.length}`).join(', ')}`);\n\n const actions = new Actions(taskRunnerId);\n const asyncTasks: AsyncTask[] = [];\n\n for (let i = 0; i < groupedTasksArray.length; i++) {\n const taskGroup = groupedTasksArray[i];\n // Get the first task to determine the queue_id\n const firstTask = taskGroup.tasks[0];\n if (!firstTask) {\n logger.warn(`[${taskRunnerId}] No tasks found for type: ${taskGroup.type}`);\n continue;\n }\n const executor = taskQueue.getExecutor(firstTask.queue_id, taskGroup.type);\n if (!executor) {\n logger.warn(`[${taskRunnerId}] No executor found for type: ${taskGroup.type} in queue ${firstTask.queue_id}`);\n // Ensure all tasks have an _id and add them to ignoredTasks\n for (const task of taskGroup.tasks) {\n const taskWithId: CronTask<any> = task._id\n ? task as CronTask<any>\n : {...task, _id: \"\"/*generate random id*/};\n actions.addIgnoredTask(taskWithId);\n }\n continue;\n }\n\n // Pre-check async queue capacity before processing\n if (executor.asyncConfig?.handoffTimeout && asyncTaskManager && !asyncTaskManager.canAcceptTask()) {\n logger.warn(`[${taskRunnerId}] Async queue full, rescheduling ${taskGroup.tasks.length} ${taskGroup.type} tasks for 3 min later`);\n\n // Update tasks directly in database with new execute_at (3 min ensures they go to DB, not queue)\n const rescheduledTasks = taskGroup.tasks.map(task => ({\n ...task,\n execute_at: new Date(Date.now() + 180000), // 3 minutes\n status: 'scheduled' as const\n }));\n\n // Direct database update - no retry count increment, no duplicates\n await TaskStore.updateTasksForRetry(rescheduledTasks);\n continue; // Skip this task group entirely\n }\n\n logger.info(`[${taskRunnerId}] Processing ${taskGroup.tasks.length} tasks of type: ${taskGroup.type}`);\n\n if (executor.multiple) {\n // Multi-task executors are always sync - they get the root Actions object\n await executor.onTasks(taskGroup.tasks, actions).catch(err => logger.error(`[${taskRunnerId}] executor.onTasks failed: ${err}`))\n } else {\n if (executor.parallel) {\n const chunks = chunk(taskGroup.tasks, executor.chunkSize);\n logger.info(`[${taskRunnerId}] Processing in parallel chunks of ${executor.chunkSize}`);\n for (const chunk of chunks) {\n const chunkTasks: Promise<void>[] = []\n for (let j = 0; j < chunk.length; j++) {\n // Each task gets its own forked context\n const taskActions = actions.forkForTask(chunk[j]);\n chunkTasks.push(executor.onTask(chunk[j], taskActions).catch(err => logger.error(`[${taskRunnerId}] executor.onTask failed: ${err}`)))\n }\n await Promise.all(chunkTasks)\n }\n } else {\n // Sequential processing with timeout detection for async handoff\n const timeoutMs = executor.asyncConfig?.handoffTimeout;\n\n for (let j = 0; j < taskGroup.tasks.length; j++) {\n const task = taskGroup.tasks[j];\n\n if (!timeoutMs) {\n // No async config - process normally with forked context\n const taskActions = actions.forkForTask(task);\n await executor.onTask(task, taskActions).catch(err => logger.error(`[${taskRunnerId}] executor.onTask failed: ${err}`))\n } else {\n // Has async config - use timeout detection\n const startTime = Date.now();\n let isTimedOut = false;\n\n // Fork context for this task\n const taskActions = actions.forkForTask(task);\n\n const taskPromise = executor.onTask(task, taskActions).catch(err => {\n logger.error(`[${taskRunnerId}] executor.onTask failed: ${err}`);\n // Let it fail fast - executor should have called fail() before throwing\n });\n\n const timeoutPromise = new Promise<'~~~timeout'>(resolve =>\n setTimeout(() => {\n isTimedOut = true;\n resolve('~~~timeout');\n }, timeoutMs)\n );\n\n const result = await Promise.race([taskPromise, timeoutPromise]);\n\n if (result === '~~~timeout') {\n logger.info(`[${taskRunnerId}] Task ${tId(task)} (${task.type}) exceeded ${timeoutMs}ms, marking for async handoff`);\n\n // Check if AsyncTaskManager is available\n if (!asyncTaskManager) {\n throw new Error(`Task ${task.type} exceeded timeout but AsyncTaskManager not initialized!`);\n }\n\n // Async tasks MUST have an _id for tracking\n if (!task._id) {\n logger.error(`[${taskRunnerId}] Cannot hand off task without _id (type: ${task.type}). Task will continue but won't be tracked.`);\n // Let the task continue running but don't track it\n } else {\n // Task has _id, safe to hand off\n // Create AsyncActions wrapper (no callback needed!)\n const asyncActions = new AsyncActions(messageQueue, actions, task);\n\n // Wrap the promise to handle completion\n const asyncPromise = taskPromise\n .finally(async () => {\n // Execute the collected actions when promise completes\n try {\n await asyncActions.onPromiseFulfilled();\n } catch (err) {\n logger.error(`[${taskRunnerId}] Failed to execute async actions for task ${tId(task)}:`, err);\n }\n });\n\n asyncTasks.push({\n task,\n promise: asyncPromise,\n startTime,\n actions: asyncActions\n });\n }\n }\n }\n }\n }\n }\n }\n\n // Extract sync results (excluding async tasks)\n const asyncTaskIds = asyncTasks.map(at => tId(at.task));\n const results = actions.extractSyncResults(asyncTaskIds);\n\n logger.info(`[${taskRunnerId}] Completing run - Success: ${results.successTasks.length}, Failed: ${results.failedTasks.length}, New: ${results.newTasks.length}, Async: ${asyncTasks.length}, Ignored: ${results.ignoredTasks.length}`);\n\n await Promise.all(tasks.map((t) => lock.release(tId(t))));\n\n return {...results, asyncTasks};\n}\n","import {getEnvironmentQueueName, QueueName} from \"@supergrowthai/mq\";\nimport taskQueue from \"../index.js\";\n\n/**\n * Gets all queue names for the current environment\n * @returns Array of full queue names including environment suffix\n */\nexport function getEnabledQueues(): QueueName[] {\n let enabledQueues: QueueName[] = process.env.ENABLED_QUEUES ? JSON.parse(process.env.ENABLED_QUEUES!) : ['queue-all'];\n\n if (enabledQueues.length === 0) throw new Error('No queues enabled');\n enabledQueues = enabledQueues.map(getEnvironmentQueueName)\n\n const queues = taskQueue.getQueues().filter((queue: QueueName) => enabledQueues.includes(queue));\n\n return queues.map(getEnvironmentQueueName);\n}\n","import cacheProvider from \"@supergrowthai/cache\";\nimport TaskStore from \"./task-store.js\";\nimport {LockManager, Logger, LogLevel} from \"@supergrowthai/utils\"\nimport taskRunner from \"./task-runner.js\";\nimport {ObjectId} from \"mongodb\";\nimport {getEnabledQueues} from \"./environment.js\";\nimport moment from \"moment\";\nimport taskQueue from \"../index.js\";\nimport {IAsyncTaskManager, IMessageQueue, ProcessedTaskResult, Processor, QueueName} from \"@supergrowthai/mq\";\nimport {CronTask} from \"../adapters/index.js\";\n\n// Constants for Redis metrics\nconst METRICS_KEY_PREFIX = 'task_metrics:';\nconst DISCARDED_TASKS_KEY = `${METRICS_KEY_PREFIX}discarded_tasks`;\n\n// Stats tracking\nconst queueStats = new Map<QueueName, {\n success: number;\n failed: number;\n async: number;\n ignored: number;\n}>();\n\nconst STATS_THRESHOLD = parseInt(process.env.TQ_STATS_THRESHOLD || '1000');\nconst FAILURE_THRESHOLD = parseInt(process.env.TQ_STATS_FAILURE_THRESHOLD || '100');\nconst INSTANCE_ID = process.env.INSTANCE_ID || 'unknown';\n\nconst logger = new Logger('TaskHandler', LogLevel.INFO);\nconst lock = new LockManager(cacheProvider, {\n prefix: 'mature_task_lock_',\n defaultTimeout: 20,\n});\n\nconst slack = {sendSlackMessage: console.log}\n\n// Async task manager instance - to be injected\nlet asyncTaskManager: IAsyncTaskManager | null = null;\n\n/**\n * Tracks the count of discarded tasks using cacheProvider\n * Maintains separate counters for each hour, creating a true 24-hour sliding window\n */\nasync function trackDiscardedTasks(count: number) {\n try {\n // Get current hour key using moment.js\n const now = moment.utc();\n const hourKey = `${DISCARDED_TASKS_KEY}:${now.format('YYYY-MM-DD-HH')}`;\n\n // Increment the counter for current hour\n const currentHourCountStr = await cacheProvider.get(hourKey) || '0';\n const currentHourCount = parseInt(currentHourCountStr, 10);\n const newCount = currentHourCount + count;\n\n // Store with 25-hour expiry (extra hour for safety)\n await cacheProvider.set(hourKey, newCount.toString(), 25 * 3600);\n\n // Get total for last 24 hours for logging (optional)\n let total = 0;\n try {\n // We'll only compute this occasionally to avoid too much overhead\n if (Math.random() < 0.1) { // 10% chance to compute total\n for (let i = 0; i < 24; i++) {\n const hourOffset = moment.utc().subtract(i, 'hours');\n const pastHourKey = `${DISCARDED_TASKS_KEY}:${hourOffset.format('YYYY-MM-DD-HH')}`;\n const pastHourCountStr = await cacheProvider.get(pastHourKey) || '0';\n total += parseInt(pastHourCountStr, 10);\n }\n logger.info(`Added ${count} discarded tasks to metrics. Last 24h total: ${total}`);\n } else {\n logger.info(`Added ${count} discarded tasks to current hour metrics.`);\n }\n } catch (error) {\n // If getting the total fails, just log the current hour's update\n logger.info(`Added ${count} discarded tasks to current hour metrics.`);\n }\n } catch (error) {\n logger.error(`Failed to track discarded tasks: ${error}`);\n // Non-critical error, don't throw\n }\n}\n\nlet matureTaskTimer: NodeJS.Timeout | null = null;\nconst getRetryCount = (task: CronTask<any>): number => {\n if (typeof task.retries === 'number') return task.retries;\n const executor = taskQueue.getExecutor(task.queue_id, task.type);\n return executor?.default_retries ?? 3;\n};\n\nasync function addTasks(messageQueue: IMessageQueue, tasks: CronTask<any>[]) {\n const diffedItems = tasks.reduce(\n (acc, {force_store, ...task}) => {\n const currentTime = new Date();\n const executeTime = task.execute_at;\n const timeDifference = (executeTime.getTime() - currentTime.getTime()) / 1000 / 60; // difference in minutes\n\n const queue = task.queue_id;\n if (timeDifference > 2 || force_store) {\n acc.future[queue] = acc.future[queue] || [];\n acc.future[queue].push(task);\n } else {\n acc.immediate[queue] = acc.immediate[queue] || [];\n acc.immediate[queue].push(task);\n }\n\n return acc;\n },\n {\n future: {} as { [key in QueueName]: CronTask<any>[] },\n immediate: {} as { [key in QueueName]: CronTask<any>[] },\n }\n );\n\n const iQueues = Object.keys(diffedItems.immediate) as unknown as QueueName[];\n for (let i = 0; i < iQueues.length; i++) {\n const queue = iQueues[i];\n const tasks: CronTask<any>[] = diffedItems.immediate[queue]\n .map((task) => {\n const executor = taskQueue.getExecutor(task.queue_id, task.type);\n const shouldStoreOnFailure = executor?.store_on_failure ?? false;\n const id = shouldStoreOnFailure ? {_id: new ObjectId(),} : {}\n return ({...id, ...task});\n });\n\n await messageQueue.addTasks(queue, tasks);\n }\n\n const fQueues = Object.keys(diffedItems.future) as unknown as QueueName[];\n for (let i = 0; i < fQueues.length; i++) {\n const queue = fQueues[i];\n const tasks: CronTask<any>[] = diffedItems.future[queue]\n .map((task) => {\n const executor = taskQueue.getExecutor(task.queue_id, task.type);\n const shouldStoreOnFailure = executor?.store_on_failure ?? false;\n const id = shouldStoreOnFailure ? {_id: new ObjectId(),} : {}\n return ({...id, ...task}); //fixme [THINK] if the task is \"save_on_failure=false\" should it ever be stored ?\n });\n await TaskStore.addTasksToScheduled(tasks);\n }\n}\n\nasync function postProcessTasks(messageQueue: IMessageQueue, {\n failedTasks: failedTasksRaw,\n newTasks,\n successTasks\n}: ProcessedTaskResult) {\n // Separate tasks into two categories: \n // 1. Tasks with _id (to be updated in DB)\n // 2. Tasks without _id and exceeded retries (to be discarded)\n const tasksToRetry: CronTask<any>[] = [];\n const finalFailedTasks: CronTask<any>[] = [];\n let discardedTasksCount = 0;\n\n for (const task of failedTasksRaw) {\n const taskRetryCount = (task.execution_stats && typeof task.execution_stats.retry_count === 'number') ? task.execution_stats.retry_count : 0;\n const taskRetryAfter = task.retry_after || 2000; // seconds\n const retryAfter = taskRetryAfter * Math.pow(taskRetryCount + 1, 2);\n //fixme rename to executeAtMillis\n const executeAt = Date.now() + retryAfter;\n const maxRetries = getRetryCount(task);\n\n if (task._id && taskRetryCount < maxRetries) {\n // This is a retry-able task with an ID - update the existing task\n tasksToRetry.push({\n ...task,\n status: 'scheduled',\n execute_at: new Date(executeAt),\n execution_stats: {\n ...(task.execution_stats || {}),\n retry_count: taskRetryCount + 1\n }\n });\n } else if (task._id) {\n // This is a task with ID that exceeded retry count - mark as failed\n finalFailedTasks.push(task);\n } else if (taskRetryCount < maxRetries) {\n // This is a task without ID but still has retries left\n // For tasks without _id that can be retried, we create a new task\n // but only if the executor is configured to store on failure\n //fixme check executor\n const shouldStoreOnFailure = taskQueue.getExecutor(task.queue_id, task.type)?.store_on_failure;\n if (shouldStoreOnFailure) {\n tasksToRetry.push({\n ...task,\n _id: new ObjectId(),\n status: 'scheduled',\n execute_at: new Date(executeAt),\n execution_stats: {\n ...(task.execution_stats || {}),\n retry_count: taskRetryCount + 1\n }\n });\n } else {\n // Just create a retry task without persistence\n await addTasks(messageQueue, [{\n ...task,\n status: 'scheduled',\n execute_at: new Date(executeAt),\n execution_stats: {\n ...(task.execution_stats || {}),\n retry_count: taskRetryCount + 1\n }\n }]);\n }\n } else {\n // Task without _id that exceeded retries is being discarded\n discardedTasksCount++;\n logger.info(`Discarding task of type ${task.type} after ${taskRetryCount} retries`);\n }\n }\n\n // Track discarded tasks count in Redis for monitoring\n if (discardedTasksCount > 0) {\n await trackDiscardedTasks(discardedTasksCount);\n }\n\n // Process tasks that need to be retried (already have _id)\n if (tasksToRetry.length > 0) {\n await TaskStore.updateTasksForRetry(tasksToRetry);\n }\n\n // Process new tasks\n if (newTasks.length > 0) {\n await addTasks(messageQueue, newTasks);\n }\n\n // Mark tasks that have exceeded retries as finally failed\n if (finalFailedTasks.length > 0) {\n const taskIds = finalFailedTasks.map(task => task._id as ObjectId);\n await TaskStore.markTasksAsFailed(taskIds);\n }\n\n // Mark successful tasks\n if (successTasks.length > 0) {\n await TaskStore.markTasksAsSuccess(successTasks);\n }\n}\n\nasync function reportQueueStats(queueName: QueueName, forceSend: boolean = false): Promise<void> {\n const stats = queueStats.get(queueName);\n if (!stats) return;\n\n const total = stats.success + stats.failed + stats.async + stats.ignored;\n\n // Skip if no stats\n if (total === 0) return;\n\n // Check thresholds unless force sending\n if (!forceSend && total < STATS_THRESHOLD && stats.failed < FAILURE_THRESHOLD) return;\n\n const message = `[${INSTANCE_ID}] TQ Stats for ${queueName}:\\n` +\n `✅ Success: ${stats.success}\\n` +\n `❌ Failed: ${stats.failed}\\n` +\n `⏳ Async: ${stats.async}\\n` +\n `🚫 Ignored: ${stats.ignored}`;\n\n try {\n // fixme\n // await slack.sendSlackMessage(undefined, message);\n logger.info(`Sent stats for ${queueName}`);\n } catch (err) {\n logger.error(`Failed to send stats: ${err}`);\n }\n\n // Reset stats after threshold-based reporting (not on shutdown)\n if (!forceSend) {\n stats.success = 0;\n stats.failed = 0;\n stats.async = 0;\n stats.ignored = 0;\n }\n}\n\nfunction startConsumingTasks(messageQueue: IMessageQueue, streamName: QueueName) {\n return messageQueue.consumeTasks(streamName, async (id, tasks) => {\n logger.debug(`Processing ${tasks.length} tasks for stream ${streamName}`);\n const {\n failedTasks,\n newTasks,\n successTasks,\n asyncTasks,\n ignoredTasks\n } = await taskRunner(messageQueue, id, tasks, asyncTaskManager || undefined)\n .catch(err => {\n logger.error(\"Failed to execute tasks?\", err);\n return {failedTasks: [], newTasks: [], successTasks: [], asyncTasks: [], ignoredTasks: []}\n });\n\n // Handle async tasks if we have an async manager\n if (asyncTasks.length > 0 && !asyncTaskManager) {\n throw new Error(\"Async tasks detected but AsyncTaskManager not initialized!\");\n }\n if (asyncTasks.length > 0) {\n logger.info(`Handling ${asyncTasks.length} async tasks for stream ${streamName}`);\n for (const asyncTask of asyncTasks) {\n const accepted = asyncTaskManager!.handoffTask(asyncTask.task, asyncTask.promise);\n if (!accepted) {\n // Queue full - push back to queue with backpressure\n logger.warn(`Async queue full, requeueing task ${asyncTask.task._id} with 30s delay`);\n await addTasks(messageQueue, [{\n ...asyncTask.task,\n execute_at: new Date(Date.now() + 30000) // 30 second delay\n }]);\n }\n }\n }\n\n // Handle ignored tasks (tasks with no executor)\n if (ignoredTasks.length > 0) {\n logger.warn(`Storing ${ignoredTasks.length} ignored tasks with no executor for stream ${streamName}`);\n await TaskStore.markTasksAsIgnored(ignoredTasks)\n .catch(err => {\n logger.error(\"Failed to mark tasks as ignored\", err)\n });\n }\n\n await postProcessTasks(messageQueue, {failedTasks, newTasks, successTasks})\n .catch(err => {\n logger.error(\"Failed to postProcessTasks\", err)\n })\n\n // Update stats\n if (!queueStats.has(streamName)) {\n queueStats.set(streamName, {\n success: 0,\n failed: 0,\n async: 0,\n ignored: 0\n });\n }\n const stats = queueStats.get(streamName)!;\n stats.success += successTasks.length;\n stats.failed += failedTasks.length;\n stats.async += asyncTasks.length;\n stats.ignored += ignoredTasks.length;\n\n // Check thresholds and report if needed\n await reportQueueStats(streamName);\n\n logger.debug(`Completed processing for stream ${streamName}: ${successTasks.length} succeeded, ${failedTasks.length} failed, ${newTasks.length} new tasks, ${ignoredTasks.length} ignored`);\n return {failedTasks, newTasks, successTasks};\n });\n}\n\nfunction processMatureTasks(messageQueue: IMessageQueue) {\n const LOCK_ID = 'task_processor';\n\n if (matureTaskTimer) clearInterval(matureTaskTimer);\n matureTaskTimer = setInterval(async () => {\n // Check if the operation is already locked\n if (await lock.isLocked(LOCK_ID)) {\n logger.info('Mature task runner locked');\n return; // Exit if another execution is in progress\n }\n\n try {\n // Acquire lock before proceeding\n await lock.acquire(LOCK_ID);\n\n // Perform the task operations\n const matureTasks = await TaskStore.getMatureTasks(Date.now());\n logger.debug(`Found ${matureTasks.length} mature tasks to process`);\n await addTasks(messageQueue, matureTasks);\n } catch (error) {\n logger.error(`Error processing tasks: ${error}`);\n } finally {\n // Always release the lock when done\n await lock.release(LOCK_ID);\n }\n\n }, 5000);\n}\n\nfunction taskProcessServer(messageQueue: IMessageQueue,) {\n const queues = getEnabledQueues();\n for (let i = 0; i < queues.length; i++) {\n logger.info(`Starting consumer for queue: ${queues[i]}`);\n startConsumingTasks(messageQueue, queues[i]);\n }\n logger.info('Starting mature tasks processor');\n processMatureTasks(messageQueue);\n\n //fixme\n // Register shutdown handler to send final stats\n // shutdownManager.sigint.register(async () => {\n // await sendFinalStats();\n // });\n // shutdownManager.sigterm.register(async () => {\n // await sendFinalStats();\n // });\n}\n\nasync function sendFinalStats(): Promise<void> {\n // Send stats for each queue that has processed tasks (force send on shutdown)\n for (const queueName of queueStats.keys()) {\n await reportQueueStats(queueName, true);\n }\n\n // If no queues have been initialized, send a no-tasks message\n if (queueStats.size === 0) {\n try {\n const message = `[${INSTANCE_ID}] TQ Final Stats:\\nNo tasks processed during this session`;\n await slack.sendSlackMessage(undefined, message);\n logger.info('Sent final TQ stats to Slack (no tasks)');\n } catch (err) {\n logger.error(`Failed to send final stats: ${err}`);\n }\n }\n}\n\nfunction processBatch(messageQueue: IMessageQueue, queueId: QueueName, processor: Processor, limit?: number): Promise<ProcessedTaskResult> {\n return messageQueue.processBatch(queueId, processor, limit);\n}\n\nfunction setAsyncTaskManager(manager: IAsyncTaskManager) {\n asyncTaskManager = manager;\n logger.info('Async task manager set');\n}\n\nexport default {\n processBatch,\n processMatureTasks,\n startConsumingTasks,\n postProcessTasks,\n addTasks,\n taskProcessServer,\n setAsyncTaskManager\n}\n","import {Logger, LogLevel} from \"@supergrowthai/utils\";\nimport {CronTask} from \"../../adapters/index.js\";\nimport {IAsyncTaskManager} from \"@supergrowthai/mq\";\n\nconst logger = new Logger('AsyncTaskManager', LogLevel.INFO);\n\ninterface AsyncTaskEntry {\n task: CronTask<any>;\n promise: Promise<void>;\n startTime: number;\n}\n\nexport class AsyncTaskManager implements IAsyncTaskManager {\n private asyncTasks: Map<string, AsyncTaskEntry> = new Map();\n private handedOffTaskIds: Set<string> = new Set();\n private readonly maxTasks: number;\n private totalHandedOff: number = 0;\n\n constructor(maxTasks: number = 100) {\n this.maxTasks = maxTasks;\n logger.info(`AsyncTaskManager initialized with max ${maxTasks} concurrent tasks`);\n }\n\n handoffTask(task: CronTask<any>, runningPromise: Promise<void>): boolean {\n // Require _id for async tasks - we need to track completion in DB\n if (!task._id) {\n logger.error(`Cannot hand off task without _id (type: ${task.type})`);\n return false;\n }\n\n const taskId = task._id.toString();\n\n // Check if queue is full\n if (this.asyncTasks.size >= this.maxTasks) {\n logger.warn(`Async queue full (${this.asyncTasks.size}/${this.maxTasks}), rejecting task ${taskId}`);\n return false;\n }\n\n // Add to tracking\n const entry: AsyncTaskEntry = {\n task: task as CronTask<any>,\n promise: runningPromise,\n startTime: Date.now()\n };\n\n this.asyncTasks.set(taskId, entry);\n this.handedOffTaskIds.add(taskId);\n this.totalHandedOff++;\n logger.info(`Task ${taskId} (${task.type}) handed off to async processing (queue: ${this.asyncTasks.size}/${this.maxTasks})`);\n\n // Monitor completion - AsyncActions handles success/fail\n runningPromise\n .then(() => {\n const duration = Date.now() - entry.startTime;\n logger.info(`Async task ${taskId} completed after ${duration}ms`);\n })\n .catch(error => {\n const duration = Date.now() - entry.startTime;\n logger.error(`Async task ${taskId} errored after ${duration}ms:`, error);\n })\n .finally(() => {\n this.asyncTasks.delete(taskId);\n this.handedOffTaskIds.delete(taskId);\n logger.debug(`Task ${taskId} removed from async queue (remaining: ${this.asyncTasks.size})`);\n });\n\n return true;\n }\n\n\n async shutdown(): Promise<void> {\n logger.info(`Shutting down AsyncTaskManager with ${this.asyncTasks.size} tasks still running`);\n\n // Wait a bit for tasks to complete\n const gracePeriod = 10000; // 10 seconds\n logger.info(`Waiting ${gracePeriod}ms for tasks to complete...`);\n await new Promise(resolve => setTimeout(resolve, gracePeriod));\n\n if (this.asyncTasks.size > 0) {\n logger.warn(`${this.asyncTasks.size} tasks still running after grace period, they will continue in background`);\n\n // Log remaining tasks\n for (const [taskId, entry] of this.asyncTasks) {\n const runtime = Date.now() - entry.startTime;\n logger.info(`Task ${taskId} (${entry.task.type}) has been running for ${runtime}ms`);\n }\n }\n\n logger.info('AsyncTaskManager shutdown complete');\n }\n\n getMetrics() {\n return {\n activeTaskCount: this.asyncTasks.size,\n totalHandedOff: this.totalHandedOff,\n maxTasks: this.maxTasks,\n utilizationPercent: (this.asyncTasks.size / this.maxTasks) * 100\n };\n }\n\n isHandedOff(taskId: string): boolean {\n return this.handedOffTaskIds.has(taskId);\n }\n\n canAcceptTask(): boolean {\n return this.asyncTasks.size < this.maxTasks;\n }\n}","// Core types and utilities\nexport * from \"./types.js\";\n\n// Adapters\nexport * from \"./adapters/index.js\";\n\n// Core modules\nexport {default as TaskStore} from \"./core/task-store.js\";\nexport {default as taskHandler} from \"./core/task-handler.js\";\nexport {default as taskRunner} from \"./core/task-runner.js\";\nexport {getEnabledQueues} from \"./core/environment.js\";\n\n// Actions\nexport {Actions} from \"./core/actions/Actions.js\";\nexport {AsyncActions} from \"./core/actions/AsyncActions.js\";\n\n// Async task management\nexport {AsyncTaskManager} from \"./core/async/AsyncTaskManager.js\";\n\n// Base interfaces\nexport * from \"./core/base/interfaces.js\";\n\n// Task registry\nexport * from \"./task-registry.js\";\n\n// Utilities\nexport {default as tId} from \"./utils/task-id-gen.js\";\n\nimport {getEnvironmentQueueName, IMessageQueue, QueueName} from \"@supergrowthai/mq\";\nimport {TaskExecutor} from \"./core/base/interfaces.js\";\n\nclass TaskQueue {\n queueTaskExecutorMap: Map<QueueName, Map<string, TaskExecutor<any>>> = new Map();\n\n /**\n * Registers a task executor with a message queue and queue name\n * @param messageQueue The message queue to register with\n * @param queueName The name of the queue\n * @param taskType The type of task\n * @param executor The executor for the task\n */\n register(\n messageQueue: IMessageQueue,\n queueName: QueueName,\n taskType: string,\n executor: TaskExecutor<any>\n ): void {\n queueName = getEnvironmentQueueName(queueName)\n // Ensure the queue is registered with the message queue\n messageQueue.register(queueName);\n\n // Initialize the map for this queue if it doesn't exist\n if (!this.queueTaskExecutorMap.has(queueName)) {\n this.queueTaskExecutorMap.set(queueName, new Map());\n }\n\n // Register the executor for this task type\n const queueMap = this.queueTaskExecutorMap.get(queueName)!;\n queueMap.set(taskType, executor);\n\n console.log(`Registered task executor for ${taskType} on queue ${queueName}`);\n }\n\n /**\n * Gets the task executor for a specific queue and task type\n * @param queueName The name of the queue\n * @param taskType The type of task\n * @returns The executor for the task\n */\n getExecutor(queueName: QueueName, taskType: string): TaskExecutor<any> | undefined {\n queueName = getEnvironmentQueueName(queueName)\n const queueMap = this.queueTaskExecutorMap.get(queueName);\n if (!queueMap) {\n return undefined;\n }\n return queueMap.get(taskType);\n }\n\n /**\n * Gets all registered queues\n * @returns Array of queue names\n */\n getQueues(): QueueName[] {\n return Array.from(this.queueTaskExecutorMap.keys());\n }\n\n /**\n * Gets all task types for a specific queue\n * @param queueName The name of the queue\n * @returns Array of task types\n */\n getTasksForQueue(queueName: QueueName): string[] {\n queueName = getEnvironmentQueueName(queueName)\n const queueMap = this.queueTaskExecutorMap.get(queueName);\n if (!queueMap) {\n return [];\n }\n return Array.from(queueMap.keys());\n }\n}\n\n// Create a singleton instance of the task queue\nconst taskQueue = new TaskQueue();\n\n// Task queue management\nexport {TaskQueue};\nexport default taskQueue;"],"names":["cacheProvider","logger","updates","global","require$$0","require$$1","require$$2","require$$3","chunk","lock","asyncTaskManager","tasks","stats"],"mappings":"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","x_google_ignoreList":[7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { BaseTask, ITasksAdapter } from '@supergrowthai/mq';
|
|
2
|
+
/**
|
|
3
|
+
* Extended task structure for cron tasks with additional fields
|
|
4
|
+
*/
|
|
5
|
+
export interface CronTask<T = any, ID = any> extends BaseTask<T, ID> {
|
|
6
|
+
_id: ID;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Extended TasksAdapter interface specifically for cron tasks
|
|
10
|
+
* This extends the base ITasksAdapter with TQ-specific requirements
|
|
11
|
+
*/
|
|
12
|
+
export interface ICronTasksAdapter<T = any> extends ITasksAdapter<T> {
|
|
13
|
+
/**
|
|
14
|
+
* Insert multiple cron tasks into storage
|
|
15
|
+
*/
|
|
16
|
+
insertTasks(tasks: CronTask<T>[]): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Find cron tasks ready for processing
|
|
19
|
+
*/
|
|
20
|
+
findScheduledTasks(queueId: string, limit: number): Promise<CronTask<T>[]>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* In-memory implementation of ICronTasksAdapter for testing/development
|
|
24
|
+
*/
|
|
25
|
+
export declare class MemoryCronTasksAdapter<T = any> implements ICronTasksAdapter<T> {
|
|
26
|
+
private tasks;
|
|
27
|
+
private idCounter;
|
|
28
|
+
generateTaskId(): string;
|
|
29
|
+
insertTasks(tasks: CronTask<T>[]): Promise<void>;
|
|
30
|
+
findScheduledTasks(queueId: string, limit: number): Promise<CronTask<T>[]>;
|
|
31
|
+
markTasksAsProcessing(taskIds: any[]): Promise<void>;
|
|
32
|
+
markTasksAsExecuted(taskIds: any[]): Promise<void>;
|
|
33
|
+
markTasksAsFailed(taskIds: any[]): Promise<void>;
|
|
34
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { CronTask } from './CronTasksAdapter.js';
|
|
2
|
+
import { ObjectId } from 'mongodb';
|
|
3
|
+
/**
|
|
4
|
+
* Database adapter interface for task storage operations
|
|
5
|
+
*/
|
|
6
|
+
export interface IDatabaseAdapter {
|
|
7
|
+
/**
|
|
8
|
+
* Add tasks to the scheduled collection
|
|
9
|
+
*/
|
|
10
|
+
addTasksToScheduled(tasks: CronTask<any>[]): Promise<CronTask<any>[]>;
|
|
11
|
+
/**
|
|
12
|
+
* Get mature tasks ready for processing
|
|
13
|
+
*/
|
|
14
|
+
getMatureTasks(timestamp: number): Promise<CronTask<any>[]>;
|
|
15
|
+
/**
|
|
16
|
+
* Update task status to processing
|
|
17
|
+
*/
|
|
18
|
+
markTasksAsProcessing(taskIds: ObjectId[], processingStartedAt: Date): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Update task status to executed
|
|
21
|
+
*/
|
|
22
|
+
markTasksAsExecuted(taskIds: ObjectId[]): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Update task status to failed
|
|
25
|
+
*/
|
|
26
|
+
markTasksAsFailed(taskIds: ObjectId[]): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Get tasks by IDs
|
|
29
|
+
*/
|
|
30
|
+
getTasksByIds(taskIds: ObjectId[]): Promise<CronTask<any>[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Update multiple tasks
|
|
33
|
+
*/
|
|
34
|
+
updateTasks(updates: Array<{
|
|
35
|
+
id: ObjectId;
|
|
36
|
+
updates: Partial<CronTask<any>>;
|
|
37
|
+
}>): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Get stats for cleanup
|
|
40
|
+
*/
|
|
41
|
+
getCleanupStats(): Promise<{
|
|
42
|
+
orphanedTasks: number;
|
|
43
|
+
expiredTasks: number;
|
|
44
|
+
}>;
|
|
45
|
+
/**
|
|
46
|
+
* Clean up orphaned and expired tasks
|
|
47
|
+
*/
|
|
48
|
+
cleanupTasks(orphanedBefore: Date, expiredBefore: Date): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Initialize database connection
|
|
51
|
+
*/
|
|
52
|
+
initialize(): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Close database connection
|
|
55
|
+
*/
|
|
56
|
+
close(): Promise<void>;
|
|
57
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ObjectId } from 'mongodb';
|
|
2
|
+
import { IDatabaseAdapter } from './IDatabaseAdapter.js';
|
|
3
|
+
import { CronTask } from './CronTasksAdapter.js';
|
|
4
|
+
/**
|
|
5
|
+
* MongoDB implementation of IDatabaseAdapter
|
|
6
|
+
*/
|
|
7
|
+
export declare class MongoDbAdapter implements IDatabaseAdapter {
|
|
8
|
+
private client;
|
|
9
|
+
private db;
|
|
10
|
+
private tasksCollection;
|
|
11
|
+
private readonly uri;
|
|
12
|
+
private readonly dbName;
|
|
13
|
+
private readonly collectionName;
|
|
14
|
+
constructor(uri?: string, dbName?: string, collectionName?: string);
|
|
15
|
+
initialize(): Promise<void>;
|
|
16
|
+
addTasksToScheduled(tasks: CronTask<any>[]): Promise<CronTask<any>[]>;
|
|
17
|
+
getMatureTasks(timestamp: number): Promise<CronTask<any>[]>;
|
|
18
|
+
markTasksAsProcessing(taskIds: ObjectId[], processingStartedAt: Date): Promise<void>;
|
|
19
|
+
markTasksAsExecuted(taskIds: ObjectId[]): Promise<void>;
|
|
20
|
+
markTasksAsFailed(taskIds: ObjectId[]): Promise<void>;
|
|
21
|
+
getTasksByIds(taskIds: ObjectId[]): Promise<CronTask<any>[]>;
|
|
22
|
+
updateTasks(updates: Array<{
|
|
23
|
+
id: ObjectId;
|
|
24
|
+
updates: Partial<CronTask<any>>;
|
|
25
|
+
}>): Promise<void>;
|
|
26
|
+
getCleanupStats(): Promise<{
|
|
27
|
+
orphanedTasks: number;
|
|
28
|
+
expiredTasks: number;
|
|
29
|
+
}>;
|
|
30
|
+
cleanupTasks(orphanedBefore: Date, expiredBefore: Date): Promise<void>;
|
|
31
|
+
close(): Promise<void>;
|
|
32
|
+
private ensureConnection;
|
|
33
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { IDatabaseAdapter } from './IDatabaseAdapter.js';
|
|
2
|
+
/**
|
|
3
|
+
* Singleton database adapter instance
|
|
4
|
+
* Can be replaced with different implementations (e.g., PostgreSQL, Redis, etc.)
|
|
5
|
+
*/
|
|
6
|
+
declare const databaseAdapter: IDatabaseAdapter;
|
|
7
|
+
export default databaseAdapter;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { MemoryCronTasksAdapter } from './CronTasksAdapter.js';
|
|
2
|
+
export type { ICronTasksAdapter, CronTask } from './CronTasksAdapter.js';
|
|
3
|
+
export type { IDatabaseAdapter } from './IDatabaseAdapter.js';
|
|
4
|
+
export { MongoDbAdapter } from './MongoDbAdapter.js';
|
|
5
|
+
export { default as databaseAdapter } from './database-adapter.js';
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ExecutorActions } from '../base/interfaces';
|
|
2
|
+
import { CronTask } from '../../adapters/index.js';
|
|
3
|
+
export interface ActionResults {
|
|
4
|
+
failedTasks: CronTask<any>[];
|
|
5
|
+
successTasks: CronTask<any>[];
|
|
6
|
+
newTasks: CronTask<any>[];
|
|
7
|
+
ignoredTasks: CronTask<any>[];
|
|
8
|
+
}
|
|
9
|
+
export declare class Actions implements ExecutorActions<any> {
|
|
10
|
+
private readonly taskRunnerId;
|
|
11
|
+
private readonly taskContexts;
|
|
12
|
+
constructor(taskRunnerId: string);
|
|
13
|
+
/**
|
|
14
|
+
* Fork execution context for a specific task (for single-task executors)
|
|
15
|
+
*/
|
|
16
|
+
forkForTask(task: CronTask<any>): ExecutorActions<any>;
|
|
17
|
+
fail(task: CronTask<any>): void;
|
|
18
|
+
success(task: CronTask<any>): void;
|
|
19
|
+
addTasks(tasks: CronTask<any>[]): void;
|
|
20
|
+
addIgnoredTask(task: CronTask<any>): void;
|
|
21
|
+
/**
|
|
22
|
+
* Extract actions for a single task (used by async tasks)
|
|
23
|
+
*/
|
|
24
|
+
extractTaskActions(taskId: string): ActionResults;
|
|
25
|
+
/**
|
|
26
|
+
* Extract sync results including batch context (for sync processing)
|
|
27
|
+
*/
|
|
28
|
+
extractSyncResults(excludeTaskIds: string[]): ActionResults;
|
|
29
|
+
/**
|
|
30
|
+
* Get all results (mainly for backward compatibility)
|
|
31
|
+
*/
|
|
32
|
+
getResults(): ActionResults;
|
|
33
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Actions } from './Actions.js';
|
|
2
|
+
import { IMessageQueue } from '@supergrowthai/mq';
|
|
3
|
+
import { CronTask } from '../../adapters/index.js';
|
|
4
|
+
export declare class AsyncActions {
|
|
5
|
+
private messageQueue;
|
|
6
|
+
private readonly actions;
|
|
7
|
+
private readonly taskId;
|
|
8
|
+
constructor(messageQueue: IMessageQueue, actions: Actions, task: CronTask<any>);
|
|
9
|
+
/**
|
|
10
|
+
* Called when the async promise completes to execute the collected actions
|
|
11
|
+
*/
|
|
12
|
+
onPromiseFulfilled(): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Schedule new tasks - replicates the logic from task-handler's addTasks
|
|
15
|
+
*/
|
|
16
|
+
private scheduleNewTasks;
|
|
17
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { CronTask } from '../../adapters/index.js';
|
|
2
|
+
import { IAsyncTaskManager } from '@supergrowthai/mq';
|
|
3
|
+
export declare class AsyncTaskManager implements IAsyncTaskManager {
|
|
4
|
+
private asyncTasks;
|
|
5
|
+
private handedOffTaskIds;
|
|
6
|
+
private readonly maxTasks;
|
|
7
|
+
private totalHandedOff;
|
|
8
|
+
constructor(maxTasks?: number);
|
|
9
|
+
handoffTask(task: CronTask<any>, runningPromise: Promise<void>): boolean;
|
|
10
|
+
shutdown(): Promise<void>;
|
|
11
|
+
getMetrics(): {
|
|
12
|
+
activeTaskCount: number;
|
|
13
|
+
totalHandedOff: number;
|
|
14
|
+
maxTasks: number;
|
|
15
|
+
utilizationPercent: number;
|
|
16
|
+
};
|
|
17
|
+
isHandedOff(taskId: string): boolean;
|
|
18
|
+
canAcceptTask(): boolean;
|
|
19
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { CronTask } from '../../adapters/CronTasksAdapter.js';
|
|
2
|
+
export type ExecutorActions<T> = {
|
|
3
|
+
addTasks(task: CronTask<any>[]): void;
|
|
4
|
+
fail(task: CronTask<T>): void;
|
|
5
|
+
success(task: CronTask<T>): void;
|
|
6
|
+
};
|
|
7
|
+
interface IBaseExecutor<T> {
|
|
8
|
+
multiple: boolean;
|
|
9
|
+
default_retries?: number;
|
|
10
|
+
store_on_failure: boolean;
|
|
11
|
+
asyncConfig?: {
|
|
12
|
+
handoffTimeout: number;
|
|
13
|
+
maxConcurrentAsync?: number;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export interface IMultiTaskExecutor<T> extends IBaseExecutor<T> {
|
|
17
|
+
multiple: true;
|
|
18
|
+
onTasks(tasks: CronTask<T>[], action: ExecutorActions<T>): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
export interface ISingleTaskExecutor<T> extends IBaseExecutor<T> {
|
|
21
|
+
parallel: boolean;
|
|
22
|
+
multiple: false;
|
|
23
|
+
onTask(task: CronTask<T>, action: ExecutorActions<T>): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
export interface ISingleTaskNonParallel<T> extends ISingleTaskExecutor<T> {
|
|
26
|
+
parallel: false;
|
|
27
|
+
multiple: false;
|
|
28
|
+
}
|
|
29
|
+
export interface ISingleTaskParallel<T> extends ISingleTaskExecutor<T> {
|
|
30
|
+
chunkSize: number;
|
|
31
|
+
parallel: true;
|
|
32
|
+
multiple: false;
|
|
33
|
+
}
|
|
34
|
+
export type TaskExecutor<T> = IMultiTaskExecutor<T> | ISingleTaskNonParallel<T> | ISingleTaskParallel<T>;
|
|
35
|
+
export {};
|