41 lines
2.3 KiB
TypeScript
41 lines
2.3 KiB
TypeScript
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<ReadonlyArray<RealWeatherFrame & { payloadFileUri: string }>> {
|
|
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 };
|
|
}));
|
|
}
|