Skip to content

Commit 631be79

Browse files
authored
fix: resolve memory leak in MediaRecorder event listeners (#1077)
1 parent 46546f3 commit 631be79

1 file changed

Lines changed: 29 additions & 13 deletions

File tree

packages/react/src/hooks/useMediaRecorder.js

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,19 +28,29 @@ export function useMediaRecorder({ constraints, onStop, videoRef }) {
2828
const stream = await getStream(constraints, true);
2929
chunks.current = [];
3030
const _recorder = new MediaRecorder(stream);
31-
_recorder.start();
32-
setRecorder(_recorder);
33-
_recorder.addEventListener('dataavailable', (event) => {
31+
32+
const handleDataAvailable = (event) => {
3433
chunks.current.push(event.data);
35-
});
36-
_recorder.addEventListener('stop', () => {
34+
};
35+
36+
const handleStop = () => {
3737
onStop && onStop(chunks.current);
38-
});
38+
_recorder.removeEventListener('dataavailable', handleDataAvailable);
39+
_recorder.removeEventListener('stop', handleStop);
40+
};
41+
42+
_recorder.addEventListener('dataavailable', handleDataAvailable);
43+
_recorder.addEventListener('stop', handleStop);
44+
45+
_recorder.start();
46+
setRecorder(_recorder);
3947
}
4048

4149
async function stop() {
4250
if (recorder) {
43-
recorder.stop();
51+
if (recorder.state !== 'inactive') {
52+
recorder.stop();
53+
}
4454
(await getStream()).getTracks().forEach((track) => track.stop());
4555
}
4656
}
@@ -77,17 +87,23 @@ export function useNewMediaRecorder({ constraints, videoRef, onStop }) {
7787

7888
chunks.current = [];
7989
const _recorder = new MediaRecorder(stream);
80-
_recorder.start();
81-
setRecorder(_recorder);
8290

83-
_recorder.addEventListener('dataavailable', (event) => {
91+
const handleDataAvailable = (event) => {
8492
chunks.current.push(event.data);
85-
});
93+
};
8694

87-
_recorder.addEventListener('stop', () => {
95+
const handleStop = () => {
8896
setRecordingData(new Blob(chunks.current, { type: 'video/mp4' }));
8997
onStop && onStop(chunks.current);
90-
});
98+
_recorder.removeEventListener('dataavailable', handleDataAvailable);
99+
_recorder.removeEventListener('stop', handleStop);
100+
};
101+
102+
_recorder.addEventListener('dataavailable', handleDataAvailable);
103+
_recorder.addEventListener('stop', handleStop);
104+
105+
_recorder.start();
106+
setRecorder(_recorder);
91107
}
92108

93109
async function stopRecording() {

0 commit comments

Comments
 (0)