import {z} from 'zod' export type GetApiRadarAs112SummaryDimensionArgs = {dimension: 'DNSSEC' | 'EDNS' | 'IP_VERSION' | 'PROTOCOL' | 'QUERY_TYPE' | 'RESPONSE_CODE', name?: Array | undefined, dateRange?: Array | undefined, dateStart?: Array | undefined, dateEnd?: Array | undefined, location?: Array | undefined, continent?: Array | undefined, queryType?: (Array<'A' | 'AAAA' | 'A6' | 'AFSDB' | 'ANY' | 'APL' | 'ATMA' | 'AXFR' | 'CAA' | 'CDNSKEY' | 'CDS' | 'CERT' | 'CNAME' | 'CSYNC' | 'DHCID' | 'DLV' | 'DNAME' | 'DNSKEY' | 'DOA' | 'DS' | 'EID' | 'EUI48' | 'EUI64' | 'GPOS' | 'GID' | 'HINFO' | 'HIP' | 'HTTPS' | 'IPSECKEY' | 'ISDN' | 'IXFR' | 'KEY' | 'KX' | 'L32' | 'L64' | 'LOC' | 'LP' | 'MAILA' | 'MAILB' | 'MB' | 'MD' | 'MF' | 'MG' | 'MINFO' | 'MR' | 'MX' | 'NAPTR' | 'NB' | 'NBSTAT' | 'NID' | 'NIMLOC' | 'NINFO' | 'NS' | 'NSAP' | 'NSEC' | 'NSEC3' | 'NSEC3PARAM' | 'NULL' | 'NXT' | 'OPENPGPKEY' | 'OPT' | 'PTR' | 'PX' | 'RKEY' | 'RP' | 'RRSIG' | 'RT' | 'SIG' | 'SINK' | 'SMIMEA' | 'SOA' | 'SPF' | 'SRV' | 'SSHFP' | 'SVCB' | 'TA' | 'TALINK' | 'TKEY' | 'TLSA' | 'TSIG' | 'TXT' | 'UINFO' | 'UID' | 'UNSPEC' | 'URI' | 'WKS' | 'X25' | 'ZONEMD' | null>) | undefined, protocol?: (Array<'UDP' | 'TCP' | 'HTTPS' | 'TLS'>) | undefined, responseCode?: (Array<'NOERROR' | 'FORMERR' | 'SERVFAIL' | 'NXDOMAIN' | 'NOTIMP' | 'REFUSED' | 'YXDOMAIN' | 'YXRRSET' | 'NXRRSET' | 'NOTAUTH' | 'NOTZONE' | 'BADSIG' | 'BADKEY' | 'BADTIME' | 'BADMODE' | 'BADNAME' | 'BADALG' | 'BADTRUNC' | 'BADCOOKIE'>) | undefined, limitPerGroup?: number | undefined, format?: ('JSON' | 'CSV') | undefined}; export type GetApiRadarAs112SummaryDimensionOptions = {baseUrl?: string | undefined, apiEmail?: string | undefined, apiKey?: string | undefined, apiToken?: string | undefined, fetch?: typeof fetch | undefined}; export const getApiRadarAs112SummaryDimensionResponse = z.object({result: z.object({meta: z.object({confidenceInfo: z.object({annotations: z.array(z.object({dataSource: z.enum(["ALL", "AI_BOTS", "AI_GATEWAY", "BGP", "BOTS", "CONNECTION_ANOMALY", "CT", "DNS", "DNS_MAGNITUDE", "DNS_AS112", "DOS", "EMAIL_ROUTING", "EMAIL_SECURITY", "FW", "FW_PG", "HTTP", "HTTP_CONTROL", "HTTP_CRAWLER_REFERER", "HTTP_ORIGINS", "IQI", "LEAKED_CREDENTIALS", "NET", "ROBOTS_TXT", "SPEED", "WORKERS_AI"]), description: z.string(), endDate: z.string(), eventType: z.enum(["GENERAL", "OUTAGE", "PARTIAL_PROJECTION", "PIPELINE", "TRAFFIC_ANOMALY"]), isInstantaneous: z.boolean(), linkedUrl: z.string(), startDate: z.string(), tags: z.array(z.string()).optional()})), level: z.number().int()}), dateRange: z.array(z.object({endTime: z.string(), startTime: z.string()})), lastUpdated: z.string(), normalization: z.enum(["PERCENTAGE", "MIN0_MAX", "MIN_MAX", "RAW_VALUES", "PERCENTAGE_CHANGE", "ROLLING_AVERAGE", "OVERLAPPED_PERCENTAGE", "RATIO"]), units: z.array(z.object({name: z.string(), value: z.string()}))}), summary_0: z.record(z.string(), z.string())}), success: z.boolean()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Get AS112 summary by dimension * * GET /radar/as112/summary/{dimension} */ export const getApiRadarAs112SummaryDimension = async (args: GetApiRadarAs112SummaryDimensionArgs, options?: GetApiRadarAs112SummaryDimensionOptions) => { const {baseUrl = "https://api.cloudflare.com/client/v4", fetch: fetchFn = fetch, apiEmail, apiKey, apiToken} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") for (const item of args.name ?? []) query.append("name", String(item)) for (const item of args.dateRange ?? []) query.append("dateRange", String(item)) for (const item of args.dateStart ?? []) query.append("dateStart", String(item)) for (const item of args.dateEnd ?? []) query.append("dateEnd", String(item)) for (const item of args.location ?? []) query.append("location", String(item)) for (const item of args.continent ?? []) query.append("continent", String(item)) for (const item of args.queryType ?? []) query.append("queryType", String(item)) for (const item of args.protocol ?? []) query.append("protocol", String(item)) for (const item of args.responseCode ?? []) query.append("responseCode", String(item)) if (args.limitPerGroup != null) query.append("limitPerGroup", String(args.limitPerGroup)) if (args.format != null) query.append("format", String(args.format)) if (apiEmail !== undefined) headers.set("X-Auth-Email", apiEmail) if (apiKey !== undefined) headers.set("X-Auth-Key", apiKey) if (apiToken !== undefined) headers.set('authorization', `Bearer ${apiToken}`) const url = `${baseUrl.replace(/\/+$/, '')}/radar/as112/summary/${encodeURIComponent(String(args.dimension))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(getApiRadarAs112SummaryDimensionResponse, await res.json()) };