WhatsApp VoIP in JavaScript

A JavaScript port of meowcaller for Baileys. Make and receive WhatsApp calls with pure JavaScript — no native bindings, no CGO.

Read the Docs View on GitHub
This library is experimental. Signaling works, but media relay (actual audio/video) requires a native DTLS addon or WebRTC bridge.

Installation

npm install meowcaller-js

Requires Node.js 17+ and Baileys.

Quick Start

import { makeWASocket, useMultiFileAuthState } from '@whiskeysockets/baileys';
import { Client, SinkFunc, SourceFunc } from 'meowcaller-js';

const { state, saveCreds } = await useMultiFileAuthState('auth_info');
const wa = makeWASocket({ auth: state, printQRInTerminal: true });

const client = new Client(wa);
client.Connect();

client.OnIncomingCall((call) => {
  call.OnStateChange((phase) => console.log('phase:', phase.description));
  call.OnEnd((reason) => console.log('ended:', reason));
  call.Receive(SinkFunc((frame) => console.log('audio frame', frame.length)));
  call.Play(SourceFunc(async () => null));
  call.Answer();
});

Why meowcaller-js?

No CGO

Pure JavaScript throughout. No native bindings, no Go runtime. Just Node.js.

Async/Await

Modern async patterns instead of goroutines and channels.

EventEmitter

Standard EventEmitter patterns for call events. Familiar to any Node developer.

Baileys Native

Wraps directly around a Baileys socket. Drop into any existing project.

Implementation Status

FeatureStatus
Outbound callsSignal path ported
Inbound callsSignal path ported
Audio callsSignaling done, media relay needs DTLS
Video callsSignaling + depacketizer ported
MLow codecStub — needs WASM port
Opus codecPlanned
DTLS → relayNeeds native addon or WebRTC

API Overview

Client

Call

Audio & Video

Full documentation →