From 8f3e32f908597aacc67da989eda210c16c02935b Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Tue, 11 Jun 2024 01:10:11 +0900 Subject: [PATCH] Expose Participant.kind (#401) --- .../Participant/Participant+Kind.swift | 62 +++++++++++++++++++ Sources/LiveKit/Participant/Participant.swift | 6 ++ 2 files changed, 68 insertions(+) create mode 100644 Sources/LiveKit/Participant/Participant+Kind.swift diff --git a/Sources/LiveKit/Participant/Participant+Kind.swift b/Sources/LiveKit/Participant/Participant+Kind.swift new file mode 100644 index 000000000..c527f1c16 --- /dev/null +++ b/Sources/LiveKit/Participant/Participant+Kind.swift @@ -0,0 +1,62 @@ +/* + * Copyright 2024 LiveKit + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// MARK: - Public + +public extension Participant { + @objc + enum Kind: Int { + case unknown + /// Standard participants, e.g. web clients. + case standard + /// Only ingests streams. + case ingress + /// Only consumes streams. + case egress + /// SIP participants. + case sip + /// LiveKit agents. + case agent + } +} + +extension Participant.Kind: CustomStringConvertible { + public var description: String { + switch self { + case .unknown: return "unknown" + case .standard: return "standard" + case .ingress: return "ingress" + case .egress: return "egress" + case .sip: return "sip" + case .agent: return "agent" + } + } +} + +// MARK: - Internal + +extension Livekit_ParticipantInfo.Kind { + func toLKType() -> Participant.Kind { + switch self { + case .standard: return .standard + case .ingress: return .ingress + case .egress: return .egress + case .sip: return .sip + case .agent: return .agent + default: return .unknown + } + } +} diff --git a/Sources/LiveKit/Participant/Participant.swift b/Sources/LiveKit/Participant/Participant.swift index b1228b7f8..94ea3984a 100644 --- a/Sources/LiveKit/Participant/Participant.swift +++ b/Sources/LiveKit/Participant/Participant.swift @@ -51,6 +51,10 @@ public class Participant: NSObject, ObservableObject, Loggable { @objc public var joinedAt: Date? { _state.joinedAt } + /// The kind of participant (i.e. a standard client participant, AI agent, etc.) + @objc + public var kind: Kind { _state.kind } + @objc public var trackPublications: [Track.Sid: TrackPublication] { _state.trackPublications } @@ -79,6 +83,7 @@ public class Participant: NSObject, ObservableObject, Loggable { var isSpeaking: Bool = false var metadata: String? var joinedAt: Date? + var kind: Kind = .unknown var connectionQuality: ConnectionQuality = .unknown var permissions = ParticipantPermissions() var trackPublications = [Track.Sid: TrackPublication]() @@ -181,6 +186,7 @@ public class Participant: NSObject, ObservableObject, Loggable { $0.name = info.name $0.metadata = info.metadata $0.joinedAt = Date(timeIntervalSince1970: TimeInterval(info.joinedAt)) + $0.kind = info.kind.toLKType() } self.info = info