Skip to content

Commit 4213c27

Browse files
authored
fix(segments): should be stable once isFinalized (#5)
* fix(segments): should be stable once `isFinalized` Previously the segments could receive one final update after `isFinalized` became `true` - this could cause consumer effects that read segments to run twice, even if guarded with `isFinalized` to run twice. This PR fixes this behavior, such that with a guard such a consumer effect would run only once. * chore(version): bump version
1 parent 65a5e2a commit 4213c27

File tree

2 files changed

+16
-8
lines changed

2 files changed

+16
-8
lines changed

packages/react-user-media/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
"name": "bengreenier",
1818
"url": "https://github.com/bengreenier"
1919
},
20-
"version": "0.1.1",
20+
"version": "0.1.2",
2121
"type": "module",
2222
"licenses": [
2323
{

packages/react-user-media/src/hooks/use-media-recorder.ts

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -180,15 +180,16 @@ export function useMediaRecorder(): RecorderState {
180180
const error = useMediaRecorderError(recorder);
181181
const isError = useMemo(() => error !== null, [error]);
182182

183+
const [startTime, setStartTime] = useState<DOMHighResTimeStamp | null>(null);
184+
const [endTime, setEndTime] = useState<DOMHighResTimeStamp | null>(null);
185+
183186
const [segments, setSegments] = useState<Blob[]>([]);
184187
const isFinalized = useMemo(
185-
() => segments.length > 0 && recorderState === "inactive",
186-
[segments, recorderState],
188+
() =>
189+
segments.length > 0 && recorderState === "inactive" && endTime !== null,
190+
[segments, recorderState, endTime],
187191
);
188192

189-
const [startTime, setStartTime] = useState<DOMHighResTimeStamp | null>(null);
190-
const [endTime, setEndTime] = useState<DOMHighResTimeStamp | null>(null);
191-
192193
const startRecording = useCallback(function startRecordingMedia(
193194
media: MediaStream,
194195
options?: RecorderOptions,
@@ -211,6 +212,7 @@ export function useMediaRecorder(): RecorderState {
211212
});
212213

213214
setSegments([]);
215+
setEndTime(null);
214216

215217
const startTime = performance.now();
216218
recorder.start(timeslice);
@@ -224,9 +226,15 @@ export function useMediaRecorder(): RecorderState {
224226
const stopRecording = useCallback(function stopRecordingMedia() {
225227
const endTime = performance.now();
226228

227-
recorderRef.current?.stop();
229+
recorderRef.current?.addEventListener(
230+
"stop",
231+
function onStopCompleted() {
232+
setEndTime(endTime);
233+
},
234+
{ once: true },
235+
);
228236

229-
setEndTime(endTime);
237+
recorderRef.current?.stop();
230238
}, []);
231239

232240
const state = {

0 commit comments

Comments
 (0)