AbsoluteJS

@absolutejs/meeting-recall

@absolutejs/meeting-recallv0.0.1-beta.10betaVoice & Media

Recall.ai source adapter for @absolutejs/meeting — Recall joins a Google Meet / Zoom / Teams call as a bot and streams per-participant audio into the meeting core for live transcription + analysis

#Installation

BASH
bun add @absolutejs/meeting-recall

#Capabilities

Overview

Recall.ai source adapter for @absolutejs/meeting. Recall joins a Google Meet / Zoom / Teams call as a bot and streams per-participant audio; this adapter turns that into the MeetingSource the meeting core consumes, so the @absolutejs/voice scribe can transcribe the call live with speaker labels.

One Recall integration covers all three platforms — you only pass a meeting URL.

For dynamic applications, createRecallMeetingSourceFactory binds the Recall credentials and websocket once; @absolutejs/meeting supplies each approved meeting URL as the managed session target. The hosted AbsoluteJS.ai platform uses this factory contract, so installing the package never creates a bot or joins a call.

How it works

Recall's bot dials out to a websocket _you_ host and streams audio_separate_raw events: one stream per participant, mono 16-bit little-endian PCM at 16 kHz (exactly the scribe's input format). Your server accepts that socket and forwards each frame to source.ingest(), which decodes the PCM and emits diarized audio + participant events.

Region

A Recall workspace lives in exactly one region and its key only works against that region's host. Pass region ("us-west-2" | "us-east-1" | "eu-central-1" | "ap-northeast-1") or a full baseUrl (https://us-west-2.recall.ai/api/v1). Defaults to us-west-2.

API

createRecallMeetingSource(options) → MeetingSource & { botId, ingest }.

start() creates the bot with a realtime websocket endpoint pointed at

websocketUrl.

Show 6 more

ingest(frame) decodes a realtime frame (JSON string, bytes, or object)

into audio / participant events.

stop() makes the bot leave the call.

createRecallClient(options) → a thin typed client:

createBot, getBot, listBots, leaveBot, deleteBot.

RECALL_AUDIO_FORMAT — the PCM format Recall emits.

Outcomes

What you can build

Build on the supported package contract

Use @absolutejs/meeting-recall through its supported public entry points.

Hardening checklist

Production guidance

Make every external boundary explicitPin the deployed @absolutejs/meeting-recall version, replace example or memory-backed dependencies with durable implementations, bound external calls, protect credentials, and emit enough evidence to retry or recover safely.

Follow in order

Troubleshooting path

1
Trace from the first failed boundary
Reproduce the smallest canonical @absolutejs/meeting-recall example, confirm the supported entry point and version in the API explorer, then inspect the first boundary that did not produce its documented result.

#Usage

Partial snippet

Working example for Usage.

TS
import { createMeeting } from "@absolutejs/meeting";
import { createRecallMeetingSource } from "@absolutejs/meeting-recall";
import { createDeepgramStt } from "@absolutejs/voice-deepgram";

// 1. A source backed by a Recall bot. `websocketUrl` is a public wss:// URL
//    your server listens on (Recall connects out to it).
const source = createRecallMeetingSource({
  apiKey: process.env.RECALL_API_KEY!,
  baseUrl: process.env.RECALL_API_BASE_URL, // regional; defaults to us-west-2
  meetingUrl: "https://meet.google.com/abc-defg-hij",
  websocketUrl: "wss://your-app.example.com/meeting/recall",
  botName: "Deal Referee",
});

// 2. Wire it into the meeting core + a scribe STT.
const meeting = await createMeeting({
  source,
  stt: createDeepgramStt({ apiKey: process.env.DEEPGRAM_API_KEY! }),
  sessionId: crypto.randomUUID(),
});
meeting.on("turn", (turn) => console.log(turn.speaker, turn.text));

await meeting.start(); // creates the bot; it joins + starts streaming

// 3. In your websocket handler, pipe each frame into the source:
//    ws.on("message", (data) => source.ingest(data));

await meeting.stop(); // bot leaves the call

#How it works

Partial snippet

Recall's bot dials out to a websocket _you_ host and streams audio_separate_raw events: one stream per participant, mono 16-bit little-endian PCM at 16 kHz (exactly the scribe's input format). Your server accepts that socket and forwards each frame to source.ingest(), which decodes the PCM and emits diarized audio + participant events.

TXT
Recall bot ──(wss, per-participant PCM)──▶ your server ──source.ingest()──▶ @absolutejs/meeting ──▶ voice scribe ──▶ diarized turns

#Public entry points

Supported entry points declared by this package manifest.

Package entry point declared in package.json.

@absolutejs/meeting-recall@absolutejs/meeting-recall/manifest@absolutejs/meeting-recall/manifest.json

#Package commands

Scripts declared by this package manifest.

bun run buildrm -rf dist && bun build ./src/index.ts ./src/manifest.ts --outdir dist --root src --target bun --external @absolutejs/manifest --external '@absolutejs/manifest/*' --external @absolutejs/meeting --external '@absolutejs/meeting/*' --external @absolutejs/voice --external '@absolutejs/voice/*' --external @sinclair/typebox --external '@sinclair/typebox/*' && tsc --emitDeclarationOnly --project tsconfig.json && absolute-manifest emit
bun run check:packagebun run format && bun run typecheck && bun run test && bun run verify-package && bun run build && bun run verify-package --artifacts
bun run formatprettier --write "./**/*.{js,ts,json,md}"
bun run testbun test
bun run typecheckbun run tsc --noEmit

#API reference

Search the declarations exported by the current package type files. Expand a symbol to inspect its source-backed signature.

18 symbols
createRecallClientexportPermalinkSource
TS
createRecallClient
Exported from @absolutejs/meeting-recall