Skip to content

[Performance]UI improvements #876

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 11 commits into
base: develop
Choose a base branch
from
Draft

Conversation

ipavlidakis
Copy link
Contributor

🔗 Issue Links

Provide all JIRA tickets and/or GitHub issues related to this PR, if applicable.

🎯 Goal

Describe why we are making this change.

📝 Summary

Provide bullet points with the most important changes in the codebase.

🛠 Implementation

Provide a detailed description of the implementation and explain your decisions if you find them relevant.

🎨 Showcase

Add relevant screenshots and/or videos/gifs to easily see what this PR changes, if applicable.

Before After
img img

🧪 Manual Testing Notes

Explain how this change can be tested manually, if applicable.

☑️ Contributor Checklist

  • I have signed the Stream CLA (required)
  • This change follows zero ⚠️ policy (required)
  • This change should receive manual QA
  • Changelog is updated with client-facing changes
  • New code is covered by unit tests
  • Comparison screenshots added for visual changes
  • Affected documentation updated (tutorial, CMS)

🎁 Meme

Provide a funny gif or image that relates to your work on this pull request. (Optional)

@ipavlidakis ipavlidakis self-assigned this Jun 26, 2025
@ipavlidakis ipavlidakis added bug Something isn't working enhancement New feature or request labels Jun 26, 2025
@ipavlidakis ipavlidakis requested a review from a team as a code owner June 26, 2025 15:38
@ipavlidakis ipavlidakis marked this pull request as draft June 26, 2025 15:39
Copy link

Public Interface

+ public protocol CaptureDeviceProviding

+ @propertyWrapper public final class Atomic: @unchecked Sendable  
+ 
+   public var wrappedValue: T
+   
+ 
+   public init(wrappedValue: T,mode: Mode = .unfair)
+   
+ 
+   public enum Mode  
+   
+     case unfair
+     case recursive

+ public struct TrackVideoRendererView: UIViewRepresentable, Equatable  
+ 
+   public init(track: RTCVideoTrack,contentMode: UIView.ContentMode = .scaleAspectFill,sizeUpdater: @escaping SizeUpdater)
+   
+ 
+   public static func dismantleUIView(_ uiView: UIViewType,coordinator: Coordinator)
+   nonisolated public static func ==(lhs: TrackVideoRendererView,rhs: TrackVideoRendererView)-> Bool
+   public func makeUIView(context: Context)-> UIViewType
+   public func updateUIView(_ uiView: UIViewType,context: Context)
+   public func makeCoordinator()-> Coordinator

+ extension AVCaptureDevice  
+ 
+   public func outputFormat(preferredDimensions: CMVideoDimensions,preferredFrameRate: Int)-> AVCaptureDevice.Format?

+ public protocol CaptureDeviceProtocol: Sendable

+ public class TrackVideoRenderer: RTCMTLVideoView, @unchecked Sendable  
+ 
+   public init(track: RTCVideoTrack)
+   
+ 
+   override public func layoutSubviews()
+   override public func willMove(toWindow newWindow: UIWindow?)
+   override public func willMove(toSuperview newSuperview: UIView?)

- @available(iOS, introduced: 13, obsoleted: 14) public struct LobbyView_iOS13: View  
- 
-   public var body: some View
-   
- 
-   public init(viewFactory: Factory = DefaultViewFactory.shared,callViewModel: CallViewModel,callId: String,callType: String,callSettings: Binding<CallSettings>,onJoinCallTap: @escaping () -> Void,onCloseLobby: @escaping () -> Void)

- extension Alert  
- 
-   public static var defaultErrorAlert: Alert

- public struct PopoverButton: View  
- 
-   public var body: some View
-   
- 
-   public init(title: String,popoverShown: Binding<Bool>,action: @escaping () -> Void)

- @available(iOS, introduced: 13, obsoleted: 14) public struct LocalParticipantViewModifier_iOS13: ViewModifier  
- 
-   public func body(content: Content)-> some View

- public struct ParticipantPopoverView: View  
- 
-   public var body: some View
-   
- 
-   public init(participant: CallParticipant,call: Call?,popoverShown: Binding<Bool>,customView: (() -> CustomView)? = nil)

- @available(iOS, introduced: 13, obsoleted: 14) public struct CallContainer_iOS13: View  
- 
-   public var body: some View
-   
- 
-   public init(viewFactory: Factory = DefaultViewFactory.shared,viewModel: CallViewModel)

 @MainActor open class CallViewModel: ObservableObject  
-   public var participants: [CallParticipant]
+   @Published public var participants: [CallParticipant]

 public struct CallConnectingView: View  
-   public var title: String
+   public var body: some View
-   public var callControls: CallControls
+   
-   public var callTopView: CallTopView
+ 
-   public var body: some View
+   public init(viewFactory: Factory = DefaultViewFactory.shared,outgoingCallMembers: [Member],title: String,callControls: CallControls,callTopView: CallTopView)
-   
- 
-   public init(viewFactory: Factory = DefaultViewFactory.shared,outgoingCallMembers: [Member],title: String,callControls: CallControls,callTopView: CallTopView)

 open class StreamCallAudioRecorder: @unchecked Sendable  
-   
+   @Atomic public private var isRecording: Bool
- 
+   
-   public init(filename: String)
+ 
-   
+   public init(filename: String)
- 
+   
-   open func startRecording(ignoreActiveCall: Bool = false)async 
+ 
-   open func stopRecording()async
+   open func startRecording(ignoreActiveCall: Bool = false)async 
+   open func stopRecording()async

- @available(iOS 14.0, *) public struct BroadcastIconView: View  
+ public struct BroadcastIconView: View  

 public struct StatelessHangUpIconView: View  
-   public weak var call: Call?
+   public var size: CGFloat
-   public var size: CGFloat
+   public var actionHandler: ActionHandler?
-   public var actionHandler: ActionHandler?
+   public var body: some View
-   public var body: some View
+   
-   
+ 
- 
+   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

- public class BroadcastObserver: ObservableObject  
+ public class BroadcastObserver: ObservableObject, @unchecked Sendable  

 public struct CallDurationView: View  
-   @MainActor public init(_ viewModel: CallViewModel)
+   public init(_ viewModel: CallViewModel)

- @available(iOS 14.0, *) public struct LocalParticipantViewModifier: ViewModifier  
+ public struct LocalParticipantViewModifier: ViewModifier  
-   
+   public init(participant: CallParticipant,call: Call?,showAllInfo: Bool,decorations: [VideoCallParticipantDecoration] = VideoCallParticipantDecoration.allCases)
- 
+   
-   public func body(content: Content)-> some View
+ 
+   public func body(content: Content)-> some View

- @available(iOS 14.0, *) public struct CallContainer: View  
+ public struct CallContainer: View  

- @available(iOS 14.0, *) public struct CallModifier: ViewModifier  
+ public struct CallModifier: ViewModifier  
-   
+   @MainActor public init(viewModel: CallViewModel)
- 
+   
-   public func body(content: Content)-> some View
+ 
+   public func body(content: Content)-> some View

- @available(iOS 14.0, *) public struct LobbyView: View  
+ public struct LobbyView: View  
-   public init(viewFactory: Factory = DefaultViewFactory.shared,viewModel: LobbyViewModel? = nil,callId: String,callType: String,callSettings: Binding<CallSettings>,onJoinCallTap: @escaping () -> Void,onCloseLobby: @escaping () -> Void)
+   public init(viewFactory: Factory = DefaultViewFactory.shared,callViewModel: CallViewModel,callId: String,callType: String,callSettings: Binding<CallSettings>,onJoinCallTap: @escaping () -> Void,onCloseLobby: @escaping () -> Void)

 extension InjectedValues  
-   public var pictureInPictureAdapter: StreamPictureInPictureAdapter
+   public var utils: Utils

 public struct StatelessAudioOutputIconView: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var actionHandler: ActionHandler?
+ 
-   public var body: some View
+   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   
- 
-   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

- @available(iOS 14.0, *) public struct VideoViewOverlay: View  
+ public struct VideoViewOverlay: View  

- @available(iOS 14.0, *) public struct LayoutMenuView: View  
+ public struct LayoutMenuView: View  

 public struct HorizontalParticipantsListView: View  
-   public var viewFactory: Factory
+   public var body: some View
-   public var participants: [CallParticipant]
+   
-   public var frame: CGRect
+ 
-   public var call: Call?
+   public init(viewFactory: Factory = DefaultViewFactory.shared,participants: [CallParticipant],frame: CGRect,call: Call?,innerItemSpace: CGFloat = 8,showAllInfo: Bool = false)
-   public var innerItemSpace: CGFloat
-   public var showAllInfo: Bool
-   public var body: some View
-   
- 
-   public init(viewFactory: Factory = DefaultViewFactory.shared,participants: [CallParticipant],frame: CGRect,call: Call?,innerItemSpace: CGFloat = 8,showAllInfo: Bool = false)

 public struct StatelessSpeakerIconView: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var actionHandler: ActionHandler?
+ 
-   public var body: some View
+   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   
- 
-   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

 public struct StatelessParticipantsListButton: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var isActive: Binding<Bool>
+ 
-   public var actionHandler: ActionHandler?
+   @MainActor public init(call: Call?,size: CGFloat = 44,isActive: Binding<Bool>,actionHandler: ActionHandler? = nil)
-   public var body: some View
-   
- 
-   @MainActor public init(call: Call?,size: CGFloat = 44,isActive: Binding<Bool>,actionHandler: ActionHandler? = nil)

 public struct StatelessVideoIconView: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var actionHandler: ActionHandler?
+ 
-   public var body: some View
+   public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   
- 
-   public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

 extension View  
-   public func toastView(toast: Binding<Toast?>)-> some View
+   @ViewBuilder public func snapshot(trigger: SnapshotTriggering,snapshotHandler: @escaping @Sendable(UIImage) -> Void)-> some View

 public struct StatelessToggleCameraIconView: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var actionHandler: ActionHandler?
+ 
-   public var body: some View
+   public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   
- 
-   public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

 @MainActor public class LobbyViewModel: ObservableObject, @unchecked Sendable  
-   @Published public var viewfinderImage: Image?
+   @Published public var viewFinderImage: Image?
-   @Published public var participants
+   @Published public var participants: [User]
-   
+   @Published public var audioOn: Bool
- 
+   @Published public var videoOn: Bool
-   public init(callType: String,callId: String)
+   @Published public var cameraPosition: CameraPosition
-   
+   @Published public var audioLevels: [Float]
- 
+   @Published public var isSilent: Bool
-   public func startCamera(front: Bool)
+   
-   public func stopCamera()
+ 
-   public func cleanUp()
+   public init(callType: String,callId: String,callViewModel: CallViewModel,onJoinCallTap: @escaping () -> Void,onCloseLobbyTap: @escaping () -> Void)
-   public func didUpdate(callSettings: CallSettings)async
+   
+ 
+   public func startCamera(front: Bool)
+   public func stopCamera()
+   public func cleanUp()
+   public func didTapJoin()
+   public func didTapClose()
+   public func toggleMicrophoneEnabled()
+   public func toggleCameraEnabled()

 public struct StatelessMicrophoneIconView: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var actionHandler: ActionHandler?
+ 
-   public var body: some View
+   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   
- 
-   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

 public struct MicrophoneCheckView: View  
-   public init(audioLevels: [Float],microphoneOn: Bool,isSilent: Bool,isPinned: Bool,maxHeight: Float = 14)
+   public init(viewModel: LobbyViewModel,isPinned: Bool,maxHeight: Float = 14,)
+   public init(audioLevels: [Float],microphoneOn: Bool,isSilent: Bool,isPinned: Bool,maxHeight: Float = 14)

 public struct StreamLazyImage: View  
-   public init(imageURL: URL?,contentMode: ContentMode = .fill,placeholder: @escaping () -> Placeholder)
+   public init(imageURL: URL?,contentMode: ContentMode = .fill,@ViewBuilder placeholder: @escaping () -> Placeholder)
+   public init(imageURL: URL?,contentMode: ContentMode = .fill)

Copy link

1 Message
📖 Skipping Danger since the Pull Request is classed as Draft/Work In Progress

Generated by 🚫 Danger

Copy link

@ipavlidakis ipavlidakis force-pushed the performance/ui-improvements branch from d05f590 to cd25475 Compare June 27, 2025 11:24
Copy link

Public Interface

+ @propertyWrapper public final class Atomic: @unchecked Sendable  
+ 
+   public var wrappedValue: T
+   
+ 
+   public init(wrappedValue: T,mode: Mode = .unfair)
+   
+ 
+   public enum Mode  
+   
+     case unfair
+     case recursive

+ extension AVCaptureDevice  
+ 
+   public func outputFormat(preferredDimensions: CMVideoDimensions,preferredFrameRate: Int)-> AVCaptureDevice.Format?

+ public struct TrackVideoRendererView: UIViewRepresentable, Equatable  
+ 
+   public init(track: RTCVideoTrack,contentMode: UIView.ContentMode = .scaleAspectFill,sizeUpdater: @escaping SizeUpdater)
+   
+ 
+   public static func dismantleUIView(_ uiView: UIViewType,coordinator: Coordinator)
+   nonisolated public static func ==(lhs: TrackVideoRendererView,rhs: TrackVideoRendererView)-> Bool
+   public func makeUIView(context: Context)-> UIViewType
+   public func updateUIView(_ uiView: UIViewType,context: Context)
+   public func makeCoordinator()-> Coordinator

+ public class TrackVideoRenderer: RTCMTLVideoView, @unchecked Sendable  
+ 
+   public init(track: RTCVideoTrack)
+   
+ 
+   override public func layoutSubviews()
+   override public func willMove(toWindow newWindow: UIWindow?)
+   override public func willMove(toSuperview newSuperview: UIView?)

+ public protocol CaptureDeviceProviding

+ public protocol CaptureDeviceProtocol: Sendable

- extension Alert  
- 
-   public static var defaultErrorAlert: Alert

- public struct ParticipantPopoverView: View  
- 
-   public var body: some View
-   
- 
-   public init(participant: CallParticipant,call: Call?,popoverShown: Binding<Bool>,customView: (() -> CustomView)? = nil)

- @available(iOS, introduced: 13, obsoleted: 14) public struct CallContainer_iOS13: View  
- 
-   public var body: some View
-   
- 
-   public init(viewFactory: Factory = DefaultViewFactory.shared,viewModel: CallViewModel)

- @available(iOS, introduced: 13, obsoleted: 14) public struct LocalParticipantViewModifier_iOS13: ViewModifier  
- 
-   public func body(content: Content)-> some View

- public struct PopoverButton: View  
- 
-   public var body: some View
-   
- 
-   public init(title: String,popoverShown: Binding<Bool>,action: @escaping () -> Void)

- @available(iOS, introduced: 13, obsoleted: 14) public struct LobbyView_iOS13: View  
- 
-   public var body: some View
-   
- 
-   public init(viewFactory: Factory = DefaultViewFactory.shared,callViewModel: CallViewModel,callId: String,callType: String,callSettings: Binding<CallSettings>,onJoinCallTap: @escaping () -> Void,onCloseLobby: @escaping () -> Void)

 open class StreamCallAudioRecorder: @unchecked Sendable  
