diff --git a/Sources/BandwidthRTC/BandwidthRTC.swift b/Sources/BandwidthRTC/BandwidthRTC.swift index f08b9d6..19af922 100644 --- a/Sources/BandwidthRTC/BandwidthRTC.swift +++ b/Sources/BandwidthRTC/BandwidthRTC.swift @@ -340,11 +340,6 @@ public final class BandwidthRTCClient: @unchecked Sendable { self.onReady?(metadata) } - // Handle established event - await signaling.onEvent("established") { _ in - Logger.shared.debug("Connection established") - } - // Handle disconnect await signaling.onEvent("close") { [weak self] _ in Logger.shared.warn("WebSocket closed") diff --git a/Sources/BandwidthRTC/Types/ConnectStatus.swift b/Sources/BandwidthRTC/Types/ConnectStatus.swift new file mode 100644 index 0000000..3864528 --- /dev/null +++ b/Sources/BandwidthRTC/Types/ConnectStatus.swift @@ -0,0 +1,11 @@ +import Foundation + +/// The terminal status of a `` verb. +public enum ConnectStatus: String, Codable, Sendable { + case initiated = "INITIATED" + case completed = "COMPLETED" + case timedOut = "TIMED_OUT" + case denied = "DENIED" + case canceled = "CANCELED" + case failed = "FAILED" +} diff --git a/Sources/BandwidthRTC/Types/ReadyMetadata.swift b/Sources/BandwidthRTC/Types/ReadyMetadata.swift index 9269e37..45ec54d 100644 --- a/Sources/BandwidthRTC/Types/ReadyMetadata.swift +++ b/Sources/BandwidthRTC/Types/ReadyMetadata.swift @@ -6,11 +6,43 @@ public struct ReadyMetadata: Decodable, Sendable { public let deviceId: String? public let territory: String? public let region: String? + public let connectStatus: ConnectStatus? + public let accountId: String? + public let sessionId: String? + public let from: String? + public let fromType: String? + public let fromTags: String? + public let to: String? + public let toType: String? + public let toTags: String? - public init(endpointId: String? = nil, deviceId: String? = nil, territory: String? = nil, region: String? = nil) { + public init( + endpointId: String? = nil, + deviceId: String? = nil, + territory: String? = nil, + region: String? = nil, + connectStatus: ConnectStatus? = nil, + accountId: String? = nil, + sessionId: String? = nil, + from: String? = nil, + fromType: String? = nil, + fromTags: String? = nil, + to: String? = nil, + toType: String? = nil, + toTags: String? = nil + ) { self.endpointId = endpointId self.deviceId = deviceId self.territory = territory self.region = region + self.connectStatus = connectStatus + self.accountId = accountId + self.sessionId = sessionId + self.from = from + self.fromType = fromType + self.fromTags = fromTags + self.to = to + self.toType = toType + self.toTags = toTags } } diff --git a/Tests/BandwidthRTCTests/BandwidthRTCTests.swift b/Tests/BandwidthRTCTests/BandwidthRTCTests.swift index f51e09f..79440b2 100644 --- a/Tests/BandwidthRTCTests/BandwidthRTCTests.swift +++ b/Tests/BandwidthRTCTests/BandwidthRTCTests.swift @@ -407,6 +407,78 @@ final class BandwidthRTCTests: XCTestCase { XCTAssertTrue(streamCallbackFired) } + func testReadyEventWithConnectStatusFields() async throws { + let sig = MockSignalingClient() + let sut = makeSUT(signaling: sig) + + var receivedMetadata: ReadyMetadata? + sut.onReady = { metadata in + receivedMetadata = metadata + } + try await sut.connect(authParams: validAuthParams) + + let readyJson = """ + { + "endpointId": "ep-1", + "deviceId": "dev-1", + "territory": "US", + "region": "us-east-1", + "connectStatus": "COMPLETED", + "accountId": "9900000", + "sessionId": "session-1", + "from": "ep-1", + "fromType": "ENDPOINT", + "fromTags": "tag1", + "to": "ep-2", + "toType": "ENDPOINT", + "toTags": "tag2" + } + """.data(using: .utf8)! + sig.triggerEvent("ready", data: readyJson) + try await Task.sleep(for: .milliseconds(50)) + + XCTAssertEqual(receivedMetadata?.endpointId, "ep-1") + XCTAssertEqual(receivedMetadata?.connectStatus, .completed) + XCTAssertEqual(receivedMetadata?.accountId, "9900000") + XCTAssertEqual(receivedMetadata?.sessionId, "session-1") + XCTAssertEqual(receivedMetadata?.from, "ep-1") + XCTAssertEqual(receivedMetadata?.fromType, "ENDPOINT") + XCTAssertEqual(receivedMetadata?.fromTags, "tag1") + XCTAssertEqual(receivedMetadata?.to, "ep-2") + XCTAssertEqual(receivedMetadata?.toType, "ENDPOINT") + XCTAssertEqual(receivedMetadata?.toTags, "tag2") + } + + func testReadyEventWithoutConnectStatusFieldsStillWorks() async throws { + let sig = MockSignalingClient() + let sut = makeSUT(signaling: sig) + + var receivedMetadata: ReadyMetadata? + sut.onReady = { metadata in + receivedMetadata = metadata + } + try await sut.connect(authParams: validAuthParams) + + let readyJson = """ + {"endpointId": "ep-2", "deviceId": "dev-2", "territory": "US", "region": "us-east-1"} + """.data(using: .utf8)! + sig.triggerEvent("ready", data: readyJson) + try await Task.sleep(for: .milliseconds(50)) + + XCTAssertEqual(receivedMetadata?.endpointId, "ep-2") + XCTAssertNil(receivedMetadata?.connectStatus) + XCTAssertNil(receivedMetadata?.accountId) + } + + func testEstablishedEventHandlerNotRegistered() async throws { + let sig = MockSignalingClient() + let sut = makeSUT(signaling: sig) + try await sut.connect(authParams: validAuthParams) + + XCTAssertFalse(sig.hasEventHandler(for: "established"), + "established event handler should not be registered") + } + func testCloseEventSetsNotConnected() async throws { let sig = MockSignalingClient() let sut = makeSUT(signaling: sig) diff --git a/Tests/BandwidthRTCTests/ResourceLifecycleTests.swift b/Tests/BandwidthRTCTests/ResourceLifecycleTests.swift index 0aaf42c..74ef169 100644 --- a/Tests/BandwidthRTCTests/ResourceLifecycleTests.swift +++ b/Tests/BandwidthRTCTests/ResourceLifecycleTests.swift @@ -262,8 +262,8 @@ final class ResourceLifecycleTests: XCTestCase { let events = sig.registeredEvents XCTAssertTrue(events.contains("sdpOffer")) XCTAssertTrue(events.contains("ready")) - XCTAssertTrue(events.contains("established")) XCTAssertTrue(events.contains("close")) + XCTAssertFalse(events.contains("established")) } func testReadyEventDeliversToCaller() async throws { diff --git a/VERSION b/VERSION index e6d5cb8..e4c0d46 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.2 \ No newline at end of file +1.0.3 \ No newline at end of file