Skip to content

Conversation

@Stream-SDK-Bot
Copy link
Collaborator

βœ… Added

  • Add support for ringing individual members. #995

🐞 Fixed

  • Ensure SFU track and participant updates create missing participants. #996

@Stream-SDK-Bot Stream-SDK-Bot requested a review from a team as a code owner November 19, 2025 12:20
@github-actions
Copy link

1 Warning
⚠️ Big PR

Generated by 🚫 Danger

@github-actions
Copy link

Public Interface

+ public final class RingCallResponse: @unchecked Sendable, Codable, JSONEncodable, Hashable  
+ 
+   public var duration: String
+   public var membersIds: [String]
+   
+ 
+   public init(duration: String,membersIds: [String])
+   
+ 
+   public static func ==(lhs: RingCallResponse,rhs: RingCallResponse)-> Bool
+   public func hash(into hasher: inout Hasher)
+   
+ 
+   public enum CodingKeys: String, CodingKey, CaseIterable  
+   
+     case duration
+     case membersIds = "members_ids"

+ public final class RingCallRequest: @unchecked Sendable, Codable, JSONEncodable, Hashable  
+ 
+   public var membersIds: [String]?
+   public var video: Bool?
+   
+ 
+   public init(membersIds: [String]? = nil,video: Bool? = nil)
+   
+ 
+   public static func ==(lhs: RingCallRequest,rhs: RingCallRequest)-> Bool
+   public func hash(into hasher: inout Hasher)
+   
+ 
+   public enum CodingKeys: String, CodingKey, CaseIterable  
+   
+     case membersIds = "members_ids"
+     case video



 public class Call: @unchecked Sendable, WSEventsSubscriber  