-   
+   @Atomic public private var isRecording: Bool
- 
+   
-   public init(filename: String)
+ 
-   
+   public init(filename: String)
- 
+   
-   open func startRecording(ignoreActiveCall: Bool = false)async 
+ 
-   open func stopRecording()async
+   open func startRecording(ignoreActiveCall: Bool = false)async 
+   open func stopRecording()async

 public struct CallConnectingView: View  
-   public var title: String
+   public var body: some View
-   public var callControls: CallControls
+   
-   public var callTopView: CallTopView
+ 
-   public var body: some View
+   public init(viewFactory: Factory = DefaultViewFactory.shared,outgoingCallMembers: [Member],title: String,callControls: CallControls,callTopView: CallTopView)
-   
- 
-   public init(viewFactory: Factory = DefaultViewFactory.shared,outgoingCallMembers: [Member],title: String,callControls: CallControls,callTopView: CallTopView)

- @available(iOS 14.0, *) public struct LayoutMenuView: View  
+ public struct LayoutMenuView: View  

 public struct HorizontalParticipantsListView: View  
-   public var viewFactory: Factory
+   public var body: some View
-   public var participants: [CallParticipant]
+   
-   public var frame: CGRect
+ 
-   public var call: Call?
+   public init(viewFactory: Factory = DefaultViewFactory.shared,participants: [CallParticipant],frame: CGRect,call: Call?,innerItemSpace: CGFloat = 8,showAllInfo: Bool = false)
-   public var innerItemSpace: CGFloat
-   public var showAllInfo: Bool
-   public var body: some View
-   
- 
-   public init(viewFactory: Factory = DefaultViewFactory.shared,participants: [CallParticipant],frame: CGRect,call: Call?,innerItemSpace: CGFloat = 8,showAllInfo: Bool = false)

- @available(iOS 14.0, *) public struct CallModifier: ViewModifier  
+ public struct CallModifier: ViewModifier  
-   
+   @MainActor public init(viewModel: CallViewModel)
- 
+   
-   public func body(content: Content)-> some View
+ 
+   public func body(content: Content)-> some View

 public struct CallDurationView: View  
-   @MainActor public init(_ viewModel: CallViewModel)
+   public init(_ viewModel: CallViewModel)

 extension InjectedValues  
-   public var pictureInPictureAdapter: StreamPictureInPictureAdapter
+   public var utils: Utils

- @available(iOS 14.0, *) public struct LobbyView: View  
+ public struct LobbyView: View  
-   public init(viewFactory: Factory = DefaultViewFactory.shared,viewModel: LobbyViewModel? = nil,callId: String,callType: String,callSettings: Binding<CallSettings>,onJoinCallTap: @escaping () -> Void,onCloseLobby: @escaping () -> Void)
+   public init(viewFactory: Factory = DefaultViewFactory.shared,callViewModel: CallViewModel,callId: String,callType: String,callSettings: Binding<CallSettings>,onJoinCallTap: @escaping () -> Void,onCloseLobby: @escaping () -> Void)

- public struct RTMP  
+ public struct RTMP: Equatable  

- public class BroadcastObserver: ObservableObject  
+ public class BroadcastObserver: ObservableObject, @unchecked Sendable  

 public struct StatelessParticipantsListButton: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var isActive: Binding<Bool>
+ 
-   public var actionHandler: ActionHandler?
+   @MainActor public init(call: Call?,size: CGFloat = 44,isActive: Binding<Bool>,actionHandler: ActionHandler? = nil)
-   public var body: some View
-   
- 
-   @MainActor public init(call: Call?,size: CGFloat = 44,isActive: Binding<Bool>,actionHandler: ActionHandler? = nil)

- @MainActor public class CallState: ObservableObject  
+ public class CallState: ObservableObject  
-   @Published public internal var sessionId: String
+   @Published public private var sessionId: String
-   @Published public internal var participants
+   @Published public private var participants: [CallParticipant]
-   @Published public internal var participantsMap
+   @Published public private var participantsMap: [String: CallParticipant]
-   @Published public internal var localParticipant: CallParticipant?
+   @Published public private var localParticipant: CallParticipant?
-   @Published public internal var dominantSpeaker: CallParticipant?
+   @Published public private var dominantSpeaker: CallParticipant?
-   @Published public internal var remoteParticipants: [CallParticipant]
+   @Published public private var remoteParticipants: [CallParticipant]
-   @Published public internal var activeSpeakers: [CallParticipant]
+   @Published public private var activeSpeakers: [CallParticipant]
-   @Published public internal var members: [Member]
+   @Published public private var members: [Member]
-   @Published public internal var screenSharingSession: ScreenSharingSession?
+   @Published public private var screenSharingSession: ScreenSharingSession?
-   @Published public internal var recordingState: RecordingState
+   @Published public private var recordingState: RecordingState
-   @Published public internal var blockedUserIds: Set<String>
+   @Published public private var blockedUserIds: Set<String>
-   @Published public internal var settings: CallSettingsResponse?
+   @Published public private var settings: CallSettingsResponse?
-   @Published public internal var ownCapabilities: [OwnCapability]
+   @Published public private var ownCapabilities: [OwnCapability]
-   @Published public internal var capabilitiesByRole: [String: [String]]
+   @Published public private var capabilitiesByRole: [String: [String]]
-   @Published public internal var backstage: Bool
+   @Published public private var backstage: Bool
-   @Published public internal var broadcasting: Bool
+   @Published public private var broadcasting: Bool
-   @Published public internal var createdAt: Date
+   @Published public private var createdAt: Date
-   @Published public internal var updatedAt: Date
+   @Published public private var updatedAt: Date
-   @Published public internal var startsAt: Date?
+   @Published public private var startsAt: Date?
-   @Published public internal var startedAt: Date?
+   @Published public private var startedAt: Date?
-   @Published public internal var endedAt: Date?
+   @Published public private var endedAt: Date?
-   @Published public internal var endedBy: User?
+   @Published public private var endedBy: User?
-   @Published public internal var custom: [String: RawJSON]
+   @Published public private var custom: [String: RawJSON]
-   @Published public internal var team: String?
+   @Published public private var team: String?
-   @Published public internal var createdBy: User?
+   @Published public private var createdBy: User?
-   @Published public internal var ingress: Ingress?
+   @Published public private var ingress: Ingress?
-   @Published public internal var permissionRequests: [PermissionRequest]
+   @Published public private var permissionRequests: [PermissionRequest]
-   @Published public internal var transcribing: Bool
+   @Published public private var transcribing: Bool
-   @Published public internal var captioning: Bool
+   @Published public private var captioning: Bool
-   @Published public internal var egress: EgressResponse?
+   @Published public private var egress: EgressResponse?
-   @Published public internal var session: CallSessionResponse?
+   @Published public private var session: CallSessionResponse?
-   @Published public internal var reconnectionStatus
+   @Published public private var reconnectionStatus: ReconnectionStatus
-   @Published public internal var anonymousParticipantCount: UInt32
+   @Published public private var anonymousParticipantCount: UInt32
-   @Published public internal var participantCount: UInt32
+   @Published public private var participantCount: UInt32
-   @Published public internal var isInitialized: Bool
+   @Published public private var isInitialized: Bool
-   @Published public internal var callSettings
+   @Published public private var callSettings: CallSettings
-   @Published public internal var isCurrentUserScreensharing: Bool
+   @Published public private var isCurrentUserScreensharing: Bool
-   @Published public internal var duration: TimeInterval
+   @Published public private var duration: TimeInterval
-   @Published public internal var statsReport: CallStatsReport?
+   @Published public private var statsReport: CallStatsReport?
-   @Published public internal var closedCaptions: [CallClosedCaption]
+   @Published public private var closedCaptions: [CallClosedCaption]
-   @Published public internal var statsCollectionInterval: Int
+   @Published public private var statsCollectionInterval: Int
-   @Published public internal var incomingVideoQualitySettings: IncomingVideoQualitySettings
+   @Published public private var incomingVideoQualitySettings: IncomingVideoQualitySettings
-   @Published public internal var disconnectionError: Error?
+   @Published public private var disconnectionError: Error?

 public struct StreamLazyImage: View  
-   public init(imageURL: URL?,contentMode: ContentMode = .fill,placeholder: @escaping () -> Placeholder)
+   public init(imageURL: URL?,contentMode: ContentMode = .fill,@ViewBuilder placeholder: @escaping () -> Placeholder)
+   public init(imageURL: URL?,contentMode: ContentMode = .fill)

 public struct MicrophoneCheckView: View  
-   public init(audioLevels: [Float],microphoneOn: Bool,isSilent: Bool,isPinned: Bool,maxHeight: Float = 14)
+   public init(viewModel: LobbyViewModel,isPinned: Bool,maxHeight: Float = 14,)
+   public init(audioLevels: [Float],microphoneOn: Bool,isSilent: Bool,isPinned: Bool,maxHeight: Float = 14)

- @available(iOS 14.0, *) public struct LocalParticipantViewModifier: ViewModifier  
+ public struct LocalParticipantViewModifier: ViewModifier  
-   
+   public init(participant: CallParticipant,call: Call?,showAllInfo: Bool,decorations: [VideoCallParticipantDecoration] = VideoCallParticipantDecoration.allCases)
- 
+   
-   public func body(content: Content)-> some View
+ 
+   public func body(content: Content)-> some View

- public struct PermissionRequest: @unchecked Sendable, Identifiable  
+ public struct PermissionRequest: @unchecked Sendable, Identifiable, Equatable  
-   public func reject()
+   public static func ==(lhs: PermissionRequest,rhs: PermissionRequest)-> Bool
+   public func reject()

- @available(iOS 14.0, *) public struct VideoViewOverlay: View  
+ public struct VideoViewOverlay: View  

 public struct StatelessMicrophoneIconView: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var actionHandler: ActionHandler?
+ 
-   public var body: some View
+   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   
- 
-   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

- public struct Ingress  
+ public struct Ingress: Equatable  

 public struct StatelessToggleCameraIconView: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var actionHandler: ActionHandler?
+ 
-   public var body: some View
+   public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   
- 
-   public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

 public class Call: @unchecked Sendable, WSEventsSubscriber  
-   @MainActor public internal var state
+   public let state: CallState
-   @MainActor public func currentUserCanRequestPermissions(_ permissions: [Permission])-> Bool
+   public func currentUserCanRequestPermissions(_ permissions: [Permission])-> Bool
-   @MainActor public func currentUserHasCapability(_ capability: OwnCapability)-> Bool
+   public func currentUserHasCapability(_ capability: OwnCapability)-> Bool
-   @discardableResult @MainActor public func collectUserFeedback(rating: Int,reason: String? = nil,custom: [String: RawJSON]? = nil)async throws -> CollectUserFeedbackResponse
+   @discardableResult public func collectUserFeedback(rating: Int,reason: String? = nil,custom: [String: RawJSON]? = nil)async throws -> CollectUserFeedbackResponse
-   @MainActor public func updateParticipantsSorting(with sortComparators: [StreamSortComparator<CallParticipant>])
+   public func updateParticipantsSorting(with sortComparators: [StreamSortComparator<CallParticipant>])
-   @MainActor public func setIncomingVideoQualitySettings(_ value: IncomingVideoQualitySettings)async 
+   public func setIncomingVideoQualitySettings(_ value: IncomingVideoQualitySettings)async 
-   @MainActor public func updateClosedCaptionsSettings(itemPresentationDuration: TimeInterval,maxVisibleItems: Int)async 
+   public func updateClosedCaptionsSettings(itemPresentationDuration: TimeInterval,maxVisibleItems: Int)async 

 @MainActor open class CallViewModel: ObservableObject  
-   public var participants: [CallParticipant]
+   @Published public var participants: [CallParticipant]

 public struct StatelessSpeakerIconView: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var actionHandler: ActionHandler?
+ 
-   public var body: some View
+   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   
- 
-   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

 public struct StatelessHangUpIconView: View  
-   public weak var call: Call?
+   public var size: CGFloat
-   public var size: CGFloat
+   public var actionHandler: ActionHandler?
-   public var actionHandler: ActionHandler?
+   public var body: some View
-   public var body: some View
+   
-   
+ 
- 
+   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

 @MainActor public class LobbyViewModel: ObservableObject, @unchecked Sendable  
-   @Published public var viewfinderImage: Image?
+   @Published public var viewFinderImage: Image?
-   @Published public var participants
+   @Published public var participants: [User]
-   
+   @Published public var audioOn: Bool
- 
+   @Published public var videoOn: Bool
-   public init(callType: String,callId: String)
+   @Published public var cameraPosition: CameraPosition
-   
+   @Published public var audioLevels: [Float]
- 
+   @Published public var isSilent: Bool
-   public func startCamera(front: Bool)
+   
-   public func stopCamera()
+ 
-   public func cleanUp()
+   public init(callType: String,callId: String,callViewModel: CallViewModel,onJoinCallTap: @escaping () -> Void,onCloseLobbyTap: @escaping () -> Void)
-   public func didUpdate(callSettings: CallSettings)async
+   
+ 
+   public func startCamera(front: Bool)
+   public func stopCamera()
+   public func cleanUp()
+   public func didTapJoin()
+   public func didTapClose()
+   public func toggleMicrophoneEnabled()
+   public func toggleCameraEnabled()

- @available(iOS 14.0, *) public struct CallContainer: View  
+ public struct CallContainer: View  

 public struct StatelessAudioOutputIconView: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var actionHandler: ActionHandler?
+ 
-   public var body: some View
+   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   
- 
-   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

 public struct StatelessVideoIconView: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var actionHandler: ActionHandler?
+ 
-   public var body: some View
+   public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   
- 
-   public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

- public struct ScreenSharingSession  
+ public struct ScreenSharingSession: Equatable  

 extension View  
-   public func toastView(toast: Binding<Toast?>)-> some View
+   @ViewBuilder public func snapshot(trigger: SnapshotTriggering,snapshotHandler: @escaping @Sendable(UIImage) -> Void)-> some View

 public class StreamVideo: ObservableObject, @unchecked Sendable  
