fedicrawl/application/src/Fediverse/NodeInfo/retrieveNodeInfo.ts

38 wiersze
1.1 KiB
TypeScript
Czysty Zwykły widok Historia

2021-12-23 14:14:06 +00:00
import { z } from 'zod'
import { assertSuccessJsonResponse } from '../assertSuccessJsonResponse'
2022-11-29 13:11:27 +00:00
import getTimeoutMilliseconds from '../getTimeoutMilliseconds.js'
2022-11-22 15:37:11 +00:00
import RobotsTxt from '../RobotsTxt/RobotsTxt.js'
2021-12-23 14:14:06 +00:00
const schema = z.object({
2022-09-14 19:16:04 +00:00
name: z.string().optional(),
2021-12-23 14:14:06 +00:00
software: z.object({
name: z.string(),
version: z.string()
}),
2022-09-18 11:32:25 +00:00
protocols: z.array(z.string()),
usage: z.optional(
z.object({
users: z.optional(
z.object({
total: z.optional(z.number()),
activeMonth: z.optional(z.number()),
activeHalfyear: z.optional(z.number())
})
),
localPosts: z.optional(z.number())
})
2021-12-23 14:14:06 +00:00
),
openRegistrations: z.optional(z.boolean())
})
export type NodeInfo = z.infer<typeof schema>
2022-11-29 13:11:27 +00:00
export const retrieveNodeInfo = async (url: URL, robotsTxt: RobotsTxt): Promise<NodeInfo> => {
2022-09-18 11:32:25 +00:00
console.info('Retrieving node info', { url })
2022-11-22 15:37:11 +00:00
const nodeInfoResponse = await robotsTxt.getIfAllowed(url, {
2022-11-29 13:11:27 +00:00
timeout: getTimeoutMilliseconds(url.hostname)
})
2021-12-23 14:14:06 +00:00
assertSuccessJsonResponse(nodeInfoResponse)
return schema.parse(nodeInfoResponse.data)
}