Skip to content

Releases: daily-co/daily-js

0.21.0

28 Oct 17:21

Choose a tag to compare

Features

  • Introduced a new event, live-streaming-started that corresponds to when a live streaming has started for the call. The event payload optionally includes the streaming layout:

    {
      "action": "live-streaming-started",
      "layout": {} // see layout object in [startLiveStreaming](https://docs.daily.co/reference/daily-js/instance-methods/start-live-streaming)
    }
  • Beta (cloud recording): Added support for recording-started and recording-stopped for cloud-beta recording. All recording-started events will now include the type of recording started (ie. "local", "cloud", "rtp-tracks", "output-byte-stream", or "cloud-beta"). When the type is cloud-beta or rtp-tracks, the recording-started event will also include startedBy with the participant id of the person who started the recording. cloud-beta recordings will also include the same layout property as live streaming events.

    {
      "action": "recording-started",
      "callFrameId": "16149871051110.5607513282111183",
      "layout": { "preset": "default" }, // only for rtp-tracks recordings
      "local": true, // only present for local and cloud recordings if you started the recording
      "recordingId": "cab2be92-1551-42d8-bcdf-11fe7bd81923", // only for cloud recordings
      "startedBy": "1c6d5474-b133-4993-c943-f1ffdbb38cad", // the participant that started a cloud-beta or rtp-tracks recording
      "type": "cloud-beta" // or rtp-tracks, local, cloud, or output-byte-stream
    }

Bugfixes

  • added missing userName to the DailyCallOptions type
  • Beta (background blur): added better validation for the optional config object passed in as part of processor in updateInputSettings
  • Beta (background blur): changed the strength value from being an int ranging from 0-10 to a float percentage value, ranging from 0-1.
  • Resolved an issue that would cause cloud-beta or rtp-tracks recordings to stop if startRecording() was called multiple times in the same session.

0.20.0

13 Oct 17:32

Choose a tag to compare

