sharkey/src/server/nodeinfo.ts

74 lines
2.2 KiB
TypeScript
Raw Normal View History

import * as Router from 'koa-router';
import config from '../config';
import fetchMeta from '../misc/fetch-meta';
import User from '../models/user';
import { name as softwareName, version, repository } from '../../package.json';
import Note from '../models/note';
const router = new Router();
const nodeinfo2_1path = '/nodeinfo/2.1';
const nodeinfo2_0path = '/nodeinfo/2.0';
export const links = [/* (awaiting release) {
rel: 'http://nodeinfo.diaspora.software/ns/schema/2.1',
href: config.url + nodeinfo2_1path
}, */{
rel: 'http://nodeinfo.diaspora.software/ns/schema/2.0',
href: config.url + nodeinfo2_0path
}];
const nodeinfo2 = async () => {
const [
{ name, description, maintainer, langs, broadcasts, disableRegistration, disableLocalTimeline, disableGlobalTimeline, enableRecaptcha, maxNoteTextLength, enableTwitterIntegration, enableGithubIntegration, enableDiscordIntegration, enableEmail, enableServiceWorker },
total,
activeHalfyear,
activeMonth,
localPosts,
localComments
] = await Promise.all([
fetchMeta(),
User.count({ host: null }),
User.count({ host: null, updatedAt: { $gt: new Date(Date.now() - 15552000000) } }),
User.count({ host: null, updatedAt: { $gt: new Date(Date.now() - 2592000000) } }),
Note.count({ '_user.host': null, replyId: null }),
Note.count({ '_user.host': null, replyId: { $ne: null } })
]);
return {
software: {
name: softwareName,
version,
repository: repository.url
},
protocols: ['activitypub'],
services: {
inbound: [] as string[],
outbound: ['atom1.0', 'rss2.0']
},
openRegistrations: !disableRegistration,
usage: {
users: { total, activeHalfyear, activeMonth },
localPosts,
localComments
},
metadata: { name, description, maintainer, langs, broadcasts, disableRegistration, disableLocalTimeline, disableGlobalTimeline, enableRecaptcha, maxNoteTextLength, enableTwitterIntegration, enableGithubIntegration, enableDiscordIntegration, enableEmail, enableServiceWorker }
};
};
router.get(nodeinfo2_1path, async ctx => {
const base = await nodeinfo2();
ctx.body = { version: '2.1', ...base };
});
router.get(nodeinfo2_0path, async ctx => {
const base = await nodeinfo2();
delete base.software.repository;
ctx.body = { version: '2.0', ...base };
});
export default router;