mirror of https://github.com/oxen-io/session-ios
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
2.1 KiB
Swift
52 lines
2.1 KiB
Swift
// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
|
|
|
|
import Foundation
|
|
import WebRTC
|
|
import Foundation
|
|
import SessionMessagingKit
|
|
import SessionUtilitiesKit
|
|
|
|
extension WebRTCSession: RTCDataChannelDelegate {
|
|
// stringlint:ignore_contents
|
|
internal func createDataChannel() -> RTCDataChannel? {
|
|
let dataChannelConfiguration = RTCDataChannelConfiguration()
|
|
dataChannelConfiguration.isOrdered = true
|
|
dataChannelConfiguration.isNegotiated = true
|
|
dataChannelConfiguration.channelId = 548
|
|
guard let dataChannel = peerConnection?.dataChannel(forLabel: "CONTROL", configuration: dataChannelConfiguration) else {
|
|
Log.error(.calls, "Couldn't create data channel.")
|
|
return nil
|
|
}
|
|
return dataChannel
|
|
}
|
|
|
|
public func sendJSON(_ json: [String: Any]) {
|
|
if let dataChannel = self.dataChannel, let jsonAsData = try? JSONSerialization.data(withJSONObject: json, options: [ .fragmentsAllowed ]) {
|
|
Log.info(.calls, "Send json to data channel")
|
|
let dataBuffer = RTCDataBuffer(data: jsonAsData, isBinary: false)
|
|
dataChannel.sendData(dataBuffer)
|
|
}
|
|
}
|
|
|
|
// MARK: Data channel delegate
|
|
public func dataChannelDidChangeState(_ dataChannel: RTCDataChannel) {
|
|
Log.info(.calls, "Data channel did change to \(dataChannel.readyState.rawValue)")
|
|
if dataChannel.readyState == .open {
|
|
delegate?.dataChannelDidOpen()
|
|
}
|
|
}
|
|
|
|
// stringlint:ignore_contents
|
|
public func dataChannel(_ dataChannel: RTCDataChannel, didReceiveMessageWith buffer: RTCDataBuffer) {
|
|
if let json: [String: Any] = try? JSONSerialization.jsonObject(with: buffer.data, options: [ .fragmentsAllowed ]) as? [String: Any] {
|
|
Log.info(.calls, "Data channel did receive data: \(json)")
|
|
if let isRemoteVideoEnabled = json["video"] as? Bool {
|
|
delegate?.isRemoteVideoDidChange(isEnabled: isRemoteVideoEnabled)
|
|
}
|
|
if let _ = json["hangup"] {
|
|
delegate?.didReceiveHangUpSignal()
|
|
}
|
|
}
|
|
}
|
|
}
|