2023-04-12 21:35:35 +09:00
|
|
|
import { LRUCache } from 'lru-cache'
|
2023-01-08 15:21:09 +09:00
|
|
|
import type { mastodon } from 'masto'
|
2022-11-24 14:47:14 +09:00
|
|
|
|
2023-04-12 21:35:35 +09:00
|
|
|
const cache = new LRUCache<string, any>({
|
2022-11-24 14:47:14 +09:00
|
|
|
max: 1000,
|
|
|
|
})
|
|
|
|
|
2022-12-18 01:55:29 +09:00
|
|
|
if (process.dev && process.client)
|
2022-11-24 14:47:14 +09:00
|
|
|
// eslint-disable-next-line no-console
|
|
|
|
console.log({ cache })
|
|
|
|
|
2022-11-24 16:53:27 +09:00
|
|
|
export function setCached(key: string, value: any, override = false) {
|
|
|
|
if (override || !cache.has(key))
|
|
|
|
cache.set(key, value)
|
2022-11-24 14:47:14 +09:00
|
|
|
}
|
2022-12-25 23:52:37 +09:00
|
|
|
function removeCached(key: string) {
|
|
|
|
cache.delete(key)
|
|
|
|
}
|
2022-11-24 14:47:14 +09:00
|
|
|
|
2023-01-08 15:21:09 +09:00
|
|
|
export function fetchStatus(id: string, force = false): Promise<mastodon.v1.Status> {
|
2022-12-12 08:30:26 +09:00
|
|
|
const server = currentServer.value
|
2023-01-15 06:56:47 +09:00
|
|
|
const userId = currentUser.value?.account.id
|
|
|
|
const key = `${server}:${userId}:status:${id}`
|
2022-11-24 14:47:14 +09:00
|
|
|
const cached = cache.get(key)
|
2022-12-01 16:24:35 +09:00
|
|
|
if (cached && !force)
|
2022-11-24 14:47:14 +09:00
|
|
|
return cached
|
2024-01-09 17:56:15 +09:00
|
|
|
const promise = useMastoClient().v1.statuses.$select(id).fetch()
|
2022-11-24 14:47:14 +09:00
|
|
|
.then((status) => {
|
|
|
|
cacheStatus(status)
|
|
|
|
return status
|
|
|
|
})
|
|
|
|
cache.set(key, promise)
|
|
|
|
return promise
|
|
|
|
}
|
|
|
|
|
2023-01-08 15:21:09 +09:00
|
|
|
export function fetchAccountById(id?: string | null): Promise<mastodon.v1.Account | null> {
|
2022-12-07 08:38:00 +09:00
|
|
|
if (!id)
|
|
|
|
return Promise.resolve(null)
|
|
|
|
|
2022-12-12 08:30:26 +09:00
|
|
|
const server = currentServer.value
|
2023-01-15 06:56:47 +09:00
|
|
|
const userId = currentUser.value?.account.id
|
|
|
|
const key = `${server}:${userId}:account:${id}`
|
2022-11-24 14:47:14 +09:00
|
|
|
const cached = cache.get(key)
|
|
|
|
if (cached)
|
|
|
|
return cached
|
2023-05-10 21:19:50 +09:00
|
|
|
const domain = getInstanceDomainFromServer(server)
|
2024-01-09 17:56:15 +09:00
|
|
|
const promise = useMastoClient().v1.accounts.$select(id).fetch()
|
2022-12-12 08:30:26 +09:00
|
|
|
.then((r) => {
|
2023-01-08 15:21:09 +09:00
|
|
|
if (r.acct && !r.acct.includes('@') && domain)
|
|
|
|
r.acct = `${r.acct}@${domain}`
|
2022-12-12 08:30:26 +09:00
|
|
|
|
|
|
|
cacheAccount(r, server, true)
|
|
|
|
return r
|
2022-11-24 14:47:14 +09:00
|
|
|
})
|
|
|
|
cache.set(key, promise)
|
|
|
|
return promise
|
|
|
|
}
|
|
|
|
|
2023-01-08 15:21:09 +09:00
|
|
|
export async function fetchAccountByHandle(acct: string): Promise<mastodon.v1.Account> {
|
2022-12-12 08:30:26 +09:00
|
|
|
const server = currentServer.value
|
2023-01-15 06:56:47 +09:00
|
|
|
const userId = currentUser.value?.account.id
|
2023-05-10 21:19:50 +09:00
|
|
|
const domain = getInstanceDomainFromServer(server)
|
|
|
|
const userAcct = (domain && acct.endsWith(`@${domain}`)) ? acct.slice(0, -domain.length - 1) : acct
|
2023-02-05 21:10:19 +09:00
|
|
|
const key = `${server}:${userId}:account:${userAcct}`
|
2022-11-24 14:47:14 +09:00
|
|
|
const cached = cache.get(key)
|
|
|
|
if (cached)
|
|
|
|
return cached
|
2022-12-04 22:19:47 +09:00
|
|
|
|
2023-01-15 18:21:03 +09:00
|
|
|
async function lookupAccount() {
|
|
|
|
const client = useMastoClient()
|
|
|
|
let account: mastodon.v1.Account
|
2023-07-21 21:52:55 +09:00
|
|
|
if (!isGotoSocial.value) { // TODO: GoToSocial will support this endpoint from 0.10.0
|
2023-02-05 21:10:19 +09:00
|
|
|
account = await client.v1.accounts.lookup({ acct: userAcct })
|
2023-07-21 21:52:55 +09:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
const userAcctDomain = userAcct.includes('@') ? userAcct : `${userAcct}@${domain}`
|
2024-01-09 17:56:15 +09:00
|
|
|
account = (await client.v1.search.fetch({ q: `@${userAcctDomain}`, type: 'accounts' })).accounts[0]
|
2023-07-21 21:52:55 +09:00
|
|
|
}
|
2023-01-15 18:21:03 +09:00
|
|
|
|
|
|
|
if (account.acct && !account.acct.includes('@') && domain)
|
|
|
|
account.acct = `${account.acct}@${domain}`
|
|
|
|
return account
|
|
|
|
}
|
|
|
|
|
|
|
|
const account = lookupAccount()
|
|
|
|
.then((r) => {
|
2022-12-12 08:30:26 +09:00
|
|
|
cacheAccount(r, server, true)
|
2022-11-24 14:47:14 +09:00
|
|
|
return r
|
|
|
|
})
|
|
|
|
cache.set(key, account)
|
|
|
|
return account
|
|
|
|
}
|
|
|
|
|
2022-12-07 08:38:00 +09:00
|
|
|
export function useAccountById(id?: string | null) {
|
2022-11-30 16:08:10 +09:00
|
|
|
return useAsyncState(() => fetchAccountById(id), null).state
|
|
|
|
}
|
|
|
|
|
2023-01-08 15:21:09 +09:00
|
|
|
export function cacheStatus(status: mastodon.v1.Status, server = currentServer.value, override?: boolean) {
|
2023-01-15 06:56:47 +09:00
|
|
|
const userId = currentUser.value?.account.id
|
|
|
|
setCached(`${server}:${userId}:status:${status.id}`, status, override)
|
2022-11-24 14:47:14 +09:00
|
|
|
}
|
|
|
|
|
2022-12-25 23:52:37 +09:00
|
|
|
export function removeCachedStatus(id: string, server = currentServer.value) {
|
2023-01-15 06:56:47 +09:00
|
|
|
const userId = currentUser.value?.account.id
|
|
|
|
removeCached(`${server}:${userId}:status:${id}`)
|
2022-12-25 23:52:37 +09:00
|
|
|
}
|
|
|
|
|
2023-01-08 15:21:09 +09:00
|
|
|
export function cacheAccount(account: mastodon.v1.Account, server = currentServer.value, override?: boolean) {
|
2023-01-15 06:56:47 +09:00
|
|
|
const userId = currentUser.value?.account.id
|
2023-02-05 21:10:19 +09:00
|
|
|
const userAcct = account.acct.endsWith(`@${server}`) ? account.acct.slice(0, -server.length - 1) : account.acct
|
2023-01-15 06:56:47 +09:00
|
|
|
setCached(`${server}:${userId}:account:${account.id}`, account, override)
|
2023-02-05 21:10:19 +09:00
|
|
|
setCached(`${server}:${userId}:account:${userAcct}`, account, override)
|
2022-11-24 14:47:14 +09:00
|
|
|
}
|