import type { ErrorObject } from "ajv"; import type { RespondFn } from "./types.js"; import { ErrorCodes, errorShape, formatValidationErrors } from "../protocol/index.js"; import { formatForLog } from "../ws-log.js"; type ValidatorFn = ((value: unknown) => boolean) & { errors?: ErrorObject[] | null; }; export function respondInvalidParams(params: { respond: RespondFn; method: string; validator: ValidatorFn; }) { params.respond( false, undefined, errorShape( ErrorCodes.INVALID_REQUEST, `invalid ${params.method} params: ${formatValidationErrors(params.validator.errors)}`, ), ); } export async function respondUnavailableOnThrow(respond: RespondFn, fn: () => Promise) { try { await fn(); } catch (err) { respond(false, undefined, errorShape(ErrorCodes.UNAVAILABLE, formatForLog(err))); } } export function uniqueSortedStrings(values: unknown[]) { return [...new Set(values.filter((v) => typeof v === "string"))] .map((v) => v.trim()) .filter(Boolean) .toSorted(); } export function safeParseJson(value: string | null | undefined): unknown { if (typeof value !== "string") { return undefined; } const trimmed = value.trim(); if (!trimmed) { return undefined; } try { return JSON.parse(trimmed) as unknown; } catch { return { payloadJSON: value }; } }