Features

  • Added language support for Russian. See docs on [setDailyLang()](https://docs.daily.co/reference/daily-js/instance-methods/set-daily-lang#main) and the IFrame Properties for information on setting the language. Use ru to specify Russian.
  • Beta (background blur): In Prebuilt only, added support for enabling/disabling UI for turning on background blur. To enable, you must set the (not documented) enable_video_processing_ui property to true in your domain or room properties. This is defaulted to false. Please contact help@daily.co for more details and the implications of turning this feature on.
  • Beta (background blur): Added ability to detect if a device/browser supports video processing (ie. background blur). See supportsVideoProcessing returned by supportedBrowser().

0.19.0

30 Sep 20:03

Choose a tag to compare

Features

  • For prebuilt users, Added show-local-video-changed event that fires when a local participant hides or shows their own video element (when the setShowLocalVideo() method is called)..

  • Introduced new method, getNetworkTopology() which indicates whether the call is happening over an "sfu" or "peer" connection type.

    let { topology } = await call.getNetworkTopology();
    // topology will be set to 'sfu' | 'peer' | 'none' (if not in the call)
  • Added support for new portrait layouts to live streaming with the options of a 'vertical' or 'inset' layout. See the portrait option in the docs for more information.

  • Beta Deepgram transcription support. Have a look at startTranscription() to get started.

  • Beta support for background blur / processing of the local camera. IMPORTANT: This is an early Beta. For more information on how to use this feature, please contact help@daily.co. Full documentation and support coming soon.

Bugfixes

  • Fix DailyCallOptions to allow audioSource/videoSource to be set via boolean.

Other improvements

  • Improved TypeScript definitions for recording/streaming options
  • Removed default values from startRecording and updateRecording to allow for detection of user-set vs. default values down the line in validation

0.18.0

02 Sep 13:19

Choose a tag to compare

Features

  • Introduces a new beta recording type, cloud-beta, which records a Daily call server-side.

    • Set the enable_recording property for a room or meeting token to cloud-beta to test it out. Be advised that this feature is beta and is subject to change

    • You can now pass a layout property to start startRecording that determines how participants' camera streams will be displayed in the recording. This layout object includes a preset key that specifies a default (grid), single-participant, or active-participant layout value. The default value can be set with an additional max_cam_streams key to indicate the number of participant videos displayed.

      await call.startRecording({
        width: 1280,
        height: 720,
          backgroundColor: "#FF1F2D3D",
        layout: {
          preset: "default",
          max_cam_streams: 5,
        },
      });
    • The new updateRecording method makes it possible to update the layout value mid-recording.

      await call.updateRecording({
        layout: {
          preset: "single-participant",
            session_id: "abcd123..."
        }
      });
    • Additional Notes:

      • The new layout property of startRecording and updateRecording method are only applicable for the new cloud-beta recording type.
      • Cloud recording is only available to Scale Plans and is an additional charge. See daily.co/pricing.

    For more details on these recording improvements, please contact daily

0.17.0

17 Aug 20:30

Choose a tag to compare

Features

  • Shipped activeSpeakerMode iframe property to control whether Daily Prebuilt displays the person currently speaking ({ activeSpeakerMode: true } ; this is the default) or a grid of call participants ({ activeSpeakerMode: false } ).

    Set Daily Prebuilt to grid mode

    DailyIFrame.createFrame({ activeSpeakerMode: false });
    
  • New iframe property layoutConfig customizes how the grid of video tiles behaves when the browser is resized (if the call is in grid mode, of course)

    Example layoutConfig usage

    DailyIframe.createFrame({
      layoutConfig: {
        grid: {
          minTilesPerPage: 3, // default: 1, minimum required: 1
          maxTilesPerPage: 36 // default: 25, maximum allowable: 49
        }
      }
    });
    
  • Added 'staged' media track subscription state that corresponds to setting up the connections for a track, but not transmitting data across that connection. This lets you "stage" tracks that you know you'll need soon, for later rapid transition into the fully "subscribed" state, without using any extra bandwidth. Reminder: Track subscriptions are only supported when your call is in SFU mode.

    Example 'staged' usage

    call.updateParticipant(id, {
      setSubscribedTracks: {
        video: 'staged',
      },
    });
    
  • Launched several affordances to give you control over how you want to receive the video tracks that you're subscribed to. These are referred to as receive settings. The first—and so far only—configurable receive settings are the desired maximum simulcast layers for video and screenVideo. A higher simulcast layer corresponds to higher quality. The new affordances are:

    Note: Simulcast layer settings only apply when a call is in SFU mode.

    Example usage: update receive settings for a participant on the fly

    call.updateReceiveSettings({
      'some-participant-id': { video: { layer: 0 } }
    });
    

0.16.0

28 Jul 21:56

Choose a tag to compare

Features

  • You can now customize colors when using Daily Prebuilt. Pass your own hex codes as a theme property to join() or createFrame(), or use the new setTheme() method. You can inspect your custom theme using the theme() method and get notified when you’ve changed it via the ‘theme-updated’ event.

Other improvements

  • preAuth() now rejects its Promise with a meaningful error when there's a room-related error (e.g. when in invalid or expired room is specified), with its contents matching the corresponding 'error' event's payload.

0.15.0

06 Jul 22:07

Choose a tag to compare

Bugfixes

  • Fixed a bug where the 'active-speaker-change' event wouldn't fire immediately upon join() if it wasn't the first time join() was invoked on the call object (i.e. if you were reusing the same call object for multiple calls).

0.14.0

27 May 19:51

Choose a tag to compare

Features

  • Added byDeviceInUse as a possible participants().local.tracks.video.blocked property. Now, when Daily can't access a camera on Windows because another app is using it, participants().local.tracks.video.blocked.byDeviceInUse will be set to true, and a 'participant-updated' event will fire. This sets you up to handle the use case (say, by showing a prompt asking your user to close other apps that might be using the camera).

0.13.0

12 May 20:37

Choose a tag to compare

Features

  • A new 'lang-updated' event fires when setDailyLang() is called and changes the call language. The payload includes two values: lang and langSetting. lang is the language currently in effect. langSetting is the value the user explicitly specified (e.g. via setDailyLang()) that resulted in that language ultimately being set. For example, if you call setDailyLang('en'), both your lang and your langSetting will be 'en'. If you call setDailyLang('user'), where 'user' is a special language setting that instructs Daily to use the user’s browser’s language preference, then langSetting will be 'user' and lang will be the language chosen based on the browser setting: 'en', 'fr', 'pt', or any other Daily-supported language.
  • A new getMeetingSession() method returns the current meeting session id. A meeting session is a set of one or more people in a room together during a specific time window.
  • A new 'meeting-session-updated' event fires when your meeting session changes. One meeting session ends and another begins, for example, when you've been sitting alone in a room for 10 minutes (cricket, cricket).
  • Norwegian language support has been added in Daily Prebuilt (language code 'no').

Bugfixes

  • Squashed a bug where if you invoked two or more async methods (like getInputDevices(), room(), requestAccess(), etc.) within the same millisecond, some of those methods might never have resolved.
  • When a call-ending error happens while using Daily Prebuilt, the call iframe will no longer be cleared. Instead, a relevant user-friendly error message (which might be an oxymoron) will be displayed.

0.12.0

19 Apr 22:18

Choose a tag to compare

Features

  • A new updateLiveStreaming() method exists to let you update on the fly parameters of a live stream you've previously started with startLiveStreaming(). So far the only parameter you can update is layout.
  • A new 'active-participant' layout preset has been added for live streaming: startLiveStreaming({ rtmpUrl: <url>, layout: { preset: 'active-participant' } }).
  • You can now specify 'user' as a value when invoking setDailyLang() or as a lang property when invoking join(), preAuth(), startCamera(), or factory methods like createFrame(). 'user' instructs Daily to use the user's preferred language as specified by the browser.
  • A new method, getDailyLang() returns a Promise that resolves to { lang: <language>, langSetting: <specified language> }, telling you both the language actually in effect and the language you've specified. For example, if you've specified 'user' as your language, getDailyLang() might give you { lang: 'en', langSetting: 'user'}.

Bugfixes

  • width and height have been added as arguments in the TypeScript declaration of the startLiveStreaming() method.

Other improvements

  • supportedBrowser().supported now returns false for Edge 18. So long, Edge 18, it's been a wild ride 👋.
  • 'error' and 'camera-error' event payloads now include an optional error field in addition to the existing errorMsg field. This new error field includes a type (which you can think of as an error code but a string constant) and an optional localizedMsg, which can provide you with a localized UI-friendly message describing the error. Note that not all kinds of errors have an error field yet—see index.d.ts's DailyCameraErrorType and DailyFatalErrorType for supported error types so far—but the eventual goal is that you'll be able to stop relying on errorMsg in your code to identify errors.
  • The preAuth() method will now put the meeting into an 'error' state (meetingState() === 'error') if it determines that a provided join token is expired or not yet valid or if the room is expired or not yet valid, and will fire a corresponding 'error' event. This behavior better matches join()'s behavior.