Skip to content

Commit 297df56

Browse files
authored
Protocol submodule (#798)
Mirrors Android setup for easier/more consistent tracking. Keeps the generated files, you don't need to install anything in order to build...
1 parent 05e12c1 commit 297df56

File tree

8 files changed

+427
-24
lines changed

8 files changed

+427
-24
lines changed

.github/workflows/ci.yaml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
name: CI
22

3+
permissions:
4+
contents: read
5+
pull-requests: write
6+
37
on:
48
workflow_dispatch:
59
push:
@@ -179,6 +183,32 @@ jobs:
179183
name: docs
180184
path: docs.zip
181185
retention-days: 1
186+
check-protocol:
187+
name: Check Protocol
188+
runs-on: macos-latest
189+
steps:
190+
- uses: actions/checkout@v4
191+
with:
192+
submodules: recursive
193+
194+
- name: Install swift-protobuf
195+
run: brew install protobuf swift-protobuf
196+
197+
- name: Generate Swift protobuf files
198+
run: make proto
199+
200+
- name: Check working tree
201+
run: |
202+
if ! git diff --quiet; then
203+
echo "::error::Working tree is not clean after running 'make proto'"
204+
echo "The following files have been modified:"
205+
git diff --name-only
206+
echo ""
207+
echo "Please run 'make proto' locally and commit the changes."
208+
exit 1
209+
else
210+
echo "Working tree is clean - all Swift protobuf files are up to date"
211+
fi
182212
check-changes:
183213
name: Check Changes
184214
if: github.event_name == 'pull_request'

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[submodule "protocol"]
2+
path = protocol
3+
url = ../protocol.git

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
PROTO_SOURCE=../protocol/protobufs
1+
PROTO_SOURCE=./protocol/protobufs
22

33
proto: protoc protoc-swift
44
protoc --swift_out=Sources/LiveKit/protos -I=${PROTO_SOURCE} \

Sources/LiveKit/Core/SignalClient.swift

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -341,20 +341,11 @@ private extension SignalClient {
341341
case let .pongResp(pongResp):
342342
await _onReceivedPongResp(pongResp)
343343

344-
case .subscriptionResponse:
345-
log("Received subscriptionResponse message")
346-
347-
case .requestResponse:
348-
log("Received requestResponse message")
349-
350344
case let .trackSubscribed(trackSubscribed):
351345
_delegate.notifyDetached { await $0.signalClient(self, didSubscribeTrack: Track.Sid(from: trackSubscribed.trackSid)) }
352346

353-
case .roomMoved:
354-
log("Received roomMoved message")
355-
356-
case .mediaSectionsRequirement:
357-
log("Received mediaSectionsRequirement message")
347+
default:
348+
log("Unhandled signal message: \(message)", .warning)
358349
}
359350
}
360351
}

