Skip to content

Commit 953c561

Browse files
committed
add useLocalTrackRecorder
1 parent 76eb1be commit 953c561

File tree

1 file changed

+61
-0
lines changed

1 file changed

+61
-0
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import * as React from 'react';
2+
import type { LocalTrack, LocalAudioTrack } from 'livekit-client';
3+
import { isLocalTrack, LocalTrackRecorder } from 'livekit-client';
4+
import type { TrackReference } from '@livekit/components-core';
5+
import { isLocal, isTrackReference, log } from '@livekit/components-core';
6+
7+
export function useLocalTrackRecorder({
8+
track,
9+
onChunk,
10+
onError,
11+
}: {
12+
track: TrackReference | LocalAudioTrack;
13+
onChunk: (chunk: Uint8Array) => void;
14+
onError?: (error: Error) => void;
15+
}) {
16+
if (isTrackReference(track) && !isLocal(track.participant)) {
17+
throw TypeError('This hook only supports local audio tracks');
18+
}
19+
20+
let _track: LocalTrack | undefined;
21+
if (isTrackReference(track) && isLocalTrack(track.publication.track)) {
22+
_track = track.publication.track;
23+
} else if (!isTrackReference(track) && isLocalTrack(track)) {
24+
_track = track;
25+
}
26+
const recorder = React.useMemo(
27+
() => (_track ? new LocalTrackRecorder(_track) : undefined),
28+
[_track],
29+
);
30+
31+
const startRecording = React.useCallback(async () => {
32+
if (!recorder) {
33+
log.error('No track to record');
34+
return;
35+
}
36+
37+
if (recorder.state === 'recording') {
38+
log.warn('Recording already started');
39+
return;
40+
}
41+
42+
const stream = await recorder.start();
43+
try {
44+
for await (const chunk of stream) {
45+
onChunk(chunk);
46+
}
47+
} catch (error) {
48+
onError?.(error as Error);
49+
}
50+
}, [recorder, onChunk, onError]);
51+
52+
const stopRecording = React.useCallback(async () => {
53+
if (!recorder) {
54+
log.warn('No active recording');
55+
return;
56+
}
57+
recorder?.stop();
58+
}, [recorder]);
59+
60+
return { stop: stopRecording, start: startRecording };
61+
}

0 commit comments

Comments
 (0)