pdmq
Version:
262 lines (261 loc) • 9.78 kB
JavaScript
"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;