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(base:string,path:string,schema:S,message:string,options?:Options):Promise>{ const signal=options?.signal?AbortSignal.any([options.signal,AbortSignal.timeout(30_000)]):AbortSignal.timeout(30_000) signal.throwIfAborted() const parsed=schema.safeParse(await requestJson(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)