Skip to content

Commit 7f062a7

Browse files
committed
Address CodeRabbit's comments
1 parent 067ebf6 commit 7f062a7

2 files changed

Lines changed: 22 additions & 7 deletions

File tree

src/worker/browser/service-worker-manager.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ function attachUpdateHandlers(
6666
registration: ServiceWorkerRegistration,
6767
options: ReturnType<typeof normalizeOptions>
6868
) {
69+
// Guard: only the first caller per registration attaches handlers.
70+
// Subsequent calls with different options are silently ignored.
6971
if (handshakes.has(registration)) return;
7072
handshakes.add(registration);
7173

@@ -196,10 +198,8 @@ export async function getActiveServiceWorker(
196198
path?: string
197199
): Promise<ServiceWorker> {
198200
ensureServiceWorkerSupport();
199-
// Avoid mixing registrations when a specific script path is provided.
200-
const options = normalizeOptions(path ?? "");
201201
const registration: ServiceWorkerRegistration = path
202-
? await registerOnce(options)
202+
? await registerOnce(normalizeOptions(path))
203203
: await navigator.serviceWorker.ready;
204204
let serviceWorker =
205205
registration.active ||

test/service-worker-manager.test.ts

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,32 @@ const stubNavigator = (serviceWorker: Partial<ServiceWorkerContainer>) => {
1212
const createServiceWorkerContainer = (
1313
registration: Partial<ServiceWorkerRegistration> = {}
1414
) => {
15-
const listeners = new Map<string, (evt?: Event) => void>();
15+
const listeners = new Map<string, Array<(evt?: Event) => void>>();
1616
return {
1717
register: vi.fn().mockResolvedValue(registration),
1818
ready: Promise.resolve(registration as ServiceWorkerRegistration),
1919
controller: null,
2020
addEventListener: (event: string, cb: (evt?: Event) => void) => {
21-
listeners.set(event, cb);
21+
const cbs = listeners.get(event);
22+
if (cbs) {
23+
cbs.push(cb);
24+
} else {
25+
listeners.set(event, [cb]);
26+
}
27+
},
28+
removeEventListener: (event: string, cb?: (evt?: Event) => void) => {
29+
if (!cb) {
30+
listeners.delete(event);
31+
return;
32+
}
33+
const cbs = listeners.get(event);
34+
if (!cbs) return;
35+
const idx = cbs.indexOf(cb);
36+
if (idx !== -1) cbs.splice(idx, 1);
37+
if (cbs.length === 0) listeners.delete(event);
2238
},
23-
removeEventListener: (event: string) => listeners.delete(event),
2439
dispatch: (event: string, evt: Event = new Event(event)) => {
25-
listeners.get(event)?.(evt);
40+
listeners.get(event)?.forEach((cb) => cb(evt));
2641
},
2742
};
2843
};

0 commit comments

Comments
 (0)