summaryrefslogtreecommitdiff
path: root/packages/backend/src/core/WebfingerService.ts
blob: d2a88be5838bf3ce043f7a7df07b80b4de8f4045 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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})`);
	}
}