- js/layers/geojson-layer.js: one factory expressing fetch/dedupe+revision/ time-anchoring/cap/style/status — adding a GeoJSON feed is now data entry - js/registry.js: quakes & fires refactored onto it (verified parity — same counts/colors/time-anchoring), plus 4 new REAL layers, all default-off: GDACS disasters (93), NWS severe weather US (13), Launch Library (30), NSW RFS bushfires (21) - deleted js/layers/quakes.js + fires.js (now registry entries); removed dead CONFIG.quakes/fires blocks - factory honors default-off (ds.show synced to enabled); zero console errors Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
125 lines
4.8 KiB
JavaScript
125 lines
4.8 KiB
JavaScript
// GODSIGH configuration — every URL, interval, and tunable in one place.
|
|
// All feed paths are RELATIVE so the app works identically at "/" (dev) and
|
|
// "/godsigh/" (prod). Never introduce a leading-slash path.
|
|
|
|
export const CONFIG = {
|
|
// Same-origin proxy endpoints (serve.py in dev; nginx location blocks in prod).
|
|
proxy: {
|
|
opensky: 'proxy/opensky',
|
|
celestrak: 'proxy/celestrak',
|
|
},
|
|
|
|
basemaps: {
|
|
// Data Mode — dark high-contrast raster.
|
|
dark: {
|
|
url: 'https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png',
|
|
subdomains: ['a', 'b', 'c', 'd'],
|
|
credit: '© OpenStreetMap contributors © CARTO',
|
|
maximumLevel: 19,
|
|
},
|
|
// Photo Mode — Sentinel-2 cloudless mosaic (no key).
|
|
photo: {
|
|
url: 'https://tiles.maps.eox.at/wmts/1.0.0/s2cloudless-2023_3857/default/g/{z}/{y}/{x}.jpg',
|
|
credit: 'Sentinel-2 cloudless by EOX — modified Copernicus Sentinel data 2023',
|
|
maximumLevel: 14,
|
|
},
|
|
},
|
|
|
|
// Timeline spans now ± windowHours.
|
|
windowHours: 6,
|
|
// Live-only layers (aircraft, live AIS) pause when the clock is scrubbed
|
|
// further than this from wall-clock now.
|
|
liveThresholdSec: 600,
|
|
|
|
// Camera opens on the Persian Gulf theater.
|
|
camera: { lon: 53.0, lat: 25.5, height: 2_800_000 },
|
|
|
|
satellites: {
|
|
sampleStepSec: 60, // one SGP4 sample per minute across the window
|
|
cap: 120, // hard ceiling on tracked satellites
|
|
// Each source is one Celestrak query. `filter` = keep only names containing
|
|
// one of these tokens; `keepOnly` = keep only these exact names; `max` =
|
|
// cap this source's contribution so one big constellation can't crowd out
|
|
// the rest. Rare/high-value sources are listed first so the global cap
|
|
// never starves them.
|
|
sources: [
|
|
{ q: 'GROUP=stations&FORMAT=tle', keepOnly: ['ISS (ZARYA)', 'CSS (TIANHE)'] },
|
|
{ q: 'NAME=COSMOS%202486&FORMAT=tle' }, // Russian Persona-class recon
|
|
{ q: 'NAME=COSMOS%202506&FORMAT=tle' },
|
|
{
|
|
q: 'GROUP=resource&FORMAT=tle',
|
|
filter: ['WORLDVIEW', 'LEGION', 'PLEIADES', 'CAPELLA', 'GAOFEN', 'SKYSAT',
|
|
'ICEYE', 'UMBRA', 'LANDSAT', 'SENTINEL-1', 'SENTINEL-2',
|
|
'GEOEYE', 'KOMPSAT', 'CARTOSAT', 'RESURS'],
|
|
},
|
|
{ q: 'NAME=GAOFEN&FORMAT=tle', max: 30 }, // large Chinese EO fleet — cap it
|
|
],
|
|
},
|
|
|
|
aircraft: {
|
|
// null bbox = global (a global states/all call costs the same 4 credits as
|
|
// any large bbox). Or set {lamin, lomin, lamax, lomax}.
|
|
bbox: null,
|
|
pollMs: 90_000,
|
|
// Callsign prefixes flagged as military (highlighted + optionally filtered).
|
|
// Trimmed OpenSky callsigns are matched by prefix. Curated list of common
|
|
// NATO/allied air-transport & tanker call words; extend freely.
|
|
militaryPrefixes: ['RCH', 'REACH', 'LAGR', 'DUKE', 'POLO', 'CNV', 'RRR',
|
|
'ASCOT', 'GAF', 'BAF', 'IAM', 'PLF', 'HKY', 'NATO',
|
|
'CFC', 'MC', 'SAM', 'EVAC'],
|
|
},
|
|
|
|
// Earthquakes, wildfires, disasters, severe-weather, launches, NSW bushfires
|
|
// are now data-defined in js/registry.js (Wave 3). Their shared colors stay in
|
|
// CONFIG.colors below (quakeMin/quakeMax/fire).
|
|
|
|
// Military aircraft — REAL unfiltered military traffic (the OSINT prize OpenSky
|
|
// hides: RCH/Reach airlift, tankers, the Area 51 "Janet" shuttle). Now on the
|
|
// FREE, keyless adsb.lol /v2/mil feed via proxy/mil (same {ac:[...]} shape as
|
|
// the old paid ADS-B Exchange feed, so the layer code is source-agnostic).
|
|
// proxy/adsbx-mil still exists server-side as a paid fallback but is unused.
|
|
adsbx: {
|
|
proxyMil: 'proxy/mil', // RELATIVE — works at "/" and "/godsigh/"; free adsb.lol
|
|
pollMs: 60_000, // 1 min — free feed, no quota (server 60s cache coalesces)
|
|
},
|
|
|
|
// Optional live AIS. Leave blank to use the demo fleet only (roadmap feature).
|
|
AISSTREAM_API_KEY: '',
|
|
|
|
colors: {
|
|
// satellites (by name token)
|
|
GAOFEN: '#ff4d4d',
|
|
COSMOS: '#ff9f40',
|
|
WORLDVIEW: '#4dd2ff',
|
|
LEGION: '#4dd2ff',
|
|
CAPELLA: '#9d7bff',
|
|
PLEIADES: '#7bff9d',
|
|
SENTINEL: '#ffd24d',
|
|
ISS: '#ffffff',
|
|
CSS: '#ffffff',
|
|
satDefault: '#66ffcc',
|
|
// aircraft (by altitude band)
|
|
aircraftLow: '#ffb347',
|
|
aircraftMid: '#ffe74d',
|
|
aircraftHigh: '#4dd2ff',
|
|
aircraftMil: '#ff5964', // military-callsign tint (overrides altitude band)
|
|
militaryReal: '#ff453a', // REAL military (ADS-B Exchange feed)
|
|
militaryEmerg: '#ff2d95', // military squawking 7500/7600/7700 or emergency
|
|
// earthquakes (magnitude ramp: amber → red)
|
|
quakeMin: '#ffcf50',
|
|
quakeMax: '#ff3b30',
|
|
// wildfires
|
|
fire: '#ff7a1a',
|
|
// ships
|
|
shipNormal: '#7bff9d',
|
|
shipToll: '#ffe74d',
|
|
shipDark: '#ff4d4d',
|
|
shipIdle: '#8a97a3',
|
|
// infra
|
|
chokepoint: '#ff003c',
|
|
pipeline: '#ffbf40',
|
|
facility: '#35e0ff',
|
|
event: '#ff4d4d',
|
|
},
|
|
};
|