unoffical wafrn mirror wafrn.net
atproto social-network activitypub
at angular21 66 lines 2.1 kB view raw
1import axios from "axios"; 2import { FederatedHost, User } from "../../models/index.js"; 3import { splitHandle } from "../../models/user.js"; 4import { logger } from "../logger.js"; 5import { getPetitionSigned } from "./getPetitionSigned.js"; 6import { getRemoteActor } from "./getRemoteActor.js"; 7import { Agent, fetch } from "undici"; 8 9async function searchRemoteUser( 10 searchTerm: string, 11 user: any 12): Promise<User | null> { 13 let remoteResponse: any; 14 const searchData = splitHandle(searchTerm); 15 const users: Array<any> = []; 16 if (searchData && searchData.type === "fediverse") { 17 // fediverse users are like emails right? god I hope so 18 const username = searchData.username; 19 const domain = searchData.domain; 20 const domainBlocked = await FederatedHost.findOne({ 21 where: { 22 displayName: domain, 23 blocked: true, 24 }, 25 }); 26 if (domainBlocked) { 27 return null; 28 } 29 try { 30 try { 31 remoteResponse = await getPetitionSigned( 32 user, 33 `https://${domain}/.well-known/webfinger/?resource=acct:${username}@${domain}` 34 ); 35 } catch (error) { } 36 37 if (!remoteResponse) { 38 try { 39 const petitionResponse = await fetch( 40 `https://${domain}/.well-known/webfinger/?resource=acct:${username}@${domain}`, 41 ); 42 remoteResponse = await petitionResponse.json(); 43 } catch (error) { 44 logger.debug(error); 45 } 46 } 47 if (!remoteResponse) { 48 remoteResponse = await getPetitionSigned( 49 user, 50 `https://${domain}/.well-known/webfinger?resource=acct:${username}@${domain}` 51 ); 52 } 53 const links = remoteResponse.links; 54 for await (const responseLink of links) { 55 if (responseLink.rel === "self") { 56 users.push(await getRemoteActor(responseLink.href, user, true)); 57 } 58 } 59 } catch (error) { 60 logger.trace(`webfinger petition failed: ${searchTerm}`); 61 } 62 } 63 return users.find((elem) => !!elem); 64} 65 66export { searchRemoteUser };