Skip to content

Conversation

laevandus
Copy link
Contributor

@laevandus laevandus commented Aug 1, 2025

Important

This PR is for next major version 5 and is going to merged into v5 branch.

🔗 Issue Links

Resolves: IOS-734
Resolves: IOS-735

🎯 Goal

Use Swift 6 with strict concurrency checking set to complete

📝 Summary

  • Set Swift version to 6 with strict concurrency checking complete (including test tools, demo app, mock server)
  • Drop Xcode 15 support
  • Add Sendable conformances to public types
  • Add @sendable to many closure callbacks
  • LLC: Controller delegates and completion handlers are @mainactor (removed callbackDelegate)
  • UIKit: Nuke was upgraded from 10 to 12 (brings Swift 6 support)
  • UIKit: Use @mainactor in delegates

🛠 Implementation

Tried to make it as concise as possible, therefore in some cases there is nonisolated(unsafe), because fixing them properly leads to huge refactoring (too large scope). In many cases this is actually all right.

🧪 Manual Testing Notes

Needs full regression testing round.

☑️ Contributor Checklist

  • I have signed the Stream CLA (required)
  • This change should be manually QAed
  • Changelog is updated with client-facing changes
  • Changelog is updated with new localization keys
  • New code is covered by unit tests
  • Documentation has been updated in the docs-content repo

@laevandus laevandus requested a review from a team as a code owner August 1, 2025 08:52
@laevandus laevandus added 🌐 SDK: StreamChat (LLC) Tasks related to the StreamChat LLC SDK 🎨 SDK: StreamChatUI Tasks related to the StreamChatUI SDK 🪧 Demo App An Issue or PR related to the Demo App ⏫ Dependencies Update A PR that updates SDK Dependencies ✅ Feature An issue or PR related to a feature 🤞 Ready For QA A PR that is Ready for QA 💥 Breaking Changes A PR that contains breaking changes labels Aug 1, 2025
Copy link

github-actions bot commented Aug 1, 2025

2 Warnings
⚠️ Big PR
⚠️ The changes should be manually QAed before the Pull Request will be merged

Generated by 🚫 Danger

@laevandus laevandus changed the title Use Swift 6 with complete concurrency checking [V5] Use Swift 6 with complete concurrency checking Aug 1, 2025
@laevandus laevandus marked this pull request as draft August 1, 2025 08:55
@Stream-SDK-Bot
Copy link
Collaborator

SDK Performance

target metric benchmark branch performance status
MessageList Hitches total duration 10 ms 5.01 ms 49.9% 🔼 🟢
Duration 2.6 s 2.54 s 2.31% 🔼 🟢
Hitch time ratio 4 ms per s 1.97 ms per s 50.75% 🔼 🟢
Frame rate 75 fps 78.41 fps 4.55% 🔼 🟢
Number of hitches 1 0.6 40.0% 🔼 🟢

Copy link

github-actions bot commented Aug 1, 2025

Public Interface

- public protocol DataControllerStateDelegate: AnyObject
+ @MainActor public protocol DataControllerStateDelegate: AnyObject

- public struct UploadedAttachment  
+ public struct UploadedAttachment: Sendable  

- public class ChatReactionListController: DataController, DelegateCallable, DataStoreProvider  
+ public class ChatReactionListController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   override public func synchronize(_ completion: ((_ error: Error?) -> Void)? = nil)
+   override public func synchronize(_ completion: (@MainActor @Sendable(_ error: Error?) -> Void)? = nil)

- open class NukeImageProcessor: ImageProcessor  
+ open class NukeImageProcessor: ImageProcessor, @unchecked Sendable  

- public struct UnreadChannelByType  
+ public struct UnreadChannelByType: Sendable  

- public final class AudioAnalysisEngineError: ClientError  
+ public final class AudioAnalysisEngineError: ClientError, @unchecked Sendable  

- public protocol SortingKey: Encodable
+ public protocol SortingKey: Encodable, Sendable

- public class PollController: DataController, DelegateCallable, DataStoreProvider  
+ public class PollController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   override public func synchronize(_ completion: ((_ error: Error?) -> Void)? = nil)
+   override public func synchronize(_ completion: (@MainActor @Sendable(_ error: Error?) -> Void)? = nil)
-   public func castPollVote(answerText: String?,optionId: String?,completion: ((Error?) -> Void)? = nil)
+   public func castPollVote(answerText: String?,optionId: String?,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func removePollVote(voteId: String,completion: ((Error?) -> Void)? = nil)
+   public func removePollVote(voteId: String,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func closePoll(completion: ((Error?) -> Void)? = nil)
+   public func closePoll(completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func suggestPollOption(text: String,position: Int? = nil,extraData: [String: RawJSON]? = nil,completion: ((Error?) -> Void)? = nil)
+   public func suggestPollOption(text: String,position: Int? = nil,extraData: [String: RawJSON]? = nil,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)

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

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

- public protocol ChatMessageActionsVCDelegate: AnyObject
+ @MainActor public protocol ChatMessageActionsVCDelegate: AnyObject

- public protocol ChatMessageListScrollOverlayDataSource: AnyObject
+ @MainActor public protocol ChatMessageListScrollOverlayDataSource: AnyObject

- public enum AttachmentFileType: String, Codable, Equatable, CaseIterable  
+ public enum AttachmentFileType: String, Codable, Equatable, CaseIterable, Sendable  

- public final class WebSocket: ClientError
+ public final class WebSocket: ClientError, @unchecked Sendable

- public enum MessageOrdering  
+ public enum MessageOrdering: Sendable  

 open class ComposerVC: _ViewController, ThemeProvider, UITextViewDelegate, UIImagePickerControllerDelegate, UIDocumentPickerDelegate, UINavigationControllerDelegate, InputTextViewClipboardAttachmentDelegate, VoiceRecordingDelegate  
-   open func addAttachmentToContent(from url: URL,type: AttachmentType,info: [LocalAttachmentInfoKey: Any],extraData: Encodable?)throws 
+   open func addAttachmentToContent(from url: URL,type: AttachmentType,info: [LocalAttachmentInfoKey: Any],extraData: (Encodable & Sendable)?)throws 

- public struct Sorting: Encodable, CustomStringConvertible  
+ public struct Sorting: Encodable, CustomStringConvertible, Sendable  

- public enum MessageType: String, Codable  
+ public enum MessageType: String, Codable, Sendable  

- public struct TypingIndicatorPrivacySettings  
+ public struct TypingIndicatorPrivacySettings: Sendable  

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

- public class MessageReminderDeletedEvent: Event  
+ public final class MessageReminderDeletedEvent: Event  

- public class ConsoleLogDestination: BaseLogDestination  
+ public class ConsoleLogDestination: BaseLogDestination, @unchecked Sendable  

- public struct ChatMessage  
+ public struct ChatMessage: Sendable  

- public protocol Event
+ public protocol Event: Sendable

- public struct AttachmentAction: Codable, Hashable  
+ public struct AttachmentAction: Codable, Hashable, Sendable  
-   public enum ActionType: String, Codable  
+   public enum ActionType: String, Codable, Sendable  
-   public enum ActionStyle: String, Codable  
+   public enum ActionStyle: String, Codable, Sendable  

- public protocol StreamModelsTransformer
+ public protocol StreamModelsTransformer: Sendable

- public struct UnreadThread  
+ public struct UnreadThread: Sendable  

- @propertyWrapper public class Atomic  
+ @propertyWrapper public class Atomic: @unchecked Sendable  

- public class DraftDeletedEvent: Event  
+ public final class DraftDeletedEvent: Event  

- public struct PushNotificationType: Equatable  
+ public struct PushNotificationType: Equatable, Sendable  
-   public static var messageNew: PushNotificationType
+   public static let messageNew: PushNotificationType
-   public static var messageReminderDue: PushNotificationType
+   public static let messageReminderDue: PushNotificationType
-   public static var messageUpdated: PushNotificationType
+   public static let messageUpdated: PushNotificationType
-   public static var reactionNew: PushNotificationType
+   public static let reactionNew: PushNotificationType

- public class MessageReminderDueEvent: Event  
+ public final class MessageReminderDueEvent: Event  

- public struct Token: Decodable, Equatable, ExpressibleByStringLiteral  
+ public struct Token: Decodable, Equatable, ExpressibleByStringLiteral, Sendable  

- public struct AudioPlaybackRate: Comparable, Equatable  
+ public struct AudioPlaybackRate: Comparable, Equatable, Sendable  

- public struct UserRole: RawRepresentable, Codable, Hashable, ExpressibleByStringLiteral  
+ public struct UserRole: RawRepresentable, Codable, Hashable, ExpressibleByStringLiteral, Sendable  

- public final class ReconnectionTimeout: ClientError  
+ public final class ReconnectionTimeout: ClientError, @unchecked Sendable  

- public struct ChannelQuery: Encodable  
+ public struct ChannelQuery: Encodable, Sendable  

- public protocol InputTextViewClipboardAttachmentDelegate: AnyObject
+ @MainActor public protocol InputTextViewClipboardAttachmentDelegate: AnyObject

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

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

- public class CurrentChatUserController: DataController, DelegateCallable, DataStoreProvider  
+ public class CurrentChatUserController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   override public func synchronize(_ completion: ((_ error: Error?) -> Void)? = nil)
+   override public func synchronize(_ completion: (@MainActor @Sendable(_ error: Error?) -> Void)? = nil)

- public final class PollVoteAlreadyExists: ClientError  
+ public final class PollVoteAlreadyExists: ClientError, @unchecked Sendable  

- public protocol VoiceRecordingAttachmentPresentationViewDelegate: ChatMessageContentViewDelegate
+ @MainActor public protocol VoiceRecordingAttachmentPresentationViewDelegate: ChatMessageContentViewDelegate

- open class BaseLogDestination: LogDestination  
+ open class BaseLogDestination: LogDestination, @unchecked Sendable  

- public final class Unknown: ClientError
+ public final class Unknown: ClientError, @unchecked Sendable

- public protocol KeyboardHandler
+ @MainActor public protocol KeyboardHandler

 open class VoiceRecordingVC: _ViewController, ComponentsProvider, AppearanceProvider, AudioRecordingDelegate, AudioPlayingDelegate, UIGestureRecognizerDelegate  
-   public struct State: RawRepresentable, Equatable  
+   public struct State: RawRepresentable, Equatable, Sendable  
-     public static var idle
+     public static let idle
-     public static var showingTip
+     public static let showingTip
-     public static var recording
+     public static let recording
-     public static var locked
+     public static let locked
-     public static var preview
+     public static let preview
-   public struct Action: RawRepresentable, Equatable  
+   public struct Action: RawRepresentable, Equatable, Sendable  
-     public static var tapRecord
+     public static let tapRecord
-     public static var showTip
+     public static let showTip
-     public static var beginRecording
+     public static let beginRecording
-     public static var touchUp
+     public static let touchUp
-     public static var cancel
+     public static let cancel
-     public static var lock
+     public static let lock
-     public static var stop
+     public static let stop
-     public static var discard
+     public static let discard
-     public static var send
+     public static let send
-     public static var confirm
+     public static let confirm
-     public static var publishMessage
+     public static let publishMessage
-     public static var play
+     public static let play
-     public static var pause
+     public static let pause
-   public struct Content: Equatable  
+   public struct Content: Equatable, Sendable  

- public protocol AttachmentUploader
+ public protocol AttachmentUploader: Sendable

- public protocol AudioRecordingDelegate: AnyObject
+ @MainActor public protocol AudioRecordingDelegate: AnyObject

- public struct TranslationLanguage: Hashable  
+ public struct TranslationLanguage: Hashable, Sendable  

 @available(iOSApplicationExtension, unavailable) open class ChatChannelSearchVC: ChatChannelListSearchVC  
-   public var didSelectChannel: ((ChatChannel) -> Void)?
+   public var didSelectChannel: (@MainActor(ChatChannel) -> Void)?

- public struct UserListQuery: Encodable  
+ public struct UserListQuery: Encodable, Sendable  

- public final class MissingTokenProvider: ClientError  
+ public final class MissingTokenProvider: ClientError, @unchecked Sendable  

- public protocol Customizable
+ @MainActor public protocol Customizable

- public class ChannelList  
+ public class ChannelList: @unchecked Sendable  
-   @MainActor public lazy var state: ChannelListState
+   @MainActor public var state: ChannelListState

- public protocol ChatMessageContentViewDelegate: AnyObject
+ @MainActor public protocol ChatMessageContentViewDelegate: AnyObject

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

- public struct MessagePinDetails  
+ public struct MessagePinDetails: Sendable  

- public enum PinnedMessagesPagination: Hashable  
+ public enum PinnedMessagesPagination: Hashable, Sendable  

- public struct DraftListQuery: Encodable  
+ public struct DraftListQuery: Encodable, Sendable  

- public final class Unexpected: ClientError
+ public final class Unexpected: ClientError, @unchecked Sendable

- public struct Components  
+ public struct Components: @unchecked Sendable  
-   public static var `default`
+   public nonisolated static var `default`

- public struct EmptyResponse: Decodable
+ public struct EmptyResponse: Decodable, Sendable

- public struct MessageReminder  
+ public struct MessageReminder: Sendable  

- public protocol SendMessageInterceptorFactory
+ public protocol SendMessageInterceptorFactory: Sendable

- public protocol ChatMessageListVCDelegate: AnyObject
+ @MainActor public protocol ChatMessageListVCDelegate: AnyObject

- open class StreamAudioQueuePlayer: StreamAudioPlayer  
+ open class StreamAudioQueuePlayer: StreamAudioPlayer, @unchecked Sendable  

- public struct ChatChannel  
+ public struct ChatChannel: Sendable  

- public final class IgnoredEventType: ClientError  
+ public final class IgnoredEventType: ClientError, @unchecked Sendable  

- public protocol ChatMessageListVCDataSource: AnyObject
+ @MainActor public protocol ChatMessageListVCDataSource: AnyObject

- public protocol AudioPlayingDelegate: AnyObject
+ @MainActor public protocol AudioPlayingDelegate: AnyObject

- public protocol FilterValue: Encodable
+ public protocol FilterValue: Encodable, Sendable

- public struct AnyAttachmentPayload  
+ public struct AnyAttachmentPayload: Sendable  
-   public let payload: Encodable
+   public let payload: (Encodable & Sendable)

- public protocol ChatChannelAvatarViewSwiftUIView: View
+ @MainActor public protocol ChatChannelAvatarViewSwiftUIView: View

 extension ImageAttachmentPayload: AttachmentPreviewProvider  
-   public func previewView(components: Components)-> UIView
+   @MainActor public func previewView(components: Components)-> UIView

- public class PollVoteListController: DataController, DelegateCallable, DataStoreProvider  
+ public class PollVoteListController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   override public func synchronize(_ completion: ((_ error: Error?) -> Void)? = nil)
+   override public func synchronize(_ completion: (@MainActor @Sendable(_ error: Error?) -> Void)? = nil)
-   public func loadMoreVotes(limit: Int? = nil,completion: ((Error?) -> Void)? = nil)
+   public func loadMoreVotes(limit: Int? = nil,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)

- public class CurrentChatUser: ChatUser  
+ public class CurrentChatUser: ChatUser, @unchecked Sendable  

- public class ChatUserController: DataController, DelegateCallable, DataStoreProvider  
+ public class ChatUserController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   override public func synchronize(_ completion: ((_ error: Error?) -> Void)? = nil)
+   override public func synchronize(_ completion: (@MainActor @Sendable(_ error: Error?) -> Void)? = nil)

- public struct ReadReceiptsPrivacySettings  
+ public struct ReadReceiptsPrivacySettings: Sendable  

 public enum LogConfig  
-   public static var identifier
+   public nonisolated static var identifier
-   public static var level: LogLevel
+   public nonisolated static var level: LogLevel
-   public static var dateFormatter: DateFormatter
+   public nonisolated static var dateFormatter: DateFormatter
-   public static var formatters
+   public nonisolated static var formatters
-   public static var showDate
+   public nonisolated static var showDate
-   public static var showLevel
+   public nonisolated static var showLevel
-   public static var showIdentifier
+   public nonisolated static var showIdentifier
-   public static var showThreadName
+   public nonisolated static var showThreadName
-   public static var showFileName
+   public nonisolated static var showFileName
-   public static var showLineNumber
+   public nonisolated static var showLineNumber
-   public static var showFunctionName
+   public nonisolated static var showFunctionName
-   public static var subsystems: LogSubsystem
+   public nonisolated static var subsystems: LogSubsystem
-   public static var destinationTypes: [LogDestination.Type]
+   public nonisolated static var destinationTypes: [LogDestination.Type]

 extension VideoAttachmentPayload: AttachmentPreviewProvider  
-   public func previewView(components: Components)-> UIView
+   @MainActor public func previewView(components: Components)-> UIView

- public protocol GalleryContentViewDelegate: ChatMessageContentViewDelegate
+ @MainActor public protocol GalleryContentViewDelegate: ChatMessageContentViewDelegate

- public protocol QuotedChatMessageViewSwiftUIView: View
+ @MainActor public protocol QuotedChatMessageViewSwiftUIView: View

- public final class ConnectionNotSuccessful: ClientError  
+ public final class ConnectionNotSuccessful: ClientError, @unchecked Sendable  

- public class ChatMessageController: DataController, DelegateCallable, DataStoreProvider  
+ public class ChatMessageController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   override public func synchronize(_ completion: ((Error?) -> Void)? = nil)
+   override public func synchronize(_ completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func editMessage(text: String,skipEnrichUrl: Bool = false,skipPush: Bool = false,attachments: [AnyAttachmentPayload] = [],restrictedVisibility: [UserId] = [],extraData: [String: RawJSON]? = nil,completion: ((Error?) -> Void)? = nil)
+   public func editMessage(text: String,skipEnrichUrl: Bool = false,skipPush: Bool = false,attachments: [AnyAttachmentPayload] = [],restrictedVisibility: [UserId] = [],extraData: [String: RawJSON]? = nil,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func partialUpdateMessage(text: String? = nil,attachments: [AnyAttachmentPayload]? = nil,extraData: [String: RawJSON]? = nil,unsetProperties: [String]? = nil,completion: ((Result<ChatMessage, Error>) -> Void)? = nil)
+   public func partialUpdateMessage(text: String? = nil,attachments: [AnyAttachmentPayload]? = nil,extraData: [String: RawJSON]? = nil,unsetProperties: [String]? = nil,completion: (@MainActor @Sendable(Result<ChatMessage, Error>) -> Void)? = nil)
-   public func deleteMessage(hard: Bool = false,completion: ((Error?) -> Void)? = nil)
+   public func deleteMessage(hard: Bool = false,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func createNewReply(messageId: MessageId? = nil,text: String,pinning: MessagePinning? = nil,attachments: [AnyAttachmentPayload] = [],mentionedUserIds: [UserId] = [],showReplyInChannel: Bool = false,isSilent: Bool = false,quotedMessageId: MessageId? = nil,skipPush: Bool = false,skipEnrichUrl: Bool = false,extraData: [String: RawJSON] = [:],completion: ((Result<MessageId, Error>) -> Void)? = nil)
+   public func createNewReply(messageId: MessageId? = nil,text: String,pinning: MessagePinning? = nil,attachments: [AnyAttachmentPayload] = [],mentionedUserIds: [UserId] = [],showReplyInChannel: Bool = false,isSilent: Bool = false,quotedMessageId: MessageId? = nil,skipPush: Bool = false,skipEnrichUrl: Bool = false,extraData: [String: RawJSON] = [:],completion: (@MainActor @Sendable(Result<MessageId, Error>) -> Void)? = nil)
-   public func loadPreviousReplies(before replyId: MessageId? = nil,limit: Int? = nil,completion: ((Error?) -> Void)? = nil)
+   public func loadPreviousReplies(before replyId: MessageId? = nil,limit: Int? = nil,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func loadPageAroundReplyId(_ replyId: MessageId,limit: Int? = nil,completion: ((Error?) -> Void)? = nil)
+   public func loadPageAroundReplyId(_ replyId: MessageId,limit: Int? = nil,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func loadNextReplies(after replyId: MessageId? = nil,limit: Int? = nil,completion: ((Error?) -> Void)? = nil)
+   public func loadNextReplies(after replyId: MessageId? = nil,limit: Int? = nil,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func loadFirstPage(limit: Int? = nil,_ completion: ((_ error: Error?) -> Void)? = nil)
+   public func loadFirstPage(limit: Int? = nil,_ completion: (@MainActor @Sendable(_ error: Error?) -> Void)? = nil)
-   public func loadNextReactions(limit: Int = 25,completion: ((Error?) -> Void)? = nil)
+   public func loadNextReactions(limit: Int = 25,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func loadReactions(limit: Int,offset: Int = 0,completion: @escaping (Result<[ChatMessageReaction], Error>) -> Void)
+   public func loadReactions(limit: Int,offset: Int = 0,completion: @escaping @MainActor @Sendable(Result<[ChatMessageReaction], Error>) -> Void)
-   public func flag(reason: String? = nil,extraData: [String: RawJSON]? = nil,completion: ((Error?) -> Void)? = nil)
+   public func flag(reason: String? = nil,extraData: [String: RawJSON]? = nil,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func unflag(completion: ((Error?) -> Void)? = nil)
+   public func unflag(completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func addReaction(_ type: MessageReactionType,score: Int = 1,enforceUnique: Bool = false,skipPush: Bool = false,pushEmojiCode: String? = nil,extraData: [String: RawJSON] = [:],completion: ((Error?) -> Void)? = nil)
+   public func addReaction(_ type: MessageReactionType,score: Int = 1,enforceUnique: Bool = false,skipPush: Bool = false,pushEmojiCode: String? = nil,extraData: [String: RawJSON] = [:],completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func deleteReaction(_ type: MessageReactionType,completion: ((Error?) -> Void)? = nil)
+   public func deleteReaction(_ type: MessageReactionType,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func pin(_ pinning: MessagePinning,completion: ((Error?) -> Void)? = nil)
+   public func pin(_ pinning: MessagePinning,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func unpin(completion: ((Error?) -> Void)? = nil)
+   public func unpin(completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func downloadAttachment(_ attachment: ChatMessageAttachment<Payload>,completion: @escaping (Result<ChatMessageAttachment<Payload>, Error>) -> Void)
+   public func downloadAttachment(_ attachment: ChatMessageAttachment<Payload>,completion: @escaping @MainActor @Sendable(Result<ChatMessageAttachment<Payload>, Error>) -> Void)
-   public func deleteLocalAttachmentDownload(for attachmentId: AttachmentId,completion: ((Error?) -> Void)? = nil)
+   public func deleteLocalAttachmentDownload(for attachmentId: AttachmentId,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func restartFailedAttachmentUploading(with id: AttachmentId,completion: ((Error?) -> Void)? = nil)
+   public func restartFailedAttachmentUploading(with id: AttachmentId,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func resendMessage(completion: ((Error?) -> Void)? = nil)
+   public func resendMessage(completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func dispatchEphemeralMessageAction(_ action: AttachmentAction,completion: ((Error?) -> Void)? = nil)
+   public func dispatchEphemeralMessageAction(_ action: AttachmentAction,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func translate(to language: TranslationLanguage,completion: ((Error?) -> Void)? = nil)
+   public func translate(to language: TranslationLanguage,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func markThreadRead(completion: ((Error?) -> Void)? = nil)
+   public func markThreadRead(completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func markThreadUnread(completion: ((Error?) -> Void)? = nil)
+   public func markThreadUnread(completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func loadThread(replyLimit: Int? = nil,participantLimit: Int? = nil,completion: @escaping ((Result<ChatThread, Error>) -> Void))
+   public func loadThread(replyLimit: Int? = nil,participantLimit: Int? = nil,completion: @escaping @MainActor @Sendable(Result<ChatThread, Error>) -> Void)
-   public func updateThread(title: String?,extraData: [String: RawJSON]? = nil,unsetProperties: [String]? = nil,completion: @escaping ((Result<ChatThread, Error>) -> Void))
+   public func updateThread(title: String?,extraData: [String: RawJSON]? = nil,unsetProperties: [String]? = nil,completion: @escaping @MainActor @Sendable(Result<ChatThread, Error>) -> Void)
-   public func stopLiveLocationSharing(completion: ((Result<SharedLocation, Error>) -> Void)? = nil)
+   public func stopLiveLocationSharing(completion: (@MainActor @Sendable(Result<SharedLocation, Error>) -> Void)? = nil)
-   public func updateDraftReply(text: String,isSilent: Bool = false,attachments: [AnyAttachmentPayload] = [],mentionedUserIds: [UserId] = [],quotedMessageId: MessageId? = nil,showReplyInChannel: Bool = false,command: Command? = nil,extraData: [String: RawJSON] = [:],completion: ((Result<DraftMessage, Error>) -> Void)? = nil)
+   public func updateDraftReply(text: String,isSilent: Bool = false,attachments: [AnyAttachmentPayload] = [],mentionedUserIds: [UserId] = [],quotedMessageId: MessageId? = nil,showReplyInChannel: Bool = false,command: Command? = nil,extraData: [String: RawJSON] = [:],completion: (@MainActor @Sendable(Result<DraftMessage, Error>) -> Void)? = nil)
-   public func loadDraftReply(completion: ((Result<DraftMessage?, Error>) -> Void)? = nil)
+   public func loadDraftReply(completion: (@MainActor @Sendable(Result<DraftMessage?, Error>) -> Void)? = nil)
-   public func deleteDraftReply(completion: ((Error?) -> Void)? = nil)
+   public func deleteDraftReply(completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func createReminder(remindAt: Date? = nil,completion: ((Result<MessageReminder, Error>) -> Void)? = nil)
+   public func createReminder(remindAt: Date? = nil,completion: (@MainActor @Sendable(Result<MessageReminder, Error>) -> Void)? = nil)
-   public func updateReminder(remindAt: Date?,completion: ((Result<MessageReminder, Error>) -> Void)? = nil)
+   public func updateReminder(remindAt: Date?,completion: (@MainActor @Sendable(Result<MessageReminder, Error>) -> Void)? = nil)
-   public func deleteReminder(completion: ((Error?) -> Void)? = nil)
+   public func deleteReminder(completion: (@MainActor @Sendable(Error?) -> Void)? = nil)

- public class ChatMessageSearchController: DataController, DelegateCallable, DataStoreProvider  
+ public class ChatMessageSearchController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   public func search(text: String,completion: ((_ error: Error?) -> Void)? = nil)
+   public func search(text: String,completion: (@MainActor @Sendable(_ error: Error?) -> Void)? = nil)
-   public func search(query: MessageSearchQuery,completion: ((_ error: Error?) -> Void)? = nil)
+   public func search(query: MessageSearchQuery,completion: (@MainActor @Sendable(_ error: Error?) -> Void)? = nil)
-   public func loadNextMessages(limit: Int = 25,completion: ((Error?) -> Void)? = nil)
+   public func loadNextMessages(limit: Int = 25,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)

- public struct ComposerState: RawRepresentable, Equatable  
+ public struct ComposerState: RawRepresentable, Equatable, Sendable  
-   public static var new
+   public static let new
-   public static var edit
+   public static let edit
-   public static var quote
+   public static let quote
-   public static var recording
+   public static let recording
-   public static var recordingLocked
+   public static let recordingLocked

- public struct PollOption: Hashable, Equatable  
+ public struct PollOption: Hashable, Equatable, Sendable  

- public protocol ImageCDN
+ public protocol ImageCDN: Sendable

- public struct EventType: RawRepresentable, Codable, Hashable, ExpressibleByStringLiteral  
+ public struct EventType: RawRepresentable, Codable, Hashable, ExpressibleByStringLiteral, Sendable  

- @resultBuilder public struct ViewContainerBuilder  
+ @MainActor @resultBuilder public struct ViewContainerBuilder  

- public struct QueryOptions: OptionSet, Encodable  
+ public struct QueryOptions: OptionSet, Encodable, Sendable  

 @available(iOSApplicationExtension, unavailable) open class ChatMessageSearchVC: ChatChannelListSearchVC, ChatMessageSearchControllerDelegate  
-   public var didSelectMessage: ((ChatChannel, ChatMessage) -> Void)?
+   public var didSelectMessage: (@MainActor(ChatChannel, ChatMessage) -> Void)?

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

- open class StreamVideoLoader: VideoLoading  
+ open class StreamVideoLoader: VideoLoading, @unchecked Sendable  
-   open func loadPreviewForVideo(at url: URL,completion: @escaping (Result<UIImage, Error>) -> Void)
+   open func loadPreviewForVideo(at url: URL,completion: @escaping @MainActor @Sendable(Result<UIImage, Error>) -> Void)

 extension VoiceRecordingAttachmentPayload: AttachmentPreviewProvider  
-   public func previewView(components: Components)-> UIView
+   @MainActor public func previewView(components: Components)-> UIView

- public protocol AppearanceProvider: AnyObject
+ @MainActor public protocol AppearanceProvider: AnyObject

 @available(iOSApplicationExtension, unavailable) open class ChatMessageListVC: _ViewController, ThemeProvider, ChatMessageListScrollOverlayDataSource, ChatMessageActionsVCDelegate, ChatMessageContentViewDelegate, GalleryContentViewDelegate, GiphyActionContentViewDelegate, FileActionContentViewDelegate, LinkPreviewViewDelegate, PollAttachmentViewInjectorDelegate, UITableViewDataSource, UITableViewDelegate, UIGestureRecognizerDelegate, VoiceRecordingAttachmentPresentationViewDelegate  
-   open func jumpToUnreadMessage(animated: Bool = true,onHighlight: ((IndexPath) -> Void)? = nil)
+   open func jumpToUnreadMessage(animated: Bool = true,onHighlight: (@Sendable(IndexPath) -> Void)? = nil)

- public class ScheduledStreamTimer: StreamTimer  
+ public class ScheduledStreamTimer: StreamTimer, @unchecked Sendable  
-   public var onChange: (() -> Void)?
+   public var onChange: (@Sendable() -> Void)?

- public struct AttachmentId: Hashable  
+ public struct AttachmentId: Hashable, Sendable  

- public struct ReactionListQuery: Encodable  
+ public struct ReactionListQuery: Encodable, Sendable  

- public final class ClientHasBeenDeallocated: ClientError  
+ public final class ClientHasBeenDeallocated: ClientError, @unchecked Sendable  

- public struct PollFeatureType: Equatable  
+ public struct PollFeatureType: Equatable, Sendable  
-   public static var multipleVotes
+   public static let multipleVotes
-   public static var anonymous
+   public static let anonymous
-   public static var suggestions
+   public static let suggestions
-   public static var comments
+   public static let comments

- public final class InvalidChannelId: ClientError
+ public final class InvalidChannelId: ClientError, @unchecked Sendable

- @available(iOSApplicationExtension, unavailable) public protocol LinkPreviewViewDelegate: ChatMessageContentViewDelegate
+ @available(iOSApplicationExtension, unavailable) @MainActor public protocol LinkPreviewViewDelegate: ChatMessageContentViewDelegate

 open class ChatMessageAttachmentPreviewVC: _ViewController, WKNavigationDelegate, AppearanceProvider  
-   public func webView(_ webView: WKWebView,didStartProvisionalNavigation navigation: WKNavigation!)
+   nonisolated public func webView(_ webView: WKWebView,didStartProvisionalNavigation navigation: WKNavigation!)
-   public func webView(_ webView: WKWebView,didFinish navigation: WKNavigation!)
+   nonisolated public func webView(_ webView: WKWebView,didFinish navigation: WKNavigation!)

- public enum LocalAttachmentDownloadState: Hashable  
+ public enum LocalAttachmentDownloadState: Hashable, Sendable  

- open class StreamAudioSessionConfigurator: AudioSessionConfiguring  
+ open class StreamAudioSessionConfigurator: AudioSessionConfiguring, @unchecked Sendable  
-   open func requestRecordPermission(_ completionHandler: @escaping (Bool) -> Void)
+   open func requestRecordPermission(_ completionHandler: @escaping @Sendable(Bool) -> Void)

- public class ChatChannelController: DataController, DelegateCallable, DataStoreProvider  
+ public class ChatChannelController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   override public func synchronize(_ completion: ((_ error: Error?) -> Void)? = nil)
+   override public func synchronize(_ completion: (@MainActor @Sendable(_ error: Error?) -> Void)? = nil)
-   public func updateChannel(name: String?,imageURL: URL?,team: String?,members: Set<UserId> = [],invites: Set<UserId> = [],extraData: [String: RawJSON] = [:],completion: ((Error?) -> Void)? = nil)
+   public func updateChannel(name: String?,imageURL: URL?,team: String?,members: Set<UserId> = [],invites: Set<UserId> = [],extraData: [String: RawJSON] = [:],completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func partialChannelUpdate(name: String? = nil,imageURL: URL? = nil,team: String? = nil,members: Set<UserId> = [],invites: Set<UserId> = [],extraData: [String: RawJSON] = [:],unsetProperties: [String] = [],completion: ((Error?) -> Void)? = nil)
+   public func partialChannelUpdate(name: String? = nil,imageURL: URL? = nil,team: String? = nil,members: Set<UserId> = [],invites: Set<UserId> = [],extraData: [String: RawJSON] = [:],unsetProperties: [String] = [],completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func muteChannel(expiration: Int? = nil,completion: ((Error?) -> Void)? = nil)
+   public func muteChannel(expiration: Int? = nil,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func unmuteChannel(completion: ((Error?) -> Void)? = nil)
+   public func unmuteChannel(completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func archive(scope: ChannelArchivingScope = .me,completion: ((Error?) -> Void)? = nil)
+   public func archive(scope: ChannelArchivingScope = .me,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func unarchive(scope: ChannelArchivingScope = .me,completion: ((Error?) -> Void)? = nil)
+   public func unarchive(scope: ChannelArchivingScope = .me,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func deleteChannel(completion: ((Error?) -> Void)? = nil)
+   public func deleteChannel(completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func truncateChannel(skipPush: Bool = false,hardDelete: Bool = true,systemMessage: String? = nil,completion: ((Error?) -> Void)? = nil)
+   public func truncateChannel(skipPush: Bool = false,hardDelete: Bool = true,systemMessage: String? = nil,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func hideChannel(clearHistory: Bool = false,completion: ((Error?) -> Void)? = nil)
+   public func hideChannel(clearHistory: Bool = false,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func showChannel(completion: ((Error?) -> Void)? = nil)
+   public func showChannel(completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func loadPreviousMessages(before messageId: MessageId? = nil,limit: Int? = nil,completion: ((Error?) -> Void)? = nil)
+   public func loadPreviousMessages(before messageId: MessageId? = nil,limit: Int? = nil,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func loadNextMessages(after messageId: MessageId? = nil,limit: Int? = nil,completion: ((Error?) -> Void)? = nil)
+   public func loadNextMessages(after messageId: MessageId? = nil,limit: Int? = nil,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func loadPageAroundMessageId(_ messageId: MessageId,limit: Int? = nil,completion: ((Error?) -> Void)? = nil)
+   public func loadPageAroundMessageId(_ messageId: MessageId,limit: Int? = nil,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func loadFirstPage(_ completion: ((_ error: Error?) -> Void)? = nil)
+   public func loadFirstPage(_ completion: (@MainActor @Sendable(_ error: Error?) -> Void)? = nil)
-   public func sendKeystrokeEvent(parentMessageId: MessageId? = nil,completion: ((Error?) -> Void)? = nil)
+   public func sendKeystrokeEvent(parentMessageId: MessageId? = nil,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func sendStartTypingEvent(parentMessageId: MessageId? = nil,completion: ((Error?) -> Void)? = nil)
+   public func sendStartTypingEvent(parentMessageId: MessageId? = nil,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func sendStopTypingEvent(parentMessageId: MessageId? = nil,completion: ((Error?) -> Void)? = nil)
+   public func sendStopTypingEvent(parentMessageId: MessageId? = nil,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func createNewMessage(messageId: MessageId? = nil,text: String,pinning: MessagePinning? = nil,isSilent: Bool = false,attachments: [AnyAttachmentPayload] = [],mentionedUserIds: [UserId] = [],quotedMessageId: MessageId? = nil,skipPush: Bool = false,skipEnrichUrl: Bool = false,restrictedVisibility: [UserId] = [],location: NewLocationInfo? = nil,extraData: [String: RawJSON] = [:],completion: ((Result<MessageId, Error>) -> Void)? = nil)
+   public func createNewMessage(messageId: MessageId? = nil,text: String,pinning: MessagePinning? = nil,isSilent: Bool = false,attachments: [AnyAttachmentPayload] = [],mentionedUserIds: [UserId] = [],quotedMessageId: MessageId? = nil,skipPush: Bool = false,skipEnrichUrl: Bool = false,restrictedVisibility: [UserId] = [],location: NewLocationInfo? = nil,extraData: [String: RawJSON] = [:],completion: (@MainActor @Sendable(Result<MessageId, Error>) -> Void)? = nil)
-   public func createSystemMessage(text: String,messageId: MessageId? = nil,restrictedVisibility: [UserId] = [],extraData: [String: RawJSON] = [:],completion: ((Result<MessageId, Error>) -> Void)? = nil)
+   public func createSystemMessage(text: String,messageId: MessageId? = nil,restrictedVisibility: [UserId] = [],extraData: [String: RawJSON] = [:],completion: (@MainActor @Sendable(Result<MessageId, Error>) -> Void)? = nil)
-   public func sendStaticLocation(_ location: LocationInfo,text: String? = nil,messageId: MessageId? = nil,quotedMessageId: MessageId? = nil,extraData: [String: RawJSON] = [:],completion: ((Result<MessageId, Error>) -> Void)? = nil)
+   public func sendStaticLocation(_ location: LocationInfo,text: String? = nil,messageId: MessageId? = nil,quotedMessageId: MessageId? = nil,extraData: [String: RawJSON] = [:],completion: (@MainActor @Sendable(Result<MessageId, Error>) -> Void)? = nil)
-   public func startLiveLocationSharing(_ location: LocationInfo,endDate: Date,text: String? = nil,extraData: [String: RawJSON] = [:],completion: ((Result<MessageId, Error>) -> Void)? = nil)
+   public func startLiveLocationSharing(_ location: LocationInfo,endDate: Date,text: String? = nil,extraData: [String: RawJSON] = [:],completion: (@MainActor @Sendable(Result<MessageId, Error>) -> Void)? = nil)
-   public func updateDraftMessage(text: String,isSilent: Bool = false,attachments: [AnyAttachmentPayload] = [],mentionedUserIds: [UserId] = [],quotedMessageId: MessageId? = nil,command: Command? = nil,extraData: [String: RawJSON] = [:],completion: ((Result<DraftMessage, Error>) -> Void)? = nil)
+   public func updateDraftMessage(text: String,isSilent: Bool = false,attachments: [AnyAttachmentPayload] = [],mentionedUserIds: [UserId] = [],quotedMessageId: MessageId? = nil,command: Command? = nil,extraData: [String: RawJSON] = [:],completion: (@MainActor @Sendable(Result<DraftMessage, Error>) -> Void)? = nil)
-   public func loadDraftMessage(completion: ((Result<DraftMessage?, Error>) -> Void)? = nil)
+   public func loadDraftMessage(completion: (@MainActor @Sendable(Result<DraftMessage?, Error>) -> Void)? = nil)
-   public func deleteDraftMessage(completion: ((Error?) -> Void)? = nil)
+   public func deleteDraftMessage(completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func createPoll(name: String,allowAnswers: Bool? = nil,allowUserSuggestedOptions: Bool? = nil,description: String? = nil,enforceUniqueVote: Bool? = nil,maxVotesAllowed: Int? = nil,votingVisibility: VotingVisibility? = nil,options: [PollOption]? = nil,extraData: [String: RawJSON]? = nil,completion: ((Result<MessageId, Error>) -> Void)?)
+   public func createPoll(name: String,allowAnswers: Bool? = nil,allowUserSuggestedOptions: Bool? = nil,description: String? = nil,enforceUniqueVote: Bool? = nil,maxVotesAllowed: Int? = nil,votingVisibility: VotingVisibility? = nil,options: [PollOption]? = nil,extraData: [String: RawJSON]? = nil,completion: (@MainActor @Sendable(Result<MessageId, Error>) -> Void)?)
-   public func deletePoll(pollId: String,completion: ((Error?) -> Void)? = nil)
+   public func deletePoll(pollId: String,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func addMembers(_ members: [MemberInfo],hideHistory: Bool = false,message: String? = nil,completion: ((Error?) -> Void)? = nil)
+   public func addMembers(_ members: [MemberInfo],hideHistory: Bool = false,message: String? = nil,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func addMembers(userIds: Set<UserId>,hideHistory: Bool = false,message: String? = nil,completion: ((Error?) -> Void)? = nil)
+   public func addMembers(userIds: Set<UserId>,hideHistory: Bool = false,message: String? = nil,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func removeMembers(userIds: Set<UserId>,message: String? = nil,completion: ((Error?) -> Void)? = nil)
+   public func removeMembers(userIds: Set<UserId>,message: String? = nil,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func inviteMembers(userIds: Set<UserId>,completion: ((Error?) -> Void)? = nil)
+   public func inviteMembers(userIds: Set<UserId>,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func acceptInvite(message: String? = nil,completion: ((Error?) -> Void)? = nil)
+   public func acceptInvite(message: String? = nil,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func rejectInvite(completion: ((Error?) -> Void)? = nil)
+   public func rejectInvite(completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func markRead(completion: ((Error?) -> Void)? = nil)
+   public func markRead(completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func markUnread(from messageId: MessageId,completion: ((Result<ChatChannel, Error>) -> Void)? = nil)
+   public func markUnread(from messageId: MessageId,completion: (@MainActor @Sendable(Result<ChatChannel, Error>) -> Void)? = nil)
-   public func loadChannelReads(pagination: Pagination? = nil,completion: @escaping (Error?) -> Void)
+   public func loadChannelReads(pagination: Pagination? = nil,completion: @escaping @MainActor @Sendable(Error?) -> Void)
-   public func loadMoreChannelReads(limit: Int? = nil,completion: @escaping (Error?) -> Void)
+   public func loadMoreChannelReads(limit: Int? = nil,completion: @escaping @MainActor @Sendable(Error?) -> Void)
-   public func enableSlowMode(cooldownDuration: Int,completion: ((Error?) -> Void)? = nil)
+   public func enableSlowMode(cooldownDuration: Int,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func disableSlowMode(completion: ((Error?) -> Void)? = nil)
+   public func disableSlowMode(completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func startWatching(isInRecoveryMode: Bool,completion: ((Error?) -> Void)? = nil)
+   public func startWatching(isInRecoveryMode: Bool,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func stopWatching(completion: ((Error?) -> Void)? = nil)
+   public func stopWatching(completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func freezeChannel(completion: ((Error?) -> Void)? = nil)
+   public func freezeChannel(completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func unfreezeChannel(completion: ((Error?) -> Void)? = nil)
+   public func unfreezeChannel(completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func pin(scope: ChannelPinningScope = .me,completion: ((Error?) -> Void)? = nil)
+   public func pin(scope: ChannelPinningScope = .me,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func unpin(scope: ChannelPinningScope = .me,completion: ((Error?) -> Void)? = nil)
+   public func unpin(scope: ChannelPinningScope = .me,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func uploadAttachment(localFileURL: URL,type: AttachmentType,progress: ((Double) -> Void)? = nil,completion: @escaping ((Result<UploadedAttachment, Error>) -> Void))
+   public func uploadAttachment(localFileURL: URL,type: AttachmentType,progress: (@Sendable(Double) -> Void)? = nil,completion: @escaping @MainActor @Sendable(Result<UploadedAttachment, Error>) -> Void)
-   public func enrichUrl(_ url: URL,completion: @escaping (Result<LinkAttachmentPayload, Error>) -> Void)
+   public func enrichUrl(_ url: URL,completion: @escaping @MainActor @Sendable(Result<LinkAttachmentPayload, Error>) -> Void)
-   public func loadPinnedMessages(pageSize: Int = .messagesPageSize,sorting: [Sorting<PinnedMessagesSortingKey>] = [],pagination: PinnedMessagesPagination? = nil,completion: @escaping (Result<[ChatMessage], Error>) -> Void)
+   public func loadPinnedMessages(pageSize: Int = .messagesPageSize,sorting: [Sorting<PinnedMessagesSortingKey>] = [],pagination: PinnedMessagesPagination? = nil,completion: @escaping @MainActor @Sendable(Result<[ChatMessage], Error>) -> Void)
-   public func deleteFile(url: String,completion: ((Error?) -> Void)? = nil)
+   public func deleteFile(url: String,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func deleteImage(url: String,completion: ((Error?) -> Void)? = nil)
+   public func deleteImage(url: String,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)

- public struct PollVoteListQuery: Encodable  
+ public struct PollVoteListQuery: Encodable, Sendable  

 open class WaveformView: _View, ThemeProvider  
-   public struct Content: Equatable  
+   public struct Content: Equatable, Sendable  

- public class ChatUserSearchController: DataController, DelegateCallable, DataStoreProvider  
+ public class ChatUserSearchController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   public func search(term: String?,completion: ((_ error: Error?) -> Void)? = nil)
+   public func search(term: String?,completion: (@MainActor @Sendable(_ error: Error?) -> Void)? = nil)
-   public func search(query: UserListQuery,completion: ((_ error: Error?) -> Void)? = nil)
+   public func search(query: UserListQuery,completion: (@MainActor @Sendable(_ error: Error?) -> Void)? = nil)
-   public func loadNextUsers(limit: Int = 25,completion: ((Error?) -> Void)? = nil)
+   public func loadNextUsers(limit: Int = 25,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)

- extension PollController: EventsControllerDelegate  
+ extension PollController  
-   public func eventsController(_ controller: EventsController,didReceiveEvent event: Event)
+   public var observableObject: ObservableObject
+   
+ 
+   public class ObservableObject: SwiftUI.ObservableObject  
+   
+     public let controller: PollController
+     @Published public private var poll: Poll?
+     @Published public private var ownVotes: LazyCachedMapCollection<PollVote>
+     @Published public private var state: DataController.State

- open class AttachmentViewInjector  
+ @MainActor open class AttachmentViewInjector  

- public class ChatUserListController: DataController, DelegateCallable, DataStoreProvider  
+ public class ChatUserListController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   override public func synchronize(_ completion: ((_ error: Error?) -> Void)? = nil)
+   override public func synchronize(_ completion: (@MainActor @Sendable(_ error: Error?) -> Void)? = nil)

- public protocol EventsControllerDelegate: AnyObject
+ @MainActor public protocol EventsControllerDelegate: AnyObject

- public class DraftUpdatedEvent: Event  
+ public final class DraftUpdatedEvent: Event  

- public protocol AudioSessionFeedbackGenerator
+ @MainActor public protocol AudioSessionFeedbackGenerator

 open class ChatChannelAvatarView: _View, ThemeProvider, SwiftUIRepresentable  
-   open func loadAvatarsFrom(urls: [URL?],channelId: ChannelId,completion: @escaping ([UIImage], ChannelId)
+   open func loadAvatarsFrom(urls: [URL?],channelId: ChannelId,completion: @escaping @Sendable([UIImage], ChannelId)

- public struct UserPrivacySettings  
+ public struct UserPrivacySettings: Sendable  

- public class ChatChannelMemberListController: DataController, DelegateCallable, DataStoreProvider  
+ public class ChatChannelMemberListController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   override public func synchronize(_ completion: ((_ error: Error?) -> Void)? = nil)
+   override public func synchronize(_ completion: (@MainActor @Sendable(_ error: Error?) -> Void)? = nil)

- public struct ChatMessageReaction: Hashable  
+ public struct ChatMessageReaction: Hashable, Sendable  

- public final class MissingToken: ClientError
+ public final class MissingToken: ClientError, @unchecked Sendable

- extension PollVoteListController: EventsControllerDelegate  
+ extension PollVoteListController  
-   public func eventsController(_ controller: EventsController,didReceiveEvent event: any Event)
+   public var observableObject: ObservableObject
+   
+ 
+   public class ObservableObject: SwiftUI.ObservableObject  
+   
+     public let controller: PollVoteListController
+     @Published public private var votes: LazyCachedMapCollection<PollVote>
+     @Published public private var state: DataController.State

- public struct AttachmentDownloadingState: Hashable  
+ public struct AttachmentDownloadingState: Hashable, Sendable  

- public struct UserInfo  
+ public struct UserInfo: Sendable  

- public protocol ChatConnectionControllerDelegate: AnyObject
+ @MainActor public protocol ChatConnectionControllerDelegate: AnyObject

- open class SwipeToReplyGestureHandler  
+ @MainActor open class SwipeToReplyGestureHandler  
-   public init(listView: ChatMessageListView,impactFeedbackGenerator: UIImpactFeedbackGenerator = .init(style: .medium))
+   public init(listView: ChatMessageListView,impactFeedbackGenerator: UIImpactFeedbackGenerator? = nil)

 public struct StreamAssetPropertyLoader: AssetPropertyLoading  
-   public func loadProperties(_ properties: [AssetProperty],of asset: Asset,completion: @escaping (Result<Asset, AssetPropertyLoadingCompositeError>) -> Void)
+   public func loadProperties(_ properties: [AssetProperty],of asset: Asset,completion: @escaping @Sendable(Result<Asset, AssetPropertyLoadingCompositeError>) -> Void)

- public protocol FileActionContentViewDelegate: ChatMessageContentViewDelegate
+ @MainActor public protocol FileActionContentViewDelegate: ChatMessageContentViewDelegate

- public class ChatChannelMemberController: DataController, DelegateCallable, DataStoreProvider  
+ public class ChatChannelMemberController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   override public func synchronize(_ completion: ((_ error: Error?) -> Void)? = nil)
+   override public func synchronize(_ completion: (@MainActor @Sendable(_ error: Error?) -> Void)? = nil)

- open class StreamImageCDN: ImageCDN  
+ open class StreamImageCDN: ImageCDN, @unchecked Sendable  
-   public static var streamCDNURL
+   nonisolated public static var streamCDNURL

- public struct Mode  
+ public struct Mode: Sendable  
-   public static var clip
+   public static let clip
-   public static var fill
+   public static let fill
-   public static var scale
+   public static let scale

- public final class UnsupportedUploadableAttachmentType: ClientError
+ public final class UnsupportedUploadableAttachmentType: ClientError, @unchecked Sendable

- public protocol SwipeableViewDelegate: AnyObject
+ @MainActor public protocol SwipeableViewDelegate: AnyObject

- public struct Pagination: Encodable, Equatable  
+ public struct Pagination: Encodable, Equatable, Sendable  

- public struct AudioRecordingState: Hashable  
+ public struct AudioRecordingState: Hashable, Sendable  

- public class ChatChannelMember: ChatUser  
+ public class ChatChannelMember: ChatUser, @unchecked Sendable  

- public struct MemberRole: RawRepresentable, Codable, Hashable, ExpressibleByStringLiteral  
+ public struct MemberRole: RawRepresentable, Codable, Hashable, ExpressibleByStringLiteral, Sendable  

- public struct QuotedAvatarAlignment: RawRepresentable, Equatable  
+ public struct QuotedAvatarAlignment: RawRepresentable, Equatable, Sendable  

- public struct AnyAttachmentUpdater  
+ public struct AnyAttachmentUpdater: Sendable  

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

- public struct MessagesPagination: Encodable, Equatable  
+ public struct MessagesPagination: Encodable, Equatable, Sendable  

 open class PollAllOptionsListVC: _ViewController, ThemeProvider, PollControllerDelegate, UITableViewDataSource, UITableViewDelegate  
-   public struct Section: RawRepresentable, Equatable  
+   public struct Section: RawRepresentable, Equatable, Sendable  
-     public static var name
+     public static let name
-     public static var options
+     public static let options

 public enum StreamRuntimeCheck  
-   public static var assertionsEnabled
+   public nonisolated static var assertionsEnabled
-   public static var _isDatabasePrefetchingEnabled
+   public nonisolated static var _isDatabasePrefetchingEnabled

 public struct TypingSuggester  
-   public func typingSuggestion(in textView: UITextView)-> TypingSuggestion?
+   @MainActor public func typingSuggestion(in textView: UITextView)-> TypingSuggestion?

- public enum LocalReactionState: String  
+ public enum LocalReactionState: String, Sendable  

- public class ChatChannelListController: DataController, DelegateCallable, DataStoreProvider  
+ public class ChatChannelListController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   override public func synchronize(_ completion: ((_ error: Error?) -> Void)? = nil)
+   override public func synchronize(_ completion: (@MainActor @Sendable(_ error: Error?) -> Void)? = nil)
-   public func loadNextChannels(limit: Int? = nil,completion: ((Error?) -> Void)? = nil)
+   public func loadNextChannels(limit: Int? = nil,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   @available(*, deprecated, message: "Please use `markAllRead` available in `CurrentChatUserController`") public func markAllRead(completion: ((Error?) -> Void)? = nil)
+   @available(*, deprecated, message: "Please use `markAllRead` available in `CurrentChatUserController`") public func markAllRead(completion: (@MainActor @Sendable(Error?) -> Void)? = nil)

- public struct LogSubsystem: OptionSet  
+ public struct LogSubsystem: OptionSet, Sendable  

- public indirect enum RawJSON: Codable, Hashable  
+ public indirect enum RawJSON: Codable, Hashable, Sendable  

- public class HealthCheckEvent: ConnectionEvent, EventDTO  
+ public final class HealthCheckEvent: ConnectionEvent, EventDTO, Sendable  

- public class Chat  
+ public class Chat: @unchecked Sendable  
-   @MainActor public lazy var state: ChatState
+   @MainActor public var state: ChatState
-   public func subscribe(toEvent event: E.Type,handler: @escaping (E) -> Void)-> AnyCancellable
+   public func subscribe(toEvent event: E.Type,handler: @escaping @Sendable(E) -> Void)-> AnyCancellable
-   public func subscribe(_ handler: @escaping (Event) -> Void)-> AnyCancellable
+   public func subscribe(_ handler: @escaping @Sendable(Event) -> Void)-> AnyCancellable
-   public func uploadAttachment(with localFileURL: URL,type: AttachmentType,progress: ((Double) -> Void)? = nil)async throws -> UploadedAttachment
+   public func uploadAttachment(with localFileURL: URL,type: AttachmentType,progress: (@Sendable(Double) -> Void)? = nil)async throws -> UploadedAttachment

- public struct NewLocationInfo  
+ public struct NewLocationInfo: Sendable  

- public struct BaseURL: CustomStringConvertible  
+ public struct BaseURL: CustomStringConvertible, Sendable  

- public class ChatConnectionController: Controller, DelegateCallable, DataStoreProvider  
+ public class ChatConnectionController: Controller, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   public var callbackQueue: DispatchQueue
+   public var connectionStatus: ConnectionStatus
-   public var connectionStatus: ConnectionStatus
+   public let client: ChatClient
-   public let client: ChatClient

- public struct MessageSearchQuery: Encodable  
+ public struct MessageSearchQuery: Encodable, Sendable  

- public protocol AudioQueuePlayerDatasource: AnyObject
+ @MainActor public protocol AudioQueuePlayerDatasource: AnyObject

- public final class ReactionList  
+ public final class ReactionList: Sendable  
-   @MainActor public lazy var state: ReactionListState
+   @MainActor public var state: ReactionListState

- public struct AudioPlaybackState: Equatable, CustomStringConvertible  
+ public struct AudioPlaybackState: Equatable, CustomStringConvertible, Sendable  

 public struct DefaultAttachmentPreviewProvider: AttachmentPreviewProvider  
-   public func previewView(components: Components)-> UIView
+   @MainActor public func previewView(components: Components)-> UIView

 @available(iOSApplicationExtension, unavailable) open class ChatThreadVC: _ViewController, ThemeProvider, ChatMessageListVCDataSource, ChatMessageListVCDelegate, ChatMessageControllerDelegate, EventsControllerDelegate, AudioQueuePlayerDatasource  
-   open func loadPreviousReplies(completion: @escaping (Error?) -> Void)
+   open func loadPreviousReplies(completion: @escaping @MainActor @Sendable(Error?) -> Void)
-   open func loadNextReplies(completion: @escaping (Error?) -> Void)
+   open func loadNextReplies(completion: @escaping @MainActor @Sendable(Error?) -> Void)
-   public func chatMessageListVC(_ vc: ChatMessageListVC,shouldLoadPageAroundMessageId messageId: MessageId,_ completion: @escaping ((Error?) -> Void))
+   public func chatMessageListVC(_ vc: ChatMessageListVC,shouldLoadPageAroundMessageId messageId: MessageId,_ completion: @escaping @Sendable(Error?) -> Void)

- public class ClientError: Error, CustomStringConvertible  
+ public class ClientError: Error, CustomStringConvertible, @unchecked Sendable  

- public protocol CDNClient
+ public protocol CDNClient: Sendable

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

- public struct PollCreationSection: RawRepresentable, Equatable  
+ public struct PollCreationSection: RawRepresentable, Equatable, Sendable  
-   public static var name
+   public static let name
-   public static var options
+   public static let options
-   public static var features
+   public static let features

- public class EventsController: Controller, DelegateCallable  
+ public class EventsController: Controller, DelegateCallable, @unchecked Sendable  
-   public var callbackQueue: DispatchQueue
+   public var delegate: EventsControllerDelegate?
-   public var delegate: EventsControllerDelegate?

- public struct ImageLoaderOptions  
+ public struct ImageLoaderOptions: Sendable  

- public struct PushProvider: RawRepresentable, Hashable, ExpressibleByStringLiteral  
+ public struct PushProvider: RawRepresentable, Hashable, ExpressibleByStringLiteral, Sendable  

- public protocol SwiftUIRepresentable: AnyObject
+ @MainActor public protocol SwiftUIRepresentable: AnyObject

- public protocol CurrentChatUserControllerDelegate: AnyObject
+ @MainActor public protocol CurrentChatUserControllerDelegate: AnyObject

- public class ChatClient  
+ public class ChatClient: @unchecked Sendable  
-   public func connectUser(userInfo: UserInfo,tokenProvider: @escaping TokenProvider,completion: ((Error?) -> Void)? = nil)
+   public func connectUser(userInfo: UserInfo,tokenProvider: @escaping TokenProvider,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func connectUser(userInfo: UserInfo,token: Token,completion: ((Error?) -> Void)? = nil)
+   public func connectUser(userInfo: UserInfo,token: Token,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func connectGuestUser(userInfo: UserInfo,completion: ((Error?) -> Void)? = nil)
+   public func connectGuestUser(userInfo: UserInfo,completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func connectAnonymousUser(completion: ((Error?) -> Void)? = nil)
+   public func connectAnonymousUser(completion: (@MainActor @Sendable(Error?) -> Void)? = nil)
-   public func disconnect(completion: @escaping () -> Void)
+   public func disconnect(completion: @escaping @MainActor @Sendable() -> Void)
-   public func logout(removeDevice: Bool = true,completion: @escaping () -> Void)
+   public func logout(removeDevice: Bool = true,completion: @escaping @MainActor @Sendable() -> Void)
-   public func loadAppSettings(completion: ((Result<AppSettings, Error>) -> Void)? = nil)
+   public func loadAppSettings(completion: (@Sendable(Result<AppSettings, Error>) -> Void)? = nil)

- public final class TooManyFailedTokenRefreshAttempts: ClientError  
+ public final class TooManyFailedTokenRefreshAttempts: ClientError, @unchecked Sendable  

- public protocol ComponentsProvider: AnyObject
+ @MainActor public protocol ComponentsProvider: AnyObject

- public final class InvalidToken: ClientError
+ public final class InvalidToken: ClientError, @unchecked Sendable

 @available(iOSApplicationExtension, unavailable) open class ChatChannelVC: _ViewController, ThemeProvider, ChatMessageListVCDataSource, ChatMessageListVCDelegate, ChatChannelControllerDelegate, EventsControllerDelegate, AudioQueuePlayerDatasource  
-   open func loadPreviousMessages(completion: @escaping (Error?) -> Void)
+   open func loadPreviousMessages(completion: @escaping @MainActor @Sendable(Error?) -> Void)
-   open func loadNextMessages(completion: @escaping (Error?) -> Void)
+   open func loadNextMessages(completion: @escaping @MainActor @Sendable(Error?) -> Void)
-   public func chatMessageListVC(_ vc: ChatMessageListVC,shouldLoadPageAroundMessageId messageId: MessageId,_ completion: @escaping ((Error?) -> Void))
+   public func chatMessageListVC(_ vc: ChatMessageListVC,shouldLoadPageAroundMessageId messageId: MessageId,_ completion: @escaping @Sendable(Error?) -> Void)

 extension FileAttachmentPayload: AttachmentPreviewProvider  
-   public func previewView(components: Components)-> UIView
+   @MainActor public func previewView(components: Components)-> UIView

- public final class UserList  
+ public final class UserList: Sendable  
-   @MainActor public lazy var state: UserListState
+   @MainActor public var state: UserListState

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

 public struct LateResize: ImageProcessing  
-   @available(*, deprecated, message: "Use init(id:sizeProvider:) instead") public init(sizeProvider: @escaping () -> CGSize)
+   @available(*, deprecated, message: "Use init(id:sizeProvider:) instead") public init(sizeProvider: @escaping @Sendable() -> CGSize)
-   public init(id: String,sizeProvider: @escaping () -> CGSize)
+   public init(id: String,sizeProvider: @escaping @Sendable() -> CGSize)

- open class StreamAudioPlayer: AudioPlaying, AppStateObserverDelegate  
+ open class StreamAudioPlayer: AudioPlaying, AppStateObserverDelegate, @unchecked Sendable  

- public class MessageSearch  
+ public class MessageSearch: @unchecked Sendable  
-   @MainActor public lazy var state: MessageSearchState
+   @MainActor public var state: MessageSearchState

 open class AudioQueuePlayerNextItemProvider  
-   public struct LookUpScope: RawRepresentable, Equatable  
+   public struct LookUpScope: RawRepresentable, Equatable, Sendable  

- public struct AITypingState: ExpressibleByStringLiteral, Hashable  
+ public struct AITypingState: ExpressibleByStringLiteral, Hashable, Sendable  

- public final class MemberList  
+ public final class MemberList: Sendable  
-   @MainActor public lazy var state: MemberListState
+   @MainActor public var state: MemberListState

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

- public struct ChatClientConfig  
+ public struct ChatClientConfig: Sendable  
-   public enum DeletedMessageVisibility: String, CustomStringConvertible, CustomDebugStringConvertible  
+   public enum DeletedMessageVisibility: String, CustomStringConvertible, CustomDebugStringConvertible, Sendable  

- public struct AttachmentType: RawRepresentable, Codable, Hashable, ExpressibleByStringLiteral  
+ public struct AttachmentType: RawRepresentable, Codable, Hashable, ExpressibleByStringLiteral, Sendable  

- public class MessageReminderUpdatedEvent: Event  
+ public final class MessageReminderUpdatedEvent: Event  

- public struct BlockedUserDetails  
+ public struct BlockedUserDetails: Sendable  

- public protocol GiphyActionContentViewDelegate: ChatMessageContentViewDelegate
+ @MainActor public protocol GiphyActionContentViewDelegate: ChatMessageContentViewDelegate

- public struct ThreadQuery: Encodable  
+ public struct ThreadQuery: Encodable, Sendable  

- public struct ChatMessageLayoutOption: RawRepresentable, Hashable, ExpressibleByStringLiteral  
+ public struct ChatMessageLayoutOption: RawRepresentable, Hashable, ExpressibleByStringLiteral, Sendable  

- public struct MessageModerationDetails  
+ public struct MessageModerationDetails: Sendable  

- public struct UnreadCount: Decodable, Equatable  
+ public struct UnreadCount: Decodable, Equatable, Sendable  

- public enum LocalAttachmentState: Hashable  
+ public enum LocalAttachmentState: Hashable, Sendable  

- public enum BanEnabling  
+ public enum BanEnabling: Sendable  

- public enum ChannelType: Codable, Hashable  
+ public enum ChannelType: Codable, Hashable, Sendable  

- public struct FilterKey: ExpressibleByStringLiteral, RawRepresentable  
+ public struct FilterKey: ExpressibleByStringLiteral, RawRepresentable, Sendable  

- public protocol ChatChannelUnreadCountViewSwiftUIView: View
+ @MainActor public protocol ChatChannelUnreadCountViewSwiftUIView: View

- public protocol AssetPropertyLoading
+ public protocol AssetPropertyLoading: Sendable

- public struct AssetProperty: CustomStringConvertible  
+ public struct AssetProperty: CustomStringConvertible, Sendable  

- public struct AttachmentFile: Codable, Hashable  
+ public struct AttachmentFile: Codable, Hashable, Sendable  
-   public static let sizeFormatter
+   public nonisolated static let sizeFormatter

- public class MessageReminderCreatedEvent: Event  
+ public final class MessageReminderCreatedEvent: Event  

- public final class ConnectedUser  
+ public final class ConnectedUser: Sendable  
-   @MainActor public lazy var state: ConnectedUserState
+   @MainActor public var state: ConnectedUserState

- public struct AppSettings  
+ public struct AppSettings: Sendable  
-   public struct UploadConfig  
+   public struct UploadConfig: Sendable  

- public enum LogLevel: Int  
+ public enum LogLevel: Int, Sendable  

- public struct VotingVisibility: RawRepresentable, Equatable  
+ public struct VotingVisibility: RawRepresentable, Equatable, Sendable  

- public class ChatChannelWatcherListController: DataController, DelegateCallable, DataStoreProvider  
+ public class ChatChannelWatcherListController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   override public func synchronize(_ completion: ((_ error: Error?) -> Void)? = nil)
+   override public func synchronize(_ completion: (@MainActor @Sendable(_ error: Error?) -> Void)? = nil)

- public protocol VoiceRecordingDelegate: AnyObject
+ @MainActor public protocol VoiceRecordingDelegate: AnyObject

- public class StreamAttachmentUploader: AttachmentUploader  
+ public class StreamAttachmentUploader: AttachmentUploader, @unchecked Sendable  
-   public func upload(_ attachment: AnyChatMessageAttachment,progress: ((Double) -> Void)?,completion: @escaping (Result<UploadedAttachment, Error>) -> Void)
+   public func upload(_ attachment: AnyChatMessageAttachment,progress: (@Sendable(Double) -> Void)?,completion: @escaping @Sendable(Result<UploadedAttachment, Error>) -> Void)

- public enum LocalMessageState: String  
+ public enum LocalMessageState: String, Sendable  

- public protocol PollAttachmentViewInjectorDelegate: ChatMessageContentViewDelegate
+ @MainActor public protocol PollAttachmentViewInjectorDelegate: ChatMessageContentViewDelegate

 open class NukeImageLoader: ImageLoading  
-   @discardableResult open func loadImage(into imageView: UIImageView,from url: URL?,with options: ImageLoaderOptions,completion: ((Result<UIImage, Error>) -> Void)?)-> Cancellable?
+   @discardableResult @MainActor open func loadImage(into imageView: UIImageView,from url: URL?,with options: ImageLoaderOptions,completion: (@MainActor @Sendable(Result<UIImage, Error>) -> Void)?)-> Cancellable?
-   @discardableResult open func downloadImage(with request: ImageDownloadRequest,completion: @escaping ((Result<UIImage, Error>) -> Void))-> Cancellable?
+   @discardableResult open func downloadImage(with request: ImageDownloadRequest,completion: @escaping @MainActor @Sendable(Result<UIImage, Error>) -> Void)-> Cancellable?
-   open func downloadMultipleImages(with requests: [ImageDownloadRequest],completion: @escaping (([Result<UIImage, Error>]) -> Void))
+   open func downloadMultipleImages(with requests: [ImageDownloadRequest],completion: @escaping @MainActor @Sendable([Result<UIImage, Error>]) -> Void)

- public struct Appearance  
+ public struct Appearance: @unchecked Sendable  
-   public var localizationProvider: (_ key: String, _ table: String) -> String
+   public var localizationProvider: @Sendable(_ key: String, _ table: String) -> String

- public final class MissingLocalStorageURL: ClientError  
+ public final class MissingLocalStorageURL: ClientError, @unchecked Sendable  

- public struct AudioAnalysisEngine  
+ public struct AudioAnalysisEngine: Sendable  
-   public func waveformVisualisation(fromAudioURL audioURL: URL,for targetSamples: Int,completionHandler: @escaping (Result<[Float], Error>) -> Void)
+   public func waveformVisualisation(fromAudioURL audioURL: URL,for targetSamples: Int,completionHandler: @escaping @Sendable(Result<[Float], Error>) -> Void)

- public struct LocalAttachmentInfoKey: Hashable, Equatable, RawRepresentable  
+ public struct LocalAttachmentInfoKey: Hashable, Equatable, RawRepresentable, Sendable  

- public class ChatUser  
+ public class ChatUser: @unchecked Sendable  

- public final class ConnectionWasNotInitiated: ClientError  
+ public final class ConnectionWasNotInitiated: ClientError, @unchecked Sendable  

- public protocol ImageProcessor
+ public protocol ImageProcessor: Sendable

- public protocol MaskProviding
+ @MainActor public protocol MaskProviding

- public struct MessageDeliveryStatus: RawRepresentable, Hashable  
+ public struct MessageDeliveryStatus: RawRepresentable, Hashable, Sendable  

- public protocol CustomEventPayload: Codable, Hashable
+ public protocol CustomEventPayload: Codable, Hashable, Sendable

- public struct MessageModerationAction: RawRepresentable, Equatable  
+ public struct MessageModerationAction: RawRepresentable, Equatable, Sendable  

- public final class ClientIsNotInActiveMode: ClientError  
+ public final class ClientIsNotInActiveMode: ClientError, @unchecked Sendable  

- public struct DraftMessage  
+ public struct DraftMessage: Sendable  

- public struct ChannelUnreadCount: Decodable, Equatable  
+ public struct ChannelUnreadCount: Decodable, Equatable, Sendable  

 public struct AIIndicatorStopEvent: CustomEventPayload, Event  
-   public static var eventType: EventType
+   public static let eventType: EventType

- public struct ChannelWatcherListQuery: Encodable  
+ public struct ChannelWatcherListQuery: Encodable, Sendable  

- public struct Command: Codable, Hashable  
+ public struct Command: Codable, Hashable, Sendable  

- open class StreamAudioRecorder: NSObject, AudioRecording, AVAudioRecorderDelegate, AppStateObserverDelegate  
+ open class StreamAudioRecorder: NSObject, AudioRecording, AVAudioRecorderDelegate, AppStateObserverDelegate, @unchecked Sendable  
-   open func beginRecording(_ completionHandler: @escaping (() -> Void))
+   open func beginRecording(_ completionHandler: @escaping @Sendable() -> Void)
-     public static let `default`
+     nonisolated public static let `default`

- public enum PaginationParameter: Encodable, Hashable  
+ public enum PaginationParameter: Encodable, Hashable, Sendable  

- public struct LocationInfo  
+ public struct LocationInfo: Sendable  

- public struct AttachmentUploadingState: Hashable  
+ public struct AttachmentUploadingState: Hashable, Sendable  

- public protocol LogDestination
+ public protocol LogDestination: Sendable

- public protocol AudioPlaying: AnyObject
+ public protocol AudioPlaying: AnyObject, Sendable

 public class ChatRemoteNotificationHandler  
-   public func handleNotification(completion: @escaping (ChatPushNotificationContent) -> Void)-> Bool
+   public func handleNotification(completion: @escaping @Sendable(ChatPushNotificationContent) -> Void)-> Bool

- public struct Device: Codable, Equatable  
+ public struct Device: Codable, Equatable, Sendable  

- public protocol GalleryItemPreview
+ @MainActor public protocol GalleryItemPreview

- public class ChatThreadListController: DataController, DelegateCallable, DataStoreProvider  
+ public class ChatThreadListController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   override public func synchronize(_ completion: ((_ error: Error?) -> Void)? = nil)
+   override public func synchronize(_ completion: (@MainActor @Sendable(_ error: Error?) -> Void)? = nil)
-   public func loadMoreThreads(limit: Int? = nil,completion: ((Result<[ChatThread], Error>) -> Void)? = nil)
+   public func loadMoreThreads(limit: Int? = nil,completion: (@MainActor @Sendable(Result<[ChatThread], Error>) -> Void)? = nil)

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

- public struct AudioRecordingContext: Hashable  
+ public struct AudioRecordingContext: Hashable, Sendable  

- public struct UnreadChannel  
+ public struct UnreadChannel: Sendable  

- public struct ChannelListQuery: Encodable, LocalConvertibleSortingQuery  
+ public struct ChannelListQuery: Encodable, Sendable, LocalConvertibleSortingQuery  

- public class ChannelConfig: Codable  
+ public final class ChannelConfig: Codable, Sendable  

- public struct PollsConfig  
+ public struct PollsConfig: Sendable  

- public struct MessageReactionType: RawRepresentable, Codable, Hashable, ExpressibleByStringLiteral  
+ public struct MessageReactionType: RawRepresentable, Codable, Hashable, ExpressibleByStringLiteral, Sendable  

- public struct PollVote: Hashable, Equatable  
+ public struct PollVote: Hashable, Equatable, Sendable  

- public struct ImageResize  
+ public struct ImageResize: Sendable  

- public final class AudioRecorderError: ClientError  
+ public final class AudioRecorderError: ClientError, @unchecked Sendable  

- public struct ChannelMemberListQuery: Encodable  
+ public struct ChannelMemberListQuery: Encodable, Sendable  

- public struct Spacing: Equatable, ExpressibleByFloatLiteral, ExpressibleByIntegerLiteral  
+ public struct Spacing: Equatable, ExpressibleByFloatLiteral, ExpressibleByIntegerLiteral, Sendable  

- public protocol UploadedAttachmentPostProcessor
+ public protocol UploadedAttachmentPostProcessor: Sendable

- public struct Filter  
+ public struct Filter: Sendable  

- public struct MessageReminderListQuery: Encodable  
+ public struct MessageReminderListQuery: Encodable, Sendable  

- public struct ThreadListQuery: Encodable, LocalConvertibleSortingQuery  
+ public struct ThreadListQuery: Encodable, Sendable, LocalConvertibleSortingQuery  

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

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

- public struct ChannelListSearchStrategy  
+ public struct ChannelListSearchStrategy: Sendable  
-   public func makeSearchController(with channelListVC: ChatChannelListVC)-> UISearchController?
+   @MainActor public func makeSearchController(with channelListVC: ChatChannelListVC)-> UISearchController?

- public protocol AttachmentPayload: Codable
+ public protocol AttachmentPayload: Codable, Sendable

- public enum ConnectionStatus: Equatable  
+ public enum ConnectionStatus: Equatable, Sendable  

- public protocol ChatChannelListItemViewSwiftUIView: View
+ @MainActor public protocol ChatChannelListItemViewSwiftUIView: View

- public class UserSearch  
+ public class UserSearch: @unchecked Sendable  
-   @MainActor public lazy var state: UserSearchState
+   @MainActor public var state: UserSearchState

- public class ChannelEventsController: EventsController  
+ public class ChannelEventsController: EventsController, @unchecked Sendable  
-   public func sendEvent(_ payload: T,completion: ((Error?) -> Void)? = nil)
+   public func sendEvent(_ payload: T,completion: (@Sendable(Error?) -> Void)? = nil)

- public class CooldownTracker  
+ public class CooldownTracker: @unchecked Sendable  

- public struct ChatThread  
+ public struct ChatThread: Sendable  

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

- public struct PollsEntryConfig  
+ public struct PollsEntryConfig: Sendable  

- public class Logger  
+ public class Logger: @unchecked Sendable  
-   public func callAsFunction(_ level: LogLevel,functionName: StaticString = #function,fileName: StaticString = #filePath,lineNumber: UInt = #line,message: @autoclosure () -> Any,subsystems: LogSubsystem = .other)
+   public func callAsFunction(_ level: LogLevel,functionName: StaticString = #function,fileName: StaticString = #file,lineNumber: UInt = #line,message: @autoclosure () -> Any,subsystems: LogSubsystem = .other)

- public struct ChannelCapability: RawRepresentable, ExpressibleByStringLiteral, Hashable  
+ public struct ChannelCapability: RawRepresentable, ExpressibleByStringLiteral, Hashable, Sendable  

- public class MessageReminderListController: DataController, DelegateCallable, DataStoreProvider  
+ public class MessageReminderListController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   override public func synchronize(_ completion: ((_ error: Error?) -> Void)? = nil)
+   override public func synchronize(_ completion: (@MainActor @Sendable(_ error: Error?) -> Void)? = nil)
-   public func loadMoreReminders(limit: Int? = nil,completion: ((Result<[MessageReminder], Error>) -> Void)? = nil)
+   public func loadMoreReminders(limit: Int? = nil,completion: (@MainActor @Sendable(Result<[MessageReminder], Error>) -> Void)? = nil)

- public class DataController: Controller  
+ public class DataController: Controller, @unchecked Sendable  
-   public var callbackQueue: DispatchQueue
+   
-   
+ 
- 
+   public func synchronize(_ completion: (@MainActor @Sendable(_ error: Error?) -> Void)? = nil)
-   public func synchronize(_ completion: ((_ error: Error?) -> Void)? = nil)
+   
-   
+ 
- 
+   public enum State: Equatable, Sendable  
-   public enum State: Equatable  
+   
-   
+     case initialized
-     case initialized
+     case localDataFetched
-     case localDataFetched
+     case localDataFetchFailed(ClientError)
-     case localDataFetchFailed(ClientError)
+     case remoteDataFetched
-     case remoteDataFetched
+     case remoteDataFetchFailed(ClientError)
-     case remoteDataFetchFailed(ClientError)

- public final class EventDecoding: ClientError
+ public final class EventDecoding: ClientError, @unchecked Sendable

- public struct CurrentUserUnreads  
+ public struct CurrentUserUnreads: Sendable  

Copy link

github-actions bot commented Aug 1, 2025

Public Interface

- public class ChatChannelController: DataController, DelegateCallable, DataStoreProvider  
+ public class ChatChannelController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   override public func synchronize(_ completion: ((_ error: Error?) -> Void)? = nil)
+   override public func synchronize(_ completion: (@MainActor(_ error: Error?) -> Void)? = nil)
-   public func updateChannel(name: String?,imageURL: URL?,team: String?,members: Set<UserId> = [],invites: Set<UserId> = [],extraData: [String: RawJSON] = [:],completion: ((Error?) -> Void)? = nil)
+   public func updateChannel(name: String?,imageURL: URL?,team: String?,members: Set<UserId> = [],invites: Set<UserId> = [],extraData: [String: RawJSON] = [:],completion: (@MainActor(Error?) -> Void)? = nil)
-   public func partialChannelUpdate(name: String? = nil,imageURL: URL? = nil,team: String? = nil,members: Set<UserId> = [],invites: Set<UserId> = [],extraData: [String: RawJSON] = [:],unsetProperties: [String] = [],completion: ((Error?) -> Void)? = nil)
+   public func partialChannelUpdate(name: String? = nil,imageURL: URL? = nil,team: String? = nil,members: Set<UserId> = [],invites: Set<UserId> = [],extraData: [String: RawJSON] = [:],unsetProperties: [String] = [],completion: (@MainActor(Error?) -> Void)? = nil)
-   public func muteChannel(expiration: Int? = nil,completion: ((Error?) -> Void)? = nil)
+   public func muteChannel(expiration: Int? = nil,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func unmuteChannel(completion: ((Error?) -> Void)? = nil)
+   public func unmuteChannel(completion: (@MainActor(Error?) -> Void)? = nil)
-   public func archive(scope: ChannelArchivingScope = .me,completion: ((Error?) -> Void)? = nil)
+   public func archive(scope: ChannelArchivingScope = .me,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func unarchive(scope: ChannelArchivingScope = .me,completion: ((Error?) -> Void)? = nil)
+   public func unarchive(scope: ChannelArchivingScope = .me,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func deleteChannel(completion: ((Error?) -> Void)? = nil)
+   public func deleteChannel(completion: (@MainActor(Error?) -> Void)? = nil)
-   public func truncateChannel(skipPush: Bool = false,hardDelete: Bool = true,systemMessage: String? = nil,completion: ((Error?) -> Void)? = nil)
+   public func truncateChannel(skipPush: Bool = false,hardDelete: Bool = true,systemMessage: String? = nil,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func hideChannel(clearHistory: Bool = false,completion: ((Error?) -> Void)? = nil)
+   public func hideChannel(clearHistory: Bool = false,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func showChannel(completion: ((Error?) -> Void)? = nil)
+   public func showChannel(completion: (@MainActor(Error?) -> Void)? = nil)
-   public func loadPreviousMessages(before messageId: MessageId? = nil,limit: Int? = nil,completion: ((Error?) -> Void)? = nil)
+   public func loadPreviousMessages(before messageId: MessageId? = nil,limit: Int? = nil,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func loadNextMessages(after messageId: MessageId? = nil,limit: Int? = nil,completion: ((Error?) -> Void)? = nil)
+   public func loadNextMessages(after messageId: MessageId? = nil,limit: Int? = nil,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func loadPageAroundMessageId(_ messageId: MessageId,limit: Int? = nil,completion: ((Error?) -> Void)? = nil)
+   public func loadPageAroundMessageId(_ messageId: MessageId,limit: Int? = nil,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func loadFirstPage(_ completion: ((_ error: Error?) -> Void)? = nil)
+   public func loadFirstPage(_ completion: (@MainActor(_ error: Error?) -> Void)? = nil)
-   public func sendKeystrokeEvent(parentMessageId: MessageId? = nil,completion: ((Error?) -> Void)? = nil)
+   public func sendKeystrokeEvent(parentMessageId: MessageId? = nil,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func sendStartTypingEvent(parentMessageId: MessageId? = nil,completion: ((Error?) -> Void)? = nil)
+   public func sendStartTypingEvent(parentMessageId: MessageId? = nil,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func sendStopTypingEvent(parentMessageId: MessageId? = nil,completion: ((Error?) -> Void)? = nil)
+   public func sendStopTypingEvent(parentMessageId: MessageId? = nil,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func createNewMessage(messageId: MessageId? = nil,text: String,pinning: MessagePinning? = nil,isSilent: Bool = false,attachments: [AnyAttachmentPayload] = [],mentionedUserIds: [UserId] = [],quotedMessageId: MessageId? = nil,skipPush: Bool = false,skipEnrichUrl: Bool = false,restrictedVisibility: [UserId] = [],location: NewLocationInfo? = nil,extraData: [String: RawJSON] = [:],completion: ((Result<MessageId, Error>) -> Void)? = nil)
+   public func createNewMessage(messageId: MessageId? = nil,text: String,pinning: MessagePinning? = nil,isSilent: Bool = false,attachments: [AnyAttachmentPayload] = [],mentionedUserIds: [UserId] = [],quotedMessageId: MessageId? = nil,skipPush: Bool = false,skipEnrichUrl: Bool = false,restrictedVisibility: [UserId] = [],location: NewLocationInfo? = nil,extraData: [String: RawJSON] = [:],completion: (@MainActor(Result<MessageId, Error>) -> Void)? = nil)
-   public func createSystemMessage(text: String,messageId: MessageId? = nil,restrictedVisibility: [UserId] = [],extraData: [String: RawJSON] = [:],completion: ((Result<MessageId, Error>) -> Void)? = nil)
+   public func createSystemMessage(text: String,messageId: MessageId? = nil,restrictedVisibility: [UserId] = [],extraData: [String: RawJSON] = [:],completion: (@MainActor(Result<MessageId, Error>) -> Void)? = nil)
-   public func sendStaticLocation(_ location: LocationInfo,text: String? = nil,messageId: MessageId? = nil,quotedMessageId: MessageId? = nil,extraData: [String: RawJSON] = [:],completion: ((Result<MessageId, Error>) -> Void)? = nil)
+   public func sendStaticLocation(_ location: LocationInfo,text: String? = nil,messageId: MessageId? = nil,quotedMessageId: MessageId? = nil,extraData: [String: RawJSON] = [:],completion: (@MainActor(Result<MessageId, Error>) -> Void)? = nil)
-   public func startLiveLocationSharing(_ location: LocationInfo,endDate: Date,text: String? = nil,extraData: [String: RawJSON] = [:],completion: ((Result<MessageId, Error>) -> Void)? = nil)
+   public func startLiveLocationSharing(_ location: LocationInfo,endDate: Date,text: String? = nil,extraData: [String: RawJSON] = [:],completion: (@MainActor(Result<MessageId, Error>) -> Void)? = nil)
-   public func updateDraftMessage(text: String,isSilent: Bool = false,attachments: [AnyAttachmentPayload] = [],mentionedUserIds: [UserId] = [],quotedMessageId: MessageId? = nil,command: Command? = nil,extraData: [String: RawJSON] = [:],completion: ((Result<DraftMessage, Error>) -> Void)? = nil)
+   public func updateDraftMessage(text: String,isSilent: Bool = false,attachments: [AnyAttachmentPayload] = [],mentionedUserIds: [UserId] = [],quotedMessageId: MessageId? = nil,command: Command? = nil,extraData: [String: RawJSON] = [:],completion: (@MainActor(Result<DraftMessage, Error>) -> Void)? = nil)
-   public func loadDraftMessage(completion: ((Result<DraftMessage?, Error>) -> Void)? = nil)
+   public func loadDraftMessage(completion: (@MainActor(Result<DraftMessage?, Error>) -> Void)? = nil)
-   public func deleteDraftMessage(completion: ((Error?) -> Void)? = nil)
+   public func deleteDraftMessage(completion: (@MainActor(Error?) -> Void)? = nil)
-   public func createPoll(name: String,allowAnswers: Bool? = nil,allowUserSuggestedOptions: Bool? = nil,description: String? = nil,enforceUniqueVote: Bool? = nil,maxVotesAllowed: Int? = nil,votingVisibility: VotingVisibility? = nil,options: [PollOption]? = nil,extraData: [String: RawJSON]? = nil,completion: ((Result<MessageId, Error>) -> Void)?)
+   public func createPoll(name: String,allowAnswers: Bool? = nil,allowUserSuggestedOptions: Bool? = nil,description: String? = nil,enforceUniqueVote: Bool? = nil,maxVotesAllowed: Int? = nil,votingVisibility: VotingVisibility? = nil,options: [PollOption]? = nil,extraData: [String: RawJSON]? = nil,completion: (@MainActor(Result<MessageId, Error>) -> Void)?)
-   public func deletePoll(pollId: String,completion: ((Error?) -> Void)? = nil)
+   public func deletePoll(pollId: String,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func addMembers(_ members: [MemberInfo],hideHistory: Bool = false,message: String? = nil,completion: ((Error?) -> Void)? = nil)
+   public func addMembers(_ members: [MemberInfo],hideHistory: Bool = false,message: String? = nil,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func addMembers(userIds: Set<UserId>,hideHistory: Bool = false,message: String? = nil,completion: ((Error?) -> Void)? = nil)
+   public func addMembers(userIds: Set<UserId>,hideHistory: Bool = false,message: String? = nil,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func removeMembers(userIds: Set<UserId>,message: String? = nil,completion: ((Error?) -> Void)? = nil)
+   public func removeMembers(userIds: Set<UserId>,message: String? = nil,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func inviteMembers(userIds: Set<UserId>,completion: ((Error?) -> Void)? = nil)
+   public func inviteMembers(userIds: Set<UserId>,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func acceptInvite(message: String? = nil,completion: ((Error?) -> Void)? = nil)
+   public func acceptInvite(message: String? = nil,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func rejectInvite(completion: ((Error?) -> Void)? = nil)
+   public func rejectInvite(completion: (@MainActor(Error?) -> Void)? = nil)
-   public func markRead(completion: ((Error?) -> Void)? = nil)
+   public func markRead(completion: (@MainActor(Error?) -> Void)? = nil)
-   public func markUnread(from messageId: MessageId,completion: ((Result<ChatChannel, Error>) -> Void)? = nil)
+   public func markUnread(from messageId: MessageId,completion: (@MainActor(Result<ChatChannel, Error>) -> Void)? = nil)
-   public func loadChannelReads(pagination: Pagination? = nil,completion: @escaping (Error?) -> Void)
+   public func loadChannelReads(pagination: Pagination? = nil,completion: @escaping @MainActor(Error?) -> Void)
-   public func loadMoreChannelReads(limit: Int? = nil,completion: @escaping (Error?) -> Void)
+   public func loadMoreChannelReads(limit: Int? = nil,completion: @escaping @MainActor(Error?) -> Void)
-   public func enableSlowMode(cooldownDuration: Int,completion: ((Error?) -> Void)? = nil)
+   public func enableSlowMode(cooldownDuration: Int,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func disableSlowMode(completion: ((Error?) -> Void)? = nil)
+   public func disableSlowMode(completion: (@MainActor(Error?) -> Void)? = nil)
-   public func startWatching(isInRecoveryMode: Bool,completion: ((Error?) -> Void)? = nil)
+   public func startWatching(isInRecoveryMode: Bool,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func stopWatching(completion: ((Error?) -> Void)? = nil)
+   public func stopWatching(completion: (@MainActor(Error?) -> Void)? = nil)
-   public func freezeChannel(completion: ((Error?) -> Void)? = nil)
+   public func freezeChannel(completion: (@MainActor(Error?) -> Void)? = nil)
-   public func unfreezeChannel(completion: ((Error?) -> Void)? = nil)
+   public func unfreezeChannel(completion: (@MainActor(Error?) -> Void)? = nil)
-   public func pin(scope: ChannelPinningScope = .me,completion: ((Error?) -> Void)? = nil)
+   public func pin(scope: ChannelPinningScope = .me,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func unpin(scope: ChannelPinningScope = .me,completion: ((Error?) -> Void)? = nil)
+   public func unpin(scope: ChannelPinningScope = .me,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func uploadAttachment(localFileURL: URL,type: AttachmentType,progress: ((Double) -> Void)? = nil,completion: @escaping ((Result<UploadedAttachment, Error>) -> Void))
+   public func uploadAttachment(localFileURL: URL,type: AttachmentType,progress: (@Sendable(Double) -> Void)? = nil,completion: @escaping @MainActor(Result<UploadedAttachment, Error>) -> Void)
-   public func enrichUrl(_ url: URL,completion: @escaping (Result<LinkAttachmentPayload, Error>) -> Void)
+   public func enrichUrl(_ url: URL,completion: @escaping @MainActor(Result<LinkAttachmentPayload, Error>) -> Void)
-   public func loadPinnedMessages(pageSize: Int = .messagesPageSize,sorting: [Sorting<PinnedMessagesSortingKey>] = [],pagination: PinnedMessagesPagination? = nil,completion: @escaping (Result<[ChatMessage], Error>) -> Void)
+   public func loadPinnedMessages(pageSize: Int = .messagesPageSize,sorting: [Sorting<PinnedMessagesSortingKey>] = [],pagination: PinnedMessagesPagination? = nil,completion: @escaping @MainActor(Result<[ChatMessage], Error>) -> Void)
-   public func deleteFile(url: String,completion: ((Error?) -> Void)? = nil)
+   public func deleteFile(url: String,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func deleteImage(url: String,completion: ((Error?) -> Void)? = nil)
+   public func deleteImage(url: String,completion: (@MainActor(Error?) -> Void)? = nil)

 public struct AIIndicatorStopEvent: CustomEventPayload, Event  
-   public static var eventType: EventType
+   public static let eventType: EventType

- public protocol VoiceRecordingAttachmentPresentationViewDelegate: ChatMessageContentViewDelegate
+ @MainActor public protocol VoiceRecordingAttachmentPresentationViewDelegate: ChatMessageContentViewDelegate

- public indirect enum RawJSON: Codable, Hashable  
+ public indirect enum RawJSON: Codable, Hashable, Sendable  

- public class MessageReminderUpdatedEvent: Event  
+ public final class MessageReminderUpdatedEvent: Event  

- @resultBuilder public struct ViewContainerBuilder  
+ @MainActor @resultBuilder public struct ViewContainerBuilder  

- public struct BlockedUserDetails  
+ public struct BlockedUserDetails: Sendable  

- public struct PushNotificationType: Equatable  
+ public struct PushNotificationType: Equatable, Sendable  
-   public static var messageNew: PushNotificationType
+   public static let messageNew: PushNotificationType
-   public static var messageReminderDue: PushNotificationType
+   public static let messageReminderDue: PushNotificationType
-   public static var messageUpdated: PushNotificationType
+   public static let messageUpdated: PushNotificationType
-   public static var reactionNew: PushNotificationType
+   public static let reactionNew: PushNotificationType

- public struct MessageReminderListQuery: Encodable  
+ public struct MessageReminderListQuery: Encodable, Sendable  

- public struct MessagePinDetails  
+ public struct MessagePinDetails: Sendable  

- public class PollController: DataController, DelegateCallable, DataStoreProvider  
+ public class PollController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   override public func synchronize(_ completion: ((_ error: Error?) -> Void)? = nil)
+   override public func synchronize(_ completion: (@MainActor(_ error: Error?) -> Void)? = nil)
-   public func castPollVote(answerText: String?,optionId: String?,completion: ((Error?) -> Void)? = nil)
+   public func castPollVote(answerText: String?,optionId: String?,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func removePollVote(voteId: String,completion: ((Error?) -> Void)? = nil)
+   public func removePollVote(voteId: String,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func closePoll(completion: ((Error?) -> Void)? = nil)
+   public func closePoll(completion: (@MainActor(Error?) -> Void)? = nil)
-   public func suggestPollOption(text: String,position: Int? = nil,extraData: [String: RawJSON]? = nil,completion: ((Error?) -> Void)? = nil)
+   public func suggestPollOption(text: String,position: Int? = nil,extraData: [String: RawJSON]? = nil,completion: (@MainActor(Error?) -> Void)? = nil)

- public protocol CustomEventPayload: Codable, Hashable
+ public protocol CustomEventPayload: Codable, Hashable, Sendable

- public final class ConnectionNotSuccessful: ClientError  
+ public final class ConnectionNotSuccessful: ClientError, @unchecked Sendable  

- public struct ChatClientConfig  
+ public struct ChatClientConfig: Sendable  
-   public enum DeletedMessageVisibility: String, CustomStringConvertible, CustomDebugStringConvertible  
+   public enum DeletedMessageVisibility: String, CustomStringConvertible, CustomDebugStringConvertible, Sendable  

- public struct UnreadThread  
+ public struct UnreadThread: Sendable  

- public struct ComposerState: RawRepresentable, Equatable  
+ public struct ComposerState: RawRepresentable, Equatable, Sendable  
-   public static var new
+   public static let new
-   public static var edit
+   public static let edit
-   public static var quote
+   public static let quote
-   public static var recording
+   public static let recording
-   public static var recordingLocked
+   public static let recordingLocked

- public struct UnreadCount: Decodable, Equatable  
+ public struct UnreadCount: Decodable, Equatable, Sendable  

- public struct ChannelUnreadCount: Decodable, Equatable  
+ public struct ChannelUnreadCount: Decodable, Equatable, Sendable  

- public final class TooManyFailedTokenRefreshAttempts: ClientError  
+ public final class TooManyFailedTokenRefreshAttempts: ClientError, @unchecked Sendable  

- public protocol UploadedAttachmentPostProcessor
+ public protocol UploadedAttachmentPostProcessor: Sendable

- extension PollController: EventsControllerDelegate  
+ extension PollController  
-   public func eventsController(_ controller: EventsController,didReceiveEvent event: Event)
+   public var observableObject: ObservableObject
+   
+ 
+   public class ObservableObject: SwiftUI.ObservableObject  
+   
+     public let controller: PollController
+     @Published public private var poll: Poll?
+     @Published public private var ownVotes: LazyCachedMapCollection<PollVote>
+     @Published public private var state: DataController.State

 open class AudioQueuePlayerNextItemProvider  
-   public struct LookUpScope: RawRepresentable, Equatable  
+   public struct LookUpScope: RawRepresentable, Equatable, Sendable  

- public protocol GalleryItemPreview
+ @MainActor public protocol GalleryItemPreview

- public struct Command: Codable, Hashable  
+ public struct Command: Codable, Hashable, Sendable  

- public class ScheduledStreamTimer: StreamTimer  
+ public class ScheduledStreamTimer: StreamTimer, @unchecked Sendable  
-   public var onChange: (() -> Void)?
+   public var onChange: (@Sendable() -> Void)?

- public struct LocalAttachmentInfoKey: Hashable, Equatable, RawRepresentable  
+ public struct LocalAttachmentInfoKey: Hashable, Equatable, RawRepresentable, Sendable  

- public struct PushProvider: RawRepresentable, Hashable, ExpressibleByStringLiteral  
+ public struct PushProvider: RawRepresentable, Hashable, ExpressibleByStringLiteral, Sendable  

- public protocol EventsControllerDelegate: AnyObject
+ @MainActor public protocol EventsControllerDelegate: AnyObject

 open class ChatMessageAttachmentPreviewVC: _ViewController, WKNavigationDelegate, AppearanceProvider  
-   public func webView(_ webView: WKWebView,didStartProvisionalNavigation navigation: WKNavigation!)
+   nonisolated public func webView(_ webView: WKWebView,didStartProvisionalNavigation navigation: WKNavigation!)
-   public func webView(_ webView: WKWebView,didFinish navigation: WKNavigation!)
+   nonisolated public func webView(_ webView: WKWebView,didFinish navigation: WKNavigation!)

- public final class MissingTokenProvider: ClientError  
+ public final class MissingTokenProvider: ClientError, @unchecked Sendable  

- public protocol ChatChannelListItemViewSwiftUIView: View
+ @MainActor public protocol ChatChannelListItemViewSwiftUIView: View

- public struct MaxMessageLimitOptions  
+ public struct MaxMessageLimitOptions: Sendable  

- public protocol ChatConnectionControllerDelegate: AnyObject
+ @MainActor public protocol ChatConnectionControllerDelegate: AnyObject

 @available(iOSApplicationExtension, unavailable) open class ChatMessageSearchVC: ChatChannelListSearchVC, ChatMessageSearchControllerDelegate  
-   public var didSelectMessage: ((ChatChannel, ChatMessage) -> Void)?
+   public var didSelectMessage: (@MainActor(ChatChannel, ChatMessage) -> Void)?

- public class LivestreamChannelController: DataStoreProvider, EventsControllerDelegate, AppStateObserverDelegate  
+ public class LivestreamChannelController: DataStoreProvider, AppStateObserverDelegate, @unchecked Sendable  
-   public func startWatching(isInRecoveryMode: Bool,completion: ((Error?) -> Void)? = nil)
+   public func startWatching(isInRecoveryMode: Bool,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func stopWatching(completion: ((Error?) -> Void)? = nil)
+   public func stopWatching(completion: (@MainActor(Error?) -> Void)? = nil)
-   public func eventsController(_ controller: EventsController,didReceiveEvent event: Event)
+   public func applicationDidReceiveMemoryWarning()
-   public func applicationDidReceiveMemoryWarning()
+   public func applicationDidMoveToForeground()
-   public func applicationDidMoveToForeground()

- public struct EventType: RawRepresentable, Codable, Hashable, ExpressibleByStringLiteral  
+ public struct EventType: RawRepresentable, Codable, Hashable, ExpressibleByStringLiteral, Sendable  

- public class HealthCheckEvent: ConnectionEvent, EventDTO  
+ public final class HealthCheckEvent: ConnectionEvent, EventDTO, Sendable  

- public class MessageReminderDueEvent: Event  
+ public final class MessageReminderDueEvent: Event  

- public final class UserList  
+ public final class UserList: Sendable  
-   @MainActor public lazy var state: UserListState
+   @MainActor public var state: UserListState

- public struct ThreadQuery: Encodable  
+ public struct ThreadQuery: Encodable, Sendable  

- @available(iOSApplicationExtension, unavailable) public protocol LinkPreviewViewDelegate: ChatMessageContentViewDelegate
+ @available(iOSApplicationExtension, unavailable) @MainActor public protocol LinkPreviewViewDelegate: ChatMessageContentViewDelegate

- public protocol Event
+ public protocol Event: Sendable

- public struct PollsEntryConfig  
+ public struct PollsEntryConfig: Sendable  

- public enum ChannelType: Codable, Hashable  
+ public enum ChannelType: Codable, Hashable, Sendable  

- public protocol MaskProviding
+ @MainActor public protocol MaskProviding

- public class ChatThreadListController: DataController, DelegateCallable, DataStoreProvider  
+ public class ChatThreadListController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   override public func synchronize(_ completion: ((_ error: Error?) -> Void)? = nil)
+   override public func synchronize(_ completion: (@MainActor(_ error: Error?) -> Void)? = nil)
-   public func loadMoreThreads(limit: Int? = nil,completion: ((Result<[ChatThread], Error>) -> Void)? = nil)
+   public func loadMoreThreads(limit: Int? = nil,completion: (@MainActor(Result<[ChatThread], Error>) -> Void)? = nil)

- public final class MissingToken: ClientError
+ public final class MissingToken: ClientError, @unchecked Sendable

- public struct BaseURL: CustomStringConvertible  
+ public struct BaseURL: CustomStringConvertible, Sendable  

- public struct DraftMessage  
+ public struct DraftMessage: Sendable  

- public final class UnsupportedUploadableAttachmentType: ClientError
+ public final class UnsupportedUploadableAttachmentType: ClientError, @unchecked Sendable

- public protocol GalleryContentViewDelegate: ChatMessageContentViewDelegate
+ @MainActor public protocol GalleryContentViewDelegate: ChatMessageContentViewDelegate

 public struct LateResize: ImageProcessing  
-   @available(*, deprecated, message: "Use init(id:sizeProvider:) instead") public init(sizeProvider: @escaping () -> CGSize)
+   @available(*, deprecated, message: "Use init(id:sizeProvider:) instead") public init(sizeProvider: @escaping @Sendable() -> CGSize)
-   public init(id: String,sizeProvider: @escaping () -> CGSize)
+   public init(id: String,sizeProvider: @escaping @Sendable() -> CGSize)

- public protocol AudioQueuePlayerDatasource: AnyObject
+ @MainActor public protocol AudioQueuePlayerDatasource: AnyObject

- public struct AITypingState: ExpressibleByStringLiteral, Hashable  
+ public struct AITypingState: ExpressibleByStringLiteral, Hashable, Sendable  

- public protocol FilterValue: Encodable
+ public protocol FilterValue: Encodable, Sendable

- public protocol ChatMessageActionsVCDelegate: AnyObject
+ @MainActor public protocol ChatMessageActionsVCDelegate: AnyObject

- public struct MessageReactionType: RawRepresentable, Codable, Hashable, ExpressibleByStringLiteral  
+ public struct MessageReactionType: RawRepresentable, Codable, Hashable, ExpressibleByStringLiteral, Sendable  

- public struct ChannelMemberListQuery: Encodable  
+ public struct ChannelMemberListQuery: Encodable, Sendable  

- public protocol ChatChannelAvatarViewSwiftUIView: View
+ @MainActor public protocol ChatChannelAvatarViewSwiftUIView: View

- public struct MessagesPagination: Encodable, Equatable  
+ public struct MessagesPagination: Encodable, Equatable, Sendable  

 @available(iOSApplicationExtension, unavailable) open class ChatMessageListVC: _ViewController, ThemeProvider, ChatMessageListScrollOverlayDataSource, ChatMessageActionsVCDelegate, ChatMessageContentViewDelegate, GalleryContentViewDelegate, GiphyActionContentViewDelegate, FileActionContentViewDelegate, LinkPreviewViewDelegate, PollAttachmentViewInjectorDelegate, UITableViewDataSource, UITableViewDelegate, UIGestureRecognizerDelegate, VoiceRecordingAttachmentPresentationViewDelegate  
-   open func jumpToUnreadMessage(animated: Bool = true,onHighlight: ((IndexPath) -> Void)? = nil)
+   open func jumpToUnreadMessage(animated: Bool = true,onHighlight: (@Sendable(IndexPath) -> Void)? = nil)

- open class StreamVideoLoader: VideoLoading  
+ open class StreamVideoLoader: VideoLoading, @unchecked Sendable  
-   open func loadPreviewForVideo(at url: URL,completion: @escaping (Result<UIImage, Error>) -> Void)
+   open func loadPreviewForVideo(at url: URL,completion: @escaping @MainActor(Result<UIImage, Error>) -> Void)

- open class StreamAudioPlayer: AudioPlaying, AppStateObserverDelegate  
+ open class StreamAudioPlayer: AudioPlaying, AppStateObserverDelegate, @unchecked Sendable  

- public enum ConnectionStatus: Equatable  
+ public enum ConnectionStatus: Equatable, Sendable  

- public protocol AudioRecordingDelegate: AnyObject
+ @MainActor public protocol AudioRecordingDelegate: AnyObject

- public final class ReactionList  
+ public final class ReactionList: Sendable  
-   @MainActor public lazy var state: ReactionListState
+   @MainActor public var state: ReactionListState

- open class StreamImageCDN: ImageCDN  
+ open class StreamImageCDN: ImageCDN, @unchecked Sendable  
-   public static var streamCDNURL
+   nonisolated public static var streamCDNURL

- public struct EmptyResponse: Decodable
+ public struct EmptyResponse: Decodable, Sendable

- public struct AudioRecordingState: Hashable  
+ public struct AudioRecordingState: Hashable, Sendable  

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

- public protocol ChatChannelUnreadCountViewSwiftUIView: View
+ @MainActor public protocol ChatChannelUnreadCountViewSwiftUIView: View

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

- public protocol FileActionContentViewDelegate: ChatMessageContentViewDelegate
+ @MainActor public protocol FileActionContentViewDelegate: ChatMessageContentViewDelegate

- public protocol SwipeableViewDelegate: AnyObject
+ @MainActor public protocol SwipeableViewDelegate: AnyObject

- public enum PaginationParameter: Encodable, Hashable  
+ public enum PaginationParameter: Encodable, Hashable, Sendable  

- public struct TypingIndicatorPrivacySettings  
+ public struct TypingIndicatorPrivacySettings: Sendable  

- public final class ReconnectionTimeout: ClientError  
+ public final class ReconnectionTimeout: ClientError, @unchecked Sendable  

- public final class ClientIsNotInActiveMode: ClientError  
+ public final class ClientIsNotInActiveMode: ClientError, @unchecked Sendable  

- public class ChatChannelMember: ChatUser  
+ public class ChatChannelMember: ChatUser, @unchecked Sendable  

- public struct Device: Codable, Equatable  
+ public struct Device: Codable, Equatable, Sendable  

- public struct ThreadListQuery: Encodable, LocalConvertibleSortingQuery  
+ public struct ThreadListQuery: Encodable, Sendable, LocalConvertibleSortingQuery  

- public class ChatReactionListController: DataController, DelegateCallable, DataStoreProvider  
+ public class ChatReactionListController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   override public func synchronize(_ completion: ((_ error: Error?) -> Void)? = nil)
+   override public func synchronize(_ completion: (@MainActor(_ error: Error?) -> Void)? = nil)

 extension VideoAttachmentPayload: AttachmentPreviewProvider  
-   public func previewView(components: Components)-> UIView
+   @MainActor public func previewView(components: Components)-> UIView

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

- public enum BanEnabling  
+ public enum BanEnabling: Sendable  

- public struct Pagination: Encodable, Equatable  
+ public struct Pagination: Encodable, Equatable, Sendable  

- public struct DraftListQuery: Encodable  
+ public struct DraftListQuery: Encodable, Sendable  

- public protocol QuotedChatMessageViewSwiftUIView: View
+ @MainActor public protocol QuotedChatMessageViewSwiftUIView: View

- public final class MissingLocalStorageURL: ClientError  
+ public final class MissingLocalStorageURL: ClientError, @unchecked Sendable  

 open class PollAllOptionsListVC: _ViewController, ThemeProvider, PollControllerDelegate, UITableViewDataSource, UITableViewDelegate  
-   public struct Section: RawRepresentable, Equatable  
+   public struct Section: RawRepresentable, Equatable, Sendable  
-     public static var name
+     public static let name
-     public static var options
+     public static let options

- public struct ChannelListSearchStrategy  
+ public struct ChannelListSearchStrategy: Sendable  
-   public func makeSearchController(with channelListVC: ChatChannelListVC)-> UISearchController?
+   @MainActor public func makeSearchController(with channelListVC: ChatChannelListVC)-> UISearchController?

- public class EventsController: Controller, DelegateCallable  
+ public class EventsController: Controller, DelegateCallable, @unchecked Sendable  
-   public var callbackQueue: DispatchQueue
+   public var delegate: EventsControllerDelegate?
-   public var delegate: EventsControllerDelegate?

- public class ChatUserSearchController: DataController, DelegateCallable, DataStoreProvider  
+ public class ChatUserSearchController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   public func search(term: String?,completion: ((_ error: Error?) -> Void)? = nil)
+   public func search(term: String?,completion: (@MainActor(_ error: Error?) -> Void)? = nil)
-   public func search(query: UserListQuery,completion: ((_ error: Error?) -> Void)? = nil)
+   public func search(query: UserListQuery,completion: (@MainActor(_ error: Error?) -> Void)? = nil)
-   public func loadNextUsers(limit: Int = 25,completion: ((Error?) -> Void)? = nil)
+   public func loadNextUsers(limit: Int = 25,completion: (@MainActor(Error?) -> Void)? = nil)

- public class ChatChannelMemberListController: DataController, DelegateCallable, DataStoreProvider  
+ public class ChatChannelMemberListController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   override public func synchronize(_ completion: ((_ error: Error?) -> Void)? = nil)
+   override public func synchronize(_ completion: (@MainActor(_ error: Error?) -> Void)? = nil)

- public struct MessageDeliveryStatus: RawRepresentable, Hashable  
+ public struct MessageDeliveryStatus: RawRepresentable, Hashable, Sendable  

- public struct TranslationLanguage: Hashable  
+ public struct TranslationLanguage: Hashable, Sendable  

- public struct PollsConfig  
+ public struct PollsConfig: Sendable  

- public struct QueryOptions: OptionSet, Encodable  
+ public struct QueryOptions: OptionSet, Encodable, Sendable  

- public enum LocalAttachmentDownloadState: Hashable  
+ public enum LocalAttachmentDownloadState: Hashable, Sendable  

- public struct ImageResize  
+ public struct ImageResize: Sendable  

- public class ChatUser  
+ public class ChatUser: @unchecked Sendable  

- public protocol AssetPropertyLoading
+ public protocol AssetPropertyLoading: Sendable

- public class MessageReminderListController: DataController, DelegateCallable, DataStoreProvider  
+ public class MessageReminderListController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   override public func synchronize(_ completion: ((_ error: Error?) -> Void)? = nil)
+   override public func synchronize(_ completion: (@MainActor(_ error: Error?) -> Void)? = nil)
-   public func loadMoreReminders(limit: Int? = nil,completion: ((Result<[MessageReminder], Error>) -> Void)? = nil)
+   public func loadMoreReminders(limit: Int? = nil,completion: (@MainActor(Result<[MessageReminder], Error>) -> Void)? = nil)

 open class NukeImageLoader: ImageLoading  
-   @discardableResult open func loadImage(into imageView: UIImageView,from url: URL?,with options: ImageLoaderOptions,completion: ((Result<UIImage, Error>) -> Void)?)-> Cancellable?
+   @discardableResult @MainActor open func loadImage(into imageView: UIImageView,from url: URL?,with options: ImageLoaderOptions,completion: (@MainActor(Result<UIImage, Error>) -> Void)?)-> Cancellable?
-   @discardableResult open func downloadImage(with request: ImageDownloadRequest,completion: @escaping ((Result<UIImage, Error>) -> Void))-> Cancellable?
+   @discardableResult open func downloadImage(with request: ImageDownloadRequest,completion: @escaping @MainActor(Result<UIImage, Error>) -> Void)-> Cancellable?
-   open func downloadMultipleImages(with requests: [ImageDownloadRequest],completion: @escaping (([Result<UIImage, Error>]) -> Void))
+   open func downloadMultipleImages(with requests: [ImageDownloadRequest],completion: @escaping @MainActor([Result<UIImage, Error>]) -> Void)

- public struct MessageSearchQuery: Encodable  
+ public struct MessageSearchQuery: Encodable, Sendable  

- public protocol SendMessageInterceptorFactory
+ public protocol SendMessageInterceptorFactory: Sendable

- public struct AudioPlaybackState: Equatable, CustomStringConvertible  
+ public struct AudioPlaybackState: Equatable, CustomStringConvertible, Sendable  

 @available(iOSApplicationExtension, unavailable) open class ChatChannelVC: _ViewController, ThemeProvider, ChatMessageListVCDataSource, ChatMessageListVCDelegate, ChatChannelControllerDelegate, EventsControllerDelegate, AudioQueuePlayerDatasource  
-   open func loadPreviousMessages(completion: @escaping (Error?) -> Void)
+   open func loadPreviousMessages(completion: @escaping @MainActor(Error?) -> Void)
-   open func loadNextMessages(completion: @escaping (Error?) -> Void)
+   open func loadNextMessages(completion: @escaping @MainActor(Error?) -> Void)
-   public func chatMessageListVC(_ vc: ChatMessageListVC,shouldLoadPageAroundMessageId messageId: MessageId,_ completion: @escaping ((Error?) -> Void))
+   public func chatMessageListVC(_ vc: ChatMessageListVC,shouldLoadPageAroundMessageId messageId: MessageId,_ completion: @escaping @MainActor(Error?) -> Void)

- public class MessageReminderDeletedEvent: Event  
+ public final class MessageReminderDeletedEvent: Event  

- public protocol LogDestination
+ public protocol LogDestination: Sendable

- public struct AttachmentType: RawRepresentable, Codable, Hashable, ExpressibleByStringLiteral  
+ public struct AttachmentType: RawRepresentable, Codable, Hashable, ExpressibleByStringLiteral, Sendable  

- public class CurrentChatUser: ChatUser  
+ public class CurrentChatUser: ChatUser, @unchecked Sendable  

- public struct UserListQuery: Encodable  
+ public struct UserListQuery: Encodable, Sendable  

- public enum LogLevel: Int  
+ public enum LogLevel: Int, Sendable  

- open class SwipeToReplyGestureHandler  
+ @MainActor open class SwipeToReplyGestureHandler  
-   public init(listView: ChatMessageListView,impactFeedbackGenerator: UIImpactFeedbackGenerator = .init(style: .medium))
+   public init(listView: ChatMessageListView,impactFeedbackGenerator: UIImpactFeedbackGenerator? = nil)

- public class DataController: Controller  
+ public class DataController: Controller, @unchecked Sendable  
-   public var callbackQueue: DispatchQueue
+   
-   
+ 
- 
+   public func synchronize(_ completion: (@MainActor(_ error: Error?) -> Void)? = nil)
-   public func synchronize(_ completion: ((_ error: Error?) -> Void)? = nil)
+   
-   
+ 
- 
+   public enum State: Equatable, Sendable  
-   public enum State: Equatable  
+   
-   
+     case initialized
-     case initialized
+     case localDataFetched
-     case localDataFetched
+     case localDataFetchFailed(ClientError)
-     case localDataFetchFailed(ClientError)
+     case remoteDataFetched
-     case remoteDataFetched
+     case remoteDataFetchFailed(ClientError)
-     case remoteDataFetchFailed(ClientError)

- public class MessageSearch  
+ public class MessageSearch: @unchecked Sendable  
-   @MainActor public lazy var state: MessageSearchState
+   @MainActor public var state: MessageSearchState

- public class CooldownTracker  
+ public class CooldownTracker: @unchecked Sendable  

- public protocol KeyboardHandler
+ @MainActor public protocol KeyboardHandler

- public class ChatUserController: DataController, DelegateCallable, DataStoreProvider  
+ public class ChatUserController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   override public func synchronize(_ completion: ((_ error: Error?) -> Void)? = nil)
+   override public func synchronize(_ completion: (@MainActor(_ error: Error?) -> Void)? = nil)

- public protocol CDNClient
+ public protocol CDNClient: Sendable

 @available(iOSApplicationExtension, unavailable) open class ChatThreadVC: _ViewController, ThemeProvider, ChatMessageListVCDataSource, ChatMessageListVCDelegate, ChatMessageControllerDelegate, EventsControllerDelegate, AudioQueuePlayerDatasource  
-   open func loadPreviousReplies(completion: @escaping (Error?) -> Void)
+   open func loadPreviousReplies(completion: @escaping @MainActor(Error?) -> Void)
-   open func loadNextReplies(completion: @escaping (Error?) -> Void)
+   open func loadNextReplies(completion: @escaping @MainActor(Error?) -> Void)
-   public func chatMessageListVC(_ vc: ChatMessageListVC,shouldLoadPageAroundMessageId messageId: MessageId,_ completion: @escaping ((Error?) -> Void))
+   public func chatMessageListVC(_ vc: ChatMessageListVC,shouldLoadPageAroundMessageId messageId: MessageId,_ completion: @escaping @MainActor(Error?) -> Void)

- public protocol InputTextViewClipboardAttachmentDelegate: AnyObject
+ @MainActor public protocol InputTextViewClipboardAttachmentDelegate: AnyObject

- open class StreamAudioQueuePlayer: StreamAudioPlayer  
+ open class StreamAudioQueuePlayer: StreamAudioPlayer, @unchecked Sendable  

 extension FileAttachmentPayload: AttachmentPreviewProvider  
-   public func previewView(components: Components)-> UIView
+   @MainActor public func previewView(components: Components)-> UIView

- public protocol ChatMessageListVCDelegate: AnyObject
+ @MainActor public protocol ChatMessageListVCDelegate: AnyObject

- public final class ClientHasBeenDeallocated: ClientError  
+ public final class ClientHasBeenDeallocated: ClientError, @unchecked Sendable  

- public protocol SwiftUIRepresentable: AnyObject
+ @MainActor public protocol SwiftUIRepresentable: AnyObject

- public struct AnyAttachmentPayload  
+ public struct AnyAttachmentPayload: Sendable  
-   public let payload: Encodable
+   public let payload: (Encodable & Sendable)

 extension ImageAttachmentPayload: AttachmentPreviewProvider  
-   public func previewView(components: Components)-> UIView
+   @MainActor public func previewView(components: Components)-> UIView

- open class BaseLogDestination: LogDestination  
+ open class BaseLogDestination: LogDestination, @unchecked Sendable  

- public struct MemberRole: RawRepresentable, Codable, Hashable, ExpressibleByStringLiteral  
+ public struct MemberRole: RawRepresentable, Codable, Hashable, ExpressibleByStringLiteral, Sendable  

- public protocol ComponentsProvider: AnyObject
+ @MainActor public protocol ComponentsProvider: AnyObject

- public class ChannelList  
+ public class ChannelList: @unchecked Sendable  
-   @MainActor public lazy var state: ChannelListState
+   @MainActor public var state: ChannelListState

 @available(iOSApplicationExtension, unavailable) open class ChatChannelSearchVC: ChatChannelListSearchVC  
-   public var didSelectChannel: ((ChatChannel) -> Void)?
+   public var didSelectChannel: (@MainActor(ChatChannel) -> Void)?

- public struct Sorting: Encodable, CustomStringConvertible  
+ public struct Sorting: Encodable, CustomStringConvertible, Sendable  

 public enum StreamRuntimeCheck  
-   public static var assertionsEnabled
+   public nonisolated static var assertionsEnabled
-   public static var _isDatabasePrefetchingEnabled
+   public nonisolated static var _isDatabasePrefetchingEnabled

- public enum LocalReactionState: String  
+ public enum LocalReactionState: String, Sendable  

- @propertyWrapper public class Atomic  
+ @propertyWrapper public class Atomic: @unchecked Sendable  

- public protocol AudioPlayingDelegate: AnyObject
+ @MainActor public protocol AudioPlayingDelegate: AnyObject

- public protocol ChatMessageContentViewDelegate: AnyObject
+ @MainActor public protocol ChatMessageContentViewDelegate: AnyObject

- public struct ChannelListQuery: Encodable, LocalConvertibleSortingQuery  
+ public struct ChannelListQuery: Encodable, Sendable, LocalConvertibleSortingQuery  

- public protocol PollAttachmentViewInjectorDelegate: ChatMessageContentViewDelegate
+ @MainActor public protocol PollAttachmentViewInjectorDelegate: ChatMessageContentViewDelegate

- public struct AttachmentFile: Codable, Hashable  
+ public struct AttachmentFile: Codable, Hashable, Sendable  
-   public static let sizeFormatter
+   public nonisolated static let sizeFormatter

- public struct PollVote: Hashable, Equatable  
+ public struct PollVote: Hashable, Equatable, Sendable  

- public struct ChatThread  
+ public struct ChatThread: Sendable  

- public class MessageReminderCreatedEvent: Event  
+ public final class MessageReminderCreatedEvent: Event  

- public protocol StreamModelsTransformer
+ public protocol StreamModelsTransformer: Sendable

- public final class AudioRecorderError: ClientError  
+ public final class AudioRecorderError: ClientError, @unchecked Sendable  

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

- public struct AnyAttachmentUpdater  
+ public struct AnyAttachmentUpdater: Sendable  

- public class Chat  
+ public class Chat: @unchecked Sendable  
-   @MainActor public lazy var state: ChatState
+   @MainActor public var state: ChatState
-   public func subscribe(toEvent event: E.Type,handler: @escaping (E) -> Void)-> AnyCancellable
+   public func subscribe(toEvent event: E.Type,handler: @escaping @Sendable(E) -> Void)-> AnyCancellable
-   public func subscribe(_ handler: @escaping (Event) -> Void)-> AnyCancellable
+   public func subscribe(_ handler: @escaping @Sendable(Event) -> Void)-> AnyCancellable
-   public func uploadAttachment(with localFileURL: URL,type: AttachmentType,progress: ((Double) -> Void)? = nil)async throws -> UploadedAttachment
+   public func uploadAttachment(with localFileURL: URL,type: AttachmentType,progress: (@Sendable(Double) -> Void)? = nil)async throws -> UploadedAttachment

- public class ConsoleLogDestination: BaseLogDestination  
+ public class ConsoleLogDestination: BaseLogDestination, @unchecked Sendable  

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

- public struct ReadReceiptsPrivacySettings  
+ public struct ReadReceiptsPrivacySettings: Sendable  

- public enum LocalMessageState: String  
+ public enum LocalMessageState: String, Sendable  

- public struct VotingVisibility: RawRepresentable, Equatable  
+ public struct VotingVisibility: RawRepresentable, Equatable, Sendable  

- public class ClientError: Error, CustomStringConvertible  
+ public class ClientError: Error, CustomStringConvertible, @unchecked Sendable  

- public final class AudioAnalysisEngineError: ClientError  
+ public final class AudioAnalysisEngineError: ClientError, @unchecked Sendable  

 open class VoiceRecordingVC: _ViewController, ComponentsProvider, AppearanceProvider, AudioRecordingDelegate, AudioPlayingDelegate, UIGestureRecognizerDelegate  
-   public struct State: RawRepresentable, Equatable  
+   public struct State: RawRepresentable, Equatable, Sendable  
-     public static var idle
+     public static let idle
-     public static var showingTip
+     public static let showingTip
-     public static var recording
+     public static let recording
-     public static var locked
+     public static let locked
-     public static var preview
+     public static let preview
-   public struct Action: RawRepresentable, Equatable  
+   public struct Action: RawRepresentable, Equatable, Sendable  
-     public static var tapRecord
+     public static let tapRecord
-     public static var showTip
+     public static let showTip
-     public static var beginRecording
+     public static let beginRecording
-     public static var touchUp
+     public static let touchUp
-     public static var cancel
+     public static let cancel
-     public static var lock
+     public static let lock
-     public static var stop
+     public static let stop
-     public static var discard
+     public static let discard
-     public static var send
+     public static let send
-     public static var confirm
+     public static let confirm
-     public static var publishMessage
+     public static let publishMessage
-     public static var play
+     public static let play
-     public static var pause
+     public static let pause
-   public struct Content: Equatable  
+   public struct Content: Equatable, Sendable  

- public enum MessageType: String, Codable  
+ public enum MessageType: String, Codable, Sendable  

- public protocol AttachmentUploader
+ public protocol AttachmentUploader: Sendable

- public final class IgnoredEventType: ClientError  
+ public final class IgnoredEventType: ClientError, @unchecked Sendable  

- public final class EventDecoding: ClientError
+ public final class EventDecoding: ClientError, @unchecked Sendable

- public class ChatMessageController: DataController, DelegateCallable, DataStoreProvider  
+ public class ChatMessageController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   override public func synchronize(_ completion: ((Error?) -> Void)? = nil)
+   override public func synchronize(_ completion: (@MainActor(Error?) -> Void)? = nil)
-   public func editMessage(text: String,skipEnrichUrl: Bool = false,skipPush: Bool = false,attachments: [AnyAttachmentPayload] = [],restrictedVisibility: [UserId] = [],extraData: [String: RawJSON]? = nil,completion: ((Error?) -> Void)? = nil)
+   public func editMessage(text: String,skipEnrichUrl: Bool = false,skipPush: Bool = false,attachments: [AnyAttachmentPayload] = [],restrictedVisibility: [UserId] = [],extraData: [String: RawJSON]? = nil,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func partialUpdateMessage(text: String? = nil,attachments: [AnyAttachmentPayload]? = nil,extraData: [String: RawJSON]? = nil,unsetProperties: [String]? = nil,completion: ((Result<ChatMessage, Error>) -> Void)? = nil)
+   public func partialUpdateMessage(text: String? = nil,attachments: [AnyAttachmentPayload]? = nil,extraData: [String: RawJSON]? = nil,unsetProperties: [String]? = nil,completion: (@MainActor(Result<ChatMessage, Error>) -> Void)? = nil)
-   public func deleteMessage(hard: Bool = false,completion: ((Error?) -> Void)? = nil)
+   public func deleteMessage(hard: Bool = false,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func createNewReply(messageId: MessageId? = nil,text: String,pinning: MessagePinning? = nil,attachments: [AnyAttachmentPayload] = [],mentionedUserIds: [UserId] = [],showReplyInChannel: Bool = false,isSilent: Bool = false,quotedMessageId: MessageId? = nil,skipPush: Bool = false,skipEnrichUrl: Bool = false,extraData: [String: RawJSON] = [:],completion: ((Result<MessageId, Error>) -> Void)? = nil)
+   public func createNewReply(messageId: MessageId? = nil,text: String,pinning: MessagePinning? = nil,attachments: [AnyAttachmentPayload] = [],mentionedUserIds: [UserId] = [],showReplyInChannel: Bool = false,isSilent: Bool = false,quotedMessageId: MessageId? = nil,skipPush: Bool = false,skipEnrichUrl: Bool = false,extraData: [String: RawJSON] = [:],completion: (@MainActor(Result<MessageId, Error>) -> Void)? = nil)
-   public func loadPreviousReplies(before replyId: MessageId? = nil,limit: Int? = nil,completion: ((Error?) -> Void)? = nil)
+   public func loadPreviousReplies(before replyId: MessageId? = nil,limit: Int? = nil,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func loadPageAroundReplyId(_ replyId: MessageId,limit: Int? = nil,completion: ((Error?) -> Void)? = nil)
+   public func loadPageAroundReplyId(_ replyId: MessageId,limit: Int? = nil,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func loadNextReplies(after replyId: MessageId? = nil,limit: Int? = nil,completion: ((Error?) -> Void)? = nil)
+   public func loadNextReplies(after replyId: MessageId? = nil,limit: Int? = nil,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func loadFirstPage(limit: Int? = nil,_ completion: ((_ error: Error?) -> Void)? = nil)
+   public func loadFirstPage(limit: Int? = nil,_ completion: (@MainActor(_ error: Error?) -> Void)? = nil)
-   public func loadNextReactions(limit: Int = 25,completion: ((Error?) -> Void)? = nil)
+   public func loadNextReactions(limit: Int = 25,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func loadReactions(limit: Int,offset: Int = 0,completion: @escaping (Result<[ChatMessageReaction], Error>) -> Void)
+   public func loadReactions(limit: Int,offset: Int = 0,completion: @escaping @MainActor(Result<[ChatMessageReaction], Error>) -> Void)
-   public func flag(reason: String? = nil,extraData: [String: RawJSON]? = nil,completion: ((Error?) -> Void)? = nil)
+   public func flag(reason: String? = nil,extraData: [String: RawJSON]? = nil,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func unflag(completion: ((Error?) -> Void)? = nil)
+   public func unflag(completion: (@MainActor(Error?) -> Void)? = nil)
-   public func addReaction(_ type: MessageReactionType,score: Int = 1,enforceUnique: Bool = false,skipPush: Bool = false,pushEmojiCode: String? = nil,extraData: [String: RawJSON] = [:],completion: ((Error?) -> Void)? = nil)
+   public func addReaction(_ type: MessageReactionType,score: Int = 1,enforceUnique: Bool = false,skipPush: Bool = false,pushEmojiCode: String? = nil,extraData: [String: RawJSON] = [:],completion: (@MainActor(Error?) -> Void)? = nil)
-   public func deleteReaction(_ type: MessageReactionType,completion: ((Error?) -> Void)? = nil)
+   public func deleteReaction(_ type: MessageReactionType,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func pin(_ pinning: MessagePinning,completion: ((Error?) -> Void)? = nil)
+   public func pin(_ pinning: MessagePinning,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func unpin(completion: ((Error?) -> Void)? = nil)
+   public func unpin(completion: (@MainActor(Error?) -> Void)? = nil)
-   public func downloadAttachment(_ attachment: ChatMessageAttachment<Payload>,completion: @escaping (Result<ChatMessageAttachment<Payload>, Error>) -> Void)
+   public func downloadAttachment(_ attachment: ChatMessageAttachment<Payload>,completion: @escaping @MainActor(Result<ChatMessageAttachment<Payload>, Error>) -> Void)
-   public func deleteLocalAttachmentDownload(for attachmentId: AttachmentId,completion: ((Error?) -> Void)? = nil)
+   public func deleteLocalAttachmentDownload(for attachmentId: AttachmentId,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func restartFailedAttachmentUploading(with id: AttachmentId,completion: ((Error?) -> Void)? = nil)
+   public func restartFailedAttachmentUploading(with id: AttachmentId,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func resendMessage(completion: ((Error?) -> Void)? = nil)
+   public func resendMessage(completion: (@MainActor(Error?) -> Void)? = nil)
-   public func dispatchEphemeralMessageAction(_ action: AttachmentAction,completion: ((Error?) -> Void)? = nil)
+   public func dispatchEphemeralMessageAction(_ action: AttachmentAction,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func translate(to language: TranslationLanguage,completion: ((Error?) -> Void)? = nil)
+   public func translate(to language: TranslationLanguage,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func markThreadRead(completion: ((Error?) -> Void)? = nil)
+   public func markThreadRead(completion: (@MainActor(Error?) -> Void)? = nil)
-   public func markThreadUnread(completion: ((Error?) -> Void)? = nil)
+   public func markThreadUnread(completion: (@MainActor(Error?) -> Void)? = nil)
-   public func loadThread(replyLimit: Int? = nil,participantLimit: Int? = nil,completion: @escaping ((Result<ChatThread, Error>) -> Void))
+   public func loadThread(replyLimit: Int? = nil,participantLimit: Int? = nil,completion: @escaping @MainActor(Result<ChatThread, Error>) -> Void)
-   public func updateThread(title: String?,extraData: [String: RawJSON]? = nil,unsetProperties: [String]? = nil,completion: @escaping ((Result<ChatThread, Error>) -> Void))
+   public func updateThread(title: String?,extraData: [String: RawJSON]? = nil,unsetProperties: [String]? = nil,completion: @escaping @MainActor(Result<ChatThread, Error>) -> Void)
-   public func stopLiveLocationSharing(completion: ((Result<SharedLocation, Error>) -> Void)? = nil)
+   public func stopLiveLocationSharing(completion: (@MainActor(Result<SharedLocation, Error>) -> Void)? = nil)
-   public func updateDraftReply(text: String,isSilent: Bool = false,attachments: [AnyAttachmentPayload] = [],mentionedUserIds: [UserId] = [],quotedMessageId: MessageId? = nil,showReplyInChannel: Bool = false,command: Command? = nil,extraData: [String: RawJSON] = [:],completion: ((Result<DraftMessage, Error>) -> Void)? = nil)
+   public func updateDraftReply(text: String,isSilent: Bool = false,attachments: [AnyAttachmentPayload] = [],mentionedUserIds: [UserId] = [],quotedMessageId: MessageId? = nil,showReplyInChannel: Bool = false,command: Command? = nil,extraData: [String: RawJSON] = [:],completion: (@MainActor(Result<DraftMessage, Error>) -> Void)? = nil)
-   public func loadDraftReply(completion: ((Result<DraftMessage?, Error>) -> Void)? = nil)
+   public func loadDraftReply(completion: (@MainActor(Result<DraftMessage?, Error>) -> Void)? = nil)
-   public func deleteDraftReply(completion: ((Error?) -> Void)? = nil)
+   public func deleteDraftReply(completion: (@MainActor(Error?) -> Void)? = nil)
-   public func createReminder(remindAt: Date? = nil,completion: ((Result<MessageReminder, Error>) -> Void)? = nil)
+   public func createReminder(remindAt: Date? = nil,completion: (@MainActor(Result<MessageReminder, Error>) -> Void)? = nil)
-   public func updateReminder(remindAt: Date?,completion: ((Result<MessageReminder, Error>) -> Void)? = nil)
+   public func updateReminder(remindAt: Date?,completion: (@MainActor(Result<MessageReminder, Error>) -> Void)? = nil)
-   public func deleteReminder(completion: ((Error?) -> Void)? = nil)
+   public func deleteReminder(completion: (@MainActor(Error?) -> Void)? = nil)

- public protocol AppearanceProvider: AnyObject
+ @MainActor public protocol AppearanceProvider: AnyObject

- public class ChatChannelMemberController: DataController, DelegateCallable, DataStoreProvider  
+ public class ChatChannelMemberController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   override public func synchronize(_ completion: ((_ error: Error?) -> Void)? = nil)
+   override public func synchronize(_ completion: (@MainActor(_ error: Error?) -> Void)? = nil)

- public protocol ImageCDN
+ public protocol ImageCDN: Sendable

- public class UserSearch  
+ public class UserSearch: @unchecked Sendable  
-   @MainActor public lazy var state: UserSearchState
+   @MainActor public var state: UserSearchState

 public struct DefaultAttachmentPreviewProvider: AttachmentPreviewProvider  
-   public func previewView(components: Components)-> UIView
+   @MainActor public func previewView(components: Components)-> UIView

- public enum MessageOrdering  
+ public enum MessageOrdering: Sendable  

- public struct UploadedAttachment  
+ public struct UploadedAttachment: Sendable  

- public struct Appearance  
+ public struct Appearance: @unchecked Sendable  
-   public var localizationProvider: (_ key: String, _ table: String) -> String
+   public var localizationProvider: @Sendable(_ key: String, _ table: String) -> String

- public protocol GiphyActionContentViewDelegate: ChatMessageContentViewDelegate
+ @MainActor public protocol GiphyActionContentViewDelegate: ChatMessageContentViewDelegate

- public final class InvalidToken: ClientError
+ public final class InvalidToken: ClientError, @unchecked Sendable

- public protocol Customizable
+ @MainActor public protocol Customizable

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

- public class CurrentChatUserController: DataController, DelegateCallable, DataStoreProvider  
+ public class CurrentChatUserController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   override public func synchronize(_ completion: ((_ error: Error?) -> Void)? = nil)
+   override public func synchronize(_ completion: (@MainActor(_ error: Error?) -> Void)? = nil)

- public struct AudioRecordingContext: Hashable  
+ public struct AudioRecordingContext: Hashable, Sendable  

- public struct AudioAnalysisEngine  
+ public struct AudioAnalysisEngine: Sendable  
-   public func waveformVisualisation(fromAudioURL audioURL: URL,for targetSamples: Int,completionHandler: @escaping (Result<[Float], Error>) -> Void)
+   public func waveformVisualisation(fromAudioURL audioURL: URL,for targetSamples: Int,completionHandler: @escaping @Sendable(Result<[Float], Error>) -> Void)

- public class ChatChannelWatcherListController: DataController, DelegateCallable, DataStoreProvider  
+ public class ChatChannelWatcherListController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   override public func synchronize(_ completion: ((_ error: Error?) -> Void)? = nil)
+   override public func synchronize(_ completion: (@MainActor(_ error: Error?) -> Void)? = nil)

- public class DraftDeletedEvent: Event  
+ public final class DraftDeletedEvent: Event  

- public struct LocationInfo  
+ public struct LocationInfo: Sendable  

- public struct LogSubsystem: OptionSet  
+ public struct LogSubsystem: OptionSet, Sendable  

- public class Logger  
+ public class Logger: @unchecked Sendable  
-   public func callAsFunction(_ level: LogLevel,functionName: StaticString = #function,fileName: StaticString = #filePath,lineNumber: UInt = #line,message: @autoclosure () -> Any,subsystems: LogSubsystem = .other)
+   public func callAsFunction(_ level: LogLevel,functionName: StaticString = #function,fileName: StaticString = #file,lineNumber: UInt = #line,message: @autoclosure () -> Any,subsystems: LogSubsystem = .other)

- public struct FilterKey: ExpressibleByStringLiteral, RawRepresentable  
+ public struct FilterKey: ExpressibleByStringLiteral, RawRepresentable, Sendable  

- public struct ChatMessage  
+ public struct ChatMessage: Sendable  

- public struct ChatMessageReaction: Hashable  
+ public struct ChatMessageReaction: Hashable, Sendable  

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

- public final class WebSocket: ClientError
+ public final class WebSocket: ClientError, @unchecked Sendable

- public struct UserRole: RawRepresentable, Codable, Hashable, ExpressibleByStringLiteral  
+ public struct UserRole: RawRepresentable, Codable, Hashable, ExpressibleByStringLiteral, Sendable  

- public struct Spacing: Equatable, ExpressibleByFloatLiteral, ExpressibleByIntegerLiteral  
+ public struct Spacing: Equatable, ExpressibleByFloatLiteral, ExpressibleByIntegerLiteral, Sendable  

- public struct AudioPlaybackRate: Comparable, Equatable  
+ public struct AudioPlaybackRate: Comparable, Equatable, Sendable  

- public struct ReactionListQuery: Encodable  
+ public struct ReactionListQuery: Encodable, Sendable  

- public class ChatChannelListController: DataController, DelegateCallable, DataStoreProvider  
+ public class ChatChannelListController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   override public func synchronize(_ completion: ((_ error: Error?) -> Void)? = nil)
+   override public func synchronize(_ completion: (@MainActor(_ error: Error?) -> Void)? = nil)
-   public func loadNextChannels(limit: Int? = nil,completion: ((Error?) -> Void)? = nil)
+   public func loadNextChannels(limit: Int? = nil,completion: (@MainActor(Error?) -> Void)? = nil)
-   @available(*, deprecated, message: "Please use `markAllRead` available in `CurrentChatUserController`") public func markAllRead(completion: ((Error?) -> Void)? = nil)
+   @available(*, deprecated, message: "Please use `markAllRead` available in `CurrentChatUserController`") public func markAllRead(completion: (@MainActor(Error?) -> Void)? = nil)

- public protocol SortingKey: Encodable
+ public protocol SortingKey: Encodable, Sendable

- public class StreamAttachmentUploader: AttachmentUploader  
+ public class StreamAttachmentUploader: AttachmentUploader, @unchecked Sendable  
-   public func upload(_ attachment: AnyChatMessageAttachment,progress: ((Double) -> Void)?,completion: @escaping (Result<UploadedAttachment, Error>) -> Void)
+   public func upload(_ attachment: AnyChatMessageAttachment,progress: (@Sendable(Double) -> Void)?,completion: @escaping @Sendable(Result<UploadedAttachment, Error>) -> Void)

- public protocol CurrentChatUserControllerDelegate: AnyObject
+ @MainActor public protocol CurrentChatUserControllerDelegate: AnyObject

- public struct PollCreationSection: RawRepresentable, Equatable  
+ public struct PollCreationSection: RawRepresentable, Equatable, Sendable  
-   public static var name
+   public static let name
-   public static var options
+   public static let options
-   public static var features
+   public static let features

- public protocol VoiceRecordingDelegate: AnyObject
+ @MainActor public protocol VoiceRecordingDelegate: AnyObject

- public final class Unknown: ClientError
+ public final class Unknown: ClientError, @unchecked Sendable

 open class ComposerVC: _ViewController, ThemeProvider, UITextViewDelegate, UIImagePickerControllerDelegate, UIDocumentPickerDelegate, UINavigationControllerDelegate, InputTextViewClipboardAttachmentDelegate, VoiceRecordingDelegate  
-   open func addAttachmentToContent(from url: URL,type: AttachmentType,info: [LocalAttachmentInfoKey: Any],extraData: Encodable?)throws 
+   open func addAttachmentToContent(from url: URL,type: AttachmentType,info: [LocalAttachmentInfoKey: Any],extraData: (Encodable & Sendable)?)throws 

- public final class PollVoteAlreadyExists: ClientError  
+ public final class PollVoteAlreadyExists: ClientError, @unchecked Sendable  

- public struct AttachmentId: Hashable  
+ public struct AttachmentId: Hashable, Sendable  

- public final class Unexpected: ClientError
+ public final class Unexpected: ClientError, @unchecked Sendable

- public struct ChannelCapability: RawRepresentable, ExpressibleByStringLiteral, Hashable  
+ public struct ChannelCapability: RawRepresentable, ExpressibleByStringLiteral, Hashable, Sendable  

- public struct UnreadChannel  
+ public struct UnreadChannel: Sendable  

- public class DraftUpdatedEvent: Event  
+ public final class DraftUpdatedEvent: Event  

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

- public protocol ImageProcessor
+ public protocol ImageProcessor: Sendable

- public protocol ChatMessageListVCDataSource: AnyObject
+ @MainActor public protocol ChatMessageListVCDataSource: AnyObject

- public class ChatClient  
+ public class ChatClient: @unchecked Sendable  
-   public func connectUser(userInfo: UserInfo,tokenProvider: @escaping TokenProvider,completion: ((Error?) -> Void)? = nil)
+   public func connectUser(userInfo: UserInfo,tokenProvider: @escaping TokenProvider,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func connectUser(userInfo: UserInfo,token: Token,completion: ((Error?) -> Void)? = nil)
+   public func connectUser(userInfo: UserInfo,token: Token,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func connectGuestUser(userInfo: UserInfo,completion: ((Error?) -> Void)? = nil)
+   public func connectGuestUser(userInfo: UserInfo,completion: (@MainActor(Error?) -> Void)? = nil)
-   public func connectAnonymousUser(completion: ((Error?) -> Void)? = nil)
+   public func connectAnonymousUser(completion: (@MainActor(Error?) -> Void)? = nil)
-   public func disconnect(completion: @escaping () -> Void)
+   public func disconnect(completion: @escaping @MainActor() -> Void)
-   public func logout(removeDevice: Bool = true,completion: @escaping () -> Void)
+   public func logout(removeDevice: Bool = true,completion: @escaping @MainActor() -> Void)
-   public func loadAppSettings(completion: ((Result<AppSettings, Error>) -> Void)? = nil)
+   public func loadAppSettings(completion: (@Sendable(Result<AppSettings, Error>) -> Void)? = nil)

- public struct PollOption: Hashable, Equatable  
+ public struct PollOption: Hashable, Equatable, Sendable  

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

- public protocol AudioSessionFeedbackGenerator
+ @MainActor public protocol AudioSessionFeedbackGenerator

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

 public class ChatRemoteNotificationHandler  
-   public func handleNotification(completion: @escaping (ChatPushNotificationContent) -> Void)-> Bool
+   public func handleNotification(completion: @escaping @Sendable(ChatPushNotificationContent) -> Void)-> Bool

- public struct ChannelWatcherListQuery: Encodable  
+ public struct ChannelWatcherListQuery: Encodable, Sendable  

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

- public struct Filter  
+ public struct Filter: Sendable  

- public struct Token: Decodable, Equatable, ExpressibleByStringLiteral  
+ public struct Token: Decodable, Equatable, ExpressibleByStringLiteral, Sendable  

- public struct AttachmentDownloadingState: Hashable  
+ public struct AttachmentDownloadingState: Hashable, Sendable  

- public struct CurrentUserUnreads  
+ public struct CurrentUserUnreads: Sendable  

- public struct UserPrivacySettings  
+ public struct UserPrivacySettings: Sendable  

- public struct Components  
+ public struct Components: @unchecked Sendable  
-   public static var `default`
+   public nonisolated static var `default`

- public protocol DataControllerStateDelegate: AnyObject
+ @MainActor public protocol DataControllerStateDelegate: AnyObject

- open class StreamAudioSessionConfigurator: AudioSessionConfiguring  
+ open class StreamAudioSessionConfigurator: AudioSessionConfiguring, @unchecked Sendable  
-   open func requestRecordPermission(_ completionHandler: @escaping (Bool) -> Void)
+   open func requestRecordPermission(_ completionHandler: @escaping @Sendable(Bool) -> Void)

- public struct UserInfo  
+ public struct UserInfo: Sendable  

- public struct NewLocationInfo  
+ public struct NewLocationInfo: Sendable  

- public struct MessageModerationDetails  
+ public struct MessageModerationDetails: Sendable  

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

 public struct TypingSuggester  
-   public func typingSuggestion(in textView: UITextView)-> TypingSuggestion?
+   @MainActor public func typingSuggestion(in textView: UITextView)-> TypingSuggestion?

 public enum LogConfig  
-   public static var identifier
+   public nonisolated static var identifier
-   public static var level: LogLevel
+   public nonisolated static var level: LogLevel
-   public static var dateFormatter: DateFormatter
+   public nonisolated static var dateFormatter: DateFormatter
-   public static var formatters
+   public nonisolated static var formatters
-   public static var showDate
+   public nonisolated static var showDate
-   public static var showLevel
+   public nonisolated static var showLevel
-   public static var showIdentifier
+   public nonisolated static var showIdentifier
-   public static var showThreadName
+   public nonisolated static var showThreadName
-   public static var showFileName
+   public nonisolated static var showFileName
-   public static var showLineNumber
+   public nonisolated static var showLineNumber
-   public static var showFunctionName
+   public nonisolated static var showFunctionName
-   public static var subsystems: LogSubsystem
+   public nonisolated static var subsystems: LogSubsystem
-   public static var destinationTypes: [LogDestination.Type]
+   public nonisolated static var destinationTypes: [LogDestination.Type]

- public class ChatUserListController: DataController, DelegateCallable, DataStoreProvider  
+ public class ChatUserListController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   override public func synchronize(_ completion: ((_ error: Error?) -> Void)? = nil)
+   override public func synchronize(_ completion: (@MainActor(_ error: Error?) -> Void)? = nil)

- open class NukeImageProcessor: ImageProcessor  
+ open class NukeImageProcessor: ImageProcessor, @unchecked Sendable  

- public struct UnreadChannelByType  
+ public struct UnreadChannelByType: Sendable  

- open class StreamAudioRecorder: NSObject, AudioRecording, AVAudioRecorderDelegate, AppStateObserverDelegate  
+ open class StreamAudioRecorder: NSObject, AudioRecording, AVAudioRecorderDelegate, AppStateObserverDelegate, @unchecked Sendable  
-   open func beginRecording(_ completionHandler: @escaping (() -> Void))
+   open func beginRecording(_ completionHandler: @escaping @Sendable() -> Void)
-     public static let `default`
+     nonisolated public static let `default`

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

- public struct QuotedAvatarAlignment: RawRepresentable, Equatable  
+ public struct QuotedAvatarAlignment: RawRepresentable, Equatable, Sendable  

- public class ChannelConfig: Codable  
+ public final class ChannelConfig: Codable, Sendable  

- public struct MessageModerationAction: RawRepresentable, Equatable  
+ public struct MessageModerationAction: RawRepresentable, Equatable, Sendable  

 extension VoiceRecordingAttachmentPayload: AttachmentPreviewProvider  
-   public func previewView(components: Components)-> UIView
+   @MainActor public func previewView(components: Components)-> UIView

- public struct AppSettings  
+ public struct AppSettings: Sendable  
-   public struct UploadConfig  
+   public struct UploadConfig: Sendable  

- public struct ChannelQuery: Encodable  
+ public struct ChannelQuery: Encodable, Sendable  

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

- public class ChannelEventsController: EventsController  
+ public class ChannelEventsController: EventsController, @unchecked Sendable  
-   public func sendEvent(_ payload: T,completion: ((Error?) -> Void)? = nil)
+   public func sendEvent(_ payload: T,completion: (@Sendable(Error?) -> Void)? = nil)

- public struct AssetProperty: CustomStringConvertible  
+ public struct AssetProperty: CustomStringConvertible, Sendable  

 public struct StreamAssetPropertyLoader: AssetPropertyLoading  
-   public func loadProperties(_ properties: [AssetProperty],of asset: Asset,completion: @escaping (Result<Asset, AssetPropertyLoadingCompositeError>) -> Void)
+   public func loadProperties(_ properties: [AssetProperty],of asset: Asset,completion: @escaping @Sendable(Result<Asset, AssetPropertyLoadingCompositeError>) -> Void)

- public struct MessageReminder  
+ public struct MessageReminder: Sendable  

- public enum AttachmentFileType: String, Codable, Equatable, CaseIterable  
+ public enum AttachmentFileType: String, Codable, Equatable, CaseIterable, Sendable  

- public struct ChatMessageLayoutOption: RawRepresentable, Hashable, ExpressibleByStringLiteral  
+ public struct ChatMessageLayoutOption: RawRepresentable, Hashable, ExpressibleByStringLiteral, Sendable  

- public struct AttachmentUploadingState: Hashable  
+ public struct AttachmentUploadingState: Hashable, Sendable  

- public final class MemberList  
+ public final class MemberList: Sendable  
-   @MainActor public lazy var state: MemberListState
+   @MainActor public var state: MemberListState

- public struct PollFeatureType: Equatable  
+ public struct PollFeatureType: Equatable, Sendable  
-   public static var multipleVotes
+   public static let multipleVotes
-   public static var anonymous
+   public static let anonymous
-   public static var suggestions
+   public static let suggestions
-   public static var comments
+   public static let comments

- public protocol ChatMessageListScrollOverlayDataSource: AnyObject
+ @MainActor public protocol ChatMessageListScrollOverlayDataSource: AnyObject

 open class WaveformView: _View, ThemeProvider  
-   public struct Content: Equatable  
+   public struct Content: Equatable, Sendable  

- public class ChatConnectionController: Controller, DelegateCallable, DataStoreProvider  
+ public class ChatConnectionController: Controller, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   public var callbackQueue: DispatchQueue
+   public var connectionStatus: ConnectionStatus
-   public var connectionStatus: ConnectionStatus
+   public let client: ChatClient
-   public let client: ChatClient

- public struct PollVoteListQuery: Encodable  
+ public struct PollVoteListQuery: Encodable, Sendable  

- public final class ConnectedUser  
+ public final class ConnectedUser: Sendable  
-   @MainActor public lazy var state: ConnectedUserState
+   @MainActor public var state: ConnectedUserState

- public struct AttachmentAction: Codable, Hashable  
+ public struct AttachmentAction: Codable, Hashable, Sendable  
-   public enum ActionType: String, Codable  
+   public enum ActionType: String, Codable, Sendable  
-   public enum ActionStyle: String, Codable  
+   public enum ActionStyle: String, Codable, Sendable  

- public final class InvalidChannelId: ClientError
+ public final class InvalidChannelId: ClientError, @unchecked Sendable

- extension PollVoteListController: EventsControllerDelegate  
+ extension PollVoteListController  
-   public func eventsController(_ controller: EventsController,didReceiveEvent event: any Event)
+   public var observableObject: ObservableObject
+   
+ 
+   public class ObservableObject: SwiftUI.ObservableObject  
+   
+     public let controller: PollVoteListController
+     @Published public private var votes: LazyCachedMapCollection<PollVote>
+     @Published public private var state: DataController.State

 open class ChatChannelAvatarView: _View, ThemeProvider, SwiftUIRepresentable  
-   open func loadAvatarsFrom(urls: [URL?],channelId: ChannelId,completion: @escaping ([UIImage], ChannelId)
+   open func loadAvatarsFrom(urls: [URL?],channelId: ChannelId,completion: @escaping @Sendable([UIImage], ChannelId)

- open class AttachmentViewInjector  
+ @MainActor open class AttachmentViewInjector  

- public final class ConnectionWasNotInitiated: ClientError  
+ public final class ConnectionWasNotInitiated: ClientError, @unchecked Sendable  

- public protocol AudioPlaying: AnyObject
+ public protocol AudioPlaying: AnyObject, Sendable

- public class PollVoteListController: DataController, DelegateCallable, DataStoreProvider  
+ public class PollVoteListController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   override public func synchronize(_ completion: ((_ error: Error?) -> Void)? = nil)
+   override public func synchronize(_ completion: (@MainActor(_ error: Error?) -> Void)? = nil)
-   public func loadMoreVotes(limit: Int? = nil,completion: ((Error?) -> Void)? = nil)
+   public func loadMoreVotes(limit: Int? = nil,completion: (@MainActor(Error?) -> Void)? = nil)

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

- public protocol AttachmentPayload: Codable
+ public protocol AttachmentPayload: Codable, Sendable

- public enum LocalAttachmentState: Hashable  
+ public enum LocalAttachmentState: Hashable, Sendable  

- public class ChatMessageSearchController: DataController, DelegateCallable, DataStoreProvider  
+ public class ChatMessageSearchController: DataController, DelegateCallable, DataStoreProvider, @unchecked Sendable  
-   public func search(text: String,completion: ((_ error: Error?) -> Void)? = nil)
+   public func search(text: String,completion: (@MainActor(_ error: Error?) -> Void)? = nil)
-   public func search(query: MessageSearchQuery,completion: ((_ error: Error?) -> Void)? = nil)
+   public func search(query: MessageSearchQuery,completion: (@MainActor(_ error: Error?) -> Void)? = nil)
-   public func loadNextMessages(limit: Int = 25,completion: ((Error?) -> Void)? = nil)
+   public func loadNextMessages(limit: Int = 25,completion: (@MainActor(Error?) -> Void)? = nil)

- public struct ChatChannel  
+ public struct ChatChannel: Sendable  

- public struct ImageLoaderOptions  
+ public struct ImageLoaderOptions: Sendable  

- public enum PinnedMessagesPagination: Hashable  
+ public enum PinnedMessagesPagination: Hashable, Sendable  

- public struct Mode  
+ public struct Mode: Sendable  
-   public static var clip
+   public static let clip
-   public static var fill
+   public static let fill
-   public static var scale
+   public static let scale

@Stream-SDK-Bot
Copy link
Collaborator

SDK Size

title develop branch diff status
StreamChat 7.92 MB 7.71 MB -215 KB 🚀
StreamChatUI 4.84 MB 5.02 MB +184 KB 🟢

@@ -0,0 +1,213 @@
//
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do not review anything in the StreamNuke folder since this is not ours.

@GetStream GetStream deleted a comment from coderabbitai bot Aug 4, 2025
@laevandus laevandus marked this pull request as ready for review August 4, 2025 08:16
Copy link

coderabbitai bot commented Aug 4, 2025

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

✨ Finishing Touches
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch swift-6-llc-uikit

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbitai help to get the list of available commands.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@Stream-SDK-Bot
Copy link
Collaborator

SDK Performance

target metric benchmark branch performance status
MessageList Hitches total duration 10 ms 6.68 ms 33.2% 🔼 🟢
Duration 2.6 s 2.55 s 1.92% 🔼 🟢
Hitch time ratio 4 ms per s 2.63 ms per s 34.25% 🔼 🟢
Frame rate 75 fps 77.95 fps 3.93% 🔼 🟢
Number of hitches 1 0.8 20.0% 🔼 🟢

Copy link
Contributor

@martinmitrevski martinmitrevski left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good ✅ Left few small comments, and let's do a round of tests. Did you test the changes already?

@@ -35,7 +35,7 @@ enum UserPayloadsCodingKeys: String, CodingKey, CaseIterable {
// MARK: - GET users

/// An object describing the incoming user JSON payload.
class UserPayload: Decodable {
class UserPayload: Decodable, @unchecked Sendable {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not final, but unchecked Sendable like the others?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is because it is subclassed here:
final class CurrentUserPayload: UserPayload, @unchecked Sendable {

} else {
callbackQueue.async {
DispatchQueue.main.async {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't we use the StreamConcurrency.onMain here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is a tiny difference and I did not want to change it (being extra careful). StreamConcurrency.onMain has DispatchQueue.main.sync here because it supports returning a value (needed in some cases).

@@ -135,10 +134,16 @@ public class PollController: DataController, DelegateCallable, DataStoreProvider
)
pollsRepository = client.pollsRepository
super.init()
eventsController.delegate = self
eventsObserver = client.subscribe(toEvent: PollVoteChangedEvent.self, handler: { [weak self] event in
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we change this?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since we changed controller delegates to be @mainactor (delegates ran on the callbackQueue which is main), then this has a side-effect where controller can't conform to EventsControllerDelegate easily since delegate conformance would then require main actor, but controller types are not.

@MainActor public protocol EventsControllerDelegate: AnyObject {

Option 1 (current): Add @mainactor toEventsControllerDelegate and change the code where we use it in controllers
Option 2: Do not add @mainactor to EventsControllerDelegate, but if @mainactor view model or etc implements it, it as to use nonisolated for the delegate method and dispatch the call to main thread.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was discussed internally and we decided to use the subscribe method instead for controllers.

@@ -2,7 +2,7 @@
// Copyright © 2025 Stream.io Inc. All rights reserved.
//

import CoreData
@preconcurrency import CoreData
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Interesting, why do we need it?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does not like setting merge policy.

Sources/StreamChat/Database/DatabaseContainer.swift:25:31 Reference to var 'NSMergeByPropertyObjectTrumpMergePolicy' is not concurrency-safe because it involves shared mutable state

@@ -150,7 +150,7 @@ struct GzipError: Swift.Error {

init(code: Int32, msg: UnsafePointer<CChar>?) {
message = {
guard let msg = msg, let message = String(validatingUTF8: msg) else {
guard let msg = msg, let message = String(validatingCString: msg) else {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we change this?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is a deprecated in Swift 6: reference and Xcode shows a warning here since we bumped Swift version.

@martinmitrevski
Copy link
Contributor

@laevandus actually it doesn't build for me on Xcode 16.2.

@Stream-SDK-Bot
Copy link
Collaborator

Stream-SDK-Bot commented Aug 4, 2025

SDK Size

title develop branch diff status
StreamChat 8.06 MB 7.85 MB -215 KB 🚀
StreamChatUI 4.86 MB 5.02 MB +168 KB 🟢

@GetStream GetStream deleted a comment from github-actions bot Aug 21, 2025
@GetStream GetStream deleted a comment from github-actions bot Aug 21, 2025
Copy link

Comment on lines +130 to +132
StreamConcurrency.onMain {
unsafeSubscriber.audioPlayer(self, didUpdateContext: context)
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we need this? Can't we make StreamAudioPlayer MainActor?

Copy link
Member

@nuno-vieira nuno-vieira left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great Job! 👏

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
💥 Breaking Changes A PR that contains breaking changes 🪧 Demo App An Issue or PR related to the Demo App ⏫ Dependencies Update A PR that updates SDK Dependencies ✅ Feature An issue or PR related to a feature 🤞 Ready For QA A PR that is Ready for QA 🌐 SDK: StreamChat (LLC) Tasks related to the StreamChat LLC SDK 🎨 SDK: StreamChatUI Tasks related to the StreamChatUI SDK
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants