in client/src/util/audio.ts [65:110]
function startMediaRecorderRecording(stream: MediaStream, mimeTypes?: string[]): Promise<RecordingStream> {
const options: MediaRecorderOptions = {audioBitsPerSecond: 8096};
if (mimeTypes) {
const type = getSupportedMimeType(mimeTypes);
if (type) {
options.mimeType = type;
} else {
logger.warn('No supported mime type found - using default type');
}
}
const recorder = new MediaRecorder(stream, options);
const recordingStream: RecordingStream = {
onended: null,
stop: () => {
recorder.stop();
}
};
const chunks: Blob[] = [];
recorder.ondataavailable = (dataEvent: BlobEvent) => {
logger.log('Recording data available');
if(dataEvent.data.size > 0) {
chunks.push(dataEvent.data);
}
};
recorder.onstop = () => {
logger.log('Recording stopped');
for(const track of stream.getAudioTracks()) {
track.stop();
}
if (recordingStream.onended) {
const data = chunks.length === 1 ? chunks[0] : new Blob(chunks);
recordingStream.onended(data);
}
};
return new Promise<RecordingStream>((resolve, reject) => {
recorder.onstart = () => {
logger.log('Recording started');
resolve(recordingStream);
};
recorder.onerror = (ev) => {
logger.warn('Recording error', ev.error);
reject(ev.error);
};
recorder.start();
});
}