18 lines
1.4 KiB
TypeScript
18 lines
1.4 KiB
TypeScript
/** Unknown or partial results are omitted from the API, never represented as zero. */
|
|
export async function boundedCompleteCount<T>(read:()=>Promise<T>,select:(value:T)=>number|undefined,timeoutMs=8000):Promise<number|undefined>{
|
|
let timer:ReturnType<typeof setTimeout>|undefined
|
|
try{return await Promise.race([Promise.resolve().then(read).then(select).then(value=>typeof value==="number"&&Number.isSafeInteger(value)&&value>=0?value:undefined).catch(()=>undefined),new Promise<undefined>(resolve=>{timer=setTimeout(()=>resolve(undefined),timeoutMs)})])}finally{if(timer!==undefined)clearTimeout(timer)}
|
|
}
|
|
export function completeCollectionCount(raw:unknown,key:string):number|undefined{
|
|
if(typeof raw!=="object"||raw===null)return undefined
|
|
const value=raw as Record<string,unknown>
|
|
if(!Array.isArray(value.failures)||value.failures.length||!Array.isArray(value[key]))return undefined
|
|
return value[key].length
|
|
}
|
|
export function completeContainerCount(raw:unknown):number|undefined{
|
|
if(typeof raw!=="object"||raw===null||!("servers" in raw)||!Array.isArray(raw.servers))return undefined
|
|
let count=0
|
|
for(const row of raw.servers){if(typeof row!=="object"||row===null||row.availability!=="available"||!Array.isArray(row.containers)||!Array.isArray(row.failures)||row.failures.some((failure:unknown)=>typeof failure!=="object"||failure===null||!("resource" in failure)||failure.resource==="containers"))return undefined;count+=row.containers.length}
|
|
return count
|
|
}
|