25 lines
1.7 KiB
TypeScript
25 lines
1.7 KiB
TypeScript
import {z} from "zod"
|
|
export const terminalServersSchema=z.array(z.object({
|
|
id:z.number().int().positive(),name:z.string(),host:z.string().min(1),country:z.string(),enabled:z.boolean(),
|
|
status:z.enum(["online","offline","degraded"]).nullable(),os:z.string().nullable().optional(),identityName:z.string().nullable().optional(),
|
|
})).refine(rows=>new Set(rows.map(row=>row.id)).size===rows.length)
|
|
const response=z.object({output:z.string().max(1024*1024)}).strict()
|
|
export function readTerminalOutput(raw:unknown) {
|
|
const data=response.safeParse(raw)
|
|
if(!data.success)throw new Error("Некорректный ответ API: вывод команды не подтверждён.")
|
|
if(/^(error:|bad command name |Usage:)/i.test(data.data.output))throw new Error(data.data.output)
|
|
return data.data.output
|
|
}
|
|
export function readTerminalUrl(params:URLSearchParams) {
|
|
const server=params.get("server"),host=params.get("host")
|
|
const error=["server","host"].some(key=>params.getAll(key).length>1)?"В ссылке повторяется устройство терминала."
|
|
:server!==null&&host!==null?"В ссылке одновременно указаны server и host."
|
|
:server!==null&&!/^[a-zA-Z0-9_.:-]{1,64}$/.test(server)?"В ссылке указан некорректный сервер."
|
|
:host!==null&&(!host.trim()||host.length>256||/[\u0000-\u001f]/.test(host))?"В ссылке указан некорректный host.":null
|
|
return {server,host,error}
|
|
}
|
|
export function patchTerminalUrl(params:URLSearchParams,server:string|null){
|
|
const next=new URLSearchParams(params);next.delete("server");next.delete("host");if(server)next.set("server",server)
|
|
return "/terminal"+(next.size?"?"+next.toString():"")
|
|
}
|