ws4kp-linhanced/proxy/handlers.mjs

82 lines
2.5 KiB
JavaScript

// Consolidated proxy handlers for all external API requests with caching
import cache from './cache.mjs';
import OVERRIDES from '../src/overrides.mjs';
// Weather.gov API proxy (catch-all for any Weather.gov API endpoint)
export const weatherProxy = async (req, res) => {
await cache.handleRequest(req, res, 'https://api.weather.gov', {
serviceName: 'Weather.gov',
skipParams: ['u'],
});
};
// Radar proxy for weather radar images
export const radarProxy = async (req, res) => {
await cache.handleRequest(req, res, 'https://radar.weather.gov', {
serviceName: 'Radar',
skipParams: ['u'],
encoding: 'binary', // Radar images are binary data
});
};
// SPC (Storm Prediction Center) outlook proxy
export const outlookProxy = async (req, res) => {
await cache.handleRequest(req, res, 'https://www.spc.noaa.gov', {
serviceName: 'SPC Outlook',
skipParams: ['u'],
});
};
// Iowa State Mesonet proxy with configurable host
export const mesonetProxy = async (req, res) => {
// Determine if this is a binary file (images)
const isBinary = req.path.match(/\.(png|jpg|jpeg|gif|webp|ico)$/i);
// Use override radar host if provided, otherwise default to mesonet
const radarHost = OVERRIDES.RADAR_HOST || 'mesonet.agron.iastate.edu';
await cache.handleRequest(req, res, `https://${radarHost}`, {
serviceName: `Iowa State Mesonet (${radarHost})`,
skipParams: [], // No parameters to skip for Mesonet
encoding: isBinary ? 'binary' : 'utf8', // Use binary encoding for images
});
};
// Legacy forecast.weather.gov API proxy
export const forecastProxy = async (req, res) => {
await cache.handleRequest(req, res, 'https://forecast.weather.gov', {
serviceName: 'Forecast.weather.gov',
skipParams: ['u'],
});
};
export const openMeteoProxy = async (req, res) => {
await cache.handleRequest(req, res, 'https://api.open-meteo.com', {
serviceName: 'Open-Meteo',
skipParams: ['u'],
});
};
export const rainViewerProxy = async (req, res) => {
await cache.handleRequest(req, res, 'https://api.rainviewer.com', {
serviceName: 'RainViewer',
skipParams: ['u'],
});
};
export const arcGisServerProxy = async (req, res) => {
await cache.handleRequest(req, res, 'https://server.arcgisonline.com', {
serviceName: 'ArcGIS Server',
skipParams: ['u'],
encoding: 'binary',
});
};
export const arcGisServicesProxy = async (req, res) => {
await cache.handleRequest(req, res, 'https://services.arcgisonline.com', {
serviceName: 'ArcGIS Services',
skipParams: ['u'],
encoding: 'binary',
});
};