November 25, 2024
Overview
November brings background effects, enhanced reliability, and platform-wide improvements to our SDKs and Media Services. Key updates include:
- Support for automatic client-side recording recovery during meeting moves (pre-beta).
- Background blur, virtual background, and custom audio track support for iOS and Android SDKs.
- Better logging for recordings and streaming-related errors and other transcription improvements.
Additional improvements include better state management, permission handling, and various stability fixes across all platforms. Complete release history is available in our Github release notes:
daily-js
0.73.0
Recording and Streaming Recovery During Meeting Moves (Pre-beta)
Added client-side support for automatic recovery of recordings and streaming during meeting moves.
Meeting moves are Daily's automatic process for transferring ongoing meetings between servers. This happens during planned maintenance and deployments, as well as for automatic failover if server connectivity issues occur. In most cases, these moves are harmless to end users. However, they previously required manual handling for features like recording and streaming.
- When enabled, your recordings and live streams will automatically resume after a meeting move occurs, eliminating the need for manual intervention or custom recovery logic.
- This feature ensures continuous recording/streaming during both planned maintenance and unexpected server transitions, reducing gaps in your recorded and streamed content.
- Currently available as an opt-in feature. Contact help@daily.co if you're interested in testing this functionality on your domain.
Fixed leave()
race condition
Fixed a timing issue where calling leave()
immediately after join()
could result in unexpected behavior:
// Previously this could occasionally cause issuesawait call.join();call.leave(); // might be ignored
Resolved edge cases where
leave()
calls would sometimes return a promise that never fulfilled, particularly when:- Transitioning between meeting states rapidly
- Managing multiple join/leave operations in quick succession
Added additional state validation to prevent race conditions between
join()
andleave()
operationsThis change improves reliability for applications that need to handle rapid meeting state transitions, such as moving participants between rooms or implementing reconnection logic.
Fixed Chrome 129 Device Selection Issues
Fixed device selection behavior in Chrome 129+ where setting a deviceId
as ideal
(instead of exact
) would silently fall back to the default device:
// Previously in Chrome 129+:const constraints = {video: {deviceId: { ideal: 'requested-camera-id' }, // Would silently use default camera},};
- Added proper error handling when requested devices aren't available
- This resolves issues where camera/microphone selection would appear to succeed but continue using the previous or default device
- This fix ensures consistent device selection behavior, particularly important when users need to switch between multiple cameras or microphones.
Fixed Audio Processing Detection in Safari 17.0-17.3
- Corrected browser capability detection for audio processing features in Safari versions 17.0 through 17.3. Previously, these versions would incorrectly report support for audio processing features.
- This ensures that applications using audio processing features (like Krisp's noise cancellation) can accurately determine browser compatibility and provide appropriate fallback experiences.
- Audio processing is now correctly reported as supported only in Safari 17.4 and above.
Fixed Resource Loading URL Resolution
Fixed an edge case in URL resolution when calling methods in a specific order:
// Previously this could cause resource loading from incorrect serversawait call.startCamera(); // Without a URL// Any resource loading here would use incorrect serverawait call.join({ url: 'https://your-domain.daily.co/room' });
- This ensures resources are always loaded from the correct Daily production server, particularly important when using features that require additional resources before joining a call, especially in restrictive network environments.
Dependency updates including Sentry
We've updated dependencies including Sentry to the latest versions to resolve security vulnerabilities. This required a change in how we use Sentry, but our usage should not interfere or bleed into your Sentry and vice versa.
Please reach out to help@daily.co if you see otherwise.
Improved Error Logging for Participant Updates
Fixed misleading error messages that would appear in dashboard logs when calling updateParticipant()
or updateParticipants()
:
- Reduced noise in dashboard logs by no longer treating participant-not-found cases as errors.
- These messages commonly occurred during normal operation when participants left the call but pending updates were still being processed.
- Now only logs actual errors related to permissions or other substantial issues.
- No changes to functionality - calls to
updateParticipant()
for unknown participants continue to be handled as no-ops.
Removed Legacy Device Handling System
The legacy device handling system has been fully deprecated and removed:
- The
v2CamAndMic
configuration flag now has no effect as all clients automatically use the modern device handling system. - No action required for existing applications since this system has been the default since version 0.49.0.
- If you see references to
v2CamAndMic
in your codebase, you can safely remove them.
Version Support Update
- The oldest supported version of
daily-js
is now 0.62.0.
daily-react
0.22.0
Improved Browser Compatibility for Audio Level Observation
- Added error handling to prevent unhandled exceptions when local audio monitoring is not supported by the browser.
- Applications using useAudioLevelObserver now continue functioning normally in browsers that don't support audio level monitoring.
- This improves the stability of features that depend on audio level detection, like audio visualizers or speaking indicators.
Fixed Room Expiration Logic for Mixed Token and Room Settings
- Fixed
useRoomExp
hook to correctly handle combinations of token expiration (exp
) and room ejection settings. - This resolves UI inconsistencies where expiration countdown banners would appear based on token expiration even when room ejection wasn't configured.
- Ensures expiration warnings only show when actual ejection will occur, preventing confusing user experiences.
- Particularly important for applications using token-based authentication alongside room expiration settings.
0.21.3
Improved Graceful Degradation for Disabled WebRTC
Added graceful fallback handling to prevent application crashes when WebRTC features are disabled or blocked by privacy browser extensions:
- This improves compatibility with privacy-focused browser extensions that often disable WebRTC features.
- Components like
<DailyProvider/>
and<DailyAudio/>
now handle these scenarios gracefully instead of throwing runtime errors. - Particularly important for applications that need to maintain functionality even when users have restricted WebRTC access.
react-native-daily-js
0.70.0
Fixed iOS Camera Orientation in Portrait Mode
Fixed a camera initialization issue affecting iOS 16.x devices where initial video constraints would be incorrectly set in portrait mode:
// Previously in iOS 16.x on initial join:{ height: 720, width: 1280 } // Incorrect landscape dimensions// After fix - correct portrait dimensions:{ height: 1280, width: 720 } // Correct portrait dimensions
- This resolves an issue where users would experience zoomed-in video feeds when first joining a call in portrait orientation.
- The fix ensures correct video dimensions are set on initial join, eliminating the need to rotate the device to fix the view.
- Primarily affected iOS 16.x devices in Chrome and WKWebView-based browsers (embedded webviews).
Improved Android Permission Handling
- Fixed several Android-specific permission issues:
// Previously requested both permissions regardless of call settingsconst audioOnlyCall = Daily.createCallObject({videoSource: false, // Camera permission still requestedaudioSource: true,});// Now correctly requests only needed permissionsconst audioOnlyCall = Daily.createCallObject({videoSource: false, // No camera permission requestedaudioSource: true, // Only microphone permission requested});
- Fixed a race condition where tracks weren't properly initialized if users took longer to respond to permission prompts
These changes improve the permission flow on Android by:
- Only requesting necessary permissions based on call configuration.
- Ensuring permissions are properly handled regardless of user response time.
- Preventing unnecessary camera permission requests for audio-only calls.
- Optimizing foreground service permissions:
- It is recommended that developers remove
FOREGROUND_SERVICE_CAMERA
permission fromAndroidManifest.xml
when not needed. - Update
foregroundServiceType
configuration to exclude camera when not required.
- It is recommended that developers remove
Fixed Global Event Listener Cleanup
- Added missing
removeEventListener
when cleaning up global shims. - Resolves potential conflicts with other React Native libraries that use global variables.
Additional Updates
This release also includes several core improvements shared with daily-js 0.73.0:
- Automatic recording/streaming recovery during meeting moves.
- Fixed join/leave timing issue.
- Dependency updates including Sentry upgrade.
- Less noisy logging for participant updates.
- Removal of legacy device handling system.
See the daily-js 0.73.0 section for full details on these changes.
daily-android
0.26.0
Background Effects Support
Added support for camera background blur and virtual background effects via VideoProcessor
:
BackgroundBlur
: Apply adjustable background blur (strength: 0.0 to 1.0).BackgroundImage
: Replace background with an image from your assets directory.
To use this feature, add co.daily:client-videoprocessor-plugin:0.1.0
as a dependency to your app's build.gradle
file.
Use VideoMediaTrackSettingsUpdate.processor
to configure background effects. See our VideoProcessor and VideoMediaTrackSettingsUpdate docs for detailed usage.
Example usage is available for reference in our Android demo app.
Custom Audio Tracks Support
Added support for playing custom audio tracks during calls - useful for scenarios like background music, high-quality audio playback, sound effects, and more. New methods include:
addCustomAudioTrack()
: Add a new custom audio track to the call.updateCustomAudioTrack()
: Modify an existing custom audio track.removeCustomAudioTrack()
: Remove a custom audio track from the call.
These tracks are independent of participant audio/video streams, allowing for flexible audio playback during calls. See implementation examples in our Android demo app.
- Fixed
setTransform()
crash withVideoTextureView
on older Android versions. - Renamed
org.webrtc
package toco.daily.webrtc
to avoid conflicts. - Updated subscription state method names for better clarity.
Fixed VideoTextureView Crash on Older Android Versions
Fixed a crash that occurred when using VideoTextureView
on Android API levels 23-25. The issue was related to thread restrictions when calling setTransform()
on older Android versions. This fix improves compatibility for apps supporting Android 6.0 (Marshmallow) and above.
0.25.0
WebRTC Package Namespace Change
Renamed our WebRTC package from org.webrtc to co.daily.webrtc to prevent conflicts with other WebRTC implementations in your application. This change allows you to safely use multiple WebRTC-based SDKs in the same project.
Added Resolution Change Detection for VideoTextureView
Added VideoTextureView.Listener interface and setListener() method to monitor video resolution changes. This enables applications to respond to video dimension updates in real-time, useful for implementing dynamic video overlays or layouts.
0.24.0
Added Support for REST API App Messages
Added new CallClientListener.onAppMessageFromRestApi()
callback to handle app messages sent through Daily's REST API. This addition maintains backward compatibility while allowing your app to receive app messages from both client-side participants and server-side REST API calls.
Deprecated Transcription tier
Property
The transcription property tier
has been deprecated in favor of model
. This change aligns with Deepgram's updated API which has moved away from the tier-based system. See Deepgram's model documentation for available options.
daily-ios
0.25.0
Added support for custom audio tracks
Added support for playing custom audio tracks during calls - useful for scenarios like background music, high-quality audio playback, sound effects, and more. New methods include:
addCustomAudioTrack()
: Add a new custom audio track to the call.updateCustomAudioTrack()
: Modify an existing custom audio track.removeCustomAudioTrack()
: Remove a custom audio track from the call.
These tracks are independent of participant audio/video streams, allowing for flexible audio playback during calls. See implementation examples in our iOS demo app.
0.24.0
Added REST API App Message Support
Added new CallClientListener.onAppMessageFromRestApi()
callback for receiving app messages sent through Daily's REST API. This addition maintains backward compatibility while allowing your app to receive app messages from both client-side participants and server-side REST API calls.
Deprecated Transcription Tier Property
The transcription property tier
has been deprecated in favor of model
. This change aligns with Deepgram's updated API which has moved away from the tier-based system. See Deepgram's model documentation for available options.
- Added new delegate methods for handling custom audio tracks.
- Fixed camera zoom issues in Portrait mode.
- Enhanced resource cleanup processes.
- Improved error handling for audio device selection.
daily-python
0.13.0
Added Comprehensive Dial-in Event Support
Added new event handlers to provide complete visibility into dial-in call lifecycle:
on_dialin_connected
: Triggered when initial connection is established with SIP/PSTN endpoint.on_dialin_stopped
: Fired when remote endpoint disconnects the call.on_dialin_warning
: Handles non-fatal issues (e.g., codec fallbacks).on_dialin_error
: Captures fatal errors that prevent service continuation.
Each event handler receives relevant data payload containing details about the dial-in session state. See our Python SDK reference for complete event payload details.
Fixed Virtual Speaker Deadlock
Resolved a deadlock issue that could occur when:
- Reading from a virtual speaker before any remote participants joined.
- Subsequently attempting to exit the application.
The fix corrects the initialization sequence between the Daily speaker device and its proxy component, preventing situations where the speaker could become permanently blocked waiting for nonexistent audio data.
Daily Prebuilt
- Added
visualState
option forcustomTrayButtons
giving developers more control over button appearance and behavior. - Fixed an issue where resizing the Prebuilt window with chat open could result in a fatal error. This occurred when sending emojis and scrolling through chat messages in a room with advanced chat enabled.
- Participants now automatically leave the call when encountering a fatal error or crash to prevent orphaned participants.
- Enhanced custom button UX by rendering labels instead of tooltips in the more menu.
- Fixed recording/streaming status indicator disappearing during meeting moves.
Media Services
Dial-in and Dial-out
Added missing payload properties to dial-in and dial-out webhook events:
- Added
userId
to dial-out webhook events. - Added
sessionId
to dial-in webhook events.
Transcription
display_name
for HIPAA customers:- Transcripts now include participant display names when stored in customer-managed infrastructure, improving speaker identification while maintaining HIPAA compliance.
Recording and Live Streaming
- Enhanced error handling and logging:
- Improved error message detection and logging for better troubleshooting.
- Added detection of common recording/streaming issues including authorization failures and publishing restrictions.
- Expanded known error patterns for recording/streaming connection failures and S3 permission problems.
- Fixed a bug in VCS where participant order changes with dominant flag even when
dominant.followDomFlag
is off.
Batch Processor
The Batch Processor API now uses the improved nova-2-general
Deepgram model by default, which supports all languages and provides improved accuracy. This change removes language-specific model handling since nova-2-general
works universally.