@@ -12,6 +12,7 @@ class Recording {
1212 this . _recordedBlobs = [ ] ;
1313 this . _recordingStream = false ;
1414 this . _recStartTs = null ;
15+ this . _trackEndedListeners = [ ] ;
1516 }
1617
1718 start ( ) {
@@ -20,7 +21,8 @@ class Recording {
2021 options = { mimeType : options [ 0 ] } ;
2122 try {
2223 this . _mediaRecorder = new MediaRecorder ( this . _stream , options ) ;
23- this . _mediaRecorder . start ( ) ;
24+ this . _mediaRecorder . start ( 1000 ) ;
25+ this . _listenTrackEnded ( ) ;
2426 this . _mediaRecorder . addEventListener ( 'start' , ( e ) => {
2527 playSound ( 'recStart' ) ;
2628 console . log ( 'MediaRecorder started' , e ) ;
@@ -36,6 +38,7 @@ class Recording {
3638 this . _mediaRecorder . addEventListener ( 'stop' , ( e ) => {
3739 this . _recordingStream = false ;
3840 console . log ( 'MediaRecorder stopped' , e ) ;
41+ this . _removeTrackEndedListeners ( ) ;
3942 this . handleElements ( ) ;
4043 stopRecordingTimer ( ) ;
4144 this . downloadRecordedStream ( ) ;
@@ -149,4 +152,28 @@ class Recording {
149152 stop ( ) {
150153 this . _mediaRecorder . stop ( ) ;
151154 }
155+
156+ _listenTrackEnded ( ) {
157+ this . _stream . getTracks ( ) . forEach ( ( track ) => {
158+ const handler = ( ) => {
159+ console . warn ( 'Recording track ended during recording:' , track . kind , track . label ) ;
160+ if ( this . _mediaRecorder && this . _mediaRecorder . state === 'recording' ) {
161+ try {
162+ this . _mediaRecorder . requestData ( ) ;
163+ } catch ( e ) {
164+ console . warn ( 'requestData after track ended failed:' , e ) ;
165+ }
166+ }
167+ } ;
168+ track . addEventListener ( 'ended' , handler ) ;
169+ this . _trackEndedListeners . push ( { track, handler } ) ;
170+ } ) ;
171+ }
172+
173+ _removeTrackEndedListeners ( ) {
174+ this . _trackEndedListeners . forEach ( ( { track, handler } ) => {
175+ track . removeEventListener ( 'ended' , handler ) ;
176+ } ) ;
177+ this . _trackEndedListeners = [ ] ;
178+ }
152179}
0 commit comments