-   @discardableResult public func update(custom: [String: RawJSON]? = nil,settingsOverride: CallSettingsRequest? = nil,startsAt: Date? = nil)async throws -> UpdateCallResponse
+   @discardableResult public func ring(request: RingCallRequest)async throws -> RingCallResponse
-   @discardableResult public func accept()async throws -> AcceptCallResponse
+   @discardableResult public func update(custom: [String: RawJSON]? = nil,settingsOverride: CallSettingsRequest? = nil,startsAt: Date? = nil)async throws -> UpdateCallResponse
-   @discardableResult public func reject(reason: String? = nil)async throws -> RejectCallResponse
+   @discardableResult public func accept()async throws -> AcceptCallResponse
-   @discardableResult public func block(user: User)async throws -> BlockUserResponse
+   @discardableResult public func reject(reason: String? = nil)async throws -> RejectCallResponse
-   @discardableResult public func unblock(user: User)async throws -> UnblockUserResponse
+   @discardableResult public func block(user: User)async throws -> BlockUserResponse
-   public func changeTrackVisibility(for participant: CallParticipant,isVisible: Bool)async 
+   @discardableResult public func unblock(user: User)async throws -> UnblockUserResponse
-   @discardableResult public func addMembers(members: [MemberRequest])async throws -> UpdateCallMembersResponse
+   public func changeTrackVisibility(for participant: CallParticipant,isVisible: Bool)async 
-   @discardableResult public func updateMembers(members: [MemberRequest])async throws -> UpdateCallMembersResponse
+   @discardableResult public func addMembers(members: [MemberRequest])async throws -> UpdateCallMembersResponse
-   @discardableResult public func addMembers(ids: [String])async throws -> UpdateCallMembersResponse
+   @discardableResult public func updateMembers(members: [MemberRequest])async throws -> UpdateCallMembersResponse
-   @discardableResult public func removeMembers(ids: [String])async throws -> UpdateCallMembersResponse
+   @discardableResult public func addMembers(ids: [String])async throws -> UpdateCallMembersResponse
-   public func updateTrackSize(_ trackSize: CGSize,for participant: CallParticipant)async 
+   @discardableResult public func removeMembers(ids: [String])async throws -> UpdateCallMembersResponse
-   public func setVideoFilter(_ videoFilter: VideoFilter?)
+   public func updateTrackSize(_ trackSize: CGSize,for participant: CallParticipant)async 
-   public func setAudioFilter(_ audioFilter: AudioFilter?)
+   public func setVideoFilter(_ videoFilter: VideoFilter?)
-   public func startScreensharing(type: ScreensharingType)async throws 
+   public func setAudioFilter(_ audioFilter: AudioFilter?)
-   public func stopScreensharing()async throws 
+   public func startScreensharing(type: ScreensharingType)async throws 
-   public func eventPublisher(for event: WSEvent.Type)-> AnyPublisher<WSEvent, Never>
+   public func stopScreensharing()async throws 
-   public func subscribe()-> AsyncStream<VideoEvent>
+   public func eventPublisher(for event: WSEvent.Type)-> AnyPublisher<WSEvent, Never>
-   public func subscribe(for event: WSEvent.Type)-> AsyncStream<WSEvent>
+   public func subscribe()-> AsyncStream<VideoEvent>
-   public func leave()
+   public func subscribe(for event: WSEvent.Type)-> AsyncStream<WSEvent>
-   public func startNoiseCancellation()async throws 
+   public func leave()
-   public func stopNoiseCancellation()async throws 
+   public func startNoiseCancellation()async throws 
-   @MainActor public func currentUserCanRequestPermissions(_ permissions: [Permission])-> Bool
+   public func stopNoiseCancellation()async throws 
-   @discardableResult public func request(permissions: [Permission])async throws -> RequestPermissionResponse
+   @MainActor public func currentUserCanRequestPermissions(_ permissions: [Permission])-> Bool
-   @MainActor public func currentUserHasCapability(_ capability: OwnCapability)-> Bool
+   @discardableResult public func request(permissions: [Permission])async throws -> RequestPermissionResponse
-   @discardableResult public func grant(permissions: [Permission],for userId: String)async throws -> UpdateUserPermissionsResponse
+   @MainActor public func currentUserHasCapability(_ capability: OwnCapability)-> Bool
-   @discardableResult public func grant(request: PermissionRequest)async throws -> UpdateUserPermissionsResponse
+   @discardableResult public func grant(permissions: [Permission],for userId: String)async throws -> UpdateUserPermissionsResponse
-   @discardableResult public func revoke(permissions: [Permission],for userId: String)async throws -> UpdateUserPermissionsResponse
+   @discardableResult public func grant(request: PermissionRequest)async throws -> UpdateUserPermissionsResponse
-   @discardableResult public func mute(userId: String,audio: Bool = true,video: Bool = true)async throws -> MuteUsersResponse
+   @discardableResult public func revoke(permissions: [Permission],for userId: String)async throws -> UpdateUserPermissionsResponse
-   @discardableResult public func muteAllUsers(audio: Bool = true,video: Bool = true)async throws -> MuteUsersResponse
+   @discardableResult public func mute(userId: String,audio: Bool = true,video: Bool = true)async throws -> MuteUsersResponse
-   @discardableResult public func end()async throws -> EndCallResponse
+   @discardableResult public func muteAllUsers(audio: Bool = true,video: Bool = true)async throws -> MuteUsersResponse
-   @discardableResult public func blockUser(with userId: String)async throws -> BlockUserResponse
+   @discardableResult public func end()async throws -> EndCallResponse
-   @discardableResult public func unblockUser(with userId: String)async throws -> UnblockUserResponse
+   @discardableResult public func blockUser(with userId: String)async throws -> BlockUserResponse
-   @discardableResult public func goLive(startHls: Bool? = nil,startRecording: Bool? = nil,startRtmpBroadcasts: Bool? = nil,startTranscription: Bool? = nil)async throws -> GoLiveResponse
+   @discardableResult public func unblockUser(with userId: String)async throws -> UnblockUserResponse
-   @discardableResult public func stopLive()async throws -> StopLiveResponse
+   @discardableResult public func goLive(startHls: Bool? = nil,startRecording: Bool? = nil,startRtmpBroadcasts: Bool? = nil,startTranscription: Bool? = nil)async throws -> GoLiveResponse
-   public func stopLive(request: StopLiveRequest)async throws -> StopLiveResponse
+   @discardableResult public func stopLive()async throws -> StopLiveResponse
-   @discardableResult public func startRecording()async throws -> StartRecordingResponse
+   public func stopLive(request: StopLiveRequest)async throws -> StopLiveResponse
-   @discardableResult public func stopRecording()async throws -> StopRecordingResponse
+   @discardableResult public func startRecording()async throws -> StartRecordingResponse
-   public func listRecordings()async throws -> [CallRecording]
+   @discardableResult public func stopRecording()async throws -> StopRecordingResponse
-   @discardableResult public func startHLS()async throws -> StartHLSBroadcastingResponse
+   public func listRecordings()async throws -> [CallRecording]
-   @discardableResult public func stopHLS()async throws -> StopHLSBroadcastingResponse
+   @discardableResult public func startHLS()async throws -> StartHLSBroadcastingResponse
-   @discardableResult public func startRTMPBroadcast(request: StartRTMPBroadcastsRequest)async throws -> StartRTMPBroadcastsResponse
+   @discardableResult public func stopHLS()async throws -> StopHLSBroadcastingResponse
-   @discardableResult public func stopRTMPBroadcasts(name: String)async throws -> StopRTMPBroadcastsResponse
+   @discardableResult public func startRTMPBroadcast(request: StartRTMPBroadcastsRequest)async throws -> StartRTMPBroadcastsResponse
-   @discardableResult public func sendCustomEvent(_ data: [String: RawJSON])async throws -> SendEventResponse
+   @discardableResult public func stopRTMPBroadcasts(name: String)async throws -> StopRTMPBroadcastsResponse
-   @discardableResult public func sendReaction(type: String,custom: [String: RawJSON]? = nil,emojiCode: String? = nil)async throws -> SendReactionResponse
+   @discardableResult public func sendCustomEvent(_ data: [String: RawJSON])async throws -> SendEventResponse
-   public func queryMembers(filters: [String: RawJSON]? = nil,sort: [SortParamRequest] = [SortParamRequest.descending("created_at")],limit: Int = 25)async throws -> QueryMembersResponse
+   @discardableResult public func sendReaction(type: String,custom: [String: RawJSON]? = nil,emojiCode: String? = nil)async throws -> SendReactionResponse
-   public func queryMembers(filters: [String: RawJSON]? = nil,sort: [SortParamRequest]? = nil,limit: Int = 25,next: String)async throws -> QueryMembersResponse
+   public func queryMembers(filters: [String: RawJSON]? = nil,sort: [SortParamRequest] = [SortParamRequest.descending("created_at")],limit: Int = 25)async throws -> QueryMembersResponse
-   public func pin(sessionId: String)async throws 
+   public func queryMembers(filters: [String: RawJSON]? = nil,sort: [SortParamRequest]? = nil,limit: Int = 25,next: String)async throws -> QueryMembersResponse
-   public func unpin(sessionId: String)async throws 
+   public func pin(sessionId: String)async throws 
-   public func pinForEveryone(userId: String,sessionId: String)async throws -> PinResponse
+   public func unpin(sessionId: String)async throws 
-   public func unpinForEveryone(userId: String,sessionId: String)async throws -> UnpinResponse
+   public func pinForEveryone(userId: String,sessionId: String)async throws -> PinResponse
-   public func focus(at point: CGPoint)async throws 
+   public func unpinForEveryone(userId: String,sessionId: String)async throws -> UnpinResponse
-   public func addCapturePhotoOutput(_ capturePhotoOutput: AVCapturePhotoOutput)async throws 
+   public func focus(at point: CGPoint)async throws 
-   public func removeCapturePhotoOutput(_ capturePhotoOutput: AVCapturePhotoOutput)async throws 
+   public func addCapturePhotoOutput(_ capturePhotoOutput: AVCapturePhotoOutput)async throws 
-   @available(iOS 16.0, *) public func addVideoOutput(_ videoOutput: AVCaptureVideoDataOutput)async throws 
+   public func removeCapturePhotoOutput(_ capturePhotoOutput: AVCapturePhotoOutput)async throws 
-   @available(iOS 16.0, *) public func removeVideoOutput(_ videoOutput: AVCaptureVideoDataOutput)async throws 
+   @available(iOS 16.0, *) public func addVideoOutput(_ videoOutput: AVCaptureVideoDataOutput)async throws 
-   public func zoom(by factor: CGFloat)async throws 
+   @available(iOS 16.0, *) public func removeVideoOutput(_ videoOutput: AVCaptureVideoDataOutput)async throws 
-   @discardableResult public func startTranscription(transcriptionExternalStorage: String? = nil)async throws -> StartTranscriptionResponse
+   public func zoom(by factor: CGFloat)async throws 
-   @discardableResult public func stopTranscription(stopClosedCaptions: Bool? = nil)async throws -> StopTranscriptionResponse
+   @discardableResult public func startTranscription(transcriptionExternalStorage: String? = nil)async throws -> StartTranscriptionResponse
-   @discardableResult @MainActor public func collectUserFeedback(rating: Int,reason: String? = nil,custom: [String: RawJSON]? = nil)async throws -> CollectUserFeedbackResponse
+   @discardableResult public func stopTranscription(stopClosedCaptions: Bool? = nil)async throws -> StopTranscriptionResponse
-   @MainActor public func updateParticipantsSorting(with sortComparators: [StreamSortComparator<CallParticipant>])
+   @discardableResult @MainActor public func collectUserFeedback(rating: Int,reason: String? = nil,custom: [String: RawJSON]? = nil)async throws -> CollectUserFeedbackResponse
-   @MainActor public func setIncomingVideoQualitySettings(_ value: IncomingVideoQualitySettings)async 
+   @MainActor public func updateParticipantsSorting(with sortComparators: [StreamSortComparator<CallParticipant>])
-   public func setDisconnectionTimeout(_ timeout: TimeInterval)
+   @MainActor public func setIncomingVideoQualitySettings(_ value: IncomingVideoQualitySettings)async 
-   public func updatePublishOptions(preferredVideoCodec: VideoCodec,maxBitrate: Int = .maxBitrate)async 
+   public func setDisconnectionTimeout(_ timeout: TimeInterval)
-   @discardableResult public func startClosedCaptions(_ request: StartClosedCaptionsRequest = .init())async throws -> StartClosedCaptionsResponse
+   public func updatePublishOptions(preferredVideoCodec: VideoCodec,maxBitrate: Int = .maxBitrate)async 
-   @discardableResult public func stopClosedCaptions(stopTranscription: Bool? = nil)async throws -> StopClosedCaptionsResponse
+   @discardableResult public func startClosedCaptions(_ request: StartClosedCaptionsRequest = .init())async throws -> StartClosedCaptionsResponse
-   @MainActor public func updateClosedCaptionsSettings(itemPresentationDuration: TimeInterval,maxVisibleItems: Int)async 
+   @discardableResult public func stopClosedCaptions(stopTranscription: Bool? = nil)async throws -> StopClosedCaptionsResponse
-   public func updateAudioSessionPolicy(_ policy: AudioSessionPolicy)async 
+   @MainActor public func updateClosedCaptionsSettings(itemPresentationDuration: TimeInterval,maxVisibleItems: Int)async 
-   public func addProximityPolicy(_ policy: any ProximityPolicy)throws 
+   public func updateAudioSessionPolicy(_ policy: AudioSessionPolicy)async 
-   public func removeProximityPolicy(_ policy: any ProximityPolicy)
+   public func addProximityPolicy(_ policy: any ProximityPolicy)throws 
-   public func enableClientCapabilities(_ capabilities: Set<ClientCapability>)async 
+   public func removeProximityPolicy(_ policy: any ProximityPolicy)
-   public func disableClientCapabilities(_ capabilities: Set<ClientCapability>)async 
+   public func enableClientCapabilities(_ capabilities: Set<ClientCapability>)async 
-   public func kickUser(userId: String,block: Bool? = nil)async throws -> KickUserResponse
+   public func disableClientCapabilities(_ capabilities: Set<ClientCapability>)async 
+   public func kickUser(userId: String,block: Bool? = nil)async throws -> KickUserResponse

 @MainActor open class CallViewModel: ObservableObject  
