Skip to content

Commit 67148d9

Browse files
committed
prevent memory leak from setTimeout
1 parent 1daaa7b commit 67148d9

File tree

2 files changed

+18
-5
lines changed

2 files changed

+18
-5
lines changed

packages/client/src/timers/index.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,17 @@ class TimerWorker {
7373
}
7474

7575
const id = this.getTimerId();
76-
this.callbacks.set(id, callback);
76+
77+
this.callbacks.set(id, () => {
78+
callback();
79+
80+
// Timeouts are one-off operations, so no need to keep callback reference
81+
// after timer has fired
82+
if (type === 'setTimeout') {
83+
this.callbacks.delete(id);
84+
}
85+
});
86+
7787
this.sendMessage({ type, id, timeout });
7888
return id;
7989
}

packages/client/src/timers/worker.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,13 @@ self.addEventListener('message', (event: MessageEvent) => {
1212
case 'setInterval':
1313
timerIdMapping.set(
1414
request.id,
15-
(request.type === 'setTimeout' ? setTimeout : setInterval)(
16-
() => tick(request.id),
17-
request.timeout,
18-
),
15+
(request.type === 'setTimeout' ? setTimeout : setInterval)(() => {
16+
tick(request.id);
17+
18+
if (request.type === 'setTimeout') {
19+
timerIdMapping.delete(request.id);
20+
}
21+
}, request.timeout),
1922
);
2023
break;
2124

0 commit comments

Comments
 (0)