15 lines
902 B
TypeScript
15 lines
902 B
TypeScript
export async function pollGreCatalog<S extends { id: number; name: string }, T extends { serverId: string }>(
|
|
devices: readonly S[], read: (device: S) => Promise<{ tunnels: T[] }>,
|
|
): Promise<{ tunnels: T[]; failures: Array<{ serverId: string; serverName: string; error: string }> }> {
|
|
const results = await Promise.all(devices.map(async device => {
|
|
try {
|
|
const { tunnels } = await read(device)
|
|
if (!Array.isArray(tunnels) || tunnels.some(t => t.serverId !== String(device.id))) throw new Error("Чужой контекст GRE-каталога")
|
|
return { tunnels, failures: [] }
|
|
} catch (error) {
|
|
return { tunnels: [], failures: [{ serverId: String(device.id), serverName: device.name, error: error instanceof Error ? error.message : String(error) }] }
|
|
}
|
|
}))
|
|
return { tunnels: results.flatMap(r => r.tunnels), failures: results.flatMap(r => r.failures) }
|
|
}
|