-   public func enterLobby(callType: String,callId: String,members: [Member])
+   public func joinAndRingCall(callType: String,callId: String,members: [Member],team: String? = nil,maxDuration: Int? = nil,maxParticipants: Int? = nil,startsAt: Date? = nil,customData: [String: RawJSON]? = nil,video: Bool? = nil)
-   public func acceptCall(callType: String,callId: String,customData: [String: RawJSON]? = nil)
+   public func enterLobby(callType: String,callId: String,members: [Member])
-   public func rejectCall(callType: String,callId: String)
+   public func acceptCall(callType: String,callId: String,customData: [String: RawJSON]? = nil)
-   public func changeTrackVisibility(for participant: CallParticipant,isVisible: Bool)
+   public func rejectCall(callType: String,callId: String)
-   public func updateTrackSize(_ trackSize: CGSize,for participant: CallParticipant)
+   public func changeTrackVisibility(for participant: CallParticipant,isVisible: Bool)
-   public func startScreensharing(type: ScreensharingType)
+   public func updateTrackSize(_ trackSize: CGSize,for participant: CallParticipant)
-   public func stopScreensharing()
+   public func startScreensharing(type: ScreensharingType)
-   public func hangUp()
+   public func stopScreensharing()
-   public func setVideoFilter(_ videoFilter: VideoFilter?)
+   public func hangUp()
-   public func update(participantsLayout: ParticipantsLayout)
+   public func setVideoFilter(_ videoFilter: VideoFilter?)
-   public func setActiveCall(_ call: Call?,file: StaticString = #file,function: StaticString = #function,line: UInt = #line)
+   public func update(participantsLayout: ParticipantsLayout)
-   public func update(participantsSortComparators: [StreamSortComparator<CallParticipant>])
+   public func setActiveCall(_ call: Call?,file: StaticString = #file,function: StaticString = #function,line: UInt = #line)
+   public func update(participantsSortComparators: [StreamSortComparator<CallParticipant>])

 open class DefaultAPI: DefaultAPIEndpoints, @unchecked Sendable  
-   open func videoConnect()async throws
+   open func videoConnect()async throws 
+   open func ringCall(type: String,id: String,ringCallRequest: RingCallRequest)async throws -> RingCallResponse

@Stream-SDK-Bot
Copy link
Collaborator Author

SDK Size

title previous release current release diff status
StreamVideo 8.77 MB 8.79 MB +21 KB 🟒
StreamVideoSwiftUI 2.4 MB 2.4 MB +1 KB 🟒
StreamVideoUIKit 2.52 MB 2.52 MB +1 KB 🟒
StreamWebRTC 11.01 MB 11.01 MB 0 KB 🟒

@Stream-SDK-Bot
Copy link
Collaborator Author

StreamVideo XCSize

Object Diff (bytes)
RingCallRequest.o +7250
RingCallResponse.o +7061
DefaultAPI.o +3085
SFUEventAdapter.o +2336
WebRTCStatsCollecting.o +380
NoiseCancellationSettingsRequest.o +332
Call.o +280

@Stream-SDK-Bot
Copy link
Collaborator Author

StreamVideoSwiftUI XCSize

Object Diff (bytes)
CallViewModel.o +11154
CallControlsView.o +120
StreamVideo.tbd +76

@github-actions
Copy link

Build for regression testing β„–293 has been uploaded to TestFlight 🎁

@sonarqubecloud
Copy link

@testableapple
Copy link
Contributor

/merge release

@testableapple
Copy link
Contributor

Publication of the release has been launched πŸ‘

@github-actions github-actions bot merged commit 5e508ba into main Nov 19, 2025
13 checks passed
@github-actions github-actions bot deleted the release/1.36.0 branch November 19, 2025 16:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants