Video Javascript SDK Release Notes

v2.36.0 — November 2026

Added

  • Performed iOS 27 validation. The Vonage Web SDK has been validated on iOS 27, confirming smooth operation across iOS mobile browsers and WebView applications.

  • Client Observability: quality restriction insights. Statistics now provide more detail on why video quality is being limited, for both subscribers and publishers:

    • Subscriber video statistics now report whether the received video quality is being restricted, and where the restriction originates. The new senderQualityRestriction property of the subscriber video statistics (stats.video) reflects restrictions applied by the immediate sender (the Media Router in routed sessions, or the publisher in relayed sessions).
    • The new remotePublisherQualityRestriction property reflects restrictions applied by the originating publisher, such as CPU or uplink bandwidth constraints.
    • Changes in the sender quality restriction are now also reported in the subscriber videoQualityChanged event, with the reason property set to "senderQualityRestriction".
    • The network condition reason now includes two new values, which apply only to the publisher's transport: "noSubscribers" (the publisher bitrate is limited because there are no active subscribers) and "downstreamConstraint" (the publisher bitrate is constrained by downstream receiver conditions, typically when client simulcast is disabled).

    For more information, see this documentation.

  • Built-in publish retry. The SDK now automatically retries a failed session.publish() when the failure is caused by a recoverable error, so applications no longer need to implement their own retry logic. Three new optional properties of the publisher options object (passed to OT.initPublisher(), or to session.publish() when publishing without a pre-initialized publisher) control this behavior:

    • maxPublishTimeout (default 15000 ms) sets the maximum time allowed for the publish operation to succeed. While the timer runs, the SDK retries on any recoverable error. Non-recoverable errors are still returned immediately, and a timeout error is returned if the timeout expires. When set explicitly, it acts as a hard timeout. When left at the default, the timer pauses while the socket is disconnected and resumes when it reconnects.
    • onRetry is a callback invoked each time a recoverable error is encountered and a retry is about to be attempted. It receives the error that triggered the retry. It is informational only and cannot cancel the retry.
    • fallbackOnPartialPermission (default false), when true, lets the publish continue with the permitted devices if the user grants access to only some of them, or if a device permission is revoked after publishing has started. Denied or revoked devices are reported via the accessDenied event. If all requested devices are denied, publishing fails as before.

    For more information, see this documentation.

  • End-to-end encryption: new error when encryption is not enabled. Setting an encryption secret in a session that was not created with end-to-end encryption enabled now results in a new OT_ENCRYPTION_NOT_ENABLED error. Previously, the secret was silently ignored. For more information, see this documentation.

Fixed

  • Fixed an issue on iOS WKWebView where applying a background blur or background replacement video filter caused the published video to appear rotated 90 degrees, both in the publisher preview and for subscribers.
  • Improved the stability of the background replacement video filter on Safari.
  • Improved the reliability of publishers and subscribers in sessions that use adaptive media routing, when switching between relayed and routed connections.
  • Fixed memory leaks that could occur when publishers were repeatedly created and destroyed, or when the published stream changed.
  • Improved automatic reconnection to the session. When the server rejects a reconnection attempt with an error that cannot be recovered, the client now stops retrying and disconnects right away, instead of retrying until the reconnection timeout expires.
  • Fixed an issue where a publisher without an audio source could throw an error when updating its audio level.
  • Fixed an issue where calling Subscriber.subscribeToCaptions() before the subscriber had finished connecting to the stream could fail. The call is now applied once the subscriber is ready.
  • Fixed an issue where retrieving WebRTC statistics could fail in some browsers and webviews, affecting statistics collection and network tests. The SDK now detects the statistics API supported by the browser more reliably.

v2.35.4 — November 2026

Fixed

  • Fixed an issue where deprecation warnings for the transportStats and senderStats statistics properties and the addEventListener API were logged to the console even when the application did not use these deprecated APIs. The warnings now appear only when the application uses a deprecated API. This version also fixes the statsContainer property of the Publisher networkConditionChanged event, which now includes the stats, subscriberId, and connectionId properties, like the videoQualityChanged event.