Sources/LiveKit/Protos/livekit_metrics.pb.swift

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ struct Livekit_MetricsBatch: Sendable {
192192
/// This is useful for storing participant identities, track names, etc.
193193
/// There is also a predefined list of labels that can be used to reference common metrics.
194194
/// They have reserved indices from 0 to (METRIC_LABEL_PREDEFINED_MAX_VALUE - 1).
195-
/// Indexes pointing at str_data should start from METRIC_LABEL_PREDEFINED_MAX_VALUE,
195+
/// Indexes pointing at str_data should start from METRIC_LABEL_PREDEFINED_MAX_VALUE,
196196
/// such that str_data[0] == index of METRIC_LABEL_PREDEFINED_MAX_VALUE.
197197
var strData: [String] = []
198198

@@ -316,6 +316,29 @@ struct Livekit_EventMetric: Sendable {
316316
fileprivate var _normalizedEndTimestamp: SwiftProtobuf.Google_Protobuf_Timestamp? = nil
317317
}
318318

319+
struct Livekit_MetricsRecordingHeader: Sendable {
320+
// SwiftProtobuf.Message conformance is added in an extension below. See the
321+
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
322+
// methods supported on all messages.
323+
324+
var roomID: String = String()
325+
326+
var enableUserDataTraining: Bool {
327+
get {return _enableUserDataTraining ?? false}
328+
set {_enableUserDataTraining = newValue}
329+
}
330+
/// Returns true if `enableUserDataTraining` has been explicitly set.
331+
var hasEnableUserDataTraining: Bool {return self._enableUserDataTraining != nil}
332+
/// Clears the value of `enableUserDataTraining`. Subsequent reads from it will return its default value.
333+
mutating func clearEnableUserDataTraining() {self._enableUserDataTraining = nil}
334+
335+
var unknownFields = SwiftProtobuf.UnknownStorage()
336+
337+
init() {}
338+
339+
fileprivate var _enableUserDataTraining: Bool? = nil
340+
}
341+
319342
// MARK: - Code below here is support for the SwiftProtobuf runtime.
320343

321344
fileprivate let _protobuf_package = "livekit"
@@ -545,3 +568,42 @@ extension Livekit_EventMetric: SwiftProtobuf.Message, SwiftProtobuf._MessageImpl
545568
return true
546569
}
547570
}
571+
572+
extension Livekit_MetricsRecordingHeader: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
573+
static let protoMessageName: String = _protobuf_package + ".MetricsRecordingHeader"
574+
static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{3}room_id\0\u{3}enable_user_data_training\0")
575+
576+
mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
577+
while let fieldNumber = try decoder.nextFieldNumber() {
578+
// The use of inline closures is to circumvent an issue where the compiler
579+
// allocates stack space for every case branch when no optimizations are
580+
// enabled. https://github.com/apple/swift-protobuf/issues/1034
581+
switch fieldNumber {
582+
case 1: try { try decoder.decodeSingularStringField(value: &self.roomID) }()
583+
case 2: try { try decoder.decodeSingularBoolField(value: &self._enableUserDataTraining) }()
584+
default: break
585+
}
586+
}
587+
}
588+
589+
func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
590+
// The use of inline closures is to circumvent an issue where the compiler
591+
// allocates stack space for every if/case branch local when no optimizations
592+
// are enabled. https://github.com/apple/swift-protobuf/issues/1034 and
593+
// https://github.com/apple/swift-protobuf/issues/1182
594+
if !self.roomID.isEmpty {
595+
try visitor.visitSingularStringField(value: self.roomID, fieldNumber: 1)
596+
}
597+
try { if let v = self._enableUserDataTraining {
598+
try visitor.visitSingularBoolField(value: v, fieldNumber: 2)
599+
} }()
600+
try unknownFields.traverse(visitor: &visitor)
601+
}
602+
603+
static func ==(lhs: Livekit_MetricsRecordingHeader, rhs: Livekit_MetricsRecordingHeader) -> Bool {
604+
if lhs.roomID != rhs.roomID {return false}
605+
if lhs._enableUserDataTraining != rhs._enableUserDataTraining {return false}
606+
if lhs.unknownFields != rhs.unknownFields {return false}
607+
return true
608+
}
609+
}

Sources/LiveKit/Protos/livekit_models.pb.swift

Lines changed: 65 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ enum Livekit_AudioCodec: SwiftProtobuf.Enum, Swift.CaseIterable {
4040
case defaultAc // = 0
4141
case opus // = 1
4242
case aac // = 2
43+
case acMp3 // = 3
4344
case UNRECOGNIZED(Int)
4445

4546
init() {
@@ -51,6 +52,7 @@ enum Livekit_AudioCodec: SwiftProtobuf.Enum, Swift.CaseIterable {
5152
case 0: self = .defaultAc
5253
case 1: self = .opus
5354
case 2: self = .aac
55+
case 3: self = .acMp3
5456
default: self = .UNRECOGNIZED(rawValue)
5557
}
5658
}
@@ -60,6 +62,7 @@ enum Livekit_AudioCodec: SwiftProtobuf.Enum, Swift.CaseIterable {
6062
case .defaultAc: return 0
6163
case .opus: return 1
6264
case .aac: return 2
65+
case .acMp3: return 3
6366
case .UNRECOGNIZED(let i): return i
6467
}
6568
}
@@ -69,6 +72,7 @@ enum Livekit_AudioCodec: SwiftProtobuf.Enum, Swift.CaseIterable {
6972
.defaultAc,
7073
.opus,
7174
.aac,
75+
.acMp3,
7276
]
7377

