Changelog: RTMS - JavaScript - 1.1.0

Released: 2026-04-16 Updated: 2026-04-20

Visit Changelog

Summary: New RTMS SDK version.

RTMS SDK v1.1.0. For more information, see the Changelog on GitHub.

Added

ZCC (Zoom Contact Center) Support

  • engagement_id in join(): ZCC voice engagements identify sessions with an engagement_id instead of meeting_uuid; join() now accepts engagement_id as an alternative identifier
    (all bindings)
  • ZCC event constants: EVENT_CONSUMER_ANSWERED, EVENT_CONSUMER_END, EVENT_USER_ANSWERED, EVENT_USER_END, EVENT_USER_HOLD, EVENT_USER_UNHOLD exported as flat module-level
    constants in both Node.js and Python

Transcript Configuration

  • TranscriptParams: New parameter class for configuring transcript streams (language hint, content type, language detection)
  • TranscriptLanguage constants: Full set of language constants (ENGLISH, SPANISH, JAPANESE, CHINESE_SIMPLIFIED, and many more) for skipping auto-detection (~3s delay) by hinting
    the source language
  • setTranscriptParams()/set_transcript_params(): New method on Client to apply transcript configuration before joining (Node.js and Python)

HTTP Proxy Support

  • setProxy()/set_proxy(): New method on Client for configuring HTTP and HTTPS proxies for RTMS connections (Node.js and Python)

Individual Video Streams

  • subscribeVideo()/subscribe_video(): Subscribe or unsubscribe per-participant video when using VIDEO_SINGLE_INDIVIDUAL_STREAM mode
  • onParticipantVideo()/on_participant_video(): Callback fired when a participant’s video turns on or off
  • onVideoSubscribed()/on_video_subscribed(): Callback fired with the result of each subscribeVideo() call
  • EVENT_PARTICIPANT_VIDEO_ON / EVENT_PARTICIPANT_VIDEO_OFF: Exported as flat module-level constants in both Node.js and Python

Python — Concurrency & Scaling

  • EventLoop / EventLoopPool: New primitives for fine-grained control over polling threads; EventLoop wraps a dedicated background thread, EventLoopPool balances clients across a
    pool of threads
  • run_async(): Drop-in async replacement for run() using asyncio.sleep() between polls; composes naturally with aiohttp, FastAPI, asyncpg
  • Executor dispatch: Client(executor=...) and run(executor=...) / run_async(executor=...) dispatch data callbacks to a concurrent.futures.Executor, keeping the poll loop fast for
    CPU-bound or I/O-heavy callbacks
  • Async callback detection: Coroutine callbacks are detected automatically and scheduled on the running event loop via asyncio.run_coroutine_threadsafe
  • GIL release in poll(): The C++ poll call now releases the GIL, allowing other Python threads (e.g. the webhook HTTP server) to run freely during polling
  • Context manager support: with rtms.Client() as client: guarantees leave() is called on exit
  • Lazy alloc() / thread affinity: Client() construction is safe from any thread; the C SDK handle is allocated lazily on the EventLoop’s own thread to satisfy the C SDK’s
    thread-affinity constraint
  • Snake_case aliases: All camelCase methods have snake_case aliases (on_audio_data, set_audio_params, subscribe_event, etc.)

Metadata & AI Interpreter Fields

  • Full metadata fields: Metadata now exposes userId, userName, startTs, endTs in both bindings
  • AiInterpreter fields: Metadata now exposes aiInterpreter with language pair targets from the AI language interpreter SDK feature

Constants & Enums

  • IntEnum for Python codec/rate/option types: AudioCodec, VideoCodec, AudioSampleRate, AudioChannel, DataOption are now proper Python IntEnum values (comparisons with
    integers still work)
  • DataOption: Unified stream delivery mode enum covering both audio (AUDIO_MIXED_STREAM, AUDIO_MULTI_STREAMS) and video (VIDEO_SINGLE_ACTIVE_STREAM,
    VIDEO_SINGLE_INDIVIDUAL_STREAM, VIDEO_MIXED_GALLERY_VIEW) options — mirrors the C++ MEDIA_DATA_OPTION enum directly; AudioDataOption and VideoDataOption kept as backward-compat
    aliases
  • Bidirectional param aliases: All four param structs (AudioParams, VideoParams, DeskshareParams, TranscriptParams) now accept both snake_case and camelCase field names so
    existing code continues to work regardless of convention

Fixed

  • Spurious configure warnings on leave: updateMediaConfiguration was called during callback teardown after the session was already closed, printing 4 "Failed to update media configuration" warnings on every clean leave; suppressed by tracking sdk_opened_ state and calling markClosed() before stopping callbacks

Changed

  • Protocol enums moved to rtms.h: EVENT_TYPE, ZCC_VOICE_EVENT_TYPE, SESSION_STATE, STREAM_STATE, MESSAGE_TYPE, STOP_REASON, and TRANSCRIPT_LANGUAGE are now defined in the
    shared C++ header, making them automatically available to both Node.js and Python bindings