refactor(desktop): tidy the cross-window deduper

Drop the unused DEDUPE_WINDOW_MS export and rename its interval so
"window" isn't overloaded against BrowserWindow in a multi-window
feature (windowMs → intervalMs). DRY the completion-sound play path.
No behavior change.
This commit is contained in:
Brooklyn Nicholson 2026-07-20 18:36:05 -05:00
parent fb0c6d9ee1
commit a41346f8ae
2 changed files with 11 additions and 18 deletions

View file

@ -2,22 +2,21 @@
// sound, spoken replies). Every desktop window is its own renderer process, so N
// open windows each independently react to the same backend event. The main
// process is the one place they all share and it handles IPC serially, so it's
// the race-free owner: the first window to claim a key within the window wins;
// peers see it's taken and stay quiet.
//
// Pure + injectable clock so it's unit-testable without Electron.
// the race-free owner: the first window to claim a key within the interval wins;
// peers see it's taken and stay quiet. Pure + injectable clock, so it's
// unit-testable without Electron.
const DEDUPE_WINDOW_MS = 1000
const DEDUPE_INTERVAL_MS = 1000
// Returns true when `key` was already claimed within the window (caller drops
// Returns true when `key` was already claimed within the interval (caller drops
// this one). Self-evicting: stale keys are pruned on every call, so the map
// can't grow unbounded.
function createEventDeduper(windowMs = DEDUPE_WINDOW_MS) {
export function createEventDeduper(intervalMs = DEDUPE_INTERVAL_MS) {
const lastSeenAt = new Map<string, number>()
return function isDuplicate(key: string, now = Date.now()): boolean {
for (const [k, at] of lastSeenAt) {
if (now - at >= windowMs) {
if (now - at >= intervalMs) {
lastSeenAt.delete(k)
}
}
@ -31,5 +30,3 @@ function createEventDeduper(windowMs = DEDUPE_WINDOW_MS) {
return false
}
}
export { createEventDeduper, DEDUPE_WINDOW_MS }

View file

@ -462,17 +462,13 @@ export function playCompletionSound(dedupeKey?: string) {
return
}
if (!dedupeKey) {
playVariant($completionSoundVariantId.get())
const play = () => playVariant($completionSoundVariantId.get())
return
if (!dedupeKey) {
return play()
}
void ownsAmbientCue(`sound:${dedupeKey}`).then(owns => {
if (owns) {
playVariant($completionSoundVariantId.get())
}
})
void ownsAmbientCue(`sound:${dedupeKey}`).then(owns => owns && play())
}
interface AirPuffSpec {