UNPKG

aerofly-missions

Version:

The Aerofly Missionsgerät converts simulator flight plan files for Aerofly FS 4, Microsoft Flight Simulator, X-Plane, GeoFS, and Garmin / Infinite Flight flight plan files. It also imports SimBrief flight plans.

75 lines (63 loc) 2.09 kB
import { Mission } from "../Aerofly/Mission.js"; import { MissionConditionsCloud } from "../Aerofly/MissionConditions.js"; type CheckWxApiPayload = { data: CheckWxApiPayloadItem[]; }; type CheckWxApiPayloadItem = { clouds?: { code: string; feet: number; }[]; visibility?: { meters_float?: number; }; wind?: { degrees?: number; speed_kts?: number; gust_kts?: number; }; temperature?: { celsius?: number; }; }; export class CheckWx { constructor(protected metarApiKey: string) {} public async fetch(icao: string): Promise<CheckWxApiPayload> { const url = new URL(`https://api.checkwx.com/metar/${encodeURIComponent(icao)}/decoded`); const response = await fetch(url, { headers: { "X-API-Key": this.metarApiKey, Accept: "application/json", }, }); if (!response.ok) { throw new Error(`Response status: ${response.status}`); } return await (<Promise<CheckWxApiPayload>>response.json()); } public addToMission(checkWxPayload: CheckWxApiPayload, mission: Mission): Mission { const metar = checkWxPayload.data.at(0); if (!metar) { throw new Error("No METAR data found"); } mission.conditions.wind_direction = metar.wind?.degrees ?? 0; mission.conditions.wind_gusts = metar.wind?.gust_kts ?? 0; mission.conditions.wind_speed = metar.wind?.speed_kts ?? 0; let visibility = metar.visibility?.meters_float ?? 0; if (visibility === 9999) { visibility = 20000; } mission.conditions.visibility = Math.round(visibility / 500) * 500; mission.conditions.clouds = metar.clouds?.map((c) => { const cloud = new MissionConditionsCloud(); cloud.cover_code = c.code; cloud.height_feet = c.feet ?? 0; return cloud; }) ?? []; // @see https://github.com/fboes/aerofly-wettergeraet/blob/main/src/WettergeraetLib/AeroflyWeather.cpp#L89 mission.conditions.thermal_strength = ((metar.temperature?.celsius ?? 14) - 5) / 25; mission.conditions.makeTurbulence(); return mission; } }