import { Asset } from "expo-asset"; export type RealWeatherFrame = Readonly<{ label: "T0" | "T1" | "T2" | "T3"; cycle: "2026080700" | "2026080706" | "2026080712" | "2026080718"; metadataJson: string; validTime: number; generation: number; payloadModule: number; }>; type CanonicalMetadata = Readonly<{ validTime: number; generation: number }>; // Static requires register all four raw .f32 assets with Metro/Expo; payload bytes never enter JS memory. const metadataT0 = require("../assets/weather/ecmwf-hres-wind-20260807/2026080700/metadata.json") as CanonicalMetadata; const metadataT1 = require("../assets/weather/ecmwf-hres-wind-20260807/2026080706/metadata.json") as CanonicalMetadata; const metadataT2 = require("../assets/weather/ecmwf-hres-wind-20260807/2026080712/metadata.json") as CanonicalMetadata; const metadataT3 = require("../assets/weather/ecmwf-hres-wind-20260807/2026080718/metadata.json") as CanonicalMetadata; function frame(label: RealWeatherFrame["label"], cycle: RealWeatherFrame["cycle"], metadata: CanonicalMetadata, payloadModule: number): RealWeatherFrame { return { label, cycle, metadataJson: JSON.stringify(metadata), validTime: metadata.validTime, generation: metadata.generation, payloadModule }; } export const realWeatherFrames = [ frame("T0", "2026080700", metadataT0, require("../assets/weather/ecmwf-hres-wind-20260807/2026080700/field.f32")), frame("T1", "2026080706", metadataT1, require("../assets/weather/ecmwf-hres-wind-20260807/2026080706/field.f32")), frame("T2", "2026080712", metadataT2, require("../assets/weather/ecmwf-hres-wind-20260807/2026080712/field.f32")), frame("T3", "2026080718", metadataT3, require("../assets/weather/ecmwf-hres-wind-20260807/2026080718/field.f32")), ] as const; export async function materializeRealWeatherFrames(): Promise> { return Promise.all(realWeatherFrames.map(async (weatherFrame) => { const asset = Asset.fromModule(weatherFrame.payloadModule); await asset.downloadAsync(); if (asset.localUri == null || !asset.localUri.startsWith("file://")) { throw new Error(`${weatherFrame.label} Asset.downloadAsync did not provide a local file:// URI`); } return { ...weatherFrame, payloadFileUri: asset.localUri }; })); }