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