Skip to content

Commit b1b71e4

Browse files
authored
Merge pull request #8 from Bandwidth/dev
Concrete types and disconnects
2 parents b62d3cc + c6c5f23 commit b1b71e4

File tree

8 files changed

+122
-63
lines changed

8 files changed

+122
-63
lines changed

Package.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import PackageDescription
55

66
let package = Package(
7-
name: "webrtc-swift",
7+
name: "bandwidth-webrtc",
88
platforms: [.iOS(.v13), .macOS(.v10_15)],
99
products: [
1010
// Products define the executables and libraries a package produces, and make them visible to other packages.
@@ -15,7 +15,7 @@ let package = Package(
1515
dependencies: [
1616
// Dependencies declare other packages that this package depends on.
1717
// .package(url: /* package url */, from: "1.0.0"),
18-
.package(url: "https://github.com/Bandwidth/json-rpc-websockets.git", .branch("main")),
18+
.package(url: "https://github.com/Bandwidth/json-rpc-websockets.git", .upToNextMajor(from: "0.1.0")),
1919
.package(url: "https://github.com/alexpiezo/WebRTC.git", .upToNextMajor(from: "1.1.31567"))
2020
],
2121
targets: [
Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//
2-
// RTCBandwidthConnection.swift
2+
// Connection.swift
33
//
44
//
55
// Created by Michael Hamer on 1/8/20.
@@ -8,16 +8,18 @@
88
import Foundation
99
import WebRTC
1010

11-
public class RTCBandwidthConnection {
12-
let endpointId: String
11+
class Connection {
1312
let peerConnection: RTCPeerConnection
13+
let endpointId: String
14+
let participantId: String
15+
let mediaTypes: [MediaType]
1416
let alias: String?
15-
let participantId: String?
1617

17-
init(endpointId: String, peerConnection: RTCPeerConnection, alias: String?, participantId: String?) {
18-
self.endpointId = endpointId
18+
init(peerConnection: RTCPeerConnection, endpointId: String, participantId: String, mediaTypes: [MediaType], alias: String?) {
1919
self.peerConnection = peerConnection
20-
self.alias = alias
20+
self.endpointId = endpointId
2121
self.participantId = participantId
22+
self.mediaTypes = mediaTypes
23+
self.alias = alias
2224
}
2325
}

Sources/BandwidthWebRTC/PeerConnectionState.swift

Lines changed: 0 additions & 17 deletions
This file was deleted.

Sources/BandwidthWebRTC/RTCBandwidth.swift

Lines changed: 69 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import Foundation
99
import WebRTC
1010

1111
public protocol RTCBandwidthDelegate {
12-
func bandwidth(_ bandwidth: RTCBandwidth, streamAvailableAt connection: RTCBandwidthConnection, stream: RTCMediaStream?)
12+
func bandwidth(_ bandwidth: RTCBandwidth, streamAvailableAt endpointId: String, participantId: String, alias: String?, mediaTypes: [MediaType], mediaStream: RTCMediaStream?)
1313
func bandwidth(_ bandwidth: RTCBandwidth, streamUnavailableAt endpointId: String)
1414
}
1515

@@ -32,8 +32,8 @@ public class RTCBandwidth: NSObject {
3232

3333
private let mediaConstraints = RTCMediaConstraints(mandatoryConstraints: nil, optionalConstraints: ["DtlsSrtpKeyAgreement": kRTCMediaConstraintsValueTrue])
3434

35-
private var localConnections = [RTCBandwidthConnection]()
36-
private var remoteConnections = [RTCBandwidthConnection]()
35+
private var localConnections = [Connection]()
36+
private var remoteConnections = [Connection]()
3737

3838
#if os(iOS)
3939
private let audioSession = RTCAudioSession.sharedInstance()
@@ -62,6 +62,10 @@ public class RTCBandwidth: NSObject {
6262
}
6363
}
6464

65+
public func disconnect() {
66+
signaling?.disconnect()
67+
}
68+
6569
public func publish(audio: Bool, video: Bool, alias: String?, completion: @escaping () -> Void) {
6670
var mediaTypes = [MediaType]()
6771

@@ -84,18 +88,27 @@ public class RTCBandwidth: NSObject {
8488

8589
self.createMediaSenders(peerConnection: peerConnection, audio: audio, video: video)
8690

87-
let localConnection = RTCBandwidthConnection(endpointId: result.endpointId, peerConnection: peerConnection, alias: alias, participantId: nil)
91+
let localConnection = Connection(peerConnection: peerConnection, endpointId: result.endpointId, participantId: result.participantId, mediaTypes: mediaTypes, alias: alias)
8892
self.localConnections.append(localConnection)
8993

9094
self.negotiateSDP(endpointId: result.endpointId, direction: result.direction, mediaTypes: result.mediaTypes, for: peerConnection) {
91-
DispatchQueue.main.async {
92-
completion()
93-
}
95+
completion()
9496
}
9597
}
9698
}
9799
}
98100

101+
public func unpublish(endpointId: String) {
102+
signaling?.unpublish(endpointId: endpointId) { result in
103+
104+
}
105+
106+
if let index = localConnections.firstIndex(where: { $0.endpointId == endpointId }) {
107+
localConnections[index].peerConnection.close()
108+
localConnections.remove(at: index)
109+
}
110+
}
111+
99112
// MARK: Media
100113

101114
public func captureLocalVideo(renderer: RTCVideoRenderer) {
@@ -197,7 +210,7 @@ public class RTCBandwidth: NSObject {
197210
return videoTrack
198211
}
199212

200-
private func negotiateSDP(endpointId: String, direction: String, mediaTypes: [String], for peerConnection: RTCPeerConnection, completion: @escaping () -> Void) {
213+
private func negotiateSDP(endpointId: String, direction: String, mediaTypes: [MediaType], for peerConnection: RTCPeerConnection, completion: @escaping () -> Void) {
201214
debugPrint(direction)
202215

203216
var mandatoryConstraints = [
@@ -206,14 +219,14 @@ public class RTCBandwidth: NSObject {
206219
]
207220

208221
if direction.contains("recv") {
209-
mandatoryConstraints[kRTCMediaConstraintsOfferToReceiveAudio] = mediaTypes.contains("AUDIO") ? kRTCMediaConstraintsValueTrue : kRTCMediaConstraintsValueFalse
210-
mandatoryConstraints[kRTCMediaConstraintsOfferToReceiveVideo] = mediaTypes.contains("VIDEO") ? kRTCMediaConstraintsValueTrue : kRTCMediaConstraintsValueFalse
222+
mandatoryConstraints[kRTCMediaConstraintsOfferToReceiveAudio] = mediaTypes.contains(.audio) ? kRTCMediaConstraintsValueTrue : kRTCMediaConstraintsValueFalse
223+
mandatoryConstraints[kRTCMediaConstraintsOfferToReceiveVideo] = mediaTypes.contains(.video) ? kRTCMediaConstraintsValueTrue : kRTCMediaConstraintsValueFalse
211224
}
212225

213226
let constraints = RTCMediaConstraints(mandatoryConstraints: mandatoryConstraints, optionalConstraints: nil)
214227

215228
peerConnection.offer(for: constraints) { offer, error in
216-
DispatchQueue.main.async {
229+
// DispatchQueue.main.async {
217230
if let error = error {
218231
print(error.localizedDescription)
219232
}
@@ -228,7 +241,7 @@ public class RTCBandwidth: NSObject {
228241
}
229242

230243
peerConnection.setLocalDescription(offer) { error in
231-
DispatchQueue.main.async {
244+
// DispatchQueue.main.async {
232245
if let error = error {
233246
debugPrint(error.localizedDescription)
234247
}
@@ -242,21 +255,28 @@ public class RTCBandwidth: NSObject {
242255

243256
completion()
244257
}
245-
}
258+
// }
246259
}
247260
}
248-
}
261+
// }
249262
}
250263
}
251264

252265
private func handleSDPNeededEvent(parameters: SDPNeededParameters) {
253-
let peerConnection = RTCBandwidth.factory.peerConnection(with: configuration, constraints: mediaConstraints, delegate: self)
254-
let remoteConnection = RTCBandwidthConnection(endpointId: parameters.endpointId, peerConnection: peerConnection, alias: parameters.alias, participantId: parameters.participantId)
266+
let remotePeerConnection = RTCBandwidth.factory.peerConnection(with: configuration, constraints: mediaConstraints, delegate: self)
267+
268+
let remoteConnection = Connection(
269+
peerConnection: remotePeerConnection,
270+
endpointId: parameters.endpointId,
271+
participantId: parameters.participantId,
272+
mediaTypes: parameters.mediaTypes,
273+
alias: parameters.alias
274+
)
255275

256276
remoteConnections.append(remoteConnection)
257277

258-
negotiateSDP(endpointId: parameters.endpointId, direction: parameters.direction, mediaTypes: parameters.mediaTypes, for: peerConnection) {
259-
278+
negotiateSDP(endpointId: parameters.endpointId, direction: parameters.direction, mediaTypes: parameters.mediaTypes, for: remotePeerConnection) {
279+
260280
}
261281
}
262282

@@ -288,11 +308,16 @@ extension RTCBandwidth: RTCPeerConnectionDelegate {
288308
public func peerConnection(_ peerConnection: RTCPeerConnection, didAdd rtpReceiver: RTCRtpReceiver, streams mediaStreams: [RTCMediaStream]) {
289309
debugPrint("peerConnection didAdd rtpReceiver: streams media Streams:")
290310

291-
guard let connection = remoteConnections.first(where: { $0.peerConnection == peerConnection }) else { return }
292-
293-
DispatchQueue.main.async {
294-
self.delegate?.bandwidth(self, streamAvailableAt: connection, stream: mediaStreams.first)
295-
}
311+
guard let remoteConnection = remoteConnections.first(where: { $0.peerConnection == peerConnection }) else { return }
312+
313+
self.delegate?.bandwidth(
314+
self,
315+
streamAvailableAt: remoteConnection.endpointId,
316+
participantId: remoteConnection.participantId,
317+
alias: remoteConnection.alias,
318+
mediaTypes: remoteConnection.mediaTypes,
319+
mediaStream: mediaStreams.first
320+
)
296321
}
297322

298323
public func peerConnection(_ peerConnection: RTCPeerConnection, didChange stateChanged: RTCSignalingState) {
@@ -318,11 +343,30 @@ extension RTCBandwidth: RTCPeerConnectionDelegate {
318343
public func peerConnection(_ peerConnection: RTCPeerConnection, didGenerate candidate: RTCIceCandidate) {
319344
debugPrint("peerConnection didGenerate candidate: RTCIceCandidate")
320345

321-
guard let endpointId = remoteConnections.first(where: { $0.peerConnection == peerConnection })?.endpointId else {
346+
guard let remoteConnection = remoteConnections.first(where: { $0.peerConnection == peerConnection }) else {
322347
return
323348
}
324349

325-
signaling?.sendIceCandidate(endpointId: endpointId, candidate: candidate)
350+
signaling?.sendIceCandidate(
351+
endpointId: remoteConnection.endpointId,
352+
sdp: candidate.sdp,
353+
sdpMLineIndex: Int(candidate.sdpMLineIndex),
354+
sdpMid: candidate.sdpMid ?? ""
355+
) { _ in
356+
357+
}
358+
}
359+
360+
public func peerConnection(_ peerConnection: RTCPeerConnection, didChange newState: RTCPeerConnectionState) {
361+
print("peerConnection didChange newState: \(newState)")
362+
363+
if [.disconnected, .failed].contains(newState) {
364+
guard let remoteConnection = remoteConnections.first(where: { $0.peerConnection == peerConnection }) else {
365+
return
366+
}
367+
368+
delegate?.bandwidth(self, streamUnavailableAt: remoteConnection.endpointId)
369+
}
326370
}
327371

328372
public func peerConnection(_ peerConnection: RTCPeerConnection, didRemove candidates: [RTCIceCandidate]) {
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
//
2+
// LeaveParameters.swift
3+
//
4+
//
5+
// Created by Michael Hamer on 1/28/21.
6+
//
7+
8+
import Foundation
9+
10+
struct LeaveParameters: Codable {
11+
12+
}

Sources/BandwidthWebRTC/Signaling/RPC/RequestToPublishResult.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import Foundation
99

1010
struct RequestToPublishResult: Decodable {
1111
let endpointId: String
12-
let mediaTypes: [String]
12+
let participantId: String
13+
let mediaTypes: [MediaType]
1314
let direction: String
1415
}

Sources/BandwidthWebRTC/Signaling/RPC/SDPNeededParameters.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ struct SDPNeededParameters: Codable {
1111
let alias: String
1212
let direction: String
1313
let endpointId: String
14-
let mediaTypes: [String]
14+
let mediaTypes: [MediaType]
1515
let participantId: String
1616
// let streamProperties: Any? // TODO: What should this do?
1717
}

Sources/BandwidthWebRTC/Signaling/Signaling.swift

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
import Foundation
99
import JSONRPCWebSockets
10-
import WebRTC
1110

1211
enum SignalingMethod: String {
1312
case addICECandidate = "addIceCandidate"
@@ -17,6 +16,7 @@ enum SignalingMethod: String {
1716
case sdpNeeded
1817
case setMediaPreferences
1918
case unpublish
19+
case leave
2020
}
2121

2222
protocol SignalingDelegate {
@@ -64,6 +64,24 @@ class Signaling {
6464
}
6565
}
6666

67+
func disconnect() {
68+
let leaveParameters = LeaveParameters()
69+
client.notify(method: SignalingMethod.leave.rawValue, parameters: leaveParameters) { _ in
70+
71+
}
72+
73+
client.disconnect {
74+
75+
}
76+
}
77+
78+
func unpublish(endpointId: String, completion: @escaping (Result<(), Error>) -> Void) {
79+
let unpublishParameters = UnpublishParameters(endpointId: endpointId)
80+
client.notify(method: SignalingMethod.unpublish.rawValue, parameters: unpublishParameters) { result in
81+
completion(result)
82+
}
83+
}
84+
6785
func setMediaPreferences(protocol: String, aggregationType: String, sendReceive: Bool, completion: @escaping (SetMediaPreferencesResult?) -> Void) {
6886
let parameters = SetMediaPreferencesParameters(protocol: `protocol`, aggregationType: aggregationType, sendReceive: sendReceive)
6987
do {
@@ -94,17 +112,16 @@ class Signaling {
94112
}
95113
}
96114

97-
func sendIceCandidate(endpointId: String, candidate: RTCIceCandidate) {
98-
let parameters = AddICECandidateSendParameters(
115+
func sendIceCandidate(endpointId: String, sdp: String, sdpMLineIndex: Int, sdpMid: String, completion: @escaping (Result<(), Error>) -> Void) {
116+
let addICECandidateParameters = AddICECandidateSendParameters(
99117
endpointId: endpointId,
100-
candidate: candidate.sdp,
101-
sdpMLineIndex: Int(candidate.sdpMLineIndex),
102-
sdpMid: candidate.sdpMid ?? "")
118+
candidate: sdp,
119+
sdpMLineIndex: sdpMLineIndex,
120+
sdpMid: sdpMid
121+
)
103122

104-
try? client.notify(method: "addIceCandidate", parameters: parameters) { error in
105-
if let error = error {
106-
debugPrint(error.localizedDescription)
107-
}
123+
client.notify(method: SignalingMethod.addICECandidate.rawValue, parameters: addICECandidateParameters) { result in
124+
completion(result)
108125
}
109126
}
110127
}

0 commit comments

Comments
 (0)