Segmentation Fault When Using @zoom/rtms SDK — Crashes After the client.join()

I’m using the Zoom RTMS SDK (@zoom/rtms) in a Node.js app following the rtms-quickstart-js repo. My app receives the meeting.rtms_started webhook, but it segfaults immediately after calling client.join(payload), even if all event listeners are removed.

Output when I start the meeting:

npm start

> rtms-quickstart@1.0.0 start
> node index.js
webhook  | 2025-08-01T15:07:24.251Z | INFO  | Creating standard HTTP webhook server
webhook  | 2025-08-01T15:07:24.255Z | INFO  | Listening for webhook events at http://localhost:8080/
webhook  | 2025-08-01T15:07:37.381Z | DEBUG | Received webhook request: /
webhook  | 2025-08-01T15:07:37.383Z | INFO  | Received event: meeting.rtms_started
Received event: meeting.rtms_started
{
  "meeting_uuid": "IC72ewmGRbm9jmPmrUwNMQ==",
  "operator_id": "7z2o8fMIRTO_4w_RGX0JdA",
  "rtms_stream_id": "138bb5d5ee7c40e4b0754f86a18e28c5",
  "server_urls": "wss://zoomsjc144-195-46-189zssgw.sjc.zoom.us:443"
}
\[1\]    95479 segmentation fault  npm start

I also tested with the following minimal version of index.js (no event listeners, no setVideoParams or setDeskshareParams, just .join()):

import rtms from "@zoom/rtms";

rtms.onWebhookEvent(async ({ event, payload }) => {
  console.log(`Received event: ${event}`);
  console.log(JSON.stringify(payload, null, 2));

  if (event !== "meeting.rtms_started") return;

  const client = new rtms.Client();
  try {
    await client.join(payload);
    console.log("Successfully joined stream");
  } catch (err) {
    console.error("join failed:", err);
  }
});

This version still crashes with a segmentation fault immediately after .join(payload).

Environment

  • Node version: v23.2.0
  • RTMS SDK version: @zoom/rtms@0.0.2
  • Platform: Mac M3

@Hassan5
You’re running into a segmentation fault because the RTMS client expects at least one data subscription handler to be registered (e.g., onVideoData, onAudioData, or onTranscriptData). Without any handlers, the SDK currently crashes after client.join().

To fix this, register at least one of the following before calling join():

client.onVideoData((data) => {
  // handle video frame
});

client.onAudioData((data) => {
  // handle audio frame
});

// Optional: also available
client.onTranscriptData((data) => {
  // handle transcript chunk
});

:warning: onDeskshareData is currently non-available,

2 Likes