StreamRecorder

WebSocket audio streaming microservice

Running

How It Works

1.Connect via WebSocket to /ws-stream with auth token and chat ID
2.Stream raw audio data (WAV) as binary WebSocket messages
3.Close the WebSocket when recording is done
4.Server converts WAV to MP3 in-memory via ffmpeg and forwards to backend API

WebSocket Endpoint

GET /ws-stream?auth=<token>&chatId=<id>
authJWT token (required) — sent as Bearer token to backend
chatIdChat identifier (required) — alphanumeric, hyphens, underscores, max 128 chars

Client Example

// Connect to stream recorder
const ws = new WebSocket(
  "ws://localhost:8000/ws-stream?auth=YOUR_TOKEN&chatId=YOUR_CHAT_ID"
);
ws.binaryType = "arraybuffer";

// Stream audio from MediaRecorder
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const recorder = new MediaRecorder(stream, { mimeType: "audio/webm" });

recorder.ondataavailable = (e) => {
  if (ws.readyState === WebSocket.OPEN) {
    e.data.arrayBuffer().then((buf) => ws.send(buf));
  }
};

recorder.start(250); // send chunks every 250ms

// Stop recording and close
recorder.stop();
ws.close();

WebSocket Close Codes

Configuration

VariableDefaultDescription
BACKEND_URLhttp://api:4000/messagesBackend API endpoint
MAX_FILE_SIZE10000000Max input size for ffmpeg conversion (bytes)
MAX_STREAM_BYTES10000000Max bytes accepted per WebSocket stream
CHUNK_TIMEOUT_MS2000Idle timeout between chunks before auto-close
FETCH_TIMEOUT_MS30000Timeout for backend API request
MP3_BITRATE64kFFmpeg MP3 encoding bitrate