Files

18 lines
1.7 KiB
TypeScript

import {z} from "zod"
import {requestJson} from "./http-client"
const bgpSchema=z.array(z.object({serverName:z.string().trim().min(1),name:z.string().trim().min(1)}))
const serversSchema=z.array(z.object({id:z.number().int().positive(),name:z.string(),site:z.string().optional(),country:z.string().optional(),host:z.string().optional()}))
const greSchema=z.object({tunnels:z.array(z.object({id:z.string().optional(),name:z.string(),serverId:z.string().min(1),remoteAddress:z.string().optional(),status:z.string().optional(),comment:z.string().optional()})),failures:z.array(z.object({serverId:z.string().min(1),serverName:z.string(),error:z.string()})).optional()})
type Options={signal?:AbortSignal}
async function read<S extends z.ZodType>(base:string,path:string,schema:S,message:string,options?:Options):Promise<z.output<S>>{
const signal=options?.signal?AbortSignal.any([options.signal,AbortSignal.timeout(30_000)]):AbortSignal.timeout(30_000)
signal.throwIfAborted()
const parsed=schema.safeParse(await requestJson<unknown>(base,path,{signal,cache:"no-store"}))
signal.throwIfAborted()
if(!parsed.success)throw Error(message)
return parsed.data
}
export const getAlertsBgpTargets=(base:string,options?:Options)=>read(base,"/api/bgp/sessions",bgpSchema,"Каталог BGP для оповещений не подтверждён",options)
export const getAlertsServerTargets=(base:string,options?:Options)=>read(base,"/api/servers",serversSchema,"Каталог серверов для оповещений не подтверждён",options)
export const getAlertsGreTargets=(base:string,options?:Options)=>read(base,"/api/filters/gre-tunnels",greSchema,"Каталог GRE для оповещений не подтверждён",options)