refactor(federation): ⬆️ Refactor code to use v2.2 of federation SDK

This commit is contained in:
Jesse Wierzbinski 2024-07-26 18:07:11 +02:00
parent aca837cb16
commit ad9ed2598c
No known key found for this signature in database
12 changed files with 73 additions and 79 deletions

BIN
bun.lockb

Binary file not shown.

View file

@ -320,12 +320,13 @@ export const parseTextMentions = async (
author.data.privateKey ?? "", author.data.privateKey ?? "",
author.getUri(), author.getUri(),
); );
const manager = new FederationRequester( const manager = new FederationRequester(signatureConstructor);
new URL(`https://${person?.[2] ?? ""}`),
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); const user = await User.resolve(uri);

View file

@ -51,12 +51,9 @@ export default class FederationUserFetch extends BaseCommand<
requester.data.privateKey ?? "", requester.data.privateKey ?? "",
requester.getUri(), requester.getUri(),
); );
const manager = new FederationRequester( const manager = new FederationRequester(signatureConstructor);
new URL(`https://${host}`),
signatureConstructor,
);
const uri = await User.webFinger(manager, username); const uri = await User.webFinger(manager, username, host);
const newUser = await User.resolve(uri); const newUser = await User.resolve(uri);

View file

@ -51,12 +51,9 @@ export default class FederationUserFinger extends BaseCommand<
requester.data.privateKey ?? "", requester.data.privateKey ?? "",
requester.getUri(), requester.getUri(),
); );
const manager = new FederationRequester( const manager = new FederationRequester(signatureConstructor);
new URL(`https://${host}`),
signatureConstructor,
);
const uri = await User.webFinger(manager, username); const uri = await User.webFinger(manager, username, host);
spinner.succeed("Fetched user URI"); spinner.succeed("Fetched user URI");

View file

@ -106,7 +106,7 @@
"@json2csv/plainjs": "^7.0.6", "@json2csv/plainjs": "^7.0.6",
"@logtape/logtape": "npm:@jsr/logtape__logtape@0.4.2", "@logtape/logtape": "npm:@jsr/logtape__logtape@0.4.2",
"@lysand-org/client": "^0.2.5", "@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", "@oclif/core": "^4.0.14",
"@sentry/bun": "^8.20.0", "@sentry/bun": "^8.20.0",
"@tufjs/canonical-json": "^2.0.0", "@tufjs/canonical-json": "^2.0.0",

View file

