import {z} from 'zod' export type ATMForwardCustomSpectrum = {energy: Array, flux: Array}; export type SrcAtmV1SchemasForwardATMForwardRequestOutputFlags = {height_integrated_rayleighs_4278?: boolean | undefined, height_integrated_rayleighs_5577?: boolean | undefined, height_integrated_rayleighs_6300?: boolean | undefined, height_integrated_rayleighs_8446?: boolean | undefined, height_integrated_rayleighs_lbh?: boolean | undefined, height_integrated_rayleighs_1304?: boolean | undefined, height_integrated_rayleighs_1356?: boolean | undefined, altitudes?: boolean | undefined, emission_4278?: boolean | undefined, emission_5577?: boolean | undefined, emission_6300?: boolean | undefined, emission_8446?: boolean | undefined, emission_lbh?: boolean | undefined, emission_1304?: boolean | undefined, emission_1356?: boolean | undefined, plasma_electron_density?: boolean | undefined, plasma_o2plus_density?: boolean | undefined, plasma_oplus_density?: boolean | undefined, plasma_noplus_density?: boolean | undefined, plasma_ionisation_rate?: boolean | undefined, plasma_electron_temperature?: boolean | undefined, plasma_ion_temperature?: boolean | undefined, plasma_pederson_conductivity?: boolean | undefined, plasma_hall_conductivity?: boolean | undefined, neutral_o2_density?: boolean | undefined, neutral_o_density?: boolean | undefined, neutral_n2_density?: boolean | undefined, neutral_n_density?: boolean | undefined, neutral_temperature?: boolean | undefined}; export type SrcAtmV1SchemasForwardATMForwardRequest = {atm_model_version?: '1.0' | undefined, timestamp: string, geodetic_latitude: number, geodetic_longitude: number, maxwellian_energy_flux?: number | undefined, gaussian_energy_flux?: number | undefined, maxwellian_characteristic_energy?: number | undefined, gaussian_peak_energy?: number | undefined, gaussian_spectral_width?: number | undefined, nrlmsis_model_version?: ('00' | '2.0') | undefined, oxygen_correction_factor?: number | undefined, timescale_auroral?: number | undefined, timescale_transport?: number | undefined, custom_spectrum?: ATMForwardCustomSpectrum | undefined, output?: SrcAtmV1SchemasForwardATMForwardRequestOutputFlags | undefined, no_cache?: boolean | undefined}; export type CreateApiApiV1AtmForwardArgs = {body: SrcAtmV1SchemasForwardATMForwardRequest}; export type CreateApiApiV1AtmForwardOptions = {baseUrl: string, fetch?: typeof fetch | undefined}; export const srcAtmV1SchemasForwardATMForwardResponseData = z.object({height_integrated_rayleighs_4278: z.number().optional(), height_integrated_rayleighs_5577: z.number().optional(), height_integrated_rayleighs_6300: z.number().optional(), height_integrated_rayleighs_8446: z.number().optional(), height_integrated_rayleighs_lbh: z.number().optional(), height_integrated_rayleighs_1304: z.number().optional(), height_integrated_rayleighs_1356: z.number().optional(), altitudes: z.array(z.unknown()).optional(), emission_4278: z.array(z.unknown()).optional(), emission_5577: z.array(z.unknown()).optional(), emission_6300: z.array(z.unknown()).optional(), emission_8446: z.array(z.unknown()).optional(), emission_lbh: z.array(z.unknown()).optional(), emission_1304: z.array(z.unknown()).optional(), emission_1356: z.array(z.unknown()).optional(), plasma_electron_density: z.array(z.unknown()).optional(), plasma_o2plus_density: z.array(z.unknown()).optional(), plasma_noplus_density: z.array(z.unknown()).optional(), plasma_oplus_density: z.array(z.unknown()).optional(), plasma_ionisation_rate: z.array(z.unknown()).optional(), plasma_electron_temperature: z.array(z.unknown()).optional(), plasma_ion_temperature: z.array(z.unknown()).optional(), plasma_pederson_conductivity: z.array(z.unknown()).optional(), plasma_hall_conductivity: z.array(z.unknown()).optional(), neutral_o2_density: z.array(z.unknown()).optional(), neutral_o_density: z.array(z.unknown()).optional(), neutral_n2_density: z.array(z.unknown()).optional(), neutral_n_density: z.array(z.unknown()).optional(), neutral_temperature: z.array(z.unknown()).optional()}); export const aTMForwardCustomSpectrum = z.object({energy: z.array(z.number()), flux: z.array(z.number())}); export const srcAtmV1SchemasForwardATMForwardRequestOutputFlags = z.object({height_integrated_rayleighs_4278: z.boolean().optional(), height_integrated_rayleighs_5577: z.boolean().optional(), height_integrated_rayleighs_6300: z.boolean().optional(), height_integrated_rayleighs_8446: z.boolean().optional(), height_integrated_rayleighs_lbh: z.boolean().optional(), height_integrated_rayleighs_1304: z.boolean().optional(), height_integrated_rayleighs_1356: z.boolean().optional(), altitudes: z.boolean().optional(), emission_4278: z.boolean().optional(), emission_5577: z.boolean().optional(), emission_6300: z.boolean().optional(), emission_8446: z.boolean().optional(), emission_lbh: z.boolean().optional(), emission_1304: z.boolean().optional(), emission_1356: z.boolean().optional(), plasma_electron_density: z.boolean().optional(), plasma_o2plus_density: z.boolean().optional(), plasma_oplus_density: z.boolean().optional(), plasma_noplus_density: z.boolean().optional(), plasma_ionisation_rate: z.boolean().optional(), plasma_electron_temperature: z.boolean().optional(), plasma_ion_temperature: z.boolean().optional(), plasma_pederson_conductivity: z.boolean().optional(), plasma_hall_conductivity: z.boolean().optional(), neutral_o2_density: z.boolean().optional(), neutral_o_density: z.boolean().optional(), neutral_n2_density: z.boolean().optional(), neutral_n_density: z.boolean().optional(), neutral_temperature: z.boolean().optional()}); export const srcAtmV1SchemasForwardATMForwardRequest = z.object({atm_model_version: z.literal("1.0").optional(), timestamp: z.string(), geodetic_latitude: z.number(), geodetic_longitude: z.number(), maxwellian_energy_flux: z.number().optional(), gaussian_energy_flux: z.number().optional(), maxwellian_characteristic_energy: z.number().optional(), gaussian_peak_energy: z.number().optional(), gaussian_spectral_width: z.number().optional(), nrlmsis_model_version: z.enum(["00", "2.0"]).optional(), oxygen_correction_factor: z.number().optional(), timescale_auroral: z.number().int().optional(), timescale_transport: z.number().int().optional(), custom_spectrum: aTMForwardCustomSpectrum.optional(), output: srcAtmV1SchemasForwardATMForwardRequestOutputFlags.optional(), no_cache: z.boolean().optional()}); export const srcAtmV1SchemasForwardATMForwardResponse = z.object({data: srcAtmV1SchemasForwardATMForwardResponseData, request: srcAtmV1SchemasForwardATMForwardRequest, calculation_duration_ms: z.number()}); 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 }; /** * Perform forward ATM calculation * * POST /api/v1/atm/forward */ export const createApiApiV1AtmForward = async (args: CreateApiApiV1AtmForwardArgs, options: CreateApiApiV1AtmForwardOptions) => { const {baseUrl, fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/api/v1/atm/forward${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(srcAtmV1SchemasForwardATMForwardResponse, await res.json()) };