diff --git a/package.json b/package.json index f5d8544..deb3514 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,8 @@ "dev": "vite", "build": "tsc && vite build", "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview" + "preview": "vite preview", + "prepare": "npm run build" }, "peerDependencies": { "react": "^18.2.0", diff --git a/src/hooks/useVoiceVisualizer.tsx b/src/hooks/useVoiceVisualizer.tsx index ad399f1..1444014 100644 --- a/src/hooks/useVoiceVisualizer.tsx +++ b/src/hooks/useVoiceVisualizer.tsx @@ -20,6 +20,8 @@ function useVoiceVisualizer({ onResumedAudioPlayback, onErrorPlayingAudio, shouldHandleBeforeUnload = true, + timeslice, + onChunkAvailable, }: useVoiceVisualizerParams = {}): Controls { const [isRecordingInProgress, setIsRecordingInProgress] = useState(false); const [isPausedRecording, setIsPausedRecording] = useState(false); @@ -172,7 +174,12 @@ function useVoiceVisualizer({ "dataavailable", handleDataAvailable, ); - mediaRecorderRef.current.start(); + // Start recording with timeslice if provided, otherwise normal recording + if (timeslice) { + mediaRecorderRef.current.start(timeslice); + } else { + mediaRecorderRef.current.start(); + } if (onStartRecording) onStartRecording(); recordingFrame(); @@ -194,6 +201,13 @@ function useVoiceVisualizer({ }; const handleDataAvailable = (event: BlobEvent) => { + // If timeslice is set, only emit chunks - don't store locally + if (timeslice && onChunkAvailable) { + onChunkAvailable(event.data); + return; + } + + // Standard behavior (no timeslice): store blob and process for playback if (!mediaRecorderRef.current) return; mediaRecorderRef.current = null; @@ -234,7 +248,11 @@ function useVoiceVisualizer({ if (audioContextRef.current && audioContextRef.current.state !== "closed") { void audioContextRef.current.close(); } - _setIsProcessingAudioOnComplete(true); + + // Only process blob for playback if not in timeslice mode + if (!timeslice) { + _setIsProcessingAudioOnComplete(true); + } setRecordingTime(0); setIsPausedRecording(false); if (onStopRecording) onStopRecording(); diff --git a/src/types/types.ts b/src/types/types.ts index 1b2cdab..cd353cc 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -120,6 +120,8 @@ export interface useVoiceVisualizerParams { onResumedAudioPlayback?: () => void; onErrorPlayingAudio?: (error: Error) => void; shouldHandleBeforeUnload?: boolean; + timeslice?: number; + onChunkAvailable?: (chunk: Blob) => void; } export interface UseWebWorkerParams {