fayan.service.ts raw
1 import DataLoader from 'dataloader'
2
3 class FayanService {
4 static instance: FayanService
5
6 private userPercentileDataLoader = new DataLoader<string, number | null>(
7 async (pubkeys) => {
8 try {
9 const res = await fetch(`https://fayan.smesh.social/users`, {
10 method: 'POST',
11 headers: {
12 'Content-Type': 'application/json'
13 },
14 body: JSON.stringify({ pubkeys })
15 })
16 if (!res.ok) {
17 return new Array(pubkeys.length).fill(null)
18 }
19 const data = await res.json()
20 return pubkeys.map((pubkey) => data[pubkey] ?? 0)
21 } catch {
22 return new Array(pubkeys.length).fill(null)
23 }
24 },
25 { maxBatchSize: 50 }
26 )
27
28 constructor() {
29 if (!FayanService.instance) {
30 FayanService.instance = this
31 }
32 return FayanService.instance
33 }
34
35 // null means server error
36 async fetchUserPercentile(userId: string): Promise<number | null> {
37 return await this.userPercentileDataLoader.load(userId)
38 }
39 }
40
41 const instance = new FayanService()
42 export default instance
43