mirror of
https://github.com/block/buzz.git
synced 2026-10-28 13:01:10 +00:00
## Summary - make the relay reconnect coordinator authoritative during outages so query, publish, and subscription traffic waits for the scheduled attempt instead of cancelling backoff - release waiting operations after the coordinated AUTH + live-subscription replay attempt, while preserving one explicit manual reconnect fast path - suppress duplicate notification side effects when reconnect replay overlaps previously delivered events ## Root cause `resetConnection()` scheduled exponential backoff, but `ensureConnected()` cleared any pending reconnect timer. Operation-level retry paths immediately called `ensureConnected()`, so ordinary app traffic could repeatedly bypass the reconnect policy during an outage. The resulting churn also replayed overlapping live events into notification side effects without a shared event-ID guard. ## Validation - `pnpm --dir desktop typecheck` - `pnpm --dir desktop test` — 3,823 passed - pre-push: `desktop-check`, `desktop-test`, and `branch-skew` passed - file-size, px-text, and pubkey-truncation ratchets passed --------- Signed-off-by: Wes <wesbillman@users.noreply.github.com> Co-authored-by: Carl <c7ebe626f000404285d3686e1dc74cc07cc60a9754a150041ba132e14bd3e2ec@buzz.block.builderlab.xyz>
27 lines
752 B
JavaScript
27 lines
752 B
JavaScript
import assert from "node:assert/strict";
|
|
import test from "node:test";
|
|
|
|
import { RelayReconnectWaiters } from "./relayReconnectWaiters.ts";
|
|
|
|
test("settle releases every operation waiting on a successful reconnect", async () => {
|
|
const waiters = new RelayReconnectWaiters();
|
|
const first = waiters.wait();
|
|
const second = waiters.wait();
|
|
|
|
waiters.settle();
|
|
|
|
await Promise.all([first, second]);
|
|
});
|
|
|
|
test("settle rejects every operation after a failed reconnect", async () => {
|
|
const waiters = new RelayReconnectWaiters();
|
|
const first = waiters.wait();
|
|
const second = waiters.wait();
|
|
const error = new Error("relay unavailable");
|
|
|
|
waiters.settle(error);
|
|
|
|
await assert.rejects(first, error);
|
|
await assert.rejects(second, error);
|
|
});
|