UNPKG

megalodon

Version:

Fediverse API client for node.js and browser

109 lines (108 loc) 4.2 kB
import axios from 'axios'; import { NodeinfoError } from './megalodon.js'; const NODEINFO_10 = 'http://nodeinfo.diaspora.software/ns/schema/1.0'; const NODEINFO_20 = 'http://nodeinfo.diaspora.software/ns/schema/2.0'; const NODEINFO_21 = 'http://nodeinfo.diaspora.software/ns/schema/2.1'; export const detector = async (url) => { const options = { timeout: 20000 }; const res = await axios.get(url + '/.well-known/nodeinfo', options); const link = res.data.links.find(l => l.rel === NODEINFO_20 || l.rel === NODEINFO_21); if (!link) throw new NodeinfoError('Could not find nodeinfo'); switch (link.rel) { case NODEINFO_10: { const res = await axios.get(link.href, options); switch (res.data.software.name) { case 'akkoma': return 'pleroma'; case 'firefish': return 'firefish'; case 'friendica': return 'friendica'; case 'gotosocial': return 'gotosocial'; case 'hometown': return 'mastodon'; case 'iceshrimp': return 'firefish'; case 'mastodon': return 'mastodon'; case 'pixelfed': return 'pixelfed'; case 'pleroma': return 'pleroma'; case 'sharkey': return 'mastodon'; default: if (res.data.metadata.upstream?.name && res.data.metadata.upstream.name.toLowerCase() === 'mastodon') { return 'mastodon'; } throw new NodeinfoError('Unknown SNS'); } } case NODEINFO_20: { const res = await axios.get(link.href, options); switch (res.data.software.name) { case 'akkoma': return 'pleroma'; case 'firefish': return 'firefish'; case 'friendica': return 'friendica'; case 'gotosocial': return 'gotosocial'; case 'hometown': return 'mastodon'; case 'iceshrimp': return 'firefish'; case 'mastodon': return 'mastodon'; case 'pixelfed': return 'pixelfed'; case 'pleroma': return 'pleroma'; case 'sharkey': return 'mastodon'; default: if (res.data.metadata.upstream?.name && res.data.metadata.upstream.name.toLowerCase() === 'mastodon') { return 'mastodon'; } throw new NodeinfoError('Unknown SNS'); } } case NODEINFO_21: { const res = await axios.get(link.href, options); switch (res.data.software.name) { case 'akkoma': return 'pleroma'; case 'firefish': return 'firefish'; case 'friendica': return 'friendica'; case 'gotosocial': return 'gotosocial'; case 'hometown': return 'mastodon'; case 'iceshrimp': return 'firefish'; case 'mastodon': return 'mastodon'; case 'pixelfed': return 'pixelfed'; case 'pleroma': return 'pleroma'; case 'sharkey': return 'mastodon'; default: if (res.data.metadata.upstream?.name && res.data.metadata.upstream.name.toLowerCase() === 'mastodon') { return 'mastodon'; } throw new NodeinfoError('Unknown SNS'); } } default: throw new NodeinfoError('Could not find nodeinfo'); } };