Skip to content

Commit af859fa

Browse files
committed
feat: add onStart, onStop, onPause and onResume callbacks
1 parent 490923a commit af859fa

File tree

3 files changed

+77
-11
lines changed

3 files changed

+77
-11
lines changed

playgrounds/nuxt/app/components/recorder-demo.vue

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
<script setup lang="ts">
22
const audio = ref()
33
const video = ref()
4+
5+
const onStop = ()=>{
6+
console.log("onstop")
7+
}
48
const { start, stop, pause, resume, data, state, isMimeTypeSupported, isSupported, mimeType } = useMediaRecorder({
59
constraints: {
610
audio: true,
711
video: false,
812
},
13+
onStop,
914
})
1015
function handleStop() {
1116
console.log('stop')

src/useMediaRecorder.ts

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,31 @@ interface UseMediaRecorderOptions extends ConfigurableNavigator {
1515
* Options to pass to the MediaRecorder constructor.
1616
*/
1717
mediaRecorderOptions?: MaybeRef<MediaRecorderOptions>
18+
/**
19+
* Callback when recording starts.
20+
*/
21+
onStart?: () => any
22+
/**
23+
* Callback when recording pauses.
24+
*/
25+
onPause?: () => any
26+
/**
27+
* Callback when recording resumes.
28+
*/
29+
onResume?: () => any
30+
/**
31+
* Callback when recording stops.
32+
*/
33+
onStop?: () => any
1834
}
1935

2036
const defaultOptions: UseMediaRecorderOptions = {
2137
constraints: { audio: false, video: false },
22-
mediaRecorderOptions: {}
38+
mediaRecorderOptions: {},
39+
onStart: () => {},
40+
onPause: ()=> {},
41+
onResume: ()=> {},
42+
onStop: ()=> {},
2343
}
2444

2545
export function useMediaRecorder(options: UseMediaRecorderOptions = {}) {
@@ -43,10 +63,6 @@ export function useMediaRecorder(options: UseMediaRecorderOptions = {}) {
4363
return mediaRecorder.value?.mimeType
4464
})
4565

46-
const updateStates = () => {
47-
state.trigger()
48-
}
49-
5066
const {
5167
mediaRecorderOptions,
5268
constraints
@@ -90,12 +106,30 @@ export function useMediaRecorder(options: UseMediaRecorderOptions = {}) {
90106
newMediaRecorder.onstop = () => {
91107
stream.value?.getTracks().forEach(t => t.stop())
92108
result.value = data.value
93-
updateStates()
109+
state.trigger()
110+
mimeType.trigger()
111+
options.onStop?.()
112+
}
113+
newMediaRecorder.onpause = ()=>{
114+
state.trigger()
115+
mimeType.trigger()
116+
options.onPause?.()
117+
}
118+
newMediaRecorder.onresume = ()=>{
119+
state.trigger()
120+
mimeType.trigger()
121+
options.onResume?.()
122+
}
123+
newMediaRecorder.onstart = ()=>{
124+
state.trigger()
125+
mimeType.trigger()
126+
options.onStart?.()
127+
}
128+
newMediaRecorder.onerror = ()=>{
129+
state.trigger()
130+
mimeType.trigger()
131+
// TODO: error handling
94132
}
95-
newMediaRecorder.onpause = updateStates
96-
newMediaRecorder.onresume = updateStates
97-
newMediaRecorder.onstart = updateStates
98-
newMediaRecorder.onerror = updateStates
99133
}, { immediate: true })
100134

101135
tryOnScopeDispose(() => {

tests/index.spec.ts

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { describe, expect, it } from 'vitest'
1+
import { describe, expect, it, vi } from 'vitest'
22
import { useMediaRecorder } from '../src'
33

44
describe('useMediaRecorder', () => {
@@ -149,4 +149,31 @@ describe('useMediaRecorder', () => {
149149
await stop()
150150
expect(data.value.length).toBeGreaterThan(0)
151151
})
152+
153+
it('should call all lifecycle hooks', async () => {
154+
const onStop = vi.fn()
155+
const onStart = vi.fn()
156+
const onPause = vi.fn()
157+
const onResume = vi.fn()
158+
159+
const {
160+
start,
161+
pause,
162+
resume,
163+
stop,
164+
} = useMediaRecorder({ constraints: { audio: true }, onStop, onStart, onPause, onResume })
165+
166+
await start()
167+
pause()
168+
await new Promise(resolve => setTimeout(resolve, 10))
169+
resume()
170+
stop()
171+
172+
await vi.waitFor( () => {
173+
expect(onStart).toHaveBeenCalledTimes(1)
174+
expect(onPause).toHaveBeenCalledTimes(1)
175+
expect(onResume).toHaveBeenCalledTimes(1)
176+
expect(onStop).toHaveBeenCalledTimes(1)
177+
})
178+
})
152179
})

0 commit comments

Comments
 (0)