import { z } from "zod"; export const jobTypes = ["http", "tcp", "imcp", "udp", "dns", "ssl"] as const; export const jobTypeEnum = z.enum(jobTypes); export type JobType = z.infer; export const periods = ["1h", "1d", "3d", "7d", "14d", "45d"] as const; export const periodEnum = z.enum(periods); export type Period = z.infer; export const triggers = ["cron", "api"] as const; export const triggerEnum = z.enum(triggers); export type Trigger = z.infer; export const headersSchema = z .string() .nullable() .optional() .transform((val) => { if (!val) return null; const value = z.record(z.string(), z.string()).safeParse(JSON.parse(val)); if (value.success) return value.data; return null; }); export const httpTimingSchema = z.object({ dnsStart: z.number(), dnsDone: z.number(), connectStart: z.number(), connectDone: z.number(), tlsHandshakeStart: z.number(), tlsHandshakeDone: z.number(), firstByteStart: z.number(), firstByteDone: z.number(), transferStart: z.number(), transferDone: z.number(), }); export function transformTiming(val: string) { if (!val) return null; const value = httpTimingSchema.safeParse(JSON.parse(val)); if (value.success) return value.data; return null; } export function calculateTiming(obj: z.infer) { if (!obj) return null; return { dns: obj.dnsDone - obj.dnsStart, connect: obj.connectDone - obj.connectStart, tls: obj.tlsHandshakeDone - obj.tlsHandshakeStart, ttfb: obj.firstByteDone - obj.firstByteStart, transfer: obj.transferDone - obj.transferStart, }; } export const timingSchema = z .string() .nullable() .optional() .transform((val) => { if (!val) return null; const value = httpTimingSchema.safeParse(JSON.parse(val)); if (value.success) return value.data; return null; }); export const timingPhasesSchema = z .string() .nullable() .optional() .transform((val) => { if (!val) return null; const value = httpTimingSchema.safeParse(JSON.parse(val)); if (value.success) return calculateTiming(value.data); return null; });