Spaces:
Sleeping
Sleeping
const { HfApi } = require('@huggingface/hub'); | |
class HFDatasetManager { | |
constructor() { | |
this.hfToken = process.env.HF_TOKEN; | |
this.datasetId = process.env.HF_DATASET_ID || "Detomo/houzou-devices"; | |
this.fileName = "devices.json"; | |
this.isEnabled = !!this.hfToken; | |
if (this.isEnabled) { | |
this.hfApi = new HfApi({ accessToken: this.hfToken }); | |
} | |
console.log(`π€ HF Dataset Manager initialized`); | |
console.log(` Dataset: ${this.datasetId}`); | |
console.log(` Enabled: ${this.isEnabled}`); | |
} | |
async loadDevices() { | |
if (!this.isEnabled) { | |
console.log('β οΈ HF Dataset disabled - no token provided'); | |
return new Map(); | |
} | |
try { | |
console.log('π₯ Loading devices from HF dataset...'); | |
const fileUrl = `https://huggingface.co/datasets/${this.datasetId}/resolve/main/${this.fileName}`; | |
const response = await fetch(fileUrl, { | |
headers: { | |
'Authorization': `Bearer ${this.hfToken}` | |
} | |
}); | |
if (response.status === 404) { | |
console.log('π No devices file found in dataset, creating new one'); | |
await this.saveDevices(new Map()); | |
return new Map(); | |
} | |
if (!response.ok) { | |
throw new Error(`HTTP ${response.status}: ${response.statusText}`); | |
} | |
const data = await response.json(); | |
const deviceMap = new Map(data); | |
console.log(`π₯ Loaded ${deviceMap.size} devices from HF dataset`); | |
return deviceMap; | |
} catch (error) { | |
console.error('β Error loading devices from HF dataset:', error); | |
console.log('β οΈ Falling back to empty device list'); | |
return new Map(); | |
} | |
} | |
async saveDevices(deviceMap) { | |
if (!this.isEnabled) { | |
console.log('β οΈ HF Dataset disabled - cannot save devices'); | |
return false; | |
} | |
try { | |
console.log(`πΎ Saving ${deviceMap.size} devices to HF dataset...`); | |
const devicesArray = Array.from(deviceMap.entries()); | |
const jsonData = JSON.stringify(devicesArray, null, 2); | |
// Create a buffer from the JSON data | |
const fileContent = Buffer.from(jsonData, 'utf8'); | |
// Upload using HfApi.uploadFile | |
await this.hfApi.uploadFile({ | |
repo: this.datasetId, | |
file: { | |
path: this.fileName, | |
content: fileContent | |
}, | |
repoType: 'dataset', | |
commitMessage: `Update devices data (${deviceMap.size} devices)` | |
}); | |
console.log(`β Successfully saved ${deviceMap.size} devices to HF dataset`); | |
return true; | |
} catch (error) { | |
console.error('β Error saving devices to HF dataset:', error); | |
return false; | |
} | |
} | |
async createDatasetIfNotExists() { | |
if (!this.isEnabled) { | |
console.log('β οΈ HF Dataset disabled - cannot create dataset'); | |
return false; | |
} | |
try { | |
console.log('π Checking if dataset exists...'); | |
// Try to check if dataset exists | |
try { | |
await this.hfApi.repoInfo({ repo: this.datasetId, repoType: 'dataset' }); | |
console.log('β Dataset already exists'); | |
return true; | |
} catch (error) { | |
if (error.message.includes('404')) { | |
console.log('π Dataset not found, creating new one...'); | |
// Create new dataset | |
await this.hfApi.createRepo({ | |
repo: this.datasetId, | |
repoType: 'dataset', | |
description: 'Device tokens for Houzou Medical App notifications' | |
}); | |
console.log('β Dataset created successfully'); | |
// Create initial empty devices file | |
await this.saveDevices(new Map()); | |
return true; | |
} | |
throw error; | |
} | |
} catch (error) { | |
console.error('β Error initializing dataset:', error); | |
console.log('β οΈ Dataset initialization failed, will use fallback'); | |
return false; | |
} | |
} | |
isReady() { | |
return this.isEnabled; | |
} | |
getStatus() { | |
return { | |
enabled: this.isEnabled, | |
datasetId: this.datasetId, | |
hasToken: !!this.hfToken | |
}; | |
} | |
} | |
module.exports = HFDatasetManager; |