Merge remote-tracking branch 'upstream/main' into feature/catalonia-cctv-cameras

# Conflicts:
#	CHANGELOG.md
This commit is contained in:
ulihhhh committed 2026-09-21 19:00:01 +02:00
commit 49a322519a
29 files changed
+1025 -64

No files matched your search

+43
View File
@@ -1,5 +1,35 @@
# Changelog
- Enable responsive trackpad pinch zoom on the globe. Browser pixel-mode
`Ctrl+wheel` pinch gestures now reach Cesium with bounded amplification,
while ordinary wheel, line-mode and touch-pinch inputs retain their existing
behavior; the listener is removed with the application scene.
- Report AIS speed and course that carry the standard "not available" code as
unknown instead of 102.3 knots and 360 degrees. Genuine readings, including a
stopped vessel's zero and the highest encodable values, are unchanged.
- Render native `<select>` option lists in the dark UI palette. The closed
controls were already skinned, but the browser-painted popups fell back to the
platform light palette, leaving near-white option text on a white surface in
the HUD layout, Scenes, CCTV camera, Radio filter and Draw colour menus.
- Credit adsbdb, which supplies the aircraft type, model name and registration
on enriched flights and the airline and origin/destination pair behind the
tracked contact's route strip. `DATA_SOURCES.md` now records adsbdb's
published credits and route-data restriction, along with the request bounds
and gitignored 24-hour local cache. A matching `DATA_CREDITS` entry surfaces
the credit in the in-app Data attribution popover, and a test protects it
against accidental removal.
- Size the TomTom daily tile budget to the provider's real free allowance.
`TOMTOM_DAILY_TILE_BUDGET` defaulted to 40,000/day against an allowance
granted monthly (200,000 tile requests/month), exhausting a month in five
days and leaving the traffic layer dead for the rest of the period. The
default is now 6,000/day (186,000 over a 31-day month). Corrects the stale
"~50k/day" free-tier figure in the proxy, `.env.example` and
`DATA_SOURCES.md`. Still an application-side ceiling, not a billing cap.
- Add Catalonia (Servei Català de Trànsit) as a keyless CCTV source pack: ~135
cameras from a WFS/GML feed that aggregates SCT's own highway cameras with
hotlinked Barcelona and Terrassa municipal cameras, each partner named as a
@@ -115,6 +145,10 @@
- Expose portable radio, camera-type and regional source helpers; keep HTTP transport separate from record normalization.
- The Realtime debug-log endpoint is bounded on every axis it was not: an always-on per-client rate limit, asynchronous appends through a serialized queue instead of a synchronous write on the request path, and rotation of the log file at 32 MB keeping one prior generation. The 8 MB cap applied to a single request body and never to the file those requests accumulated into, so any local page could grow it for as long as the dev server ran. A malformed record and a failed write are now told apart, 400 from 500, and neither answer carries the error text.
- Three proxy paths no longer relay upstream or JS error text to the client. The HUD summary passed OpenAI's own `error.message` through whenever upstream was not ok, carrying request ids and quota wording; the Realtime token route passed through non-success response bodies and echoed JS errors, which can expose upstream details; and a failed CCTV media fetch stored the raw errno as the camera's health message, which reaches the screen through `GET /api/cctv/health` rather than through the sanitized response beside it. Logs now name the failure and the upstream status without the text.
- Separate vessel records and feed acquisition from rendering while preserving selection, partial-feed retention, sea-surface placement and request cancellation.
- Separate military-flight records and acquisition from rendering while preserving ground-model ownership, source units and follow behavior.
@@ -249,6 +283,15 @@ of current runtime behavior, see [`docs/CURRENT-STATE.md`](docs/CURRENT-STATE.md
### Fixed
- Keep traffic-road bounds crossing the antimeridian monotonic and inside the
longitude range accepted by the Overpass request path, preserving the small
wrapped span instead of producing an inverted or rejected box (#392 — thanks
@Ashfaqbs).
- Make `npm run doctor` report keyless anonymous OpenSky access for explicit
`OPENSKY_AUTH_MODE=anon` and OAuth mode without a client pair, retain the
existing OAuth-pair capability wording, and identify selected Basic or auto
modes without guessing their eventual credential choice. OpenSky proxy
authentication is unchanged.
- Bikeshare stations load again. The extracted station source addressed the
proxy as `/api/gbfs?url=`, but the proxy reads its upstream target from the
path, so every request answered 400 and the layer reported a fetch error for