fix(api): изолировать ошибки создания клиента устройства

This commit is contained in:
Denozordec committed 2026-10-01 11:26:22 +07:00
1 parent c7b4981dff
commit f99612f6aa
7 files changed
+55 -3

No files matched your search

@@ -22,3 +22,5 @@ assert.equal(partial.servers[0].certificates.length,1);assert.equal(partial.serv
for(const value of [{...partial,servers:[partial.servers[0],partial.servers[0]]},{...partial,servers:[{...partial.servers[0],serverId:"2"}]},{...partial,servers:[{...partial.servers[0],error:"failure"}]}])assert.equal(certificatesStateSchema.safeParse(value).success,false)
assert.equal(certificateObservedSchema.safeParse({...good,validUntil:null}).success,false)
console.log("Certificate observed: unknown/date timezone/invalid calendar, flags, key size, known empty, malformed/duplicate/context, partial devices; no DB/RouterOS")
const setupFailure=await collectCertificatesState([server,{id:2,name:"bad client"}],srv=>{if(srv.id===2)throw new Error("client setup refused");return async()=>[raw]});assert.equal(setupFailure.servers[0].certificates.length,1);assert.equal(setupFailure.servers[1].error,"client setup refused")
+1 -1
View File
@@ -36,6 +36,6 @@ export async function readCertificateServerState(server:ServerContext,read:()=>P
}
}
export async function collectCertificatesState<T extends ServerContext>(servers:T[],makeReader:(server:T)=>()=>Promise<unknown>):Promise<CertificatesState>{
const states=await Promise.all(servers.map(server=>readCertificateServerState(server,makeReader(server))))
const states=await Promise.all(servers.map(server=>readCertificateServerState(server,()=>makeReader(server)())))
return certificatesStateSchema.parse({collectedAt:new Date().toISOString(),servers:states})
}
@@ -35,3 +35,6 @@ console.log("Containers state: independent devices, malformed/duplicate IDs, unk
const limitOnly=await readContainerServerState(server,async path=>path==="/container"?[{".id":"*C","memory-high":"52428800"}]:[]);assert.equal(limitOnly.containers[0].memMb,undefined)
const modern=await readContainerServerState(server,async path=>path==="/container"?[{...row,envlist:"e,e2",mounts:undefined,mountlists:"m"}]:path==="/container/envs"?[{list:"e",key:"A",value:"1"},{list:"e2",key:"B",value:"2"}]:[{list:"m",src:"/disk",dst:"/data"}]);assert.equal(modern.containers[0].envs.length,2);assert.equal(modern.containers[0].mounts.length,1)
let factories=0
const setupFailure=await collectContainersState([server,{...server,id:2}],srv=>{if(srv.id===2)throw new Error("client setup refused");factories++;return read});assert.equal(setupFailure.servers[0].containers.length,1);assert.equal(setupFailure.servers[1].availability,"error");assert.equal(setupFailure.servers[1].failures[0].error,"client setup refused");assert.equal(factories,1)
+4 -1
View File
@@ -53,6 +53,9 @@ export async function readContainerServerState(server: ServerRow, read: Reader):
return containerServerStateSchema.parse({ serverId: server.id, collectedAt, availability: "available", containers, failures })
}
export async function collectContainersState(servers: ServerRow[], makeReader: (server: ServerRow) => Reader): Promise<ContainersState> {
const states = await Promise.all(servers.map(server => readContainerServerState(server, makeReader(server))))
const states = await Promise.all(servers.map(server => {
let reader: Reader | undefined
return readContainerServerState(server, path => { reader ??= makeReader(server); return reader(path) })
}))
return containersStateSchema.parse({ collectedAt: new Date().toISOString(), servers: states })
}