v2.35.3 — October 2026

Fixed

  • Fixed an issue in AMR sessions where a Subscriber could emit a disconnected event without subsequently emitting a connected event after the connection recovered.
  • Fixed an issue where networkDegradationSource could report only bothOrUnclear in AMR-enabled Routed 1:1 sessions. Sender statistics activation is now retried after subscription completes when necessary, improving detection of whether degradation is local or remote.
  • Fixed an issue where video could remain disabled after audio fallback and an AMR media-mode transition, even after network conditions improved.
  • Fixed an issue where networkDegradationSource could incorrectly identify the source of network degradation in peer-to-peer (P2P) connections.
  • Fixed an issue where enabling a video filter, changing the publisher's preferred resolution, and then toggling video off and on produced an unexpected zoom effect.
  • Fixed a race condition that could cause an OpenTok:MediaProcessor:error error when publishVideo(true) was called while applyVideoFilter() was still in progress.
  • Improved Subscriber audio fallback state handling so that networkConditionChanged reports network conditions consistently while Subscriber Audio Fallback is active.
  • Reduced unnecessary audioAcquisitionProblem events during PeerConnection reconnection, disconnection, or failure.
  • Fixed duplicate promise declarations in the TypeScript definitions that could cause TypeScript errors TS2300 and TS2717 in projects using OpenTok.js 2.35.1 or 2.35.2.
  • Fixed an issue where Publisher Audio Fallback could remain active after calling publishVideo(false) followed immediately by publishVideo(true), preventing video from resuming when network conditions improved.
  • Fixed an issue where calling publishAudio(false) during Publisher Audio Fallback could cause Subscribers to receive unexpected videoEnabled or videoDisabled events with reason=publishVideo.
  • Fixed an issue where a Subscriber did not receive a connected event after AMR recovered from a disconnected P2P connection and transitioned back to Routed media mode.
  • Improved subscription reliability in Safari 26 by extending the timeout for gathering relay ICE candidates, reducing timeout errors 1501 and 1554.

v2.34.3 — September 2026

Fixed

  • Fixed an issue where retrieving WebRTC statistics could throw a TypeError on iOS WKWebView and Capacitor-wrapped apps, causing errors when collecting stats or running network tests.
  • Fixed an issue where the audioLocalCandidateType, videoLocalCandidateType, audioRemoteCandidateType, and videoRemoteCandidateType fields in the QoS stats could report incorrect values by using the last ICE candidate instead of the selected one.
  • Improved the automatic reconnection logic so that the reconnection timeout window is no longer reset on every transport reconnection, preventing the client from getting stuck in an infinite reconnection cycle.
  • Fixed an issue where video filters, background blur, and background replacement did not work on Safari 27 and iOS 27.

v2.35.2 — September 2026

Fixed

  • Fixed an issue where a black flicker could briefly appear on a subscribed stream immediately after subscribing during 1-on-1 calls on Safari.
  • Fixed an issue where retrieving WebRTC statistics could throw a TypeError on iOS WKWebView and Capacitor-wrapped apps, causing errors when collecting stats or running network tests.
  • Fixed an issue on Firefox where rapidly toggling video off and on (calling publishVideo(false) immediately followed by publishVideo(true)) could intermittently leave the published video disabled, showing a black frame until the next toggle.
  • Fixed an issue where the audioLocalCandidateType, videoLocalCandidateType, audioRemoteCandidateType, and videoRemoteCandidateType fields in the QoS stats could report incorrect values by using the last ICE candidate instead of the selected one.
  • Fixed an issue where a subscriber could fail to start when the browser's autoplay policy blocked video playback. The subscriber now times out the play attempt and continues with muted audio (which the user can unmute) instead of failing to subscribe.
  • Improved the automatic reconnection logic so that the reconnection timeout window is no longer reset on every transport reconnection, preventing the client from getting stuck in an infinite reconnection cycle.
  • Fixed an issue where video filters, background blur, and background replacement did not work on Safari 27 and iOS 27.