#import #import NS_ASSUME_NONNULL_BEGIN typedef NS_ENUM(NSInteger, CrossDeskSignalState) { CrossDeskSignalStateConnecting = 0, CrossDeskSignalStateConnected, CrossDeskSignalStateFailed, CrossDeskSignalStateClosed, CrossDeskSignalStateReconnecting, CrossDeskSignalStateServerClosed, CrossDeskSignalStateTLSCertificateError, CrossDeskSignalStateCredentialUnavailable, }; typedef NS_ENUM(NSInteger, CrossDeskConnectionState) { CrossDeskConnectionStateConnecting = 0, CrossDeskConnectionStateConnected, CrossDeskConnectionStateGathering, CrossDeskConnectionStateDisconnected, CrossDeskConnectionStateFailed, CrossDeskConnectionStateClosed, CrossDeskConnectionStateIncorrectPassword, CrossDeskConnectionStateNoSuchID, CrossDeskConnectionStateRemoteUnavailable, }; typedef NS_ENUM(NSInteger, CrossDeskPointerAction) { CrossDeskPointerActionMove = 0, CrossDeskPointerActionLeftDown, CrossDeskPointerActionLeftUp, CrossDeskPointerActionRightDown, CrossDeskPointerActionRightUp, CrossDeskPointerActionMiddleDown, CrossDeskPointerActionMiddleUp, }; typedef NS_ENUM(NSInteger, CrossDeskVideoAdaptationPolicy) { CrossDeskVideoAdaptationPolicyFrameRatePriority = 0, CrossDeskVideoAdaptationPolicyQualityPriority, CrossDeskVideoAdaptationPolicyBalanced, }; @class CrossDeskRTCBridge; typedef NS_ENUM(NSInteger, CrossDeskTraversalMode) { CrossDeskTraversalModeUnknown = 0, CrossDeskTraversalModeDirect, CrossDeskTraversalModeRelay, }; typedef struct { uint32_t inboundBitrate; uint32_t outboundBitrate; float lossRate; } CrossDeskTrafficStats; /// Value snapshot: no MiniRTC callback-owned memory crosses the main queue. typedef struct { CrossDeskTrafficStats video; CrossDeskTrafficStats audio; CrossDeskTrafficStats data; CrossDeskTrafficStats total; double rttMilliseconds; BOOL srtpActive; CrossDeskTraversalMode traversalMode; } CrossDeskNetworkStats; @protocol CrossDeskRTCBridgeDelegate @optional - (void)rtcBridge:(CrossDeskRTCBridge *)bridge didChangeSignalState:(CrossDeskSignalState)state; - (void)rtcBridge:(CrossDeskRTCBridge *)bridge didChangeIdentityStorageError:(BOOL)hasError; - (void)rtcBridge:(CrossDeskRTCBridge *)bridge didChangeConnectionState:(CrossDeskConnectionState)state remoteID:(NSString *)remoteID; - (void)rtcBridge:(CrossDeskRTCBridge *)bridge didProvisionIdentity:(NSString *)identity; - (void)rtcBridge:(CrossDeskRTCBridge *)bridge didReceivePixelBuffer:(CVPixelBufferRef)pixelBuffer width:(NSInteger)width height:(NSInteger)height captureUptime:(NSTimeInterval)captureUptime; - (void)rtcBridge:(CrossDeskRTCBridge *)bridge didReceiveHostName:(NSString *)hostName appVersion:(NSString *)appVersion platform:(NSString *)platform displayNames:(NSArray *)displayNames displaySizes:(NSArray *)displaySizes supportsVideoSettings:(BOOL)supportsVideoSettings; - (void)rtcBridge:(CrossDeskRTCBridge *)bridge didReceiveVideoSettingsQuality:(NSInteger)quality frameRate:(NSInteger)frameRate preference:(NSInteger)preference requestID:(uint32_t)requestID accepted:(BOOL)accepted; - (void)rtcBridge:(CrossDeskRTCBridge *)bridge didReceivePresence:(NSDictionary *)presence snapshot:(BOOL)snapshot; - (void)rtcBridge:(CrossDeskRTCBridge *)bridge didReceiveAnnouncementMessage:(NSData *)message; - (void)rtcBridge:(CrossDeskRTCBridge *)bridge didFailAnnouncementRequest:(NSString *)requestID; - (void)rtcBridge:(CrossDeskRTCBridge *)bridge didReceiveCursorVisible:(BOOL)visible shape:(NSInteger)shape positionUpdate:(BOOL)positionUpdate positionValid:(BOOL)positionValid x:(float)x y:(float)y visualOffsetX:(float)visualOffsetX visualOffsetY:(float)visualOffsetY displayIndex:(NSInteger)displayIndex sequence:(uint32_t)sequence; - (void)rtcBridge:(CrossDeskRTCBridge *)bridge didReceiveAudioPCM:(NSData *)pcmData; - (void)rtcBridge:(CrossDeskRTCBridge *)bridge didReceiveClipboardText:(NSString *)text; - (void)rtcBridge:(CrossDeskRTCBridge *)bridge didUpdateFileTransfer:(NSString *)fileName progress:(double)progress sending:(BOOL)sending; - (void)rtcBridge:(CrossDeskRTCBridge *)bridge didReceiveFileAtURL:(NSURL *)fileURL; - (void)rtcBridge:(CrossDeskRTCBridge *)bridge didUpdateNetworkStats:(CrossDeskNetworkStats)stats NS_SWIFT_NAME(rtcBridge(_:didUpdateNetworkStats:)); @end /// Objective-C++ boundary around the native MiniRTC C API. /// /// All MiniRTC ownership and calls are serialized internally. Delegate methods /// are delivered on the main queue so SwiftUI never touches callback threads. @interface CrossDeskRTCBridge : NSObject @property(nonatomic, weak, nullable) id delegate; // Uses the same release/patch ordering as the desktop controller. + (nullable NSString *)availableUpdateForAppVersion:(NSString *)appVersion releaseJSON:(NSData *)releaseJSON NS_SWIFT_NAME(availableUpdate(appVersion:releaseJSON:)); + (nullable NSString *)checkMobileUpdateForAppVersion:(NSString *)appVersion releaseJSON:(NSData *)releaseJSON NS_SWIFT_NAME(checkMobileUpdate(appVersion:releaseJSON:)); - (void)configureWithSignalHost:(NSString *)host signalPort:(NSInteger)signalPort; - (void)setVideoAdaptationPolicy:(CrossDeskVideoAdaptationPolicy)policy; - (void)sendVideoSettingsWithQuality:(NSInteger)quality frameRate:(NSInteger)frameRate preference:(NSInteger)preference requestID:(uint32_t)requestID NS_SWIFT_NAME(sendVideoSettings(quality:frameRate:preference:requestID:)); - (void)requestPresenceForRemoteIDs:(NSArray *)remoteIDs subscribe:(BOOL)subscribe NS_SWIFT_NAME(requestPresence(remoteIDs:subscribe:)); - (void)invalidatePresence; - (void)sendAnnouncementRequest:(NSData *)request requestID:(NSString *)requestID NS_SWIFT_NAME(sendAnnouncementRequest(_:requestID:)); - (void)connectToRemoteID:(NSString *)remoteID password:(NSString *)password; - (void)disconnect; // Close both session and signaling peers, including automatic reconnection. - (void)stopNetworking; - (void)requestKeyFrame; - (void)sendPointerAtX:(float)x y:(float)y action:(CrossDeskPointerAction)action NS_SWIFT_NAME(sendPointer(x:y:action:)); - (void)sendScrollX:(float)x y:(float)y deltaX:(NSInteger)deltaX deltaY:(NSInteger)deltaY; - (void)sendWindowsKeyCode:(NSUInteger)keyCode isDown:(BOOL)isDown; - (void)sendText:(NSString *)text; - (void)switchToDisplay:(NSInteger)displayIndex; - (void)setAudioEnabled:(BOOL)enabled; - (void)sendClipboardText:(NSString *)text; - (void)sendFileAtURL:(NSURL *)fileURL; - (void)sendSecureAttentionSequence; @end NS_ASSUME_NONNULL_END