fix(firms): drop argument spread in fires.push — RangeError silently dropped 2 of 3 VIIRS sources (#93)

* fix(firms): drop spread in fires.push — RangeError silently killed 2 of 3 VIIRS sources

fires.push(...records) passes every record as a function argument. A
world/2 VIIRS pull returns ~131k records for NOAA20 and SNPP, over V8's
~125k argument limit, so both threw RangeError: Maximum call stack size
exceeded. The throw landed after sources.push({ok:true}), so each failed
source was listed twice — once ok:true with its real count, once ok:false
— while its records were dropped entirely. Only NOAA21 (114k, under the
limit) survived, making the layer look healthy at a third of the data.

Global fire count goes 113,996 -> 377,169.

* docs(changelog): record the FIRMS multi-source merge fix

* docs(changelog): move the FIRMS fix into a new Unreleased section above 0.1.0

---------

Co-authored-by: Bilawal Sidhu <106619546+bilawalsidhu@users.noreply.github.com>
Co-authored-by: Bilawal Sidhu <bilawal@metaversity.us>
This commit is contained in:
Yang Song 2026-08-31 16:50:49 -07:00 committed by GitHub
parent b6da93b8ac
commit 6b7bca2913
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 14 additions and 1 deletions

View File

@ -3,6 +3,16 @@
This changelog records public product changes. For the authoritative description
of current runtime behavior, see [`docs/CURRENT-STATE.md`](docs/CURRENT-STATE.md).
## [Unreleased]
### Fixed
- All three VIIRS sources now reach the Active Fires layer. Merging a source's
detections used argument spread, which exceeds the engine's argument limit on
the two largest sources and dropped them entirely — leaving roughly a third of
global detections while reporting each dropped source twice, once as
successful with its real count and once as failed.
## [0.1.0] — 2026-08-31 — One-click install, keyless boot, Provider Settings
### Added

View File

@ -2086,7 +2086,10 @@ function firmsProxy() {
try {
const records = filterTrailing24h(await fetchSource(key, source), now);
sources.push({ source, count: records.length, ok: true });
fires.push(...records);
// NOT fires.push(...records): spread passes each record as an argument,
// and a world/2 VIIRS pull exceeds V8's argument limit (~125k) at
// ~131k records — RangeError, and the whole source is silently dropped.
for (const record of records) fires.push(record);
} catch (err) {
console.warn(`[firms-proxy] ${source} fetch failed:`, err?.message || err);
sources.push({ source, count: 0, ok: false });