[fix](trx-frontend-http): replay what arrived before a lazy view loaded
Opening the Map or Statistics page showed only what had been decoded since the moment it was opened, and a reload — landing straight on the tab, so its module loads at startup ahead of the history — was the only way to see the rest. Two things were being thrown away. The decode log the Statistics page counts lives in the map module, which is lazy. Recording into a module that is not loaded yet is a no-op, and unlike the map markers nothing replayed the log when it finally arrived, so every decode heard before the first visit was simply never counted. Hold those records in the client and hand them over when the module attaches. The map's own replay covered APRS, AIS and VDES, whose plugins implement syncMap, but not the grid squares: the FTx family and WSPR plotted locators as decodes arrived and had no replay at all, so everything they heard before the map loaded was lost, and the unique-grid counter with it. Both plot through a helper now, which their syncMap replays oldest first. A replayed WSPR spot carries the frequency it was heard on rather than one worked out against wherever the dial has moved to since. Pinned in decode-flow, whose history fixture gains FT8 and WSPR spots: after a first visit the statistics count every stored decode and every grid square, which before this change were 0 and 0. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SyX26FCpMQxiBoC7r5K1A7 Signed-off-by: Stan Grams <sjg@haxx.space>
This commit is contained in:
@@ -120,6 +120,8 @@ try {
|
||||
// left the client on its retry path and the history path untested.
|
||||
const HISTORY_AIS = 900;
|
||||
const HISTORY_APRS = 300;
|
||||
const HISTORY_FT8 = 12;
|
||||
const HISTORY_WSPR = 8;
|
||||
const historyFixture = await startWebFixture({
|
||||
spectrum: true,
|
||||
mode: "AIS",
|
||||
@@ -129,6 +131,14 @@ const historyFixture = await startWebFixture({
|
||||
vessel_name: `HISTORIC ${index}`, channel: "A", message_type: 1,
|
||||
rig_id: "rig-a", ts_ms: Date.now() - (index + 1) * 1000,
|
||||
})),
|
||||
ft8: Array.from({ length: HISTORY_FT8 }, (_, index) => ({
|
||||
message: `CQ SP${index}ABC JO${String(index).padStart(2, "0")}`, snr_db: -7, dt_s: 0.2,
|
||||
freq_hz: 1200 + index, rig_id: "rig-a", ts_ms: Date.now() - (index + 1) * 1000,
|
||||
})),
|
||||
wspr: Array.from({ length: HISTORY_WSPR }, (_, index) => ({
|
||||
message: `SP${index}XYZ JN${String(index).padStart(2, "0")} 30`, snr_db: -22, dt_s: 0.5,
|
||||
freq_hz: 1500 + index, rig_id: "rig-a", ts_ms: Date.now() - (index + 1) * 1000,
|
||||
})),
|
||||
aprs: Array.from({ length: HISTORY_APRS }, (_, index) => ({
|
||||
src_call: `SP2SJG-${index % 15}`, dest_call: "APRS", path: "WIDE1-1",
|
||||
info: `history ${index}`, packet_type: "position", crc_ok: true,
|
||||
@@ -216,6 +226,24 @@ try {
|
||||
assert.equal(plotted.ais, HISTORY_AIS, `${plotted.ais} of ${HISTORY_AIS} vessels reached the map`);
|
||||
assert.equal(plotted.stations, 15, `${plotted.stations} of 15 stations reached the map`);
|
||||
|
||||
// The Statistics page counts the same history. Its decode log lives in the
|
||||
// map module, which is lazy, so every decode that arrived before the module
|
||||
// did used to be recorded into nothing at all — the page opened empty and
|
||||
// only filled in from decodes heard afterwards, and it took a reload landing
|
||||
// on the tab (module loaded at startup, before the history) to show the lot.
|
||||
await replay.page.evaluate(() => window.navigateToTab("statistics"));
|
||||
await replay.page.waitForTimeout(1500);
|
||||
const counted = await replay.page.evaluate(() => ({
|
||||
decodes: Number(document.getElementById("stats-total-decodes")?.textContent ?? "0"),
|
||||
grids: Number(document.getElementById("stats-unique-grids")?.textContent ?? "0"),
|
||||
}));
|
||||
assert.equal(counted.decodes, HISTORY_AIS + HISTORY_APRS + HISTORY_FT8 + HISTORY_WSPR,
|
||||
`the statistics counted ${counted.decodes} decodes`);
|
||||
// Grid squares come from the FT8 and WSPR spots, which had no map replay of
|
||||
// their own: the locators of everything heard before the map loaded were lost.
|
||||
assert.equal(counted.grids, HISTORY_FT8 + HISTORY_WSPR,
|
||||
`the statistics counted ${counted.grids} grid squares`);
|
||||
|
||||
assert.deepEqual(replay.runtimeErrors, []);
|
||||
} finally {
|
||||
await replay.browser.close();
|
||||
|
||||
Reference in New Issue
Block a user