diff --git a/bun.lockb b/bun.lockb index 41e8c4ba..342bcdb8 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/classes/functions/status.ts b/classes/functions/status.ts index 88dbbdd7..e5f60da4 100644 --- a/classes/functions/status.ts +++ b/classes/functions/status.ts @@ -320,12 +320,13 @@ export const parseTextMentions = async ( author.data.privateKey ?? "", author.getUri(), ); - const manager = new FederationRequester( - new URL(`https://${person?.[2] ?? ""}`), - signatureConstructor, - ); + const manager = new FederationRequester(signatureConstructor); - const uri = await User.webFinger(manager, person?.[1] ?? ""); + const uri = await User.webFinger( + manager, + person?.[1] ?? "", + person?.[2] ?? "", + ); const user = await User.resolve(uri); diff --git a/cli/commands/federation/user/fetch.ts b/cli/commands/federation/user/fetch.ts index 3cf5e93e..c254ac0a 100644 --- a/cli/commands/federation/user/fetch.ts +++ b/cli/commands/federation/user/fetch.ts @@ -51,12 +51,9 @@ export default class FederationUserFetch extends BaseCommand< requester.data.privateKey ?? "", requester.getUri(), ); - const manager = new FederationRequester( - new URL(`https://${host}`), - signatureConstructor, - ); + const manager = new FederationRequester(signatureConstructor); - const uri = await User.webFinger(manager, username); + const uri = await User.webFinger(manager, username, host); const newUser = await User.resolve(uri); diff --git a/cli/commands/federation/user/finger.ts b/cli/commands/federation/user/finger.ts index 37dfc4eb..51cffc0f 100644 --- a/cli/commands/federation/user/finger.ts +++ b/cli/commands/federation/user/finger.ts @@ -51,12 +51,9 @@ export default class FederationUserFinger extends BaseCommand< requester.data.privateKey ?? "", requester.getUri(), ); - const manager = new FederationRequester( - new URL(`https://${host}`), - signatureConstructor, - ); + const manager = new FederationRequester(signatureConstructor); - const uri = await User.webFinger(manager, username); + const uri = await User.webFinger(manager, username, host); spinner.succeed("Fetched user URI"); diff --git a/package.json b/package.json index 51477623..289d1381 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ "@json2csv/plainjs": "^7.0.6", "@logtape/logtape": "npm:@jsr/logtape__logtape@0.4.2", "@lysand-org/client": "^0.2.5", - "@lysand-org/federation": "^2.1.10", + "@lysand-org/federation": "^2.2.0-rc.2", "@oclif/core": "^4.0.14", "@sentry/bun": "^8.20.0", "@tufjs/canonical-json": "^2.0.0", diff --git a/packages/database-interface/instance.ts b/packages/database-interface/instance.ts index 100b9620..f4107d13 100644 --- a/packages/database-interface/instance.ts +++ b/packages/database-interface/instance.ts @@ -140,15 +140,14 @@ export class Instance extends BaseInterface { const logger = getLogger("federation"); try { - const { ok, raw, data } = await FederationRequester.get( - wellKnownUrl, - { + const { ok, raw, data } = await new FederationRequester() + .get(wellKnownUrl, { // @ts-expect-error Bun extension proxy: config.http.proxy.address, - }, - ).catch((e) => ({ - ...(e as ResponseError).response, - })); + }) + .catch((e) => ({ + ...(e as ResponseError).response, + })); if (!(ok && raw.headers.get("content-type")?.includes("json"))) { // If the server doesn't have a Lysand well-known endpoint, it's not a Lysand instance @@ -200,18 +199,20 @@ export class Instance extends BaseInterface { raw: response, ok, data: wellKnown, - } = await FederationRequester.get<{ - links: { rel: string; href: string }[]; - }>(wellKnownUrl, { - // @ts-expect-error Bun extension - proxy: config.http.proxy.address, - }).catch((e) => ({ - ...( - e as ResponseError<{ - links: { rel: string; href: string }[]; - }> - ).response, - })); + } = await new FederationRequester() + .get<{ + links: { rel: string; href: string }[]; + }>(wellKnownUrl, { + // @ts-expect-error Bun extension + proxy: config.http.proxy.address, + }) + .catch((e) => ({ + ...( + e as ResponseError<{ + links: { rel: string; href: string }[]; + }> + ).response, + })); if (!ok) { logger.error`Failed to fetch ActivityPub metadata for instance ${chalk.bold( @@ -244,30 +245,32 @@ export class Instance extends BaseInterface { raw: metadataResponse, ok: ok2, data: metadata, - } = await FederationRequester.get<{ - metadata: { - nodeName?: string; - title?: string; - nodeDescription?: string; - description?: string; - }; - software: { version: string }; - }>(metadataUrl.href, { - // @ts-expect-error Bun extension - proxy: config.http.proxy.address, - }).catch((e) => ({ - ...( - e as ResponseError<{ - metadata: { - nodeName?: string; - title?: string; - nodeDescription?: string; - description?: string; - }; - software: { version: string }; - }> - ).response, - })); + } = await new FederationRequester() + .get<{ + metadata: { + nodeName?: string; + title?: string; + nodeDescription?: string; + description?: string; + }; + software: { version: string }; + }>(metadataUrl.href, { + // @ts-expect-error Bun extension + proxy: config.http.proxy.address, + }) + .catch((e) => ({ + ...( + e as ResponseError<{ + metadata: { + nodeName?: string; + title?: string; + nodeDescription?: string; + description?: string; + }; + software: { version: string }; + }> + ).response, + })); if (!ok2) { logger.error`Failed to fetch ActivityPub metadata for instance ${chalk.bold( diff --git a/packages/database-interface/note.ts b/packages/database-interface/note.ts index bd76daf3..11a8a3be 100644 --- a/packages/database-interface/note.ts +++ b/packages/database-interface/note.ts @@ -592,7 +592,7 @@ export class Note extends BaseInterface { throw new Error(`Invalid URI to parse ${uri}`); } - const { data } = await FederationRequester.get(uri, { + const { data } = await new FederationRequester().get(uri, { // @ts-expect-error Bun extension proxy: config.http.proxy.address, }); diff --git a/packages/database-interface/user.ts b/packages/database-interface/user.ts index c94fe972..10ddd2ab 100644 --- a/packages/database-interface/user.ts +++ b/packages/database-interface/user.ts @@ -201,12 +201,13 @@ export class User extends BaseInterface { static async webFinger( manager: FederationRequester, username: string, + hostname: string, ): Promise { return ( - (await manager.webFinger(username).catch(() => null)) ?? + (await manager.webFinger(username, hostname).catch(() => null)) ?? (await manager.webFinger( username, - manager.url.hostname, + hostname, "application/activity+json", )) ); @@ -340,7 +341,7 @@ export class User extends BaseInterface { uri: string, instance: Instance, ): Promise { - const { data: json } = await FederationRequester.get< + const { data: json } = await new FederationRequester().get< Partial >(uri, { // @ts-expect-error Bun extension diff --git a/server/api/api/v1/accounts/lookup/index.ts b/server/api/api/v1/accounts/lookup/index.ts index c58c52ba..819a0a02 100644 --- a/server/api/api/v1/accounts/lookup/index.ts +++ b/server/api/api/v1/accounts/lookup/index.ts @@ -89,12 +89,9 @@ export default (app: Hono) => requester.data.privateKey ?? "", requester.getUri(), ); - const manager = new FederationRequester( - new URL(`https://${domain}`), - signatureConstructor, - ); + const manager = new FederationRequester(signatureConstructor); - const uri = await User.webFinger(manager, username); + const uri = await User.webFinger(manager, username, domain); const foundAccount = await User.resolve(uri); diff --git a/server/api/api/v1/accounts/search/index.ts b/server/api/api/v1/accounts/search/index.ts index 9b300c53..62bbfe9a 100644 --- a/server/api/api/v1/accounts/search/index.ts +++ b/server/api/api/v1/accounts/search/index.ts @@ -100,12 +100,9 @@ export default (app: Hono) => requester.data.privateKey ?? "", requester.getUri(), ); - const manager = new FederationRequester( - new URL(`https://${host}`), - signatureConstructor, - ); + const manager = new FederationRequester(signatureConstructor); - const uri = await User.webFinger(manager, username); + const uri = await User.webFinger(manager, username, host); const resolvedUser = await User.resolve(uri); diff --git a/server/api/api/v2/search/index.ts b/server/api/api/v2/search/index.ts index d32922f6..92cb2825 100644 --- a/server/api/api/v2/search/index.ts +++ b/server/api/api/v2/search/index.ts @@ -139,11 +139,14 @@ export default (app: Hono) => requester.getUri(), ); const manager = new FederationRequester( - new URL(`https://${domain}`), signatureConstructor, ); - const uri = await User.webFinger(manager, username); + const uri = await User.webFinger( + manager, + username, + domain, + ); const newUser = await User.resolve(uri); diff --git a/server/api/well-known/webfinger/index.ts b/server/api/well-known/webfinger/index.ts index d45cc285..909d1796 100644 --- a/server/api/well-known/webfinger/index.ts +++ b/server/api/well-known/webfinger/index.ts @@ -90,16 +90,14 @@ export default (app: Hono) => requester.getUri(), ); - const manager = new FederationRequester( - new URL(config.federation.bridge.url ?? ""), - signatureConstructor, - ); + const manager = new FederationRequester(signatureConstructor); try { activityPubUrl = await manager.webFinger( user.data.username, new URL(config.http.base_url).host, "application/activity+json", + config.federation.bridge.url, ); } catch (e) { const error = e as ResponseError;