Conversation
The measured migration delta from D-024's probe, verbatim: the named import (1.x's default export throws a migration error), and await aedes.listen() in start() before the port listeners open (persistence setup became async and moved out of the constructor). The node:net tcp listener was already D-024's. Defaults diff vs 0.51.3 is two options: drainTimeout 60000 (arms only on socket backpressure, unref'd, disconnects a frozen client after 60s — no clean-path latency) and maxTopicLevels 100 (qlobber already threw 'too many words' past 100 levels on 0.51; 1.x fails it cleanly at the gate). Suite 568/0 exit 0, all gates green.
…-dependent mechanisms aedes 1.x moves persistence setup into listen(), which narrows the broker's pre-start surface: getState rejected with a raw TypeError and emit failed inconsistently by QoS (TypeError for QoS>0/retained, silent success for QoS-0 non-retained). Both now reject with one legible error, pinned by a unit test. D-031's maxTopicLevels bullet is corrected to what the review measured (0.51 sync-threw only at QoS 0; at emit's default QoS 1 it hung the callback with an uncaught async throw), extended to the subscribe-side failure mode, and gains the QoS-2 delivery-timing note.
…ve panel A second start() on aedes 1.x wipes the retained store and orphans the heartbeat interval before the port bind rejects, and start-after-stop resolves into a zombie broker; re-entry now rejects on entry, pinned including retained-state survival. D-031's subscribe-side parenthetical is corrected to the panel's measurement (process-fatal on both runtimes; the 'survivable under Bun' read was a test-runner artifact), the lockfile sentence now says six of eight leave the lock, the suite count reflects the branch head, the flag-placement and stop-no-reset residuals are stated, and REQUIREMENTS.md's R-033 parenthetical records the re-run as done.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Discharges the last of D-021's three deferred range changes:
aedes^0.51.3→^1.1.1, landed exactly under D-026's condition (own branch/PR/decision entry + an R-033 rehearsal re-run) and along D-024's de-risked path.Migration — precisely the delta D-024's ten-check Bun probe recorded:
import { Aedes }(the 1.x default export is a function whose body throws a migration error)await aedes.listen()at the top ofstart()before either port listener opens — persistence setup became async and moved out of the constructor, sothis.persistenceexists only post-listen (getStatewas already a post-start surface; theAedesWithPersistencenarrowing stays, since 1.x still typespersistenceonly on the options)Defaults: taken unchanged. The measured diff vs 0.51.3 is exactly two options:
drainTimeout: 60000— arms only on socket backpressure (unref'd timer) and disconnects a client whose socket stays undrained 60s; no clean path gains latency,aedes.close()unaffectedmaxTopicLevels: 100— not a new limit: a 101-level publish on 0.51.3 threw qlobber's synchronoustoo many words(the bundled matcher already capped at 100); 1.1.1 fails the same input cleanly via the publish callback (topic has too many levels), sobroker.emitrejects legibly at the same ceilingmaxClientsIdLength/keepaliveLimitunchanged, so the connect surface D-026 measured does not move. Lockfile slims: eight utility deps dropped; aedes-persistence 10.3.1 + mqemitter 7.1.0 in; persistence backends are optional peers, not installed.Verification
bun test568 pass / 0 fail — includingsrc/broker/connect-profile.test.ts, the D-026 closure pin (MQTT 3.1.1 over ws, non-root path, no auth, retained receipt on subscribe, persistent session at keepalive 30, QoS 0/1 both ways)Docs
DECISIONS.md: D-031 (measurements, the defaults analysis, the rehearsal record)AGENTS.md: status updated — all three D-021 deferred range changes now discharged