/** * Configuration schemas using Zod */ import { z } from 'zod'; /** * Device configuration schema */ export const DeviceConfigSchema = z.object({ path: z.string().min(1, 'USB by-path is required'), vendorId: z .string() .regex(/^[0-9a-fA-F]{4}$/, 'Vendor ID must be 4 hex digits') .optional(), productId: z .string() .regex(/^[0-9a-fA-F]{4}$/, 'Product ID must be 4 hex digits') .optional(), serial: z.string().optional(), description: z.string().optional(), }); export type DeviceConfig = z.infer; /** * Server device configuration with access control */ export const ServerDeviceConfigSchema = DeviceConfigSchema.extend({ allowedClients: z.array(z.string()).default([]), }); export type ServerDeviceConfig = z.infer; /** * Server configuration schema */ export const ServerConfigSchema = z.object({ listenAddress: z.string().default('0.0.0.0'), listenPort: z.number().int().min(1).max(65535).default(3241), devices: z.array(ServerDeviceConfigSchema).default([]), logLevel: z.enum(['debug', 'info', 'warn', 'error']).default('info'), logFile: z.string().optional(), }); export type ServerConfig = z.infer; /** * Server connection configuration */ export const ServerConnectionSchema = z.object({ name: z.string().min(1, 'Server name is required'), address: z.string().min(1, 'Server address is required'), port: z.number().int().min(1).max(65535, 'Port must be between 1 and 65535'), devices: z.array(DeviceConfigSchema), }); export type ServerConnection = z.infer; /** * Client configuration schema */ export const ClientConfigSchema = z.object({ clientId: z.string().min(1, 'Client ID is required'), servers: z.array(ServerConnectionSchema).min(1, 'At least one server is required'), logLevel: z.enum(['debug', 'info', 'warn', 'error']).optional().default('info'), logFile: z.string().optional(), }); export type ClientConfig = z.infer;