7478
}
@@ -705,7 +709,7 @@ struct Livekit_ListUpdate: Sendable {
705709
var add: [String] = []
706710

707711
/// delete items from a list
708-
var del: [String] = []
712+
var remove: [String] = []
709713

710714
/// sets the list to an empty list
711715
var clear: Bool = false
@@ -1316,6 +1320,7 @@ struct Livekit_VideoLayer: Sendable {
13161320
case unused // = 0
13171321
case oneSpatialLayerPerStream // = 1
13181322
case multipleSpatialLayersPerStream // = 2
1323+
case oneSpatialLayerPerStreamIncompleteRtcpSr // = 3
13191324
case UNRECOGNIZED(Int)
13201325

13211326
init() {
@@ -1327,6 +1332,7 @@ struct Livekit_VideoLayer: Sendable {
13271332
case 0: self = .unused
13281333
case 1: self = .oneSpatialLayerPerStream
13291334
case 2: self = .multipleSpatialLayersPerStream
1335+
case 3: self = .oneSpatialLayerPerStreamIncompleteRtcpSr
13301336
default: self = .UNRECOGNIZED(rawValue)
13311337
}
13321338
}
@@ -1336,6 +1342,7 @@ struct Livekit_VideoLayer: Sendable {
13361342
case .unused: return 0
13371343
case .oneSpatialLayerPerStream: return 1
13381344
case .multipleSpatialLayersPerStream: return 2
1345+
case .oneSpatialLayerPerStreamIncompleteRtcpSr: return 3
13391346
case .UNRECOGNIZED(let i): return i
13401347
}
13411348
}
@@ -1345,6 +1352,7 @@ struct Livekit_VideoLayer: Sendable {
13451352
.unused,
13461353
.oneSpatialLayerPerStream,
13471354
.multipleSpatialLayersPerStream,
1355+
.oneSpatialLayerPerStreamIncompleteRtcpSr,
13481356
]
13491357

13501358
}
@@ -2919,12 +2927,26 @@ struct Livekit_WebhookConfig: Sendable {
29192927
init() {}
29202928
}
29212929

2930+
struct Livekit_SubscribedAudioCodec: Sendable {
2931+
// SwiftProtobuf.Message conformance is added in an extension below. See the
2932+
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for
2933+
// methods supported on all messages.
2934+
2935+
var codec: String = String()
2936+
2937+
var enabled: Bool = false
2938+
2939+
var unknownFields = SwiftProtobuf.UnknownStorage()
2940+
2941+
init() {}
2942+
}
2943+
29222944
// MARK: - Code below here is support for the SwiftProtobuf runtime.
29232945

29242946
fileprivate let _protobuf_package = "livekit"
29252947

29262948
extension Livekit_AudioCodec: SwiftProtobuf._ProtoNameProviding {
2927-
static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{2}\0DEFAULT_AC\0\u{1}OPUS\0\u{1}AAC\0")
2949+
static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{2}\0DEFAULT_AC\0\u{1}OPUS\0\u{1}AAC\0\u{1}AC_MP3\0")
29282950
}
29292951

