diff --git a/client/src/components/Aircraft.vue b/client/src/components/Aircraft.vue index 6b21fd8..1e35312 100644 --- a/client/src/components/Aircraft.vue +++ b/client/src/components/Aircraft.vue @@ -206,11 +206,11 @@ const navball = computed(() => {
- {{ operator }} + {{ operator || 'Unknown Owner' }} {{ plane.country || 'Unknown Country' }}
- {{ description }} + {{ description || 'Unknown Aircraft' }} {{ plane.class || 'Unknown' }} • {{ plane.type || 'Unknown' }}
diff --git a/client/src/components/Ship.vue b/client/src/components/Ship.vue index b883320..f530b6d 100644 --- a/client/src/components/Ship.vue +++ b/client/src/components/Ship.vue @@ -213,12 +213,12 @@ const compass = computed(() => {
- {{ boat.operator || boat.owner || 'Unknown' }} + {{ boat.operator || boat.owner || 'Unknown Owner' }} {{ boat.country || 'Unknown Country' }}
{{ boat.type || 'Unknown' }} - {{ boat.ship_type || 'Unknown' }} + {{ boat.ship_type || 'Unknown Class' }}
diff --git a/server/src/adsb.mjs b/server/src/adsb.mjs index 33c3f8a..92ca645 100644 --- a/server/src/adsb.mjs +++ b/server/src/adsb.mjs @@ -14,14 +14,17 @@ const CSV_CACHE = resolve(DATA, 'aircraft_db.csv'); const MAX_HISTORY = 500; const HISTORY_TTL = 1000 * 60 * 60; // 1 hour +const ADSB_TTL = 1000; const CSV_URL = 'https://s3.opensky-network.org/data-samples/metadata/aircraft-database-complete-2024-06.csv'; const MIL_RANGES_URL = ':8080/db-3.14.1708/ranges.js'; const MILITARY_OPERATORS = ['air force', 'army', 'navy', 'marine', 'coast guard', 'military', 'defence', 'defense', 'luftwaffe', 'RAF', 'USAF', 'USN', 'USMC']; const CARGO_OPERATORS = ['fedex', 'ups', 'dhl', 'cargo', 'freight', 'logistic', 'atlas air', 'kalitta', 'air freight']; -const PASSENGER_OPERATORS = ['airlines', 'airways', 'air ', 'jet', 'easyjet', 'ryanair', 'delta', 'united', 'american', 'avianca', 'southwest', 'lufthansa', 'emirates', 'british']; +const PASSENGER_OPERATORS = ['airlines', 'airways', 'air ', 'jet', 'jetblue', 'easyjet', 'ryanair', 'delta', 'united', 'american', 'avianca', 'southwest', 'lufthansa', 'emirates', 'british']; const MILITARY_CLASSES = ['H1M', 'H2M', 'L1M', 'L2M', 'L4M', 'A0']; +let adsbCache = null; +let adsbCacheTs = 0; const noRecord = []; const history = new Map(); const milRanges = []; @@ -150,7 +153,7 @@ function isIcaoInMilitaryRange(icao) { function wordMatch(text, keyword) { if (!text) return false; - const escaped = keyword.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + const escaped = keyword.replace(/[.*+?^${}()|[\]\\]/gi, '\\$&'); return new RegExp(`(? MAX_HISTORY) trail.shift(); } - return Promise.all(aircraft.map(async a => { + adsbCache = await Promise.all(aircraft.map(async a => { a = await enrichAircraft(a); a.icon = getIcon(a); return a; })); + adsbCacheTs = Date.now(); + return adsbCache; } export async function getADSBHistory(icao) { diff --git a/server/src/ais.mjs b/server/src/ais.mjs index 8d35b17..9b14786 100644 --- a/server/src/ais.mjs +++ b/server/src/ais.mjs @@ -8,6 +8,10 @@ const SENDER_TYPE = { 12: 'AtoN', 13: 'SART/EPIRB' }; +let aisCache = null; +let aisCacheTs = 0; +const AIS_TTL = 1000; + function decodeMsgTypes(raw) { const types = []; for (let i = 0; i < 32; i++) { @@ -38,6 +42,7 @@ function decodeFlags(flags) { } export async function getAIS() { + if (aisCache && Date.now() - aisCacheTs < AIS_TTL) return aisCache; const {ADSB_URL} = cfg(); if (!ADSB_URL) return {data: []}; const r = await fetch(`${ADSB_URL}:9990/api/ships_array.json`); @@ -45,7 +50,7 @@ export async function getAIS() { const staticMap = new Map(staticRows.map(row => [row[0], row])); - return dynamic.map(row => { + aisCache = dynamic.map(row => { const [mmsi, lat, lon, distance, bearing, heading, cog, speed, status, rrsi, ppm, count, msg_type, last_signal, last_group, group_mask, flags, altitude, @@ -79,4 +84,6 @@ export async function getAIS() { status }; }); + aisCacheTs = Date.now(); + return aisCache; }