type RecordAudioType = { (stream: MediaStream): Promise; stop: () => void; currentRecorder?: MediaRecorder; }; export const recordAudio = (function (): RecordAudioType { const func = async function recordAudio(stream: MediaStream): Promise { try { const mediaRecorder = new MediaRecorder(stream, { mimeType: "audio/webm;codecs=opus", }); const audioChunks: Blob[] = []; return new Promise((resolve, reject) => { mediaRecorder.ondataavailable = event => { if (event.data.size > 0) { audioChunks.push(event.data); } }; mediaRecorder.onstop = () => { const audioBlob = new Blob(audioChunks, { type: "audio/webm" }); resolve(audioBlob); }; mediaRecorder.onerror = () => { reject(new Error("MediaRecorder error occurred")); }; mediaRecorder.start(1000); (func as RecordAudioType).currentRecorder = mediaRecorder; }); } catch (error) { const errorMessage = error instanceof Error ? error.message : "Unknown error occurred"; throw new Error("Failed to start recording: " + errorMessage); } }; (func as RecordAudioType).stop = () => { const recorder = (func as RecordAudioType).currentRecorder; if (recorder && recorder.state !== "inactive") { recorder.stop(); } delete (func as RecordAudioType).currentRecorder; }; return func as RecordAudioType; })();