Repository navigation
feat(app): send one broker to several collectors under one switch - #722
Conversation
239237c to
9519f45
Compare
|
Amended (9519f45), three changes:
App: 1640 tests (17 new), eslint, build. Web: 762 tests, eslint. |
|
Review before merge: one point to change, one suggestion, three small ones. DutchMeshCore on by default is confirmed on the maintainer side. 1. An existing DutchMeshCore preset keeps signing the new default connection out (change requested) 2. Suggestion: pin the retention path over connections 3. Small ones
|
DutchMeshCore is one broker with two collectors behind it, and each takes
its own stream label: collector 1 hunter, collector 2 wardriver. Until now
every config.json entry was its own row with its own switch, so the site
offered four presets and a hunter had to pick one per drive.
A config.json broker can now list streams, each with its own url and
label. It stays one entry: one row on the brokers page, one line in the
Status tab, one switch. legsOf makes a connection of each stream under the
id <broker>@<host>, so each keeps its own watermark, companion token and
socket; the drain, retention and connect code now walk connections, the
rows and switches stay brokers. A row's status folds its connections
("1 of 2 connected" in between). The add form refuses a host the site
already publishes to, since two sessions under the companion's key kick
each other. The splash and About say where receptions go, from the
brokers that are on.
Verified: 1637 app and 762 web tests, eslint, build; every new test
mutation-checked. In the browser against three local brokers: the own one
got packets, collector 1 obs under hunter, collector 2 under wardriver;
with the switch off only the own one got the next reception, and on again
both collectors caught up. Not tested against the real collectors or with
a companion signing.
Closes efiten#704
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
9519f45 to
ee69e1e
Compare
|
Pushed ee69e1e for the review, rebased on master. Per point:
App: 1650 tests, eslint, build. Web: 762 tests, eslint. |
🤖 I have created a release *beep* *boop* --- <details><summary>app: 1.30.0</summary> ## [1.30.0](app-v1.29.1...app-v1.30.0) (2026-09-30) ### Features * **app,web:** ease what the map shows by zoom, on one hex system ([#734](#734)) ([4c2a57b](4c2a57b)) * **app,web:** name a relay on the map the way the app does ([#733](#733)) ([a9aa01a](a9aa01a)) * **app:** send one broker to several collectors under one switch ([#722](#722)) ([8c6da30](8c6da30)) * **web:** export the repeaters heard in view as a 1200×1200 PNG ([#725](#725)) ([d6186bc](d6186bc)) ### Bug Fixes * **app,web:** hang a Discover-heard repeater's star from its own position ([#724](#724)) ([15a6ada](15a6ada)) * **app,web:** put the caret in the target picker's search when it opens ([#721](#721)) ([6bd899c](6bd899c)) * **app:** drop the float window's previous and next buttons ([#717](#717)) ([c957ff3](c957ff3)) * **app:** give the sound the playback buffer instead of the smallest ([#712](#712)) ([dee5484](dee5484)) * **app:** hide Chrome's pause on the fullscreen readout ([#715](#715)) ([836d91e](836d91e)) * **app:** keep a space under the HUD on Android ([#710](#710)) ([2754716](2754716)) * **app:** let the fullscreen readout turn with the phone ([#718](#718)) ([fae3749](fae3749)) * **app:** put the transmit pop under the receptions it sat over ([#738](#738)) ([2bfc5fa](2bfc5fa)) * **server:** keep the node registry in memory on a loop of its own ([#736](#736)) ([4f3e988](4f3e988)) * **web:** keep the map bar on one row between 641 and 767 px ([#732](#732)) ([c44dc1d](c44dc1d)) </details> <details><summary>server: 1.10.1</summary> ## [1.10.1](server-v1.10.0...server-v1.10.1) (2026-09-30) ### Bug Fixes * **server:** keep the node registry in memory on a loop of its own ([#736](#736)) ([4f3e988](4f3e988)) * **server:** read a refused frame again when the message-id decoder changes ([#737](#737)) ([8586c71](8586c71)) </details> <details><summary>web: 1.26.0</summary> ## [1.26.0](web-v1.25.1...web-v1.26.0) (2026-09-30) ### Features * **app,web:** ease what the map shows by zoom, on one hex system ([#734](#734)) ([4c2a57b](4c2a57b)) * **app,web:** name a relay on the map the way the app does ([#733](#733)) ([a9aa01a](a9aa01a)) * **app:** send one broker to several collectors under one switch ([#722](#722)) ([8c6da30](8c6da30)) * **web:** export the repeaters heard in view as a 1200×1200 PNG ([#725](#725)) ([d6186bc](d6186bc)) ### Bug Fixes * **app,web:** hang a Discover-heard repeater's star from its own position ([#724](#724)) ([15a6ada](15a6ada)) * **app,web:** put the caret in the target picker's search when it opens ([#721](#721)) ([6bd899c](6bd899c)) * **app:** drop the float window's previous and next buttons ([#717](#717)) ([c957ff3](c957ff3)) * **app:** give the sound the playback buffer instead of the smallest ([#712](#712)) ([dee5484](dee5484)) * **app:** hide Chrome's pause on the fullscreen readout ([#715](#715)) ([836d91e](836d91e)) * **app:** keep a space under the HUD on Android ([#710](#710)) ([2754716](2754716)) * **app:** let the fullscreen readout turn with the phone ([#718](#718)) ([fae3749](fae3749)) * **app:** put the transmit pop under the receptions it sat over ([#738](#738)) ([2bfc5fa](2bfc5fa)) * **server:** keep the node registry in memory on a loop of its own ([#736](#736)) ([4f3e988](4f3e988)) * **web:** keep the map bar on one row between 641 and 767 px ([#732](#732)) ([c44dc1d](c44dc1d)) </details> --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Closes #704
What was wrong
DutchMeshCore takes two stream labels on two collectors, and every
config.jsonbroker was its own row with its own switch. The site therefore offered four presets, and a hunter picked one collector and one label per drive.What this changes
streamson a config broker. One entry, one row on the brokers page, one line in the Status tab, one switch.legsOf(app/src/brokers.js) turns each stream into a connection with the id<broker>@<host>, so each keeps its own watermark, companion token (signed for its host) and socket. Drain, retention, connect and the startup watermarks now walk connections; rows and switches stay brokers.foldLegs): connected when all are,1 of 2 connectedin between, queued as far as the slowest connection.host · label.docs/2026-09-21-mqtt-brokers.mdamended, AGENTS.md §9 and §10,config.example.json, one changelog entry.Deploy: the site's config.json
The DutchMeshCore hosts stay out of the repo, so the live
config.jsonneeds this at deploy, with the collector addresses the current presets use:{ "id": "dutchmeshcore", "name": "DutchMeshCore", "auth": "companion", "format": "wardrive", "streams": [ { "url": "<collector 1>", "label": "hunter" }, { "url": "<collector 2>", "label": "wardriver" } ] }The four DutchMeshCore entries leave
brokerPresets.Choices worth a look
Verification
packets, collector 1 gotwardriver/obsundermeshcore/hunter/…, collector 2 undermeshcore/wardriver/…. With the switch off only the own broker got the next reception; switched on again, both collectors caught up. The add form refused collector 2's host.Overlap
app/changelog.jsonandweb/changelog.jsonare regenerated here, as in #710 to #718. Whichever merges second rerunsnode scripts/build-changelog.mjs.🤖 Generated with Claude Code