fix(api): показывать ошибки строгого OSPF-каталога

This commit is contained in:
Denozordec committed 2026-09-30 17:27:44 +07:00
1 parent 72a63b4a4f
commit a89cefcbf2
6 files changed
+92 -4

No files matched your search

+29
View File
@@ -0,0 +1,29 @@
import type { MikrotikClient } from "./mikrotik.js"
import type { OspfNeighborRead, OspfInterfaceRead, OspfInstanceRead, BfdSessionRead, OspfRouteRead } from "../types/server.js"
export interface OspfCatalogCollections {
neighbors: OspfNeighborRead[]; interfaces: OspfInterfaceRead[]; instances: OspfInstanceRead[];
bfdSessions: BfdSessionRead[]; routes: OspfRouteRead[];
}
export const emptyOspfCatalog = (): OspfCatalogCollections => ({ neighbors: [], interfaces: [], instances: [], bfdSessions: [], routes: [] })
export async function readOspfCatalogRaw(client: Pick<MikrotikClient, "getOspfNeighbors" | "getOspfAreas" | "getOspfInterfaceTemplates" | "getOspfInstances" | "getBfdSessions" | "getIpRoutes">) {
const [neighbors, areas, ifaceTemplates, instances, bfdSessions, ipRoutes] = await Promise.all([
client.getOspfNeighbors(), client.getOspfAreas(), client.getOspfInterfaceTemplates(), client.getOspfInstances(), client.getBfdSessions(), client.getIpRoutes(),
])
if ([neighbors, areas, ifaceTemplates, instances, bfdSessions, ipRoutes].some(rows => !Array.isArray(rows))) throw new Error("Некорректный ответ RouterOS OSPF")
return { neighbors, areas, ifaceTemplates, instances, bfdSessions, ipRoutes }
}
export async function pollOspfCatalog<S extends { id: number; name: string }>(devices: readonly S[], read: (device: S) => Promise<OspfCatalogCollections>) {
const results = await Promise.all(devices.map(async device => {
try {
const collections = await read(device)
for (const rows of Object.values(collections)) {
if (!Array.isArray(rows) || rows.some(row => row.serverId !== device.id || typeof row.id !== "string" || !row.id.trim())) throw new Error("Некорректный контекст OSPF-каталога")
if (new Set(rows.map(row => row.id)).size !== rows.length) throw new Error("Повторяющиеся ID OSPF-каталога")
}
return { ...collections, failures: [] }
} catch (error) {
return { ...emptyOspfCatalog(), failures: [{ serverId: device.id, serverName: device.name, error: error instanceof Error ? error.message : "Ошибка опроса OSPF" }] }
}
}))
return { neighbors: results.flatMap(r => r.neighbors), interfaces: results.flatMap(r => r.interfaces), instances: results.flatMap(r => r.instances), bfdSessions: results.flatMap(r => r.bfdSessions), routes: results.flatMap(r => r.routes), failures: results.flatMap(r => r.failures) }
}