Bpistle/src/services/fayan.service.ts
2025-12-23 23:30:57 +08:00

42 lines
1.1 KiB
TypeScript

import DataLoader from 'dataloader'
class FayanService {
static instance: FayanService
private userPercentileDataLoader = new DataLoader<string, number | null>(
async (pubkeys) => {
try {
const res = await fetch(`https://fayan.jumble.social/users`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ pubkeys })
})
if (!res.ok) {
return new Array(pubkeys.length).fill(null)
}
const data = await res.json()
return pubkeys.map((pubkey) => data[pubkey] ?? null)
} catch {
return new Array(pubkeys.length).fill(null)
}
},
{ maxBatchSize: 50 }
)
constructor() {
if (!FayanService.instance) {
FayanService.instance = this
}
return FayanService.instance
}
// null means server error
async fetchUserPercentile(userId: string): Promise<number | null> {
return await this.userPercentileDataLoader.load(userId)
}
}
const instance = new FayanService()
export default instance