import { z } from "zod"; export const ttnMessageValidator = z.object({ end_device_ids: z.object({ device_id: z.string(), application_ids: z.object({ application_id: z.string(), }), dev_eui: z.string(), join_eui: z.string(), dev_addr: z.string().optional(), }), correlation_ids: z.array(z.string()), received_at: z.string(), uplink_message: z.object({ session_key_id: z.string().optional(), f_port: z.number().optional(), f_cnt: z.number().optional(), frm_payload: z.string().optional(), decoded_payload: z .object({ err: z.number(), messages: z.array( z.array( z.object({ measurementId: z.string(), measurementValue: z.union([z.array(z.any()), z.number()]), motionId: z.number().optional(), timestamp: z.number().optional(), type: z.string(), }) ) ), payload: z.string(), valid: z.boolean(), }) .optional(), rx_metadata: z.array( z.object({ gateway_ids: z.object({ gateway_id: z.string(), eui: z.string().optional(), }), time: z.string().optional(), timestamp: z.number().optional(), rssi: z.number(), channel_rssi: z.number(), snr: z.number().optional(), location: z .object({ latitude: z.number(), longitude: z.number(), altitude: z.number().optional(), source: z.string().optional(), }) .optional(), uplink_token: z.string().optional(), channel_index: z.number().optional(), received_at: z.string().optional(), }) ), settings: z.object({ data_rate: z.object({ lora: z.object({ bandwidth: z.number(), spreading_factor: z.number(), coding_rate: z.string().optional(), }), }), frequency: z.string(), timestamp: z.number().optional(), time: z.string().optional(), }), received_at: z.string().optional(), confirmed: z.boolean().optional(), consumed_airtime: z.string().optional(), version_ids: z .object({ brand_id: z.string(), model_id: z.string(), hardware_version: z.string(), firmware_version: z.string(), band_id: z.string(), }) .optional(), network_ids: z .object({ net_id: z.string(), ns_id: z.string(), tenant_id: z.string(), cluster_id: z.string(), cluster_address: z.string(), }) .optional(), }), });