summaryrefslogtreecommitdiff
path: root/packages/backend/src/services/register-or-fetch-instance-doc.ts
blob: df7d125d0b0f98399f94824f5f705a1989491c70 (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
import { Instance } from '@/models/entities/instance.js';
import { Instances } from '@/models/index.js';
import { genId } from '@/misc/gen-id.js';
import { toPuny } from '@/misc/convert-host.js';
import { Cache } from '@/misc/cache.js';

const cache = new Cache<Instance>(1000 * 60 * 60);

export async function registerOrFetchInstanceDoc(host: string): Promise<Instance> {
	host = toPuny(host);

	const cached = cache.get(host);
	if (cached) return cached;

	const index = await Instances.findOneBy({ host });

	if (index == null) {
		const i = await Instances.insert({
			id: genId(),
			host,
			caughtAt: new Date(),
			lastCommunicatedAt: new Date(),
		}).then(x => Instances.findOneByOrFail(x.identifiers[0]));

		cache.set(host, i);
		return i;
	} else {
		cache.set(host, index);
		return index;
	}
}