@imsaeedafzal/queue-event
Version:
Queue Event
139 lines • 5.12 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.scheduleJobAtDateTime = exports.enqueue = exports.deleteEvent = exports.createEvent = exports.initializeQueueEventManager = void 0;
const qstash_1 = require("@upstash/qstash");
let qstashClient = null;
const initializeQueueEventManager = (config) => {
if (!config.token) {
throw new Error("Token is required for queue initialization");
}
qstashClient = new qstash_1.Client({
token: config.token,
});
};
exports.initializeQueueEventManager = initializeQueueEventManager;
const createEvent = async (eventInput, url, authorizationToken, delay = 0) => {
if (!qstashClient) {
throw new Error("Queue manager not initialized. Call initializeQueueManager first.");
}
try {
const result = await qstashClient.publishJSON({
url: url,
body: eventInput,
delay: delay,
headers: {
Authorization: `Bearer ${authorizationToken}`,
},
});
if (!result) {
throw new Error("Failed to enqueue message");
}
return result;
}
catch (error) {
if (error instanceof Error) {
if (error.message.includes("Queue manager not initialized")) {
throw error;
}
throw new Error(`Failed to create queue event: ${error.message}`);
}
throw new Error("Failed to create queue event: Unknown error");
}
};
exports.createEvent = createEvent;
const deleteEvent = async (messageId) => {
if (!qstashClient) {
throw new Error("Queue manager not initialized. Call initializeQueueManager first.");
}
try {
// First delete the existing message if it exists
return await qstashClient.messages.delete(messageId);
}
catch (error) {
if (error instanceof Error) {
if (error.message.includes("Queue manager not initialized")) {
throw error;
}
throw new Error(`Failed to delete event: ${error.message}`);
}
throw new Error("Failed to delete event: Unknown error");
}
};
exports.deleteEvent = deleteEvent;
const enqueue = async (queueName, queueMessageInput, url, authorizationToken, parallelism = 10) => {
if (!qstashClient) {
throw new Error("Queue manager not initialized. Call initializeQueueManager first.");
}
try {
const queue = qstashClient.queue({ queueName });
await queue.upsert({
parallelism: parallelism,
});
const result = await queue.enqueueJSON({
url: url,
body: queueMessageInput,
headers: {
Authorization: "Bearer " + authorizationToken,
},
});
if (!result) {
throw new Error("Failed to enqueue message");
}
return result;
}
catch (error) {
if (error instanceof Error) {
if (error.message.includes("Queue manager not initialized")) {
throw error;
}
throw new Error(`Failed to enqueue message: ${error.message}`);
}
throw new Error("Failed to enqueue message: Unknown error");
}
};
exports.enqueue = enqueue;
const scheduleJobAtDateTime = async (jobInput, url, executionDateTime, authorizationToken) => {
try {
if (!qstashClient) {
throw new Error("Queue manager not initialized. Call initializeQueueManager first.");
}
// Validate that the date is in the future
if (executionDateTime.getTime() <= Date.now()) {
throw new Error("Execution date must be in the future");
}
const cronExpression = createOneTimeCronExpression(executionDateTime);
const result = await qstashClient.schedules.create({
destination: url,
cron: cronExpression,
body: jobInput,
headers: {
Authorization: "Bearer " + authorizationToken,
},
});
if (!result) {
throw new Error("Failed to schedule job");
}
return result;
}
catch (error) {
if (error instanceof Error) {
throw new Error(`Failed to schedule job at datetime: ${error.message}`);
}
throw new Error("Failed to schedule job at datetime: Unknown error");
}
};
exports.scheduleJobAtDateTime = scheduleJobAtDateTime;
/**
* Creates a one-time cron expression for a specific date and time
* @param dateTime - The target date and time for execution
* @returns A cron expression that will trigger once at the specified time
*/
const createOneTimeCronExpression = (dateTime) => {
const minutes = dateTime.getUTCMinutes();
const hours = dateTime.getUTCHours();
const dayOfMonth = dateTime.getUTCDate();
const month = dateTime.getUTCMonth() + 1; // getUTCMonth() returns 0-11
const dayOfWeek = dateTime.getUTCDay();
return `${minutes} ${hours} ${dayOfMonth} ${month} ${dayOfWeek}`;
};
//# sourceMappingURL=queueManager.js.map