summaryrefslogtreecommitdiff
path: root/packages/backend/src/core/WebfingerService.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/backend/src/core/WebfingerService.ts')
-rw-r--r--packages/backend/src/core/WebfingerService.ts48
1 files changed, 48 insertions, 0 deletions
diff --git a/packages/backend/src/core/WebfingerService.ts b/packages/backend/src/core/WebfingerService.ts
new file mode 100644
index 0000000000..d2a88be583
--- /dev/null
+++ b/packages/backend/src/core/WebfingerService.ts
@@ -0,0 +1,48 @@
+import { URL } from 'node:url';
+import { Inject, Injectable } from '@nestjs/common';
+import { DI } from '@/di-symbols.js';
+import type { Config } from '@/config.js';
+import { query as urlQuery } from '@/misc/prelude/url.js';
+import { HttpRequestService } from '@/core/HttpRequestService.js';
+
+type ILink = {
+ href: string;
+ rel?: string;
+};
+
+type IWebFinger = {
+ links: ILink[];
+ subject: string;
+};
+
+@Injectable()
+export class WebfingerService {
+ constructor(
+ @Inject(DI.config)
+ private config: Config,
+
+ private httpRequestService: HttpRequestService,
+ ) {
+ }
+
+ public async webfinger(query: string): Promise<IWebFinger> {
+ const url = this.genUrl(query);
+
+ return await this.httpRequestService.getJson(url, 'application/jrd+json, application/json') as IWebFinger;
+ }
+
+ private genUrl(query: string): string {
+ if (query.match(/^https?:\/\//)) {
+ const u = new URL(query);
+ return `${u.protocol}//${u.hostname}/.well-known/webfinger?` + urlQuery({ resource: query });
+ }
+
+ const m = query.match(/^([^@]+)@(.*)/);
+ if (m) {
+ const hostname = m[2];
+ return `https://${hostname}/.well-known/webfinger?` + urlQuery({ resource: `acct:${query}` });
+ }
+
+ throw new Error(`Invalid query (${query})`);
+ }
+}