-   public var state: State
+   @Published public internal var connection: ConnectionStatus
-   public let videoConfig: VideoConfig
+   @Published public internal var user: User
-   public var user: User
+   @Published public internal var activeCall: Call?
-   public var isHardwareAccelerationAvailable: Bool
+   @Published public internal var ringingCall: Call?
-   public lazy var rejectionReasonProvider: RejectionReasonProviding
+   public let state: State
-   
+   public let videoConfig: VideoConfig
- 
+   public var user: User
-   public convenience init(apiKey: String,user: User,token: UserToken,videoConfig: VideoConfig = VideoConfig(),pushNotificationsConfig: PushNotificationsConfig = .default,tokenProvider: UserTokenProvider? = nil)
+   public var isHardwareAccelerationAvailable: Bool
-   
+   public lazy var rejectionReasonProvider: RejectionReasonProviding
- 
+   
-   public func connect()async throws 
+ 
-   public func call(callType: String,callId: String,callSettings: CallSettings? = nil,file: StaticString = #file,function: StaticString = #function,line: UInt = #line)-> Call
+   public convenience init(apiKey: String,user: User,token: UserToken,videoConfig: VideoConfig = VideoConfig(),pushNotificationsConfig: PushNotificationsConfig = .default,tokenProvider: UserTokenProvider? = nil)
-   public func makeCallsController(callsQuery: CallsQuery)-> CallsController
+   
-   @discardableResult public func setDevice(id: String)async throws -> ModelResponse
+ 
-   @discardableResult public func setVoipDevice(id: String)async throws -> ModelResponse
+   public func connect()async throws 
-   @discardableResult public func deleteDevice(id: String)async throws -> ModelResponse
+   public func call(callType: String,callId: String,callSettings: CallSettings? = nil,file: StaticString = #file,function: StaticString = #function,line: UInt = #line)-> Call
-   public func listDevices()async throws -> [Device]
+   public func makeCallsController(callsQuery: CallsQuery)-> CallsController
-   public func disconnect()async 
+   @discardableResult public func setDevice(id: String)async throws -> ModelResponse
-   public func eventPublisher()-> AnyPublisher<VideoEvent, Never>
+   @discardableResult public func setVoipDevice(id: String)async throws -> ModelResponse
-   public func eventPublisher(for event: WSEvent.Type)-> AnyPublisher<WSEvent, Never>
+   @discardableResult public func deleteDevice(id: String)async throws -> ModelResponse
-   public func subscribe()-> AsyncStream<VideoEvent>
+   public func listDevices()async throws -> [Device]
-   public func subscribe(for event: WSEvent.Type)-> AsyncStream<WSEvent>
+   public func disconnect()async 
-   public func queryCalls(next: String? = nil,watch: Bool = false)async throws -> (calls: [Call], next: String?)
+   public func eventPublisher()-> AnyPublisher<VideoEvent, Never>
-   public func queryCalls(filters: [String: RawJSON]?,sort: [SortParamRequest] = [SortParamRequest.descending("created_at")],limit: Int? = 25,watch: Bool = false)async throws -> (calls: [Call], next: String?)
+   public func eventPublisher(for event: WSEvent.Type)-> AnyPublisher<WSEvent, Never>
-   
+   public func subscribe()-> AsyncStream<VideoEvent>
- 
+   public func subscribe(for event: WSEvent.Type)-> AsyncStream<WSEvent>
-   public final class State: ObservableObject, @unchecked Sendable  
+   public func queryCalls(next: String? = nil,watch: Bool = false)async throws -> (calls: [Call], next: String?)
-   
+   public func queryCalls(filters: [String: RawJSON]?,sort: [SortParamRequest] = [SortParamRequest.descending("created_at")],limit: Int? = 25,watch: Bool = false)async throws -> (calls: [Call], next: String?)
-     @Published public internal var connection: ConnectionStatus
+   
-     @Published public internal var user: User
+ 
-     @Published public internal var activeCall: Call?
+   public final class State: ObservableObject, @unchecked Sendable  
-     @Published public internal var ringingCall: Call?
+   
+     @Published public internal var connection: ConnectionStatus
+     @Published public internal var user: User
+     @Published public internal var activeCall: Call?
+     @Published public internal var ringingCall: Call?

- @available(iOS 14.0, *) public struct BroadcastIconView: View  
+ public struct BroadcastIconView: View  

Copy link

Public Interface

+ extension AVCaptureDevice  
+ 
+   public func outputFormat(preferredDimensions: CMVideoDimensions,preferredFrameRate: Int)-> AVCaptureDevice.Format?

+ @propertyWrapper public final class Atomic: @unchecked Sendable  
+ 
+   public var wrappedValue: T
+   
+ 
+   public init(wrappedValue: T,mode: Mode = .unfair)
+   
+ 
+   public enum Mode  
+   
+     case unfair
+     case recursive

+ public protocol CaptureDeviceProviding

+ public class TrackVideoRenderer: RTCMTLVideoView, @unchecked Sendable  
+ 
+   public init(track: RTCVideoTrack)
+   
+ 
+   override public func layoutSubviews()
+   override public func willMove(toWindow newWindow: UIWindow?)
+   override public func willMove(toSuperview newSuperview: UIView?)

+ public protocol CaptureDeviceProtocol: Sendable

+ public struct TrackVideoRendererView: UIViewRepresentable, Equatable  
+ 
+   public init(track: RTCVideoTrack,contentMode: UIView.ContentMode = .scaleAspectFill,sizeUpdater: @escaping SizeUpdater)
+   
+ 
+   public static func dismantleUIView(_ uiView: UIViewType,coordinator: Coordinator)
+   nonisolated public static func ==(lhs: TrackVideoRendererView,rhs: TrackVideoRendererView)-> Bool
+   public func makeUIView(context: Context)-> UIViewType
+   public func updateUIView(_ uiView: UIViewType,context: Context)
+   public func makeCoordinator()-> Coordinator

- extension Alert  
- 
-   public static var defaultErrorAlert: Alert

- @available(iOS, introduced: 13, obsoleted: 14) public struct LocalParticipantViewModifier_iOS13: ViewModifier  
- 
-   public func body(content: Content)-> some View

- @available(iOS, introduced: 13, obsoleted: 14) public struct CallContainer_iOS13: View  
- 
-   public var body: some View
-   
- 
-   public init(viewFactory: Factory = DefaultViewFactory.shared,viewModel: CallViewModel)

- public struct ParticipantPopoverView: View  
- 
-   public var body: some View
-   
- 
-   public init(participant: CallParticipant,call: Call?,popoverShown: Binding<Bool>,customView: (() -> CustomView)? = nil)

- public struct PopoverButton: View  
- 
-   public var body: some View
-   
- 
-   public init(title: String,popoverShown: Binding<Bool>,action: @escaping () -> Void)

- @available(iOS, introduced: 13, obsoleted: 14) public struct LobbyView_iOS13: View  
- 
-   public var body: some View
-   
- 
-   public init(viewFactory: Factory = DefaultViewFactory.shared,callViewModel: CallViewModel,callId: String,callType: String,callSettings: Binding<CallSettings>,onJoinCallTap: @escaping () -> Void,onCloseLobby: @escaping () -> Void)

 extension InjectedValues  
-   public var pictureInPictureAdapter: StreamPictureInPictureAdapter
+   public var utils: Utils

- public struct Ingress  
+ public struct Ingress: Equatable  

- @available(iOS 14.0, *) public struct VideoViewOverlay: View  
+ public struct VideoViewOverlay: View  

 public struct HorizontalParticipantsListView: View  
-   public var viewFactory: Factory
+   public var body: some View
-   public var participants: [CallParticipant]
+   
-   public var frame: CGRect
+ 
-   public var call: Call?
+   public init(viewFactory: Factory = DefaultViewFactory.shared,participants: [CallParticipant],frame: CGRect,call: Call?,innerItemSpace: CGFloat = 8,showAllInfo: Bool = false)
-   public var innerItemSpace: CGFloat
-   public var showAllInfo: Bool
-   public var body: some View
-   
- 
-   public init(viewFactory: Factory = DefaultViewFactory.shared,participants: [CallParticipant],frame: CGRect,call: Call?,innerItemSpace: CGFloat = 8,showAllInfo: Bool = false)

- @available(iOS 14.0, *) public struct LobbyView: View  
+ public struct LobbyView: View  
-   public init(viewFactory: Factory = DefaultViewFactory.shared,viewModel: LobbyViewModel? = nil,callId: String,callType: String,callSettings: Binding<CallSettings>,onJoinCallTap: @escaping () -> Void,onCloseLobby: @escaping () -> Void)
+   public init(viewFactory: Factory = DefaultViewFactory.shared,callViewModel: CallViewModel,callId: String,callType: String,callSettings: Binding<CallSettings>,onJoinCallTap: @escaping () -> Void,onCloseLobby: @escaping () -> Void)

- public struct RTMP  
+ public struct RTMP: Equatable  

 extension View  
-   public func toastView(toast: Binding<Toast?>)-> some View
+   @ViewBuilder public func snapshot(trigger: SnapshotTriggering,snapshotHandler: @escaping @Sendable(UIImage) -> Void)-> some View

- @available(iOS 14.0, *) public struct LayoutMenuView: View  
+ public struct LayoutMenuView: View  

 public struct CallConnectingView: View  
-   public var title: String
+   public var body: some View
-   public var callControls: CallControls
+   
-   public var callTopView: CallTopView
+ 
-   public var body: some View
+   public init(viewFactory: Factory = DefaultViewFactory.shared,outgoingCallMembers: [Member],title: String,callControls: CallControls,callTopView: CallTopView)
-   
- 
-   public init(viewFactory: Factory = DefaultViewFactory.shared,outgoingCallMembers: [Member],title: String,callControls: CallControls,callTopView: CallTopView)

- public class BroadcastObserver: ObservableObject  
+ public class BroadcastObserver: ObservableObject, @unchecked Sendable  

 public class StreamVideo: ObservableObject, @unchecked Sendable  
-   public var state: State
+   @Published public internal var connection: ConnectionStatus
-   public let videoConfig: VideoConfig
+   @Published public internal var user: User
-   public var user: User
+   @Published public internal var activeCall: Call?
-   public var isHardwareAccelerationAvailable: Bool
+   @Published public internal var ringingCall: Call?
-   public lazy var rejectionReasonProvider: RejectionReasonProviding
+   public let state: State
-   
+   public let videoConfig: VideoConfig
- 
+   public var user: User
-   public convenience init(apiKey: String,user: User,token: UserToken,videoConfig: VideoConfig = VideoConfig(),pushNotificationsConfig: PushNotificationsConfig = .default,tokenProvider: UserTokenProvider? = nil)
+   public var isHardwareAccelerationAvailable: Bool
-   
+   public lazy var rejectionReasonProvider: RejectionReasonProviding
- 
+   
-   public func connect()async throws 
+ 
-   public func call(callType: String,callId: String,callSettings: CallSettings? = nil,file: StaticString = #file,function: StaticString = #function,line: UInt = #line)-> Call
+   public convenience init(apiKey: String,user: User,token: UserToken,videoConfig: VideoConfig = VideoConfig(),pushNotificationsConfig: PushNotificationsConfig = .default,tokenProvider: UserTokenProvider? = nil)
-   public func makeCallsController(callsQuery: CallsQuery)-> CallsController
+   
-   @discardableResult public func setDevice(id: String)async throws -> ModelResponse
+ 
-   @discardableResult public func setVoipDevice(id: String)async throws -> ModelResponse
+   public func connect()async throws 
-   @discardableResult public func deleteDevice(id: String)async throws -> ModelResponse
+   public func call(callType: String,callId: String,callSettings: CallSettings? = nil,file: StaticString = #file,function: StaticString = #function,line: UInt = #line)-> Call
-   public func listDevices()async throws -> [Device]
+   public func makeCallsController(callsQuery: CallsQuery)-> CallsController
-   public func disconnect()async 
+   @discardableResult public func setDevice(id: String)async throws -> ModelResponse
-   public func eventPublisher()-> AnyPublisher<VideoEvent, Never>
+   @discardableResult public func setVoipDevice(id: String)async throws -> ModelResponse
-   public func eventPublisher(for event: WSEvent.Type)-> AnyPublisher<WSEvent, Never>
+   @discardableResult public func deleteDevice(id: String)async throws -> ModelResponse
-   public func subscribe()-> AsyncStream<VideoEvent>
+   public func listDevices()async throws -> [Device]
-   public func subscribe(for event: WSEvent.Type)-> AsyncStream<WSEvent>
+   public func disconnect()async 
-   public func queryCalls(next: String? = nil,watch: Bool = false)async throws -> (calls: [Call], next: String?)
+   public func eventPublisher()-> AnyPublisher<VideoEvent, Never>
-   public func queryCalls(filters: [String: RawJSON]?,sort: [SortParamRequest] = [SortParamRequest.descending("created_at")],limit: Int? = 25,watch: Bool = false)async throws -> (calls: [Call], next: String?)
+   public func eventPublisher(for event: WSEvent.Type)-> AnyPublisher<WSEvent, Never>
-   
+   public func subscribe()-> AsyncStream<VideoEvent>
- 
+   public func subscribe(for event: WSEvent.Type)-> AsyncStream<WSEvent>
-   public final class State: ObservableObject, @unchecked Sendable  
+   public func queryCalls(next: String? = nil,watch: Bool = false)async throws -> (calls: [Call], next: String?)
-   
+   public func queryCalls(filters: [String: RawJSON]?,sort: [SortParamRequest] = [SortParamRequest.descending("created_at")],limit: Int? = 25,watch: Bool = false)async throws -> (calls: [Call], next: String?)
-     @Published public internal var connection: ConnectionStatus
+   
-     @Published public internal var user: User
+ 
-     @Published public internal var activeCall: Call?
+   public final class State: ObservableObject, @unchecked Sendable  
-     @Published public internal var ringingCall: Call?
+   
+     @Published public internal var connection: ConnectionStatus
+     @Published public internal var user: User
+     @Published public internal var activeCall: Call?
+     @Published public internal var ringingCall: Call?

- @available(iOS 14.0, *) public struct CallModifier: ViewModifier  
+ public struct CallModifier: ViewModifier  
-   
+   @MainActor public init(viewModel: CallViewModel)
- 
+   
-   public func body(content: Content)-> some View
+ 
+   public func body(content: Content)-> some View

 public struct StreamLazyImage: View  
-   public init(imageURL: URL?,contentMode: ContentMode = .fill,placeholder: @escaping () -> Placeholder)
+   public init(imageURL: URL?,contentMode: ContentMode = .fill,@ViewBuilder placeholder: @escaping () -> Placeholder)
+   public init(imageURL: URL?,contentMode: ContentMode = .fill)

- @available(iOS 14.0, *) public struct LocalParticipantViewModifier: ViewModifier  
+ public struct LocalParticipantViewModifier: ViewModifier  
-   
+   public init(participant: CallParticipant,call: Call?,showAllInfo: Bool,decorations: [VideoCallParticipantDecoration] = VideoCallParticipantDecoration.allCases)
- 
+   
-   public func body(content: Content)-> some View
+ 
+   public func body(content: Content)-> some View

 public struct CallDurationView: View  
-   @MainActor public init(_ viewModel: CallViewModel)
+   public init(_ viewModel: CallViewModel)

 public struct StatelessHangUpIconView: View  
-   public weak var call: Call?
+   public var size: CGFloat
-   public var size: CGFloat
+   public var actionHandler: ActionHandler?
-   public var actionHandler: ActionHandler?
+   public var body: some View
-   public var body: some View
+   
-   
+ 
- 
+   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

 public class Call: @unchecked Sendable, WSEventsSubscriber  
-   @MainActor public internal var state
+   public let state: CallState
-   @MainActor public func currentUserCanRequestPermissions(_ permissions: [Permission])-> Bool
+   public func currentUserCanRequestPermissions(_ permissions: [Permission])-> Bool
-   @MainActor public func currentUserHasCapability(_ capability: OwnCapability)-> Bool
+   public func currentUserHasCapability(_ capability: OwnCapability)-> Bool
-   @discardableResult @MainActor public func collectUserFeedback(rating: Int,reason: String? = nil,custom: [String: RawJSON]? = nil)async throws -> CollectUserFeedbackResponse
+   @discardableResult public func collectUserFeedback(rating: Int,reason: String? = nil,custom: [String: RawJSON]? = nil)async throws -> CollectUserFeedbackResponse
-   @MainActor public func updateParticipantsSorting(with sortComparators: [StreamSortComparator<CallParticipant>])
+   public func updateParticipantsSorting(with sortComparators: [StreamSortComparator<CallParticipant>])
-   @MainActor public func setIncomingVideoQualitySettings(_ value: IncomingVideoQualitySettings)async 
+   public func setIncomingVideoQualitySettings(_ value: IncomingVideoQualitySettings)async 
-   @MainActor public func updateClosedCaptionsSettings(itemPresentationDuration: TimeInterval,maxVisibleItems: Int)async 
+   public func updateClosedCaptionsSettings(itemPresentationDuration: TimeInterval,maxVisibleItems: Int)async 

 public struct StatelessSpeakerIconView: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var actionHandler: ActionHandler?
+ 
-   public var body: some View
+   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   
- 
-   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

- @available(iOS 14.0, *) public struct BroadcastIconView: View  
+ public struct BroadcastIconView: View  

- @MainActor public class CallState: ObservableObject  
+ public class CallState: ObservableObject  
-   @Published public internal var sessionId: String
+   @Published public private var sessionId: String
-   @Published public internal var participants
+   @Published public private var participants: [CallParticipant]
-   @Published public internal var participantsMap
+   @Published public private var participantsMap: [String: CallParticipant]
-   @Published public internal var localParticipant: CallParticipant?
+   @Published public private var localParticipant: CallParticipant?
-   @Published public internal var dominantSpeaker: CallParticipant?
+   @Published public private var dominantSpeaker: CallParticipant?
-   @Published public internal var remoteParticipants: [CallParticipant]
+   @Published public private var remoteParticipants: [CallParticipant]
-   @Published public internal var activeSpeakers: [CallParticipant]
+   @Published public private var activeSpeakers: [CallParticipant]
-   @Published public internal var members: [Member]
+   @Published public private var members: [Member]
-   @Published public internal var screenSharingSession: ScreenSharingSession?
+   @Published public private var screenSharingSession: ScreenSharingSession?
-   @Published public internal var recordingState: RecordingState
+   @Published public private var recordingState: RecordingState
-   @Published public internal var blockedUserIds: Set<String>
+   @Published public private var blockedUserIds: Set<String>
-   @Published public internal var settings: CallSettingsResponse?
+   @Published public private var settings: CallSettingsResponse?
-   @Published public internal var ownCapabilities: [OwnCapability]
+   @Published public private var ownCapabilities: [OwnCapability]
-   @Published public internal var capabilitiesByRole: [String: [String]]
+   @Published public private var capabilitiesByRole: [String: [String]]
-   @Published public internal var backstage: Bool
+   @Published public private var backstage: Bool
-   @Published public internal var broadcasting: Bool
+   @Published public private var broadcasting: Bool
-   @Published public internal var createdAt: Date
+   @Published public private var createdAt: Date
-   @Published public internal var updatedAt: Date
+   @Published public private var updatedAt: Date
-   @Published public internal var startsAt: Date?
+   @Published public private var startsAt: Date?
-   @Published public internal var startedAt: Date?
+   @Published public private var startedAt: Date?
-   @Published public internal var endedAt: Date?
+   @Published public private var endedAt: Date?
-   @Published public internal var endedBy: User?
+   @Published public private var endedBy: User?
-   @Published public internal var custom: [String: RawJSON]
+   @Published public private var custom: [String: RawJSON]
-   @Published public internal var team: String?
+   @Published public private var team: String?
-   @Published public internal var createdBy: User?
+   @Published public private var createdBy: User?
-   @Published public internal var ingress: Ingress?
+   @Published public private var ingress: Ingress?
-   @Published public internal var permissionRequests: [PermissionRequest]
+   @Published public private var permissionRequests: [PermissionRequest]
-   @Published public internal var transcribing: Bool
+   @Published public private var transcribing: Bool
-   @Published public internal var captioning: Bool
+   @Published public private var captioning: Bool
-   @Published public internal var egress: EgressResponse?
+   @Published public private var egress: EgressResponse?
-   @Published public internal var session: CallSessionResponse?
+   @Published public private var session: CallSessionResponse?
-   @Published public internal var reconnectionStatus
+   @Published public private var reconnectionStatus: ReconnectionStatus
-   @Published public internal var anonymousParticipantCount: UInt32
+   @Published public private var anonymousParticipantCount: UInt32
-   @Published public internal var participantCount: UInt32
+   @Published public private var participantCount: UInt32
-   @Published public internal var isInitialized: Bool
+   @Published public private var isInitialized: Bool
-   @Published public internal var callSettings
+   @Published public private var callSettings: CallSettings
-   @Published public internal var isCurrentUserScreensharing: Bool
+   @Published public private var isCurrentUserScreensharing: Bool
-   @Published public internal var duration: TimeInterval
+   @Published public private var duration: TimeInterval
-   @Published public internal var statsReport: CallStatsReport?
+   @Published public private var statsReport: CallStatsReport?
-   @Published public internal var closedCaptions: [CallClosedCaption]
+   @Published public private var closedCaptions: [CallClosedCaption]
-   @Published public internal var statsCollectionInterval: Int
+   @Published public private var statsCollectionInterval: Int
-   @Published public internal var incomingVideoQualitySettings: IncomingVideoQualitySettings
+   @Published public private var incomingVideoQualitySettings: IncomingVideoQualitySettings
-   @Published public internal var disconnectionError: Error?
+   @Published public private var disconnectionError: Error?

 public struct StatelessToggleCameraIconView: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var actionHandler: ActionHandler?
+ 
-   public var body: some View
+   public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   
- 
-   public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

 public struct StatelessAudioOutputIconView: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var actionHandler: ActionHandler?
+ 
-   public var body: some View
+   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   
- 
-   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

 public struct StatelessVideoIconView: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var actionHandler: ActionHandler?
+ 
-   public var body: some View
+   public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   
- 
-   public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

 public struct StatelessParticipantsListButton: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var isActive: Binding<Bool>
+ 
-   public var actionHandler: ActionHandler?
+   @MainActor public init(call: Call?,size: CGFloat = 44,isActive: Binding<Bool>,actionHandler: ActionHandler? = nil)
-   public var body: some View
-   
- 
-   @MainActor public init(call: Call?,size: CGFloat = 44,isActive: Binding<Bool>,actionHandler: ActionHandler? = nil)

 @MainActor open class CallViewModel: ObservableObject  
-   public var participants: [CallParticipant]
+   @Published public var participants: [CallParticipant]

 @MainActor public class LobbyViewModel: ObservableObject, @unchecked Sendable  
-   @Published public var viewfinderImage: Image?
+   @Published public var viewFinderImage: Image?
-   @Published public var participants
+   @Published public var participants: [User]
-   
+   @Published public var audioOn: Bool
- 
+   @Published public var videoOn: Bool
-   public init(callType: String,callId: String)
+   @Published public var cameraPosition: CameraPosition
-   
+   @Published public var audioLevels: [Float]
- 
+   @Published public var isSilent: Bool
-   public func startCamera(front: Bool)
+   
-   public func stopCamera()
+ 
-   public func cleanUp()
+   public init(callType: String,callId: String,callViewModel: CallViewModel,onJoinCallTap: @escaping () -> Void,onCloseLobbyTap: @escaping () -> Void)
-   public func didUpdate(callSettings: CallSettings)async
+   
+ 
+   public func startCamera(front: Bool)
+   public func stopCamera()
+   public func cleanUp()
+   public func didTapJoin()
+   public func didTapClose()
+   public func toggleMicrophoneEnabled()
+   public func toggleCameraEnabled()

- public struct LobbyInfo: Equatable  
+ public struct LobbyInfo: Equatable, Sendable  

 public struct StatelessMicrophoneIconView: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var actionHandler: ActionHandler?
+ 
-   public var body: some View
+   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   
- 
-   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

 public struct MicrophoneCheckView: View  
-   public init(audioLevels: [Float],microphoneOn: Bool,isSilent: Bool,isPinned: Bool,maxHeight: Float = 14)
+   public init(viewModel: LobbyViewModel,isPinned: Bool,maxHeight: Float = 14)
+   public init(audioLevels: [Float],microphoneOn: Bool,isSilent: Bool,isPinned: Bool,maxHeight: Float = 14)

- @available(iOS 14.0, *) public struct CallContainer: View  
+ public struct CallContainer: View  

- public struct PermissionRequest: @unchecked Sendable, Identifiable  
+ public struct PermissionRequest: @unchecked Sendable, Identifiable, Equatable  
-   public func reject()
+   public static func ==(lhs: PermissionRequest,rhs: PermissionRequest)-> Bool
+   public func reject()

 open class StreamCallAudioRecorder: @unchecked Sendable  
-   
+   @Atomic public private var isRecording: Bool
- 
+   
-   public init(filename: String)
+ 
-   
+   public init(filename: String)
- 
+   
-   open func startRecording(ignoreActiveCall: Bool = false)async 
+ 
-   open func stopRecording()async
+   open func startRecording(ignoreActiveCall: Bool = false)async 
+   open func stopRecording()async

- public struct ScreenSharingSession  
+ public struct ScreenSharingSession: Equatable  

@ipavlidakis ipavlidakis force-pushed the performance/ui-improvements branch from b123407 to 6538db2 Compare June 27, 2025 15:22
Copy link

Public Interface

+ public protocol TimerControl

+ public protocol CaptureDeviceProtocol: Sendable

+ public struct DefaultTimer: Timer  
+ 
+   @discardableResult public static func schedule(timeInterval: TimeInterval,queue: DispatchQueue,onFire: @escaping () -> Void)-> TimerControl
+   public static func scheduleRepeating(timeInterval: TimeInterval,queue: DispatchQueue,onFire: @escaping () -> Void)-> RepeatingTimerControl
+   public static func publish(every: TimeInterval)-> AnyPublisher<Date, Never>

+ @propertyWrapper public final class Atomic: @unchecked Sendable  
+ 
+   public var wrappedValue: T
+   
+ 
+   public init(wrappedValue: T,mode: Mode = .unfair)
+   
+ 
+   public enum Mode  
+   
+     case unfair
+     case recursive

+ extension AVCaptureDevice  
+ 
+   public func outputFormat(preferredDimensions: CMVideoDimensions,preferredFrameRate: Int)-> AVCaptureDevice.Format?

+ public struct TrackVideoRendererView: UIViewRepresentable, Equatable  
+ 
+   public init(track: RTCVideoTrack,contentMode: UIView.ContentMode = .scaleAspectFill,sizeUpdater: @escaping SizeUpdater)
+   
+ 
+   public static func dismantleUIView(_ uiView: UIViewType,coordinator: Coordinator)
+   nonisolated public static func ==(lhs: TrackVideoRendererView,rhs: TrackVideoRendererView)-> Bool
+   public func makeUIView(context: Context)-> UIViewType
+   public func updateUIView(_ uiView: UIViewType,context: Context)
+   public func makeCoordinator()-> Coordinator

+ public protocol CaptureDeviceProviding

+ public protocol Timer

+ public class TrackVideoRenderer: RTCMTLVideoView, @unchecked Sendable  
+ 
+   public init(track: RTCVideoTrack)
+   
+ 
+   override public func layoutSubviews()
+   override public func willMove(toWindow newWindow: UIWindow?)
+   override public func willMove(toSuperview newSuperview: UIView?)

+ extension Timer  
+ 
+   public static func currentTime()-> Date

+ public protocol RepeatingTimerControl

- public class VideoCapturePolicy: @unchecked Sendable

- @available(iOS, introduced: 13, obsoleted: 14) public struct LocalParticipantViewModifier_iOS13: ViewModifier  
- 
-   public func body(content: Content)-> some View

- public struct ParticipantPopoverView: View  
- 
-   public var body: some View
-   
- 
-   public init(participant: CallParticipant,call: Call?,popoverShown: Binding<Bool>,customView: (() -> CustomView)? = nil)

- public struct PopoverButton: View  
- 
-   public var body: some View
-   
- 
-   public init(title: String,popoverShown: Binding<Bool>,action: @escaping () -> Void)

- extension Alert  
- 
-   public static var defaultErrorAlert: Alert

- @available(iOS, introduced: 13, obsoleted: 14) public struct CallContainer_iOS13: View  
- 
-   public var body: some View
-   
- 
-   public init(viewFactory: Factory = DefaultViewFactory.shared,viewModel: CallViewModel)

- extension VideoCapturePolicy: InjectionKey  
- 
-   nonisolated public static var currentValue: VideoCapturePolicy

- @available(iOS, introduced: 13, obsoleted: 14) public struct LobbyView_iOS13: View  
- 
-   public var body: some View
-   
- 
-   public init(viewFactory: Factory = DefaultViewFactory.shared,callViewModel: CallViewModel,callId: String,callType: String,callSettings: Binding<CallSettings>,onJoinCallTap: @escaping () -> Void,onCloseLobby: @escaping () -> Void)

- @available(iOS 14.0, *) public struct BroadcastIconView: View  
+ public struct BroadcastIconView: View  

- public struct RTMP  
+ public struct RTMP: Equatable  

- @available(iOS 14.0, *) public struct VideoViewOverlay: View  
+ public struct VideoViewOverlay: View  

 public struct StreamLazyImage: View  
-   public init(imageURL: URL?,contentMode: ContentMode = .fill,placeholder: @escaping () -> Placeholder)
+   public init(imageURL: URL?,contentMode: ContentMode = .fill,@ViewBuilder placeholder: @escaping () -> Placeholder)
+   public init(imageURL: URL?,contentMode: ContentMode = .fill)

- @available(iOS 14.0, *) public struct CallContainer: View  
+ public struct CallContainer: View  

 public struct CallDurationView: View  
-   @MainActor public init(_ viewModel: CallViewModel)
+   public init(_ viewModel: CallViewModel)

 public struct MicrophoneCheckView: View  
-   public init(audioLevels: [Float],microphoneOn: Bool,isSilent: Bool,isPinned: Bool,maxHeight: Float = 14)
+   public init(viewModel: LobbyViewModel,isPinned: Bool,maxHeight: Float = 14,)
+   public init(audioLevels: [Float],microphoneOn: Bool,isSilent: Bool,isPinned: Bool,maxHeight: Float = 14)

 public struct StatelessToggleCameraIconView: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var actionHandler: ActionHandler?
+ 
-   public var body: some View
+   public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   
- 
-   public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

 public class Call: @unchecked Sendable, WSEventsSubscriber  
-   @MainActor public internal var state
+   public let state: CallState
-   @MainActor public func currentUserCanRequestPermissions(_ permissions: [Permission])-> Bool
+   public func currentUserCanRequestPermissions(_ permissions: [Permission])-> Bool
-   @MainActor public func currentUserHasCapability(_ capability: OwnCapability)-> Bool
+   public func currentUserHasCapability(_ capability: OwnCapability)-> Bool
-   @discardableResult @MainActor public func collectUserFeedback(rating: Int,reason: String? = nil,custom: [String: RawJSON]? = nil)async throws -> CollectUserFeedbackResponse
+   @discardableResult public func collectUserFeedback(rating: Int,reason: String? = nil,custom: [String: RawJSON]? = nil)async throws -> CollectUserFeedbackResponse
-   @MainActor public func updateParticipantsSorting(with sortComparators: [StreamSortComparator<CallParticipant>])
+   public func updateParticipantsSorting(with sortComparators: [StreamSortComparator<CallParticipant>])
-   @MainActor public func setIncomingVideoQualitySettings(_ value: IncomingVideoQualitySettings)async 
+   public func setIncomingVideoQualitySettings(_ value: IncomingVideoQualitySettings)async 
-   @MainActor public func updateClosedCaptionsSettings(itemPresentationDuration: TimeInterval,maxVisibleItems: Int)async 
+   public func updateClosedCaptionsSettings(itemPresentationDuration: TimeInterval,maxVisibleItems: Int)async 

- public class BroadcastObserver: ObservableObject  
+ public class BroadcastObserver: ObservableObject, @unchecked Sendable  

- @available(iOS 14.0, *) public struct CallModifier: ViewModifier  
+ public struct CallModifier: ViewModifier  
-   
+   @MainActor public init(viewModel: CallViewModel)
- 
+   
-   public func body(content: Content)-> some View
+ 
+   public func body(content: Content)-> some View

 public struct StatelessVideoIconView: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var actionHandler: ActionHandler?
+ 
-   public var body: some View
+   public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   
- 
-   public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

- public struct ScreenSharingSession  
+ public struct ScreenSharingSession: Equatable  

 public struct StatelessHangUpIconView: View  
-   public weak var call: Call?
+   public var size: CGFloat
-   public var size: CGFloat
+   public var actionHandler: ActionHandler?
-   public var actionHandler: ActionHandler?
+   public var body: some View
-   public var body: some View
+   
-   
+ 
- 
+   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

 @MainActor open class CallViewModel: ObservableObject  
-   public var participants: [CallParticipant]
+   @Published public var participants: [CallParticipant]

 public struct HorizontalParticipantsListView: View  
-   public var viewFactory: Factory
+   public var body: some View
-   public var participants: [CallParticipant]
+   
-   public var frame: CGRect
+ 
-   public var call: Call?
+   public init(viewFactory: Factory = DefaultViewFactory.shared,participants: [CallParticipant],frame: CGRect,call: Call?,innerItemSpace: CGFloat = 8,showAllInfo: Bool = false)
-   public var innerItemSpace: CGFloat
-   public var showAllInfo: Bool
-   public var body: some View
-   
- 
-   public init(viewFactory: Factory = DefaultViewFactory.shared,participants: [CallParticipant],frame: CGRect,call: Call?,innerItemSpace: CGFloat = 8,showAllInfo: Bool = false)

 public struct StatelessMicrophoneIconView: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var actionHandler: ActionHandler?
+ 
-   public var body: some View
+   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   
- 
-   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

 open class StreamCallAudioRecorder: @unchecked Sendable  
-   
+   @Atomic public private var isRecording: Bool
- 
+   
-   public init(filename: String)
+ 
-   
+   public init(filename: String)
- 
+   
-   open func startRecording(ignoreActiveCall: Bool = false)async 
+ 
-   open func stopRecording()async
+   open func startRecording(ignoreActiveCall: Bool = false)async 
+   open func stopRecording()async

 public struct StatelessAudioOutputIconView: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var actionHandler: ActionHandler?
+ 
-   public var body: some View
+   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   
- 
-   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

 public struct StatelessSpeakerIconView: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var actionHandler: ActionHandler?
+ 
-   public var body: some View
+   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   
- 
-   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

 extension View  
-   public func toastView(toast: Binding<Toast?>)-> some View
+   @ViewBuilder public func snapshot(trigger: SnapshotTriggering,snapshotHandler: @escaping @Sendable(UIImage) -> Void)-> some View

- public struct Ingress  
+ public struct Ingress: Equatable  

 @MainActor public class LobbyViewModel: ObservableObject, @unchecked Sendable  
-   @Published public var viewfinderImage: Image?
+   @Published public var viewFinderImage: Image?
-   @Published public var participants
+   @Published public var participants: [User]
-   
+   @Published public var audioOn: Bool
- 
+   @Published public var videoOn: Bool
-   public init(callType: String,callId: String)
+   @Published public var cameraPosition: CameraPosition
-   
+   @Published public var audioLevels: [Float]
- 
+   @Published public var isSilent: Bool
-   public func startCamera(front: Bool)
+   
-   public func stopCamera()
+ 
-   public func cleanUp()
+   public init(callType: String,callId: String,callViewModel: CallViewModel,onJoinCallTap: @escaping () -> Void,onCloseLobbyTap: @escaping () -> Void)
-   public func didUpdate(callSettings: CallSettings)async
+   
+ 
+   public func startCamera(front: Bool)
+   public func stopCamera()
+   public func cleanUp()
+   public func didTapJoin()
+   public func didTapClose()
+   public func toggleMicrophoneEnabled()
+   public func toggleCameraEnabled()

- @available(iOS 14.0, *) public struct LayoutMenuView: View  
+ public struct LayoutMenuView: View  

- @MainActor public class CallState: ObservableObject  
+ public class CallState: ObservableObject  
-   @Published public internal var sessionId: String
+   @Published public private var sessionId: String
-   @Published public internal var participants
+   @Published public private var participants: [CallParticipant]
-   @Published public internal var participantsMap
+   @Published public private var participantsMap: [String: CallParticipant]
-   @Published public internal var localParticipant: CallParticipant?
+   @Published public private var localParticipant: CallParticipant?
-   @Published public internal var dominantSpeaker: CallParticipant?
+   @Published public private var dominantSpeaker: CallParticipant?
-   @Published public internal var remoteParticipants: [CallParticipant]
+   @Published public private var remoteParticipants: [CallParticipant]
-   @Published public internal var activeSpeakers: [CallParticipant]
+   @Published public private var activeSpeakers: [CallParticipant]
-   @Published public internal var members: [Member]
+   @Published public private var members: [Member]
-   @Published public internal var screenSharingSession: ScreenSharingSession?
+   @Published public private var screenSharingSession: ScreenSharingSession?
-   @Published public internal var recordingState: RecordingState
+   @Published public private var recordingState: RecordingState
-   @Published public internal var blockedUserIds: Set<String>
+   @Published public private var blockedUserIds: Set<String>
-   @Published public internal var settings: CallSettingsResponse?
+   @Published public private var settings: CallSettingsResponse?
-   @Published public internal var ownCapabilities: [OwnCapability]
+   @Published public private var ownCapabilities: [OwnCapability]
-   @Published public internal var capabilitiesByRole: [String: [String]]
+   @Published public private var capabilitiesByRole: [String: [String]]
-   @Published public internal var backstage: Bool
+   @Published public private var backstage: Bool
-   @Published public internal var broadcasting: Bool
+   @Published public private var broadcasting: Bool
-   @Published public internal var createdAt: Date
+   @Published public private var createdAt: Date
-   @Published public internal var updatedAt: Date
+   @Published public private var updatedAt: Date
-   @Published public internal var startsAt: Date?
+   @Published public private var startsAt: Date?
-   @Published public internal var startedAt: Date?
+   @Published public private var startedAt: Date?
-   @Published public internal var endedAt: Date?
+   @Published public private var endedAt: Date?
-   @Published public internal var endedBy: User?
+   @Published public private var endedBy: User?
-   @Published public internal var custom: [String: RawJSON]
+   @Published public private var custom: [String: RawJSON]
-   @Published public internal var team: String?
+   @Published public private var team: String?
-   @Published public internal var createdBy: User?
+   @Published public private var createdBy: User?
-   @Published public internal var ingress: Ingress?
+   @Published public private var ingress: Ingress?
-   @Published public internal var permissionRequests: [PermissionRequest]
+   @Published public private var permissionRequests: [PermissionRequest]
-   @Published public internal var transcribing: Bool
+   @Published public private var transcribing: Bool
-   @Published public internal var captioning: Bool
+   @Published public private var captioning: Bool
-   @Published public internal var egress: EgressResponse?
+   @Published public private var egress: EgressResponse?
-   @Published public internal var session: CallSessionResponse?
+   @Published public private var session: CallSessionResponse?
-   @Published public internal var reconnectionStatus
+   @Published public private var reconnectionStatus: ReconnectionStatus
-   @Published public internal var anonymousParticipantCount: UInt32
+   @Published public private var anonymousParticipantCount: UInt32
-   @Published public internal var participantCount: UInt32
+   @Published public private var participantCount: UInt32
-   @Published public internal var isInitialized: Bool
+   @Published public private var isInitialized: Bool
-   @Published public internal var callSettings
+   @Published public private var callSettings: CallSettings
-   @Published public internal var isCurrentUserScreensharing: Bool
+   @Published public private var isCurrentUserScreensharing: Bool
-   @Published public internal var duration: TimeInterval
+   @Published public private var duration: TimeInterval
-   @Published public internal var statsReport: CallStatsReport?
+   @Published public private var statsReport: CallStatsReport?
-   @Published public internal var closedCaptions: [CallClosedCaption]
+   @Published public private var closedCaptions: [CallClosedCaption]
-   @Published public internal var statsCollectionInterval: Int
+   @Published public private var statsCollectionInterval: Int
-   @Published public internal var incomingVideoQualitySettings: IncomingVideoQualitySettings
+   @Published public private var incomingVideoQualitySettings: IncomingVideoQualitySettings
-   @Published public internal var disconnectionError: Error?
+   @Published public private var disconnectionError: Error?

- public struct PermissionRequest: @unchecked Sendable, Identifiable  
+ public struct PermissionRequest: @unchecked Sendable, Identifiable, Equatable  
-   public func reject()
+   public static func ==(lhs: PermissionRequest,rhs: PermissionRequest)-> Bool
+   public func reject()

- @available(iOS 14.0, *) public struct LocalParticipantViewModifier: ViewModifier  
+ public struct LocalParticipantViewModifier: ViewModifier  
-   
+   public init(participant: CallParticipant,call: Call?,showAllInfo: Bool,decorations: [VideoCallParticipantDecoration] = VideoCallParticipantDecoration.allCases)
- 
+   
-   public func body(content: Content)-> some View
+ 
+   public func body(content: Content)-> some View

- @available(iOS 14.0, *) public struct LobbyView: View  
+ public struct LobbyView: View  
-   public init(viewFactory: Factory = DefaultViewFactory.shared,viewModel: LobbyViewModel? = nil,callId: String,callType: String,callSettings: Binding<CallSettings>,onJoinCallTap: @escaping () -> Void,onCloseLobby: @escaping () -> Void)
+   public init(viewFactory: Factory = DefaultViewFactory.shared,callViewModel: CallViewModel,callId: String,callType: String,callSettings: Binding<CallSettings>,onJoinCallTap: @escaping () -> Void,onCloseLobby: @escaping () -> Void)

 public struct StatelessParticipantsListButton: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var isActive: Binding<Bool>
+ 
-   public var actionHandler: ActionHandler?
+   @MainActor public init(call: Call?,size: CGFloat = 44,isActive: Binding<Bool>,actionHandler: ActionHandler? = nil)
-   public var body: some View
-   
- 
-   @MainActor public init(call: Call?,size: CGFloat = 44,isActive: Binding<Bool>,actionHandler: ActionHandler? = nil)

 extension InjectedValues  
-   public var pictureInPictureAdapter: StreamPictureInPictureAdapter
+   public var utils: Utils

 public class StreamVideo: ObservableObject, @unchecked Sendable  
-   public var state: State
+   @Published public internal var connection: ConnectionStatus
-   public let videoConfig: VideoConfig
+   @Published public internal var user: User
-   public var user: User
+   @Published public internal var activeCall: Call?
-   public var isHardwareAccelerationAvailable: Bool
+   @Published public internal var ringingCall: Call?
-   public lazy var rejectionReasonProvider: RejectionReasonProviding
+   public let state: State
-   
+   public let videoConfig: VideoConfig
- 
+   public var user: User
-   public convenience init(apiKey: String,user: User,token: UserToken,videoConfig: VideoConfig = VideoConfig(),pushNotificationsConfig: PushNotificationsConfig = .default,tokenProvider: UserTokenProvider? = nil)
+   public var isHardwareAccelerationAvailable: Bool
-   
+   public lazy var rejectionReasonProvider: RejectionReasonProviding
- 
+   
-   public func connect()async throws 
+ 
-   public func call(callType: String,callId: String,callSettings: CallSettings? = nil,file: StaticString = #file,function: StaticString = #function,line: UInt = #line)-> Call
+   public convenience init(apiKey: String,user: User,token: UserToken,videoConfig: VideoConfig = VideoConfig(),pushNotificationsConfig: PushNotificationsConfig = .default,tokenProvider: UserTokenProvider? = nil)
-   public func makeCallsController(callsQuery: CallsQuery)-> CallsController
+   
-   @discardableResult public func setDevice(id: String)async throws -> ModelResponse
+ 
-   @discardableResult public func setVoipDevice(id: String)async throws -> ModelResponse
+   public func connect()async throws 
-   @discardableResult public func deleteDevice(id: String)async throws -> ModelResponse
+   public func call(callType: String,callId: String,callSettings: CallSettings? = nil,file: StaticString = #file,function: StaticString = #function,line: UInt = #line)-> Call
-   public func listDevices()async throws -> [Device]
+   public func makeCallsController(callsQuery: CallsQuery)-> CallsController
-   public func disconnect()async 
+   @discardableResult public func setDevice(id: String)async throws -> ModelResponse
-   public func eventPublisher()-> AnyPublisher<VideoEvent, Never>
+   @discardableResult public func setVoipDevice(id: String)async throws -> ModelResponse
-   public func eventPublisher(for event: WSEvent.Type)-> AnyPublisher<WSEvent, Never>
+   @discardableResult public func deleteDevice(id: String)async throws -> ModelResponse
-   public func subscribe()-> AsyncStream<VideoEvent>
+   public func listDevices()async throws -> [Device]
-   public func subscribe(for event: WSEvent.Type)-> AsyncStream<WSEvent>
+   public func disconnect()async 
-   public func queryCalls(next: String? = nil,watch: Bool = false)async throws -> (calls: [Call], next: String?)
+   public func eventPublisher()-> AnyPublisher<VideoEvent, Never>
-   public func queryCalls(filters: [String: RawJSON]?,sort: [SortParamRequest] = [SortParamRequest.descending("created_at")],limit: Int? = 25,watch: Bool = false)async throws -> (calls: [Call], next: String?)
+   public func eventPublisher(for event: WSEvent.Type)-> AnyPublisher<WSEvent, Never>
-   
+   public func subscribe()-> AsyncStream<VideoEvent>
- 
+   public func subscribe(for event: WSEvent.Type)-> AsyncStream<WSEvent>
-   public final class State: ObservableObject, @unchecked Sendable  
+   public func queryCalls(next: String? = nil,watch: Bool = false)async throws -> (calls: [Call], next: String?)
-   
+   public func queryCalls(filters: [String: RawJSON]?,sort: [SortParamRequest] = [SortParamRequest.descending("created_at")],limit: Int? = 25,watch: Bool = false)async throws -> (calls: [Call], next: String?)
-     @Published public internal var connection: ConnectionStatus
+   
-     @Published public internal var user: User
+ 
-     @Published public internal var activeCall: Call?
+   public final class State: ObservableObject, @unchecked Sendable  
-     @Published public internal var ringingCall: Call?
+   
+     @Published public internal var connection: ConnectionStatus
+     @Published public internal var user: User
+     @Published public internal var activeCall: Call?
+     @Published public internal var ringingCall: Call?

 public struct CallConnectingView: View  
-   public var title: String
+   public var body: some View
-   public var callControls: CallControls
+   
-   public var callTopView: CallTopView
+ 
-   public var body: some View
+   public init(viewFactory: Factory = DefaultViewFactory.shared,outgoingCallMembers: [Member],title: String,callControls: CallControls,callTopView: CallTopView)
-   
- 
-   public init(viewFactory: Factory = DefaultViewFactory.shared,outgoingCallMembers: [Member],title: String,callControls: CallControls,callTopView: CallTopView)

Copy link

Public Interface

+ extension AVCaptureDevice  
+ 
+   public func outputFormat(preferredDimensions: CMVideoDimensions,preferredFrameRate: Int)-> AVCaptureDevice.Format?

+ public protocol Timer

+ public class TrackVideoRenderer: RTCMTLVideoView, @unchecked Sendable  
+ 
+   public init(track: RTCVideoTrack)
+   
+ 
+   override public func layoutSubviews()
+   override public func willMove(toWindow newWindow: UIWindow?)
+   override public func willMove(toSuperview newSuperview: UIView?)

+ public struct DefaultTimer: Timer  
+ 
+   @discardableResult public static func schedule(timeInterval: TimeInterval,queue: DispatchQueue,onFire: @escaping () -> Void)-> TimerControl
+   public static func scheduleRepeating(timeInterval: TimeInterval,queue: DispatchQueue,onFire: @escaping () -> Void)-> RepeatingTimerControl
+   public static func publish(every: TimeInterval)-> AnyPublisher<Date, Never>

+ public struct TrackVideoRendererView: UIViewRepresentable, Equatable  
+ 
+   public init(track: RTCVideoTrack,contentMode: UIView.ContentMode = .scaleAspectFill,sizeUpdater: @escaping SizeUpdater)
+   
+ 
+   public static func dismantleUIView(_ uiView: UIViewType,coordinator: Coordinator)
+   nonisolated public static func ==(lhs: TrackVideoRendererView,rhs: TrackVideoRendererView)-> Bool
+   public func makeUIView(context: Context)-> UIViewType
+   public func updateUIView(_ uiView: UIViewType,context: Context)
+   public func makeCoordinator()-> Coordinator

+ public protocol TimerControl

+ @propertyWrapper public final class Atomic: @unchecked Sendable  
+ 
+   public var wrappedValue: T
+   
+ 
+   public init(wrappedValue: T,mode: Mode = .unfair)
+   
+ 
+   public enum Mode  
+   
+     case unfair
+     case recursive

+ public protocol CaptureDeviceProviding

+ public protocol CaptureDeviceProtocol: Sendable

+ public protocol RepeatingTimerControl

+ extension Timer  
+ 
+   public static func currentTime()-> Date

- extension VideoCapturePolicy: InjectionKey  
- 
-   nonisolated public static var currentValue: VideoCapturePolicy

- public struct PopoverButton: View  
- 
-   public var body: some View
-   
- 
-   public init(title: String,popoverShown: Binding<Bool>,action: @escaping () -> Void)

- public struct ParticipantPopoverView: View  
- 
-   public var body: some View
-   
- 
-   public init(participant: CallParticipant,call: Call?,popoverShown: Binding<Bool>,customView: (() -> CustomView)? = nil)

- public class VideoCapturePolicy: @unchecked Sendable

- @available(iOS, introduced: 13, obsoleted: 14) public struct CallContainer_iOS13: View  
- 
-   public var body: some View
-   
- 
-   public init(viewFactory: Factory = DefaultViewFactory.shared,viewModel: CallViewModel)

- extension Alert  
- 
-   public static var defaultErrorAlert: Alert

- @available(iOS, introduced: 13, obsoleted: 14) public struct LobbyView_iOS13: View  
- 
-   public var body: some View
-   
- 
-   public init(viewFactory: Factory = DefaultViewFactory.shared,callViewModel: CallViewModel,callId: String,callType: String,callSettings: Binding<CallSettings>,onJoinCallTap: @escaping () -> Void,onCloseLobby: @escaping () -> Void)

- @available(iOS, introduced: 13, obsoleted: 14) public struct LocalParticipantViewModifier_iOS13: ViewModifier  
- 
-   public func body(content: Content)-> some View

 public class Call: @unchecked Sendable, WSEventsSubscriber  
-   @MainActor public internal var state
+   public let state: CallState
-   @MainActor public func currentUserCanRequestPermissions(_ permissions: [Permission])-> Bool
+   public func currentUserCanRequestPermissions(_ permissions: [Permission])-> Bool
-   @MainActor public func currentUserHasCapability(_ capability: OwnCapability)-> Bool
+   public func currentUserHasCapability(_ capability: OwnCapability)-> Bool
-   @discardableResult @MainActor public func collectUserFeedback(rating: Int,reason: String? = nil,custom: [String: RawJSON]? = nil)async throws -> CollectUserFeedbackResponse
+   @discardableResult public func collectUserFeedback(rating: Int,reason: String? = nil,custom: [String: RawJSON]? = nil)async throws -> CollectUserFeedbackResponse
-   @MainActor public func updateParticipantsSorting(with sortComparators: [StreamSortComparator<CallParticipant>])
+   public func updateParticipantsSorting(with sortComparators: [StreamSortComparator<CallParticipant>])
-   @MainActor public func setIncomingVideoQualitySettings(_ value: IncomingVideoQualitySettings)async 
+   public func setIncomingVideoQualitySettings(_ value: IncomingVideoQualitySettings)async 
-   @MainActor public func updateClosedCaptionsSettings(itemPresentationDuration: TimeInterval,maxVisibleItems: Int)async 
+   public func updateClosedCaptionsSettings(itemPresentationDuration: TimeInterval,maxVisibleItems: Int)async 

- @available(iOS 14.0, *) public struct LocalParticipantViewModifier: ViewModifier  
+ public struct LocalParticipantViewModifier: ViewModifier  
-   
+   public init(participant: CallParticipant,call: Call?,showAllInfo: Bool,decorations: [VideoCallParticipantDecoration] = VideoCallParticipantDecoration.allCases)
- 
+   
-   public func body(content: Content)-> some View
+ 
+   public func body(content: Content)-> some View

- public struct RTMP  
+ public struct RTMP: Equatable  

 public struct StatelessMicrophoneIconView: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var actionHandler: ActionHandler?
+ 
-   public var body: some View
+   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   
- 
-   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

 public struct StatelessSpeakerIconView: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var actionHandler: ActionHandler?
+ 
-   public var body: some View
+   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   
- 
-   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

- @available(iOS 14.0, *) public struct LayoutMenuView: View  
+ public struct LayoutMenuView: View  

- public struct LobbyInfo: Equatable  
+ public struct LobbyInfo: Equatable, Sendable  

- @available(iOS 14.0, *) public struct CallContainer: View  
+ public struct CallContainer: View  

- public struct PermissionRequest: @unchecked Sendable, Identifiable  
+ public struct PermissionRequest: @unchecked Sendable, Identifiable, Equatable  
-   public func reject()
+   public static func ==(lhs: PermissionRequest,rhs: PermissionRequest)-> Bool
+   public func reject()

 public struct CallDurationView: View  
-   @MainActor public init(_ viewModel: CallViewModel)
+   public init(_ viewModel: CallViewModel)

- public struct ScreenSharingSession  
+ public struct ScreenSharingSession: Equatable  

 public struct StatelessAudioOutputIconView: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var actionHandler: ActionHandler?
+ 
-   public var body: some View
+   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   
- 
-   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

- @available(iOS 14.0, *) public struct VideoViewOverlay: View  
+ public struct VideoViewOverlay: View  

 public struct CallConnectingView: View  
-   public var title: String
+   public var body: some View
-   public var callControls: CallControls
+   
-   public var callTopView: CallTopView
+ 
-   public var body: some View
+   public init(viewFactory: Factory = DefaultViewFactory.shared,outgoingCallMembers: [Member],title: String,callControls: CallControls,callTopView: CallTopView)
-   
- 
-   public init(viewFactory: Factory = DefaultViewFactory.shared,outgoingCallMembers: [Member],title: String,callControls: CallControls,callTopView: CallTopView)

 public struct StatelessVideoIconView: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var actionHandler: ActionHandler?
+ 
-   public var body: some View
+   public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   
- 
-   public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

- public class BroadcastObserver: ObservableObject  
+ public class BroadcastObserver: ObservableObject, @unchecked Sendable  

 public struct StatelessParticipantsListButton: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var isActive: Binding<Bool>
+ 
-   public var actionHandler: ActionHandler?
+   @MainActor public init(call: Call?,size: CGFloat = 44,isActive: Binding<Bool>,actionHandler: ActionHandler? = nil)
-   public var body: some View
-   
- 
-   @MainActor public init(call: Call?,size: CGFloat = 44,isActive: Binding<Bool>,actionHandler: ActionHandler? = nil)

 public struct MicrophoneCheckView: View  
-   public init(audioLevels: [Float],microphoneOn: Bool,isSilent: Bool,isPinned: Bool,maxHeight: Float = 14)
+   public init(viewModel: LobbyViewModel,isPinned: Bool,maxHeight: Float = 14)
+   public init(audioLevels: [Float],microphoneOn: Bool,isSilent: Bool,isPinned: Bool,maxHeight: Float = 14)

 open class StreamCallAudioRecorder: @unchecked Sendable  
-   
+   @Atomic public private var isRecording: Bool
- 
+   
-   public init(filename: String)
+ 
-   
+   public init(filename: String)
- 
+   
-   open func startRecording(ignoreActiveCall: Bool = false)async 
+ 
-   open func stopRecording()async
+   open func startRecording(ignoreActiveCall: Bool = false)async 
+   open func stopRecording()async

 extension View  
-   public func toastView(toast: Binding<Toast?>)-> some View
+   @ViewBuilder public func snapshot(trigger: SnapshotTriggering,snapshotHandler: @escaping @Sendable(UIImage) -> Void)-> some View

- public struct Ingress  
+ public struct Ingress: Equatable  

 public class StreamVideo: ObservableObject, @unchecked Sendable  
-   public var state: State
+   @Published public internal var connection: ConnectionStatus
-   public let videoConfig: VideoConfig
+   @Published public internal var user: User
-   public var user: User
+   @Published public internal var activeCall: Call?
-   public var isHardwareAccelerationAvailable: Bool
+   @Published public internal var ringingCall: Call?
-   public lazy var rejectionReasonProvider: RejectionReasonProviding
+   public let state: State
-   
+   public let videoConfig: VideoConfig
- 
+   public var user: User
-   public convenience init(apiKey: String,user: User,token: UserToken,videoConfig: VideoConfig = VideoConfig(),pushNotificationsConfig: PushNotificationsConfig = .default,tokenProvider: UserTokenProvider? = nil)
+   public var isHardwareAccelerationAvailable: Bool
-   
+   public lazy var rejectionReasonProvider: RejectionReasonProviding
- 
+   
-   public func connect()async throws 
+ 
-   public func call(callType: String,callId: String,callSettings: CallSettings? = nil,file: StaticString = #file,function: StaticString = #function,line: UInt = #line)-> Call
+   public convenience init(apiKey: String,user: User,token: UserToken,videoConfig: VideoConfig = VideoConfig(),pushNotificationsConfig: PushNotificationsConfig = .default,tokenProvider: UserTokenProvider? = nil)
-   public func makeCallsController(callsQuery: CallsQuery)-> CallsController
+   
-   @discardableResult public func setDevice(id: String)async throws -> ModelResponse
+ 
-   @discardableResult public func setVoipDevice(id: String)async throws -> ModelResponse
+   public func connect()async throws 
-   @discardableResult public func deleteDevice(id: String)async throws -> ModelResponse
+   public func call(callType: String,callId: String,callSettings: CallSettings? = nil,file: StaticString = #file,function: StaticString = #function,line: UInt = #line)-> Call
-   public func listDevices()async throws -> [Device]
+   public func makeCallsController(callsQuery: CallsQuery)-> CallsController
-   public func disconnect()async 
+   @discardableResult public func setDevice(id: String)async throws -> ModelResponse
-   public func eventPublisher()-> AnyPublisher<VideoEvent, Never>
+   @discardableResult public func setVoipDevice(id: String)async throws -> ModelResponse
-   public func eventPublisher(for event: WSEvent.Type)-> AnyPublisher<WSEvent, Never>
+   @discardableResult public func deleteDevice(id: String)async throws -> ModelResponse
-   public func subscribe()-> AsyncStream<VideoEvent>
+   public func listDevices()async throws -> [Device]
-   public func subscribe(for event: WSEvent.Type)-> AsyncStream<WSEvent>
+   public func disconnect()async 
-   public func queryCalls(next: String? = nil,watch: Bool = false)async throws -> (calls: [Call], next: String?)
+   public func eventPublisher()-> AnyPublisher<VideoEvent, Never>
-   public func queryCalls(filters: [String: RawJSON]?,sort: [SortParamRequest] = [SortParamRequest.descending("created_at")],limit: Int? = 25,watch: Bool = false)async throws -> (calls: [Call], next: String?)
+   public func eventPublisher(for event: WSEvent.Type)-> AnyPublisher<WSEvent, Never>
-   
+   public func subscribe()-> AsyncStream<VideoEvent>
- 
+   public func subscribe(for event: WSEvent.Type)-> AsyncStream<WSEvent>
-   public final class State: ObservableObject, @unchecked Sendable  
+   public func queryCalls(next: String? = nil,watch: Bool = false)async throws -> (calls: [Call], next: String?)
-   
+   public func queryCalls(filters: [String: RawJSON]?,sort: [SortParamRequest] = [SortParamRequest.descending("created_at")],limit: Int? = 25,watch: Bool = false)async throws -> (calls: [Call], next: String?)
-     @Published public internal var connection: ConnectionStatus
+   
-     @Published public internal var user: User
+ 
-     @Published public internal var activeCall: Call?
+   public final class State: ObservableObject, @unchecked Sendable  
-     @Published public internal var ringingCall: Call?
+   
+     @Published public internal var connection: ConnectionStatus
+     @Published public internal var user: User
+     @Published public internal var activeCall: Call?
+     @Published public internal var ringingCall: Call?

 @MainActor public class LobbyViewModel: ObservableObject, @unchecked Sendable  
-   @Published public var viewfinderImage: Image?
+   @Published public var viewFinderImage: Image?
-   @Published public var participants
+   @Published public var participants: [User]
-   
+   @Published public var audioOn: Bool
- 
+   @Published public var videoOn: Bool
-   public init(callType: String,callId: String)
+   @Published public var cameraPosition: CameraPosition
-   
+   @Published public var audioLevels: [Float]
- 
+   @Published public var isSilent: Bool
-   public func startCamera(front: Bool)
+   
-   public func stopCamera()
+ 
-   public func cleanUp()
+   public init(callType: String,callId: String,callViewModel: CallViewModel,onJoinCallTap: @escaping () -> Void,onCloseLobbyTap: @escaping () -> Void)
-   public func didUpdate(callSettings: CallSettings)async
+   
+ 
+   public func startCamera(front: Bool)
+   public func stopCamera()
+   public func cleanUp()
+   public func didTapJoin()
+   public func didTapClose()
+   public func toggleMicrophoneEnabled()
+   public func toggleCameraEnabled()

- @available(iOS 14.0, *) public struct BroadcastIconView: View  
+ public struct BroadcastIconView: View  

- @available(iOS 14.0, *) public struct CallModifier: ViewModifier  
+ public struct CallModifier: ViewModifier  
-   
+   @MainActor public init(viewModel: CallViewModel)
- 
+   
-   public func body(content: Content)-> some View
+ 
+   public func body(content: Content)-> some View

 @MainActor open class CallViewModel: ObservableObject  
-   public var participants: [CallParticipant]
+   @Published public var participants: [CallParticipant]

- @MainActor public class CallState: ObservableObject  
+ public class CallState: ObservableObject  
-   @Published public internal var sessionId: String
+   @Published public private var sessionId: String
-   @Published public internal var participants
+   @Published public private var participants: [CallParticipant]
-   @Published public internal var participantsMap
+   @Published public private var participantsMap: [String: CallParticipant]
-   @Published public internal var localParticipant: CallParticipant?
+   @Published public private var localParticipant: CallParticipant?
-   @Published public internal var dominantSpeaker: CallParticipant?
+   @Published public private var dominantSpeaker: CallParticipant?
-   @Published public internal var remoteParticipants: [CallParticipant]
+   @Published public private var remoteParticipants: [CallParticipant]
-   @Published public internal var activeSpeakers: [CallParticipant]
+   @Published public private var activeSpeakers: [CallParticipant]
-   @Published public internal var members: [Member]
+   @Published public private var members: [Member]
-   @Published public internal var screenSharingSession: ScreenSharingSession?
+   @Published public private var screenSharingSession: ScreenSharingSession?
-   @Published public internal var recordingState: RecordingState
+   @Published public private var recordingState: RecordingState
-   @Published public internal var blockedUserIds: Set<String>
+   @Published public private var blockedUserIds: Set<String>
-   @Published public internal var settings: CallSettingsResponse?
+   @Published public private var settings: CallSettingsResponse?
-   @Published public internal var ownCapabilities: [OwnCapability]
+   @Published public private var ownCapabilities: [OwnCapability]
-   @Published public internal var capabilitiesByRole: [String: [String]]
+   @Published public private var capabilitiesByRole: [String: [String]]
-   @Published public internal var backstage: Bool
+   @Published public private var backstage: Bool
-   @Published public internal var broadcasting: Bool
+   @Published public private var broadcasting: Bool
-   @Published public internal var createdAt: Date
+   @Published public private var createdAt: Date
-   @Published public internal var updatedAt: Date
+   @Published public private var updatedAt: Date
-   @Published public internal var startsAt: Date?
+   @Published public private var startsAt: Date?
-   @Published public internal var startedAt: Date?
+   @Published public private var startedAt: Date?
-   @Published public internal var endedAt: Date?
+   @Published public private var endedAt: Date?
-   @Published public internal var endedBy: User?
+   @Published public private var endedBy: User?
-   @Published public internal var custom: [String: RawJSON]
+   @Published public private var custom: [String: RawJSON]
-   @Published public internal var team: String?
+   @Published public private var team: String?
-   @Published public internal var createdBy: User?
+   @Published public private var createdBy: User?
-   @Published public internal var ingress: Ingress?
+   @Published public private var ingress: Ingress?
-   @Published public internal var permissionRequests: [PermissionRequest]
+   @Published public private var permissionRequests: [PermissionRequest]
-   @Published public internal var transcribing: Bool
+   @Published public private var transcribing: Bool
-   @Published public internal var captioning: Bool
+   @Published public private var captioning: Bool
-   @Published public internal var egress: EgressResponse?
+   @Published public private var egress: EgressResponse?
-   @Published public internal var session: CallSessionResponse?
+   @Published public private var session: CallSessionResponse?
-   @Published public internal var reconnectionStatus
+   @Published public private var reconnectionStatus: ReconnectionStatus
-   @Published public internal var anonymousParticipantCount: UInt32
+   @Published public private var anonymousParticipantCount: UInt32
-   @Published public internal var participantCount: UInt32
+   @Published public private var participantCount: UInt32
-   @Published public internal var isInitialized: Bool
+   @Published public private var isInitialized: Bool
-   @Published public internal var callSettings
+   @Published public private var callSettings: CallSettings
-   @Published public internal var isCurrentUserScreensharing: Bool
+   @Published public private var isCurrentUserScreensharing: Bool
-   @Published public internal var duration: TimeInterval
+   @Published public private var duration: TimeInterval
-   @Published public internal var statsReport: CallStatsReport?
+   @Published public private var statsReport: CallStatsReport?
-   @Published public internal var closedCaptions: [CallClosedCaption]
+   @Published public private var closedCaptions: [CallClosedCaption]
-   @Published public internal var statsCollectionInterval: Int
+   @Published public private var statsCollectionInterval: Int
-   @Published public internal var incomingVideoQualitySettings: IncomingVideoQualitySettings
+   @Published public private var incomingVideoQualitySettings: IncomingVideoQualitySettings
-   @Published public internal var disconnectionError: Error?
+   @Published public private var disconnectionError: Error?

 public struct HorizontalParticipantsListView: View  
-   public var viewFactory: Factory
+   public var body: some View
-   public var participants: [CallParticipant]
+   
-   public var frame: CGRect
+ 
-   public var call: Call?
+   public init(viewFactory: Factory = DefaultViewFactory.shared,participants: [CallParticipant],frame: CGRect,call: Call?,innerItemSpace: CGFloat = 8,showAllInfo: Bool = false)
-   public var innerItemSpace: CGFloat
-   public var showAllInfo: Bool
-   public var body: some View
-   
- 
-   public init(viewFactory: Factory = DefaultViewFactory.shared,participants: [CallParticipant],frame: CGRect,call: Call?,innerItemSpace: CGFloat = 8,showAllInfo: Bool = false)

 public struct StatelessHangUpIconView: View  
-   public weak var call: Call?
+   public var size: CGFloat
-   public var size: CGFloat
+   public var actionHandler: ActionHandler?
-   public var actionHandler: ActionHandler?
+   public var body: some View
-   public var body: some View
+   
-   
+ 
- 
+   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

- @available(iOS 14.0, *) public struct LobbyView: View  
+ public struct LobbyView: View  
-   public init(viewFactory: Factory = DefaultViewFactory.shared,viewModel: LobbyViewModel? = nil,callId: String,callType: String,callSettings: Binding<CallSettings>,onJoinCallTap: @escaping () -> Void,onCloseLobby: @escaping () -> Void)
+   public init(viewFactory: Factory = DefaultViewFactory.shared,callViewModel: CallViewModel,callId: String,callType: String,callSettings: Binding<CallSettings>,onJoinCallTap: @escaping () -> Void,onCloseLobby: @escaping () -> Void)

 public struct StreamLazyImage: View  
-   public init(imageURL: URL?,contentMode: ContentMode = .fill,placeholder: @escaping () -> Placeholder)
+   public init(imageURL: URL?,contentMode: ContentMode = .fill,@ViewBuilder placeholder: @escaping () -> Placeholder)
+   public init(imageURL: URL?,contentMode: ContentMode = .fill)

 public struct StatelessToggleCameraIconView: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var actionHandler: ActionHandler?
+ 
-   public var body: some View
+   public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   
- 
-   public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

 extension InjectedValues  
-   public var pictureInPictureAdapter: StreamPictureInPictureAdapter
+   public var utils: Utils

Copy link

Public Interface

+ public class TrackVideoRenderer: RTCMTLVideoView, @unchecked Sendable  
+ 
+   public init(track: RTCVideoTrack)
+   
+ 
+   override public func layoutSubviews()
+   override public func willMove(toWindow newWindow: UIWindow?)
+   override public func willMove(toSuperview newSuperview: UIView?)

+ public protocol Timer

+ extension Timer  
+ 
+   public static func currentTime()-> Date

+ public protocol CaptureDeviceProtocol: Sendable

+ public protocol CaptureDeviceProviding

+ public struct DefaultTimer: Timer  
+ 
+   @discardableResult public static func schedule(timeInterval: TimeInterval,queue: DispatchQueue,onFire: @escaping () -> Void)-> TimerControl
+   public static func scheduleRepeating(timeInterval: TimeInterval,queue: DispatchQueue,onFire: @escaping () -> Void)-> RepeatingTimerControl
+   public static func publish(every interval: TimeInterval)-> AnyPublisher<Date, Never>

+ extension AVCaptureDevice  
+ 
+   public func outputFormat(preferredDimensions: CMVideoDimensions,preferredFrameRate: Int)-> AVCaptureDevice.Format?

+ public protocol TimerControl

+ @propertyWrapper public final class Atomic: @unchecked Sendable  
+ 
+   public var wrappedValue: T
+   
+ 
+   public init(wrappedValue: T,mode: Mode = .unfair)
+   
+ 
+   public enum Mode  
+   
+     case unfair
+     case recursive

+ public protocol RepeatingTimerControl

+ public struct TrackVideoRendererView: UIViewRepresentable, Equatable  
+ 
+   public init(track: RTCVideoTrack,contentMode: UIView.ContentMode = .scaleAspectFill,sizeUpdater: @escaping SizeUpdater)
+   
+ 
+   public static func dismantleUIView(_ uiView: UIViewType,coordinator: Coordinator)
+   nonisolated public static func ==(lhs: TrackVideoRendererView,rhs: TrackVideoRendererView)-> Bool
+   public func makeUIView(context: Context)-> UIViewType
+   public func updateUIView(_ uiView: UIViewType,context: Context)
+   public func makeCoordinator()-> Coordinator

- public class VideoCapturePolicy: @unchecked Sendable

- public struct PopoverButton: View  
- 
-   public var body: some View
-   
- 
-   public init(title: String,popoverShown: Binding<Bool>,action: @escaping () -> Void)

- extension Alert  
- 
-   public static var defaultErrorAlert: Alert

- @available(iOS, introduced: 13, obsoleted: 14) public struct LobbyView_iOS13: View  
- 
-   public var body: some View
-   
- 
-   public init(viewFactory: Factory = DefaultViewFactory.shared,callViewModel: CallViewModel,callId: String,callType: String,callSettings: Binding<CallSettings>,onJoinCallTap: @escaping () -> Void,onCloseLobby: @escaping () -> Void)

- @available(iOS, introduced: 13, obsoleted: 14) public struct LocalParticipantViewModifier_iOS13: ViewModifier  
- 
-   public func body(content: Content)-> some View

- public struct ParticipantPopoverView: View  
- 
-   public var body: some View
-   
- 
-   public init(participant: CallParticipant,call: Call?,popoverShown: Binding<Bool>,customView: (() -> CustomView)? = nil)

- extension VideoCapturePolicy: InjectionKey  
- 
-   nonisolated public static var currentValue: VideoCapturePolicy

- @available(iOS, introduced: 13, obsoleted: 14) public struct CallContainer_iOS13: View  
- 
-   public var body: some View
-   
- 
-   public init(viewFactory: Factory = DefaultViewFactory.shared,viewModel: CallViewModel)

 @MainActor open class CallViewModel: ObservableObject  
-   public var participants: [CallParticipant]
+   @Published public var participants: [CallParticipant]

- @available(iOS 14.0, *) public struct LobbyView: View  
+ public struct LobbyView: View  
-   public init(viewFactory: Factory = DefaultViewFactory.shared,viewModel: LobbyViewModel? = nil,callId: String,callType: String,callSettings: Binding<CallSettings>,onJoinCallTap: @escaping () -> Void,onCloseLobby: @escaping () -> Void)
+   public init(viewFactory: Factory = DefaultViewFactory.shared,callViewModel: CallViewModel,callId: String,callType: String,callSettings: Binding<CallSettings>,onJoinCallTap: @escaping () -> Void,onCloseLobby: @escaping () -> Void)

 public struct StatelessSpeakerIconView: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var actionHandler: ActionHandler?
+ 
-   public var body: some View
+   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   
- 
-   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

 extension InjectedValues  
-   public var pictureInPictureAdapter: StreamPictureInPictureAdapter
+   public var utils: Utils

 public struct CallConnectingView: View  
-   public var title: String
+   public var body: some View
-   public var callControls: CallControls
+   
-   public var callTopView: CallTopView
+ 
-   public var body: some View
+   public init(viewFactory: Factory = DefaultViewFactory.shared,outgoingCallMembers: [Member],title: String,callControls: CallControls,callTopView: CallTopView)
-   
- 
-   public init(viewFactory: Factory = DefaultViewFactory.shared,outgoingCallMembers: [Member],title: String,callControls: CallControls,callTopView: CallTopView)

 public struct StatelessMicrophoneIconView: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var actionHandler: ActionHandler?
+ 
-   public var body: some View
+   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   
- 
-   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

- @available(iOS 14.0, *) public struct LayoutMenuView: View  
+ public struct LayoutMenuView: View  

 extension View  
-   public func toastView(toast: Binding<Toast?>)-> some View
+   @ViewBuilder public func snapshot(trigger: SnapshotTriggering,snapshotHandler: @escaping @Sendable(UIImage) -> Void)-> some View

- public struct RTMP  
+ public struct RTMP: Equatable  

- public class BroadcastObserver: ObservableObject  
+ public class BroadcastObserver: ObservableObject, @unchecked Sendable  

 public struct CallDurationView: View  
-   @MainActor public init(_ viewModel: CallViewModel)
+   public init(_ viewModel: CallViewModel)

- public struct PermissionRequest: @unchecked Sendable, Identifiable  
+ public struct PermissionRequest: @unchecked Sendable, Identifiable, Equatable  
-   public func reject()
+   public static func ==(lhs: PermissionRequest,rhs: PermissionRequest)-> Bool
+   public func reject()

 public struct MicrophoneCheckView: View  
-   public init(audioLevels: [Float],microphoneOn: Bool,isSilent: Bool,isPinned: Bool,maxHeight: Float = 14)
+   public init(viewModel: LobbyViewModel,isPinned: Bool,maxHeight: Float = 14)
+   public init(audioLevels: [Float],microphoneOn: Bool,isSilent: Bool,isPinned: Bool,maxHeight: Float = 14)

 public struct StatelessToggleCameraIconView: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var actionHandler: ActionHandler?
+ 
-   public var body: some View
+   public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   
- 
-   public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

- @MainActor public class CallState: ObservableObject  
+ public class CallState: ObservableObject  
-   @Published public internal var sessionId: String
+   @Published public private var sessionId: String
-   @Published public internal var participants
+   @Published public private var participants: [CallParticipant]
-   @Published public internal var participantsMap
+   @Published public private var participantsMap: [String: CallParticipant]
-   @Published public internal var localParticipant: CallParticipant?
+   @Published public private var localParticipant: CallParticipant?
-   @Published public internal var dominantSpeaker: CallParticipant?
+   @Published public private var dominantSpeaker: CallParticipant?
-   @Published public internal var remoteParticipants: [CallParticipant]
+   @Published public private var remoteParticipants: [CallParticipant]
-   @Published public internal var activeSpeakers: [CallParticipant]
+   @Published public private var activeSpeakers: [CallParticipant]
-   @Published public internal var members: [Member]
+   @Published public private var members: [Member]
-   @Published public internal var screenSharingSession: ScreenSharingSession?
+   @Published public private var screenSharingSession: ScreenSharingSession?
-   @Published public internal var recordingState: RecordingState
+   @Published public private var recordingState: RecordingState
-   @Published public internal var blockedUserIds: Set<String>
+   @Published public private var blockedUserIds: Set<String>
-   @Published public internal var settings: CallSettingsResponse?
+   @Published public private var settings: CallSettingsResponse?
-   @Published public internal var ownCapabilities: [OwnCapability]
+   @Published public private var ownCapabilities: [OwnCapability]
-   @Published public internal var capabilitiesByRole: [String: [String]]
+   @Published public private var capabilitiesByRole: [String: [String]]
-   @Published public internal var backstage: Bool
+   @Published public private var backstage: Bool
-   @Published public internal var broadcasting: Bool
+   @Published public private var broadcasting: Bool
-   @Published public internal var createdAt: Date
+   @Published public private var createdAt: Date
-   @Published public internal var updatedAt: Date
+   @Published public private var updatedAt: Date
-   @Published public internal var startsAt: Date?
+   @Published public private var startsAt: Date?
-   @Published public internal var startedAt: Date?
+   @Published public private var startedAt: Date?
-   @Published public internal var endedAt: Date?
+   @Published public private var endedAt: Date?
-   @Published public internal var endedBy: User?
+   @Published public private var endedBy: User?
-   @Published public internal var custom: [String: RawJSON]
+   @Published public private var custom: [String: RawJSON]
-   @Published public internal var team: String?
+   @Published public private var team: String?
-   @Published public internal var createdBy: User?
+   @Published public private var createdBy: User?
-   @Published public internal var ingress: Ingress?
+   @Published public private var ingress: Ingress?
-   @Published public internal var permissionRequests: [PermissionRequest]
+   @Published public private var permissionRequests: [PermissionRequest]
-   @Published public internal var transcribing: Bool
+   @Published public private var transcribing: Bool
-   @Published public internal var captioning: Bool
+   @Published public private var captioning: Bool
-   @Published public internal var egress: EgressResponse?
+   @Published public private var egress: EgressResponse?
-   @Published public internal var session: CallSessionResponse?
+   @Published public private var session: CallSessionResponse?
-   @Published public internal var reconnectionStatus
+   @Published public private var reconnectionStatus: ReconnectionStatus
-   @Published public internal var anonymousParticipantCount: UInt32
+   @Published public private var anonymousParticipantCount: UInt32
-   @Published public internal var participantCount: UInt32
+   @Published public private var participantCount: UInt32
-   @Published public internal var isInitialized: Bool
+   @Published public private var isInitialized: Bool
-   @Published public internal var callSettings
+   @Published public private var callSettings: CallSettings
-   @Published public internal var isCurrentUserScreensharing: Bool
+   @Published public private var isCurrentUserScreensharing: Bool
-   @Published public internal var duration: TimeInterval
+   @Published public private var duration: TimeInterval
-   @Published public internal var statsReport: CallStatsReport?
+   @Published public private var statsReport: CallStatsReport?
-   @Published public internal var closedCaptions: [CallClosedCaption]
+   @Published public private var closedCaptions: [CallClosedCaption]
-   @Published public internal var statsCollectionInterval: Int
+   @Published public private var statsCollectionInterval: Int
-   @Published public internal var incomingVideoQualitySettings: IncomingVideoQualitySettings
+   @Published public private var incomingVideoQualitySettings: IncomingVideoQualitySettings
-   @Published public internal var disconnectionError: Error?
+   @Published public private var disconnectionError: Error?

- @available(iOS 14.0, *) public struct BroadcastIconView: View  
+ public struct BroadcastIconView: View  

 public class Call: @unchecked Sendable, WSEventsSubscriber  
-   @MainActor public internal var state
+   public let state: CallState
-   @MainActor public func currentUserCanRequestPermissions(_ permissions: [Permission])-> Bool
+   public func currentUserCanRequestPermissions(_ permissions: [Permission])-> Bool
-   @MainActor public func currentUserHasCapability(_ capability: OwnCapability)-> Bool
+   public func currentUserHasCapability(_ capability: OwnCapability)-> Bool
-   @discardableResult @MainActor public func collectUserFeedback(rating: Int,reason: String? = nil,custom: [String: RawJSON]? = nil)async throws -> CollectUserFeedbackResponse
+   @discardableResult public func collectUserFeedback(rating: Int,reason: String? = nil,custom: [String: RawJSON]? = nil)async throws -> CollectUserFeedbackResponse
-   @MainActor public func updateParticipantsSorting(with sortComparators: [StreamSortComparator<CallParticipant>])
+   public func updateParticipantsSorting(with sortComparators: [StreamSortComparator<CallParticipant>])
-   @MainActor public func setIncomingVideoQualitySettings(_ value: IncomingVideoQualitySettings)async 
+   public func setIncomingVideoQualitySettings(_ value: IncomingVideoQualitySettings)async 
-   @MainActor public func updateClosedCaptionsSettings(itemPresentationDuration: TimeInterval,maxVisibleItems: Int)async 
+   public func updateClosedCaptionsSettings(itemPresentationDuration: TimeInterval,maxVisibleItems: Int)async 

- public struct ScreenSharingSession  
+ public struct ScreenSharingSession: Equatable  

- @available(iOS 14.0, *) public struct VideoViewOverlay: View  
+ public struct VideoViewOverlay: View  

 public struct StreamLazyImage: View  
-   public init(imageURL: URL?,contentMode: ContentMode = .fill,placeholder: @escaping () -> Placeholder)
+   public init(imageURL: URL?,contentMode: ContentMode = .fill,@ViewBuilder placeholder: @escaping () -> Placeholder)
+   public init(imageURL: URL?,contentMode: ContentMode = .fill)

 public struct StatelessAudioOutputIconView: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var actionHandler: ActionHandler?
+ 
-   public var body: some View
+   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   
- 
-   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

- @available(iOS 14.0, *) public struct CallModifier: ViewModifier  
+ public struct CallModifier: ViewModifier  
-   
+   @MainActor public init(viewModel: CallViewModel)
- 
+   
-   public func body(content: Content)-> some View
+ 
+   public func body(content: Content)-> some View

- @available(iOS 14.0, *) public struct CallContainer: View  
+ public struct CallContainer: View  

 public struct HorizontalParticipantsListView: View  
-   public var viewFactory: Factory
+   public var body: some View
-   public var participants: [CallParticipant]
+   
-   public var frame: CGRect
+ 
-   public var call: Call?
+   public init(viewFactory: Factory = DefaultViewFactory.shared,participants: [CallParticipant],frame: CGRect,call: Call?,innerItemSpace: CGFloat = 8,showAllInfo: Bool = false)
-   public var innerItemSpace: CGFloat
-   public var showAllInfo: Bool
-   public var body: some View
-   
- 
-   public init(viewFactory: Factory = DefaultViewFactory.shared,participants: [CallParticipant],frame: CGRect,call: Call?,innerItemSpace: CGFloat = 8,showAllInfo: Bool = false)

 open class StreamCallAudioRecorder: @unchecked Sendable  
-   
+   @Atomic public private var isRecording: Bool
- 
+   
-   public init(filename: String)
+ 
-   
+   public init(filename: String)
- 
+   
-   open func startRecording(ignoreActiveCall: Bool = false)async 
+ 
-   open func stopRecording()async
+   open func startRecording(ignoreActiveCall: Bool = false)async 
+   open func stopRecording()async

 public struct StatelessVideoIconView: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var actionHandler: ActionHandler?
+ 
-   public var body: some View
+   public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   
- 
-   public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

 @MainActor public class LobbyViewModel: ObservableObject, @unchecked Sendable  
-   @Published public var viewfinderImage: Image?
+   @Published public var viewFinderImage: Image?
-   @Published public var participants
+   @Published public var participants: [User]
-   
+   @Published public var audioOn: Bool
- 
+   @Published public var videoOn: Bool
-   public init(callType: String,callId: String)
+   @Published public var cameraPosition: CameraPosition
-   
+   @Published public var audioLevels: [Float]
- 
+   @Published public var isSilent: Bool
-   public func startCamera(front: Bool)
+   
-   public func stopCamera()
+ 
-   public func cleanUp()
+   public init(callType: String,callId: String,callViewModel: CallViewModel,onJoinCallTap: @escaping () -> Void,onCloseLobbyTap: @escaping () -> Void)
-   public func didUpdate(callSettings: CallSettings)async
+   
+ 
+   public func startCamera(front: Bool)
+   public func stopCamera()
+   public func cleanUp()
+   public func didTapJoin()
+   public func didTapClose()
+   public func toggleMicrophoneEnabled()
+   public func toggleCameraEnabled()

- public struct LobbyInfo: Equatable  
+ public struct LobbyInfo: Equatable, Sendable  

 public class StreamVideo: ObservableObject, @unchecked Sendable  
-   public var state: State
+   @Published public internal var connection: ConnectionStatus
-   public let videoConfig: VideoConfig
+   @Published public internal var user: User
-   public var user: User
+   @Published public internal var activeCall: Call?
-   public var isHardwareAccelerationAvailable: Bool
+   @Published public internal var ringingCall: Call?
-   public lazy var rejectionReasonProvider: RejectionReasonProviding
+   public let state: State
-   
+   public let videoConfig: VideoConfig
- 
+   public var user: User
-   public convenience init(apiKey: String,user: User,token: UserToken,videoConfig: VideoConfig = VideoConfig(),pushNotificationsConfig: PushNotificationsConfig = .default,tokenProvider: UserTokenProvider? = nil)
+   public var isHardwareAccelerationAvailable: Bool
-   
+   public lazy var rejectionReasonProvider: RejectionReasonProviding
- 
+   
-   public func connect()async throws 
+ 
-   public func call(callType: String,callId: String,callSettings: CallSettings? = nil,file: StaticString = #file,function: StaticString = #function,line: UInt = #line)-> Call
+   public convenience init(apiKey: String,user: User,token: UserToken,videoConfig: VideoConfig = VideoConfig(),pushNotificationsConfig: PushNotificationsConfig = .default,tokenProvider: UserTokenProvider? = nil)
-   public func makeCallsController(callsQuery: CallsQuery)-> CallsController
+   
-   @discardableResult public func setDevice(id: String)async throws -> ModelResponse
+ 
-   @discardableResult public func setVoipDevice(id: String)async throws -> ModelResponse
+   public func connect()async throws 
-   @discardableResult public func deleteDevice(id: String)async throws -> ModelResponse
+   public func call(callType: String,callId: String,callSettings: CallSettings? = nil,file: StaticString = #file,function: StaticString = #function,line: UInt = #line)-> Call
-   public func listDevices()async throws -> [Device]
+   public func makeCallsController(callsQuery: CallsQuery)-> CallsController
-   public func disconnect()async 
+   @discardableResult public func setDevice(id: String)async throws -> ModelResponse
-   public func eventPublisher()-> AnyPublisher<VideoEvent, Never>
+   @discardableResult public func setVoipDevice(id: String)async throws -> ModelResponse
-   public func eventPublisher(for event: WSEvent.Type)-> AnyPublisher<WSEvent, Never>
+   @discardableResult public func deleteDevice(id: String)async throws -> ModelResponse
-   public func subscribe()-> AsyncStream<VideoEvent>
+   public func listDevices()async throws -> [Device]
-   public func subscribe(for event: WSEvent.Type)-> AsyncStream<WSEvent>
+   public func disconnect()async 
-   public func queryCalls(next: String? = nil,watch: Bool = false)async throws -> (calls: [Call], next: String?)
+   public func eventPublisher()-> AnyPublisher<VideoEvent, Never>
-   public func queryCalls(filters: [String: RawJSON]?,sort: [SortParamRequest] = [SortParamRequest.descending("created_at")],limit: Int? = 25,watch: Bool = false)async throws -> (calls: [Call], next: String?)
+   public func eventPublisher(for event: WSEvent.Type)-> AnyPublisher<WSEvent, Never>
-   
+   public func subscribe()-> AsyncStream<VideoEvent>
- 
+   public func subscribe(for event: WSEvent.Type)-> AsyncStream<WSEvent>
-   public final class State: ObservableObject, @unchecked Sendable  
+   public func queryCalls(next: String? = nil,watch: Bool = false)async throws -> (calls: [Call], next: String?)
-   
+   public func queryCalls(filters: [String: RawJSON]?,sort: [SortParamRequest] = [SortParamRequest.descending("created_at")],limit: Int? = 25,watch: Bool = false)async throws -> (calls: [Call], next: String?)
-     @Published public internal var connection: ConnectionStatus
+   
-     @Published public internal var user: User
+ 
-     @Published public internal var activeCall: Call?
+   public final class State: ObservableObject, @unchecked Sendable  
-     @Published public internal var ringingCall: Call?
+   
+     @Published public internal var connection: ConnectionStatus
+     @Published public internal var user: User
+     @Published public internal var activeCall: Call?
+     @Published public internal var ringingCall: Call?

 public struct StatelessHangUpIconView: View  
-   public weak var call: Call?
+   public var size: CGFloat
-   public var size: CGFloat
+   public var actionHandler: ActionHandler?
-   public var actionHandler: ActionHandler?
+   public var body: some View
-   public var body: some View
+   
-   
+ 
- 
+   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)
-   @MainActor public init(call: Call?,size: CGFloat = 44,actionHandler: ActionHandler? = nil)

- public struct Ingress  
+ public struct Ingress: Equatable  

- @available(iOS 14.0, *) public struct LocalParticipantViewModifier: ViewModifier  
+ public struct LocalParticipantViewModifier: ViewModifier  
-   
+   public init(participant: CallParticipant,call: Call?,showAllInfo: Bool,decorations: [VideoCallParticipantDecoration] = VideoCallParticipantDecoration.allCases)
- 
+   
-   public func body(content: Content)-> some View
+ 
+   public func body(content: Content)-> some View

 public struct StatelessParticipantsListButton: View  
-   public weak var call: Call?
+   public var body: some View
-   public var size: CGFloat
+   
-   public var isActive: Binding<Bool>
+ 
-   public var actionHandler: ActionHandler?
+   @MainActor public init(call: Call?,size: CGFloat = 44,isActive: Binding<Bool>,actionHandler: ActionHandler? = nil)
-   public var body: some View
-   
- 
-   @MainActor public init(call: Call?,size: CGFloat = 44,isActive: Binding<Bool>,actionHandler: ActionHandler? = nil)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants