unoffical wafrn mirror
wafrn.net
atproto
social-network
activitypub
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 };