@@ -5,6 +5,59 @@ All notable changes to this project are documented here.
55The format is based on [ Keep a Changelog] ( https://keepachangelog.com/en/1.1.0/ ) ,
66and this project adheres to [ Semantic Versioning] ( https://semver.org/spec/v2.0.0.html ) .
77
8+ ## [ 2.6.0] - 2026-05-12
9+
10+ ### Fixed
11+
12+ - ** Goroutine leak in transcoder retry loop.** ` performTranscode `
13+ spawned ` mirrorTranscodeMetadata ` with the outer transcoder
14+ context, which only cancels on full transcoder stop. Every
15+ source disconnect/reconnect cycle (~ 1/min on a typical
16+ long-running deployment) entered the retry loop and spawned a
17+ fresh mirror goroutine; the old ones kept ticking forever.
18+ Production showed 1052 leaked goroutines and RSS of 777 MB
19+ (baseline 44 MB) after ~ 73 hours uptime. Fix: per-invocation
20+ child context inside performTranscode, defer-cancel; passed to
21+ mirrorTranscodeMetadata + EncodeMP3 + EncodeOpus + the decoder
22+ hub Acquire call. Goroutines that belong to one retry cycle now
23+ exit when that cycle returns.
24+ - ** Transcoder auto-restart gap reduced from ~ 2 min to ~ 5 s.**
25+ When the decoder hub's pump exited (source EOF / disconnect),
26+ nothing closed the orphaned PCM-fanout stream — transcoders
27+ subscribed to it stayed blocked on its dead signal channel and
28+ only recovered when HealthMonitor's 2-minute auto-remove
29+ finally swept the stale stream. Fix: the pump's defer now
30+ RemoveStream's the PCM mount, so subscribers see EOF
31+ immediately and the retry loop produces a fresh pump within
32+ the standard 5-second tick.
33+
34+ ### Changed
35+
36+ - ** Map rewrite: MapLibre GL + OpenFreeMap, fixes zoom/marker/
37+ autofit thrash.** The previous Leaflet + CARTO dashboard map
38+ re-ran ` flyToBounds ` and ` clearLayers ` on every SSE 'geo' tick
39+ (~ 500 ms when listeners are active). Each fly is an 800 ms
40+ animation; ticks at 0.5 s stack on each other — the camera
41+ never settled, markers flickered as they were torn down and
42+ re-created. New shared ` <LiveGeoMap> ` component (used by both
43+ GeoMapCard and KioskDashboard):
44+ - Camera refits only when the SET of cities changes
45+ (signature of iso/city/lat/lon tuples). Listener-count
46+ changes update marker sizes in place — no fly.
47+ - Markers diff in place via a Map keyed by city signature.
48+ New cities added; gone cities removed; existing cities
49+ update radius with a 200 ms animation. No clearLayers
50+ churn.
51+ - Provider switch from CARTO basemaps to openfreemap.org —
52+ no signup, no API key, explicit free-for-any-use policy.
53+ Tile and OSM attribution wired into the MapLibre default
54+ AttributionControl plus a footer line.
55+ - ` leaflet ` removed from frontend deps; ` maplibre-gl ` added
56+ (~ 285 KB gzipped, in a route-lazy chunk so the landing
57+ page is unaffected).
58+
59+ [ 2.6.0 ] : https://github.com/DatanoiseTV/tinyice/releases/tag/v2.6.0
60+
861## [ 2.5.0] - 2026-05-09
962
1063### Security
0 commit comments