kopia lustrzana https://github.com/elk-zone/elk
				
				
				
			
		
			
				
	
	
		
			43 wiersze
		
	
	
		
			1.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
			
		
		
	
	
			43 wiersze
		
	
	
		
			1.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
import { emojisArrayToObject } from './utils'
 | 
						|
import type { ServerInfo } from '~/types'
 | 
						|
 | 
						|
const ServerInfoTTL = 60 * 60 * 1000 * 12 // 12 hour
 | 
						|
 | 
						|
const serverInfoPromise = new Map<string, Promise<ServerInfo>>()
 | 
						|
const serverInfos = useLocalStorage<Record<string, ServerInfo>>('nuxtodon-server-info', {})
 | 
						|
 | 
						|
async function _fetchServerInfo(server: string) {
 | 
						|
  if (!serverInfos.value[server]) {
 | 
						|
    // @ts-expect-error init
 | 
						|
    serverInfos.value[server] = {
 | 
						|
      timeUpdated: 0,
 | 
						|
      server,
 | 
						|
    }
 | 
						|
  }
 | 
						|
  if (serverInfos.value[server].timeUpdated + ServerInfoTTL < Date.now()) {
 | 
						|
    await Promise.allSettled([
 | 
						|
      masto.instances.fetch().then((r) => {
 | 
						|
        Object.assign(serverInfos.value[server], r)
 | 
						|
      }),
 | 
						|
      masto.customEmojis.fetchAll().then((r) => {
 | 
						|
        serverInfos.value[server].customEmojis = emojisArrayToObject(r)
 | 
						|
      }),
 | 
						|
    ])
 | 
						|
  }
 | 
						|
  return serverInfos.value[server]
 | 
						|
}
 | 
						|
 | 
						|
export function fetchServerInfo(server: string) {
 | 
						|
  if (!serverInfoPromise.has(server))
 | 
						|
    serverInfoPromise.set(server, _fetchServerInfo(server))
 | 
						|
  return serverInfoPromise.get(server)!
 | 
						|
}
 | 
						|
 | 
						|
export function useServerInfo(server: string) {
 | 
						|
  const info = ref<ServerInfo | undefined>()
 | 
						|
  fetchServerInfo(server).then((r) => {
 | 
						|
    info.value = r
 | 
						|
  })
 | 
						|
  return info
 | 
						|
}
 |