UNPKG

pdmq

Version:
262 lines (261 loc) 9.78 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.PDMQClient = void 0; const redis_1 = require("redis"); const moment = require("moment"); const redis_service_1 = require("../services/common/redis.service"); const task_service_1 = require("../services/main/task.service"); const task_trigger_types_enum_1 = require("../enums/task-trigger-types.enum"); class PDMQClient { constructor(InitialOptions) { this.InitialOptions = InitialOptions; this.init(); } init() { if (this.InitialOptions.debug) console.debug("Initial Client"); this.redisClient = redis_1.createClient({ url: this.InitialOptions.redis_url }); this.redisClient.on("ready", () => { if (this.InitialOptions.debug) console.info("PDMQ Client is ready"); this.redisService = new redis_service_1.RedisService(this.redisClient); this.taskService = new task_service_1.TaskService(); }); } disconnect() { return this.redisClient.quit(); } /** * Get Execution Result */ getExecutionResult(execId, options) { return __awaiter(this, void 0, void 0, function* () { const [executionResString] = yield this.redisService.getMulti([`tasks:COMPLETED:${execId}`]); if (options === null || options === void 0 ? void 0 : options.remove) { yield this.redisService.delete([`tasks:COMPLETED:${execId}`]); } if (executionResString) return JSON.parse(executionResString); return null; }); } /** * Get instant processing task * @return {PDMQTask | null} the processing instant task */ getProcessingTask() { return __awaiter(this, void 0, void 0, function* () { const [taskString] = yield this.redisService.getMulti([`tasks:PROCESSING:${task_trigger_types_enum_1.TaskTriggerTypes.INSTANT}`]); if (!taskString) return null; const task = JSON.parse(taskString); return [task]; }); } /** * List of all consumers */ getConsumers() { return __awaiter(this, void 0, void 0, function* () { try { const keys = yield this.redisService.searchKeys("consumer:*:count"); if (!(keys === null || keys === void 0 ? void 0 : keys.length)) return []; const reply = yield this.redisService.getMulti(keys); return reply.map(consumerString => JSON.parse(consumerString)); } catch (error) { return []; } }); } /** * Total number of consumer processors */ getCurrentConsumersCount() { return __awaiter(this, void 0, void 0, function* () { const keys = yield this.redisService.searchKeys("consumer:*:count"); if (!(keys === null || keys === void 0 ? void 0 : keys.length)) return 0; const reply = yield this.redisService.getMulti(keys); return reply.map(row => JSON.parse(row)).filter(consumer => { return moment(consumer.updated_at).isAfter(moment().subtract(5, 's')); }).reduce((pre, value) => value.count + pre, 0) || 0; }); } /** * Add Task * * @param task * @returns {PDMQTask} PDMQTask */ addTask(task) { return __awaiter(this, void 0, void 0, function* () { return this.taskService.addTask(task, this.redisService); }); } /** * Fetch All Tasks * * @returns {PDMQTask[]} PDMQTask[] */ findAllTasks() { return __awaiter(this, void 0, void 0, function* () { const tasks = []; const keys = yield this.redisService.searchKeys(`tasks:*`); if (keys.length) { const values = yield this.redisService.getMulti(keys); if (values.length) tasks.push(...values.map(value => JSON.parse(value))); } return tasks; }); } /** * List a range of tasks * * @param from ISO Datetime String * @param to ISO Datetime String */ findTask(from, to) { return __awaiter(this, void 0, void 0, function* () { try { const format = "YYYY:MM:DD:HH:mm:ss"; const fromMoment = moment(from, moment.ISO_8601); const toMoment = moment(to, moment.ISO_8601); from = fromMoment.format(format); to = toMoment.format(format); let searchKey = 'tasks:', i = 0; while (i < from.length) { if (from[i] == to[i]) searchKey += from[i]; else break; i++; } searchKey += '*'; const tasks = []; let keys = yield this.redisService.searchKeys(searchKey); keys = keys.filter(key => { const runAt = key.slice(6, 25); const runtime = moment(runAt, format, true); return runtime.isBetween(fromMoment, toMoment, 'second'); }); if (keys.length) { const values = yield this.redisService.getMulti(keys); if (values.length) tasks.push(...values.map(value => JSON.parse(value))); } if (this.InitialOptions.debug) console.info("Found Tasks: ", tasks, searchKey); return tasks; } catch (error) { if (this.InitialOptions.debug) console.error(error); throw error; } }); } findInstantTask() { return __awaiter(this, void 0, void 0, function* () { try { let keys = yield this.redisService.searchKeys(`tasks:${task_trigger_types_enum_1.TaskTriggerTypes.INSTANT}:*`); if (!(keys === null || keys === void 0 ? void 0 : keys.length)) return []; const taskStrings = yield this.redisService.getMulti(keys); const tasks = taskStrings.map(string => JSON.parse(string)); return tasks; } catch (error) { if (this.InitialOptions.debug) console.error(error); throw error; } }); } /** * Fetch all stored task * * @returns */ findStoredTask() { return __awaiter(this, void 0, void 0, function* () { try { let keys = yield this.redisService.searchKeys(`tasks:${task_trigger_types_enum_1.TaskTriggerTypes.NEVER}:*`); if (!(keys === null || keys === void 0 ? void 0 : keys.length)) return []; const taskStrings = yield this.redisService.getMulti(keys); const tasks = taskStrings.map(string => JSON.parse(string)); return tasks; } catch (error) { if (this.InitialOptions.debug) console.error(error); throw error; } }); } /** * Get stored task by id * * @param taskId * @returns */ findStoredTaskById(taskId) { return __awaiter(this, void 0, void 0, function* () { try { const taskStrings = yield this.redisService.getMulti([`tasks:${task_trigger_types_enum_1.TaskTriggerTypes.NEVER}:${taskId}`]); const tasks = taskStrings.map(string => JSON.parse(string)); return tasks[0]; } catch (error) { if (this.InitialOptions.debug) console.error(error); throw error; } }); } updateTask(task) { return __awaiter(this, void 0, void 0, function* () { try { yield this.deleteTask(task.task_id); const newTask = yield this.addTask(task); return newTask; } catch (error) { throw error; } }); } deleteTask(taskId) { return __awaiter(this, void 0, void 0, function* () { try { const [key] = yield this.redisService.searchKeys(`*:${taskId}`, { count: 1 }); yield this.redisService.delete([key]); } catch (error) { throw error; } }); } runStoredTask(storedTaskId) { return __awaiter(this, void 0, void 0, function* () { return this.taskService.runStoredTask(storedTaskId, this.redisService); }); } } exports.PDMQClient = PDMQClient;