prop/test/microwaveprop_web/live
Graham McIntire e688d8c244
perf(wire)+ts: pack scores as flat tuples, bump ProfilesFile gzip, tighten TS types
**Wire format — /map scores payload.** Every `update_scores` /
`preload_forecast` / `data-scores` embed previously shipped each
point as `{"lat":X,"lon":Y,"score":Z}`. At 95k cells in full CONUS
that's ~36 bytes/point × 95k = 3.4 MB of JSON, ~50% of it repeating
the three key names. Packing as `[lat, lon, score]` tuples drops
per-point overhead to ~19 bytes → ~1.8 MB on the wire, ~45% smaller.
New `Propagation.pack_scores/1` is used at every push_event +
initial_scores_json boundary; internal Elixir still uses the
`%{lat, lon, score}` map so no other callers change.

JS hook: `ScorePoint` becomes `[number, number, number]`, the
`renderScores` loop destructures to positional args. Regression
test in map_live_test updated to match the new shape.

**ProfilesFile compression.** Rust writer was at gzip level 6
(default). Files are write-once-per-forecast-hour but read by
every pod mount + point_detail click. Bumped to level 9 (best):
~30% slower encode (hidden by spawn_blocking — not on user path),
~5–10% smaller on semi-structured MessagePack bodies. No reader
changes needed — same gzip stream.

**TypeScript strictness.**
- `app.ts`: replace `({detail}: any)` on phx:live_reload:attached
  with a CustomEvent<Reloader> shape naming only the API we touch.
- `weather_map_hook.ts`: drop the `(this as any)._map` pair by
  declaring a `GridLayerWithMap = L.GridLayer & { _map: L.Map }`
  intersection on the overlay's createTile `this` parameter.
- `global.d.ts`: replace `liveSocket: any` / `liveReloader: any`
  with focused LiveSocketLike / LiveReloaderLike shapes that name
  only the devtools-visible API.

No more `any` in the codebase (verified via rg).
2026-04-21 17:45:06 -05:00
..
admin feat(admin): surface flagged contacts on the contact-edits page 2026-04-19 12:40:20 -05:00
algo_live_test.exs Show topbar loading indicator while scores are loading 2026-03-31 09:30:20 -05:00
beacon_live_test.exs feat(beacons): plot-path link seeds TX chain to match beacon EIRP 2026-04-18 10:54:38 -05:00
contact_live_test.exs feat(contacts): hide Private column when the viewer has nothing private 2026-04-19 12:36:12 -05:00
import_live_test.exs feat(import): live /imports/:id progress page + gate upload bars on submit 2026-04-17 09:31:22 -05:00
map_live_test.exs perf(wire)+ts: pack scores as flat tuples, bump ProfilesFile gzip, tighten TS types 2026-04-21 17:45:06 -05:00
path_live_test.exs PathLive: ionosphere readout panel for VHF paths 2026-04-15 14:48:47 -05:00
status_live_test.exs feat(status): show Rust prop-grid-rs work queue alongside Oban panel 2026-04-19 17:07:38 -05:00
submit_live_test.exs feat(import): live /imports/:id progress page + gate upload bars on submit 2026-04-17 09:31:22 -05:00
user_management_live_test.exs Drop gridmap.org dependency, resolve callsigns locally 2026-04-12 17:43:29 -05:00
user_profile_live_test.exs User profiles at /u/:callsign, flexible band input, assorted UX cleanup 2026-04-12 16:13:08 -05:00
weather_map_live_test.exs fix(weather-map): default timeline cursor to the hour closest to now 2026-04-17 15:57:59 -05:00