@ -140,15 +140,14 @@ export class Instance extends BaseInterface<typeof Instances> {
const logger = getLogger("federation"); const logger = getLogger("federation");
try { try {
const { ok, raw, data } = await FederationRequester.get( const { ok, raw, data } = await new FederationRequester()
wellKnownUrl, .get(wellKnownUrl, {
{
// @ts-expect-error Bun extension // @ts-expect-error Bun extension
proxy: config.http.proxy.address, proxy: config.http.proxy.address,
}, })
).catch((e) => ({ .catch((e) => ({
...(e as ResponseError).response, ...(e as ResponseError).response,
})); }));
if (!(ok && raw.headers.get("content-type")?.includes("json"))) { 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 // 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<typeof Instances> {
raw: response, raw: response,
ok, ok,
data: wellKnown, data: wellKnown,
} = await FederationRequester.get<{ } = await new FederationRequester()
links: { rel: string; href: string }[]; .get<{
}>(wellKnownUrl, { links: { rel: string; href: string }[];
// @ts-expect-error Bun extension }>(wellKnownUrl, {
proxy: config.http.proxy.address, // @ts-expect-error Bun extension
}).catch((e) => ({ proxy: config.http.proxy.address,
...( })
e as ResponseError<{ .catch((e) => ({
links: { rel: string; href: string }[]; ...(
}> e as ResponseError<{
).response, links: { rel: string; href: string }[];
})); }>
).response,
}));
if (!ok) { if (!ok) {
logger.error`Failed to fetch ActivityPub metadata for instance ${chalk.bold( logger.error`Failed to fetch ActivityPub metadata for instance ${chalk.bold(
@ -244,30 +245,32 @@ export class Instance extends BaseInterface<typeof Instances> {
raw: metadataResponse, raw: metadataResponse,
ok: ok2, ok: ok2,
data: metadata, data: metadata,
} = await FederationRequester.get<{ } = await new FederationRequester()
metadata: { .get<{
nodeName?: string; metadata: {
title?: string; nodeName?: string;
nodeDescription?: string; title?: string;
description?: string; nodeDescription?: string;
}; description?: string;
software: { version: string }; };
}>(metadataUrl.href, { software: { version: string };
// @ts-expect-error Bun extension }>(metadataUrl.href, {
proxy: config.http.proxy.address, // @ts-expect-error Bun extension
}).catch((e) => ({ proxy: config.http.proxy.address,
...( })
e as ResponseError<{ .catch((e) => ({
metadata: { ...(
nodeName?: string; e as ResponseError<{
title?: string; metadata: {
nodeDescription?: string; nodeName?: string;
description?: string; title?: string;
}; nodeDescription?: string;
software: { version: string }; description?: string;
}> };
).response, software: { version: string };
})); }>
).response,
}));
if (!ok2) { if (!ok2) {
logger.error`Failed to fetch ActivityPub metadata for instance ${chalk.bold( logger.error`Failed to fetch ActivityPub metadata for instance ${chalk.bold(

View file

@ -592,7 +592,7 @@ export class Note extends BaseInterface<typeof Notes, StatusWithRelations> {
throw new Error(`Invalid URI to parse ${uri}`); 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 // @ts-expect-error Bun extension
proxy: config.http.proxy.address, proxy: config.http.proxy.address,
}); });

View file

@ -201,12 +201,13 @@ export class User extends BaseInterface<typeof Users, UserWithRelations> {
static async webFinger( static async webFinger(
manager: FederationRequester, manager: FederationRequester,
username: string, username: string,
hostname: string,
): Promise<string> { ): Promise<string> {
return ( return (
(await manager.webFinger(username).catch(() => null)) ?? (await manager.webFinger(username, hostname).catch(() => null)) ??
(await manager.webFinger( (await manager.webFinger(
username, username,
manager.url.hostname, hostname,
"application/activity+json", "application/activity+json",
)) ))
); );
@ -340,7 +341,7 @@ export class User extends BaseInterface<typeof Users, UserWithRelations> {
uri: string, uri: string,
instance: Instance, instance: Instance,
): Promise<User> { ): Promise<User> {
const { data: json } = await FederationRequester.get< const { data: json } = await new FederationRequester().get<
Partial<LysandUser> Partial<LysandUser>
>(uri, { >(uri, {
// @ts-expect-error Bun extension // @ts-expect-error Bun extension

View file

@ -89,12 +89,9 @@ export default (app: Hono) =>
requester.data.privateKey ?? "", requester.data.privateKey ?? "",
requester.getUri(), requester.getUri(),
); );
const manager = new FederationRequester( const manager = new FederationRequester(signatureConstructor);
new URL(`https://${domain}`),
signatureConstructor,
);
const uri = await User.webFinger(manager, username); const uri = await User.webFinger(manager, username, domain);
const foundAccount = await User.resolve(uri); const foundAccount = await User.resolve(uri);

View file

@ -100,12 +100,9 @@ export default (app: Hono) =>
requester.data.privateKey ?? "", requester.data.privateKey ?? "",
requester.getUri(), requester.getUri(),
); );
const manager = new FederationRequester( const manager = new FederationRequester(signatureConstructor);
new URL(`https://${host}`),
signatureConstructor,
);
const uri = await User.webFinger(manager, username); const uri = await User.webFinger(manager, username, host);
const resolvedUser = await User.resolve(uri); const resolvedUser = await User.resolve(uri);

View file

@ -139,11 +139,14 @@ export default (app: Hono) =>
requester.getUri(), requester.getUri(),
); );
const manager = new FederationRequester( const manager = new FederationRequester(
new URL(`https://${domain}`),
signatureConstructor, signatureConstructor,
); );
const uri = await User.webFinger(manager, username); const uri = await User.webFinger(
manager,
username,
domain,
);
const newUser = await User.resolve(uri); const newUser = await User.resolve(uri);

View file

@ -90,16 +90,14 @@ export default (app: Hono) =>
requester.getUri(), requester.getUri(),
); );
const manager = new FederationRequester( const manager = new FederationRequester(signatureConstructor);
new URL(config.federation.bridge.url ?? ""),
signatureConstructor,
);
try { try {
activityPubUrl = await manager.webFinger( activityPubUrl = await manager.webFinger(
user.data.username, user.data.username,
new URL(config.http.base_url).host, new URL(config.http.base_url).host,
"application/activity+json", "application/activity+json",
config.federation.bridge.url,
); );
} catch (e) { } catch (e) {
const error = e as ResponseError; const error = e as ResponseError;