delqhi/code-devops
0
1import * as fs from 'node:fs';2import * as path from 'node:path';3import * as tar from 'tar';4import { uploadFile, downloadFile } from '@huggingface/hub';5import cron from 'node-cron';6 7const AUTH_DIR = path.join(process.cwd(), '.wwebjs_auth');8const BACKUP_FILE = path.join(process.cwd(), 'auth_backup.tar.gz');9 10const hfToken = process.env.HF_TOKEN;11const datasetRepo = process.env.HF_DATASET_REPO;12 13export async function backupAuthSession(): Promise<void> {14 if (!hfToken || !datasetRepo) {15 return;16 }17 18 if (!fs.existsSync(AUTH_DIR)) {19 return;20 }21 22 try {23 await tar.c({ gzip: true, file: BACKUP_FILE, cwd: process.cwd() }, ['.wwebjs_auth']);24 25 const fileBuffer = fs.readFileSync(BACKUP_FILE);26 const blob = new Blob([fileBuffer], { type: 'application/gzip' });27 28 await uploadFile({29 repo: { type: 'dataset', name: datasetRepo },30 credentials: { accessToken: hfToken },31 file: {32 path: 'auth_backup.tar.gz',33 content: blob34 },35 commitTitle: 'Auto-Backup: Session - ' + new Date().toISOString()36 });37 } catch (error) {38 console.error('[HF-Sync] Error during backup:', error);39 }40}41 42export async function restoreAuthSession(): Promise<void> {43 if (!hfToken || !datasetRepo) {44 return;45 }46 47 try {48 const response = await downloadFile({49 repo: { type: 'dataset', name: datasetRepo },50 credentials: { accessToken: hfToken },51 path: 'auth_backup.tar.gz'52 });53 54 if (!response) {55 return;56 }57 58 const buffer = await response.arrayBuffer();59 fs.writeFileSync(BACKUP_FILE, Buffer.from(buffer));60 61 await tar.x({ file: BACKUP_FILE, cwd: process.cwd() });62 console.log('[HF-Sync] Restored session from dataset.');63 } catch (error: any) {64 if (!error.message?.includes('404')) {65 console.error('[HF-Sync] Restore error:', error);66 }67 }68}69 70export function startKeepAlivePing(): void {71 const spaceUrl = process.env.SPACE_HOST ? 'https://' + process.env.SPACE_HOST : 'http://localhost:' + (process.env.PORT || 7860);72 73 cron.schedule('*/5 * * * *', async () => {74 try {75 await fetch(spaceUrl);76 } catch (e) {77 // ignore78 }79 });80}81 82export function startAutoBackup(): void {83 cron.schedule('*/10 * * * *', async () => {84 await backupAuthSession();85 });86}