import { fetch } from "bun";
import { CronJobParams } from "cron";
import FormData from "form-data";
import { createReadStream, existsSync } from "node:fs";
import { basename } from "node:path";
export class Webhook {
private webhookPath: string;
private crontab: CronJobParams["cronTime"];
public constructor(webhookPath: string, crontab: CronJobParams["cronTime"]) {
this.webhookPath = webhookPath;
this.crontab = crontab;
}
public async sendWebhook(filePath: string): Promise<boolean> {
if (!existsSync(filePath)) {
throw new Error(`File ${filePath} does not exist`);
}
console.log(`[${new Date().toString().split(" ", 5).join(" ")}] Sending webhook`);
const content = this.crontab ? `Auto Backup crontab \`${this.crontab}\`` : `Manual Backup`;
const fileName = basename(filePath);
const fileBuffer = createReadStream(filePath);
const form = new FormData();
form.append("payload_json", JSON.stringify({ content: content }));
form.append("file", fileBuffer, { filename: fileName });
const response = await fetch(this.webhookPath, {
method: "POST",
headers: {
"Content-Type": `multipart/form-data; boundary=${form.getBoundary()}`
},
body: form,
})
console.log(`[${new Date().toString().split(" ", 5).join(" ")}] Webhook response: ${response.status}`);
if (response.status === 200) {
return true;
} else {
console.error(await response.text());
return false;
}
}
}
bun 1.2.8