/** * This is a temporary off-spec search endpoint * TODO removeme when we land this in proto! */ import {AppBskyFeedPost} from '@atproto/api' const PROFILES_ENDPOINT = 'https://search.bsky.social/search/profiles' const POSTS_ENDPOINT = 'https://search.bsky.social/search/posts' export interface ProfileSearchItem { $type: string avatar: { cid: string mimeType: string } banner: { cid: string mimeType: string } description: string | undefined displayName: string | undefined did: string } export interface PostSearchItem { tid: string cid: string user: { did: string handle: string } post: AppBskyFeedPost.Record } export async function searchProfiles( query: string, ): Promise { return await doFetch(PROFILES_ENDPOINT, query) } export async function searchPosts(query: string): Promise { return await doFetch(POSTS_ENDPOINT, query) } async function doFetch(endpoint: string, query: string): Promise { const controller = new AbortController() const to = setTimeout(() => controller.abort(), 15e3) const uri = new URL(endpoint) uri.searchParams.set('q', query) const res = await fetch(String(uri), { method: 'get', headers: { accept: 'application/json', }, signal: controller.signal, }) const resHeaders: Record = {} res.headers.forEach((value: string, key: string) => { resHeaders[key] = value }) let resBody = await res.json() clearTimeout(to) return resBody as unknown as T }