44 lines
1.6 KiB
TypeScript
44 lines
1.6 KiB
TypeScript
import { Job } from "bullmq";
|
|
import { redis } from "lib/db/redis.ts";
|
|
import { insertLatestVideos } from "lib/task/insertLatestVideo.ts";
|
|
import MainQueue from "lib/mq/index.ts";
|
|
import { MINUTE, SECOND } from "$std/datetime/constants.ts";
|
|
import { db } from "lib/db/init.ts";
|
|
import { truncate } from "lib/utils/turncate.ts";
|
|
import { Client } from "https://deno.land/x/postgres@v0.19.3/mod.ts";
|
|
|
|
const LAST_EXECUTED_KEY = "job:insert-videos:last-executed";
|
|
const DELTA = 15 * SECOND;
|
|
const delayMap = [5, 10, 15, 30, 60, 60];
|
|
|
|
const setLastExecutedTimestamp = async () =>
|
|
await redis.set(LAST_EXECUTED_KEY, Date.now());
|
|
|
|
const addJobToQueue = (failedCount: number, delay: number) =>
|
|
MainQueue.add("getLatestVideos", { failedCount }, { delay });
|
|
|
|
export const insertVideosWorker = async (job: Job) => {
|
|
const failedCount = (job.data.failedCount ?? 0) as number;
|
|
const client = await db.connect();
|
|
const lastExecutedTimestamp = Number(await redis.get(LAST_EXECUTED_KEY));
|
|
|
|
if (!lastExecutedTimestamp || isNaN(lastExecutedTimestamp)) {
|
|
await executeTask(client, failedCount);
|
|
return;
|
|
}
|
|
|
|
const diff = Date.now() - lastExecutedTimestamp;
|
|
if (diff < 5 * MINUTE) {
|
|
addJobToQueue(0, diff + DELTA);
|
|
return;
|
|
}
|
|
|
|
await executeTask(client, failedCount);
|
|
};
|
|
|
|
const executeTask = async (client: Client, failedCount: number) => {
|
|
const result = await insertLatestVideos(client);
|
|
await setLastExecutedTimestamp();
|
|
failedCount = result !== 0 ? truncate(failedCount + 1, 0, 5) : 0;
|
|
addJobToQueue(failedCount, delayMap[failedCount] * MINUTE);
|
|
}; |