mirror of
https://github.com/block/buzz.git
synced 2026-10-30 05:51:46 +00:00
The retransmit orchestrator installed its listener and interval, then awaited the first send outside the loop's settle path. A rejected first send propagated to the caller with the loop never torn down: the listener and interval stayed live firing unhandled `void send()`, while both UI callers re-enabled the buttons — so a retry with the opposite option left two loops retransmitting different optionIds under one nonce. Route the first send through the same guarded transmit path as every tick and swallow a rejected send: a rejection is the transport failure this loop exists to survive, so the next tick retries. The orchestrator never rejects, guaranteeing exactly one loop per click and no unhandled promise on any path. Permanent send failure ends like silence — retry until `expiresAt`, then the card fails closed. Co-authored-by: Will Pfleger <pfleger.will@gmail.com> Signed-off-by: Will Pfleger <pfleger.will@gmail.com>
Buzz
Desktop chat shell with:
- Tauri + React + TypeScript + Vite
- Tailwind CSS
- shadcn/ui-ready shared components
- Biome (lint/format/check)
- Feature-driven frontend structure
Scripts
pnpm dev- run the web frontendpnpm tauri dev- run the desktop apppnpm build- typecheck and build frontendpnpm typecheck- TypeScript checkspnpm lint- Biome lintpnpm format- Biome format (write)pnpm check- Biome check
Structure
src/shared- reusable app-wide code (ui,lib,styles)src/features- feature modules (vertical slices)src/app- top-level app composition