Team Ai
Apppublic

delqhi/code-devops

sourceHugging Faceupdated 6mo agoView on Hugging Face
0likes
hf_sync.ts86 linesDownload Raw Back to src
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}