
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
fallback-api
Advanced tools
A framework-agnostic TypeScript library for streaming audio responses from a fallback REST API with automatic retry and exponential backoff polling. Supports Opus audio format at 24kHz for efficient, high-quality audio streaming.
onChunkReceived callbacknpm install fallback-api
import { FallbackService } from 'fallback-api';
const service = new FallbackService({
baseUrl: 'https://your-api.example.com',
healthCheckTimeout: 5000,
});
const response = await service.execute({
sessionId: 'user-session-123',
userQuery: 0,
audioChunkNumber: 0,
});
if (response.success) {
console.log('Audio Data:', response.audioData);
console.log('Transcription:', response.transcription);
}
const response = await service.execute({
sessionId: 'user-session-123',
userQuery: 0,
audioChunkNumber: 0,
onChunkReceived: (chunk) => {
if (chunk.transcription) {
console.log('Transcription:', chunk.transcription);
}
if (chunk.audioData) {
console.log('Audio chunk received:', chunk.chunkNumber);
}
},
});
const controller = new AbortController();
const response = await service.execute({
sessionId: 'user-session-123',
userQuery: 0,
audioChunkNumber: 0,
abortSignal: controller.signal,
});
// Cancel the request if needed
// controller.abort();
import { AudioStreamQueue } from 'fallback-api';
const audioQueue = new AudioStreamQueue(
{
sampleRate: 24000,
channels: 1,
bitDepth: 16,
},
{
onChunkStart: (chunkIndex, remaining) => {
console.log(`Playing chunk ${chunkIndex}, ${remaining} remaining`);
},
onChunkEnd: (chunkIndex) => {
console.log(`Finished chunk ${chunkIndex}`);
},
onQueueEmpty: () => {
console.log('Playback complete');
},
onError: (error) => {
console.error('Playback error:', error);
},
}
);
// Enqueue audio chunks (base64-encoded PCM data)
audioQueue.enqueue(audioChunk1);
audioQueue.enqueue(audioChunk2);
// Control playback
audioQueue.setMuted(true); // Mute audio
audioQueue.stop(); // Stop and clear queue
new FallbackService(config: FallbackConfig)
Config Options:
baseUrl (string, required): Base URL of the fallback APIhealthCheckTimeout (number, optional): Timeout for health checks in ms (default: 5000)pollingIntervals (number[], optional): Polling intervals for exponential backoff (default: [0, 2000, 4000, 8000, 16000, 32000, 64000])maxPollingCalls (number, optional): Maximum polling attempts (default: 50)execute(request: FallbackRequest): Promise<FallbackResponse>Execute a request to the fallback API.
Request Options:
sessionId (string, required): Session identifieruserQuery (number, required): Query number (0-indexed)audioChunkNumber (number, required): Starting chunk numberabortSignal (AbortSignal, optional): Signal for cancellationonChunkReceived (callback, optional): Callback for streaming chunksskipThinkingMessage (boolean, optional): Skip the thinking message phaseResponse:
success (boolean): Whether the request succeededaudioData (string, optional): Base64-encoded audiotranscription (string, optional): Text transcriptionsessionId (string): Session ID from requestisEnd (boolean): Whether response is completeerror (string, optional): Error message if failednew AudioStreamQueue(config?: AudioStreamConfig, callbacks?: AudioQueueCallbacks)
Config:
sampleRate (number): Audio sample rate in Hz (default: 24000)channels (number): Number of audio channels (default: 1)bitDepth (number): Audio bit depth (default: 16)Callbacks:
onChunkStart(chunkIndex, remainingInQueue): When chunk starts playingonChunkEnd(chunkIndex): When chunk finishesonQueueEmpty(): When all chunks are playedonError(error): On playback errorsenqueue(base64Audio: string): Add audio to playback queuesetMuted(muted: boolean): Mute/unmute playbackstop(): Stop playback and clear queueget queueSize(): number: Get number of pending chunksimport { FallbackService, AudioStreamQueue } from 'fallback-api';
// Initialize service
const service = new FallbackService({
baseUrl: 'https://your-api.example.com',
});
// Initialize audio queue
const audioQueue = new AudioStreamQueue(
{ sampleRate: 24000, channels: 1, bitDepth: 16 },
{
onChunkStart: (idx) => console.log(`Playing chunk ${idx}`),
onQueueEmpty: () => console.log('Done playing'),
onError: (err) => console.error('Playback failed:', err),
}
);
// Execute request with streaming
const response = await service.execute({
sessionId: 'session-123',
userQuery: 0,
audioChunkNumber: 0,
onChunkReceived: (chunk) => {
if (chunk.audioData) {
audioQueue.enqueue(chunk.audioData);
}
if (chunk.transcription) {
console.log('Transcription:', chunk.transcription);
}
},
});
console.log('Final result:', response);
try {
const response = await service.execute(request);
if (!response.success) {
console.error('Request failed:', response.error);
}
} catch (error) {
console.error('Service error:', error);
}
All types are exported for full type-safety:
import type {
FallbackConfig,
FallbackRequest,
FallbackResponse,
ChunkData,
AudioStreamConfig,
AudioQueueCallbacks,
} from 'fallback-api';
This library works in both:
onChunkReceived callback as they arriveThe library provides minimal logging to help with debugging:
MIT
For issues, questions, or contributions, please visit the GitHub repository.
FAQs
Framework-agnostic fallback REST API streaming for audio
We found that fallback-api demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.