29302952
extension Livekit_VideoCodec: SwiftProtobuf._ProtoNameProviding {
@@ -3042,7 +3064,7 @@ extension Livekit_TokenPagination: SwiftProtobuf.Message, SwiftProtobuf._Message
30423064

30433065
extension Livekit_ListUpdate: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
30443066
static let protoMessageName: String = _protobuf_package + ".ListUpdate"
3045-
static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{1}set\0\u{1}add\0\u{1}del\0\u{1}clear\0")
3067+
static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{1}set\0\u{1}add\0\u{1}remove\0\u{1}clear\0")
30463068

30473069
mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
30483070
while let fieldNumber = try decoder.nextFieldNumber() {
@@ -3052,7 +3074,7 @@ extension Livekit_ListUpdate: SwiftProtobuf.Message, SwiftProtobuf._MessageImple
30523074
switch fieldNumber {
30533075
case 1: try { try decoder.decodeRepeatedStringField(value: &self.set) }()
30543076
case 2: try { try decoder.decodeRepeatedStringField(value: &self.add) }()
3055-
case 3: try { try decoder.decodeRepeatedStringField(value: &self.del) }()
3077+
case 3: try { try decoder.decodeRepeatedStringField(value: &self.remove) }()
30563078
case 4: try { try decoder.decodeSingularBoolField(value: &self.clear) }()
30573079
default: break
30583080
}
@@ -3066,8 +3088,8 @@ extension Livekit_ListUpdate: SwiftProtobuf.Message, SwiftProtobuf._MessageImple
30663088
if !self.add.isEmpty {
30673089
try visitor.visitRepeatedStringField(value: self.add, fieldNumber: 2)
30683090
}
3069-
if !self.del.isEmpty {
3070-
try visitor.visitRepeatedStringField(value: self.del, fieldNumber: 3)
3091+
if !self.remove.isEmpty {
3092+
try visitor.visitRepeatedStringField(value: self.remove, fieldNumber: 3)
30713093
}
30723094
if self.clear != false {
30733095
try visitor.visitSingularBoolField(value: self.clear, fieldNumber: 4)
@@ -3078,7 +3100,7 @@ extension Livekit_ListUpdate: SwiftProtobuf.Message, SwiftProtobuf._MessageImple
30783100
static func ==(lhs: Livekit_ListUpdate, rhs: Livekit_ListUpdate) -> Bool {
30793101
if lhs.set != rhs.set {return false}
30803102
if lhs.add != rhs.add {return false}
3081-
if lhs.del != rhs.del {return false}
3103+
if lhs.remove != rhs.remove {return false}
30823104
if lhs.clear != rhs.clear {return false}
30833105
if lhs.unknownFields != rhs.unknownFields {return false}
30843106
return true
@@ -3858,7 +3880,7 @@ extension Livekit_VideoLayer: SwiftProtobuf.Message, SwiftProtobuf._MessageImple
38583880
}
38593881

38603882
extension Livekit_VideoLayer.Mode: SwiftProtobuf._ProtoNameProviding {
3861-
static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{2}\0MODE_UNUSED\0\u{1}ONE_SPATIAL_LAYER_PER_STREAM\0\u{1}MULTIPLE_SPATIAL_LAYERS_PER_STREAM\0")
3883+
static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{2}\0MODE_UNUSED\0\u{1}ONE_SPATIAL_LAYER_PER_STREAM\0\u{1}MULTIPLE_SPATIAL_LAYERS_PER_STREAM\0\u{1}ONE_SPATIAL_LAYER_PER_STREAM_INCOMPLETE_RTCP_SR\0")
38623884
}
38633885

38643886
extension Livekit_DataPacket: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
@@ -6359,3 +6381,38 @@ extension Livekit_WebhookConfig: SwiftProtobuf.Message, SwiftProtobuf._MessageIm
63596381
return true
63606382
}
63616383
}
6384+
6385+
extension Livekit_SubscribedAudioCodec: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
6386+
static let protoMessageName: String = _protobuf_package + ".SubscribedAudioCodec"
6387+
static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{1}codec\0\u{1}enabled\0")
6388+
6389+
mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
6390+
while let fieldNumber = try decoder.nextFieldNumber() {
6391+
// The use of inline closures is to circumvent an issue where the compiler
6392+
// allocates stack space for every case branch when no optimizations are
6393+
// enabled. https://github.com/apple/swift-protobuf/issues/1034
6394+
switch fieldNumber {
6395+
case 1: try { try decoder.decodeSingularStringField(value: &self.codec) }()
6396+
case 2: try { try decoder.decodeSingularBoolField(value: &self.enabled) }()
6397+
default: break
6398+
}
6399+
}
6400+
}
6401+
6402+
func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
6403+
if !self.codec.isEmpty {
6404+
try visitor.visitSingularStringField(value: self.codec, fieldNumber: 1)
6405+
}
6406+
if self.enabled != false {
6407+
try visitor.visitSingularBoolField(value: self.enabled, fieldNumber: 2)
6408+
}
6409+
try unknownFields.traverse(visitor: &visitor)
6410+
}
6411+
6412+
static func ==(lhs: Livekit_SubscribedAudioCodec, rhs: Livekit_SubscribedAudioCodec) -> Bool {
6413+
if lhs.codec != rhs.codec {return false}
6414+
if lhs.enabled != rhs.enabled {return false}
6415+
if lhs.unknownFields != rhs.unknownFields {return false}
6416+
return true
6417+
}
6418+
}

0 commit comments

Comments
 (0)