From 3ee7e29a1db4198bce85aeca69f444dc59db038d Mon Sep 17 00:00:00 2001 From: shijing xian Date: Fri, 28 Aug 2026 15:02:21 -0700 Subject: [PATCH 01/10] signalling: add compression envelopes for signal messages `WrappedJoinRequest` already compresses the join payload carried in the connect URL, but every message after the handshake goes over the WebSocket uncompressed. On the resume path that is where the bulk of the bytes are: `SyncState` alone carries two full session descriptions plus the subscription, publish and data channel lists, and the publisher ICE-restart offer follows right behind it. Measured against a minimal one-audio/one-video offer, an SDP is 5734 bytes raw and 1515 gzipped -- a 3.8x saving on the single largest repeated payload. Signalling is one TCP connection, so these are not merely large, they are in the way: a multi-kilobyte offer in flight head-of-line blocks everything queued behind it, including the trickle candidates the PeerConnection needs to finish its ICE restart. Compressing them shortens recovery on exactly the degraded networks where recovery matters. `permessage-deflate` would have avoided a protocol change -- livekit-server already sets `EnableCompression: true` on the client-facing upgrader -- but no usable Rust WebSocket crate implements it, and it would not reach SDKs whose host application supplies its own WebSocket transport. Doing it at the application layer covers every transport uniformly, and mirrors what the SFU already does gzipping signal messages on its own internal transport. Negotiation reuses the existing `CAP_COMPRESSION_DEFLATE_RAW` capability, which clients already advertise and nothing currently reads. The server acknowledges it in `JoinResponse`/`ReconnectResponse`; unset means the current uncompressed format, so old and new peers on either side interoperate unchanged. Those two responses are themselves unwrapped, since they are what establish the agreement. Co-Authored-By: Claude Opus 5 (1M context) --- .changeset/signal-payload-compression.md | 6 +++ protobufs/livekit_rtc.proto | 58 ++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 .changeset/signal-payload-compression.md diff --git a/.changeset/signal-payload-compression.md b/.changeset/signal-payload-compression.md new file mode 100644 index 000000000..b5d792cc0 --- /dev/null +++ b/.changeset/signal-payload-compression.md @@ -0,0 +1,6 @@ +--- +"github.com/livekit/protocol": minor +"@livekit/protocol": minor +--- + +signalling: add `WrappedSignalRequest` / `WrappedSignalResponse` envelopes and the `SignalCompression` enum, so signal messages on the WebSocket can be compressed the way `WrappedJoinRequest` already compresses the join payload in the connect URL. Negotiated via the existing `ClientInfo.CAP_COMPRESSION_DEFLATE_RAW` capability and acknowledged by the new `JoinResponse.signal_compression` / `ReconnectResponse.signal_compression` fields; unset means the existing uncompressed wire format is used, so old and new peers interoperate unchanged. diff --git a/protobufs/livekit_rtc.proto b/protobufs/livekit_rtc.proto index a6b978896..8050ba4ad 100644 --- a/protobufs/livekit_rtc.proto +++ b/protobufs/livekit_rtc.proto @@ -264,6 +264,19 @@ message JoinResponse { repeated Codec enabled_publish_codecs = 14; // when set, client should attempt to establish publish peer connection when joining room to speed up publishing bool fast_publish = 15; + // when set, every signal message after this JoinResponse is wrapped in + // WrappedSignalRequest/WrappedSignalResponse, in both directions. + // + // The server sets this only if the client advertised + // ClientInfo.CAP_COMPRESSION_DEFLATE_RAW. Unset (the default) means the client MUST + // keep sending bare SignalRequests, so an old server and a new client, or the + // reverse, keep working unchanged. + // + // This JoinResponse itself is NOT wrapped: it is what establishes the agreement, so + // it has to be readable by a client that does not yet know the answer. That leaves + // the join roster uncompressed -- the one place this scheme does not help. See + // ReconnectResponse.signal_compression for the resume path. + bool signal_compression = 16; } message ReconnectResponse { @@ -273,6 +286,14 @@ message ReconnectResponse { // last sequence number of reliable message received before resuming uint32 last_message_seq = 4; + + // Same contract as JoinResponse.signal_compression: when set, every signal message + // after this ReconnectResponse is wrapped, in both directions, and this message + // itself is not. + // + // Renegotiated per resume rather than inherited, because a resume may land on a + // different node than the one that answered the original join. + bool signal_compression = 5; } message TrackPublishedResponse { @@ -667,6 +688,43 @@ message WrappedJoinRequest { bytes join_request = 2; // marshalled JoinRequest + potentially compressed } +// How a wrapped signal payload was compressed. +// +// DEFLATE_RAW is preferred over GZIP for per-message compression: it omits gzip's +// ~18 bytes of header and trailer, which is material when the median signal message +// is a few hundred bytes. GZIP is offered for implementations that already have a +// gzip codec wired up (WrappedJoinRequest uses it) and want to reuse it. +// +// Values are prefixed, unlike the older bare-valued enums in this file: top-level +// enum values share the package namespace, and a bare `NONE` would collide with the +// one already declared in livekit_sip.proto. +enum SignalCompression { + SIGNAL_COMPRESSION_NONE = 0; + SIGNAL_COMPRESSION_GZIP = 1; + SIGNAL_COMPRESSION_DEFLATE_RAW = 2; +} + +// Envelope for a compressed SignalRequest, mirroring WrappedJoinRequest. +// +// Used in place of a bare SignalRequest on the signalling WebSocket once both +// sides have agreed to compress -- see JoinResponse.signal_compression. +// +// Senders SHOULD leave small payloads uncompressed (NONE): below roughly 200 bytes +// the compressed form is usually larger, and the CPU is wasted either way. Senders +// MUST fall back to NONE if compression fails or does not shrink the payload; a +// compression problem must never become a connection failure. Receivers MUST honour +// whatever `compression` says regardless of size. +message WrappedSignalRequest { + SignalCompression compression = 1; + bytes signal_request = 2; // marshalled SignalRequest + potentially compressed +} + +// Envelope for a compressed SignalResponse. See WrappedSignalRequest. +message WrappedSignalResponse { + SignalCompression compression = 1; + bytes signal_response = 2; // marshalled SignalResponse + potentially compressed +} + message MediaSectionsRequirement { uint32 num_audios = 1; uint32 num_videos = 2; From a22795de28c1158801c3ff3cd403dde7461bb62e Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 28 Aug 2026 22:04:03 +0000 Subject: [PATCH 02/10] generated protobuf --- livekit/livekit_rtc.pb.go | 751 +++++++++++++++++++++++++------------- 1 file changed, 488 insertions(+), 263 deletions(-) diff --git a/livekit/livekit_rtc.pb.go b/livekit/livekit_rtc.pb.go index 214b234cb..b8fa548ab 100644 --- a/livekit/livekit_rtc.pb.go +++ b/livekit/livekit_rtc.pb.go @@ -177,6 +177,65 @@ func (CandidateProtocol) EnumDescriptor() ([]byte, []int) { return file_livekit_rtc_proto_rawDescGZIP(), []int{2} } +// How a wrapped signal payload was compressed. +// +// DEFLATE_RAW is preferred over GZIP for per-message compression: it omits gzip's +// ~18 bytes of header and trailer, which is material when the median signal message +// is a few hundred bytes. GZIP is offered for implementations that already have a +// gzip codec wired up (WrappedJoinRequest uses it) and want to reuse it. +// +// Values are prefixed, unlike the older bare-valued enums in this file: top-level +// enum values share the package namespace, and a bare `NONE` would collide with the +// one already declared in livekit_sip.proto. +type SignalCompression int32 + +const ( + SignalCompression_SIGNAL_COMPRESSION_NONE SignalCompression = 0 + SignalCompression_SIGNAL_COMPRESSION_GZIP SignalCompression = 1 + SignalCompression_SIGNAL_COMPRESSION_DEFLATE_RAW SignalCompression = 2 +) + +// Enum value maps for SignalCompression. +var ( + SignalCompression_name = map[int32]string{ + 0: "SIGNAL_COMPRESSION_NONE", + 1: "SIGNAL_COMPRESSION_GZIP", + 2: "SIGNAL_COMPRESSION_DEFLATE_RAW", + } + SignalCompression_value = map[string]int32{ + "SIGNAL_COMPRESSION_NONE": 0, + "SIGNAL_COMPRESSION_GZIP": 1, + "SIGNAL_COMPRESSION_DEFLATE_RAW": 2, + } +) + +func (x SignalCompression) Enum() *SignalCompression { + p := new(SignalCompression) + *p = x + return p +} + +func (x SignalCompression) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SignalCompression) Descriptor() protoreflect.EnumDescriptor { + return file_livekit_rtc_proto_enumTypes[3].Descriptor() +} + +func (SignalCompression) Type() protoreflect.EnumType { + return &file_livekit_rtc_proto_enumTypes[3] +} + +func (x SignalCompression) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SignalCompression.Descriptor instead. +func (SignalCompression) EnumDescriptor() ([]byte, []int) { + return file_livekit_rtc_proto_rawDescGZIP(), []int{3} +} + // indicates action clients should take on receiving this message type LeaveRequest_Action int32 @@ -211,11 +270,11 @@ func (x LeaveRequest_Action) String() string { } func (LeaveRequest_Action) Descriptor() protoreflect.EnumDescriptor { - return file_livekit_rtc_proto_enumTypes[3].Descriptor() + return file_livekit_rtc_proto_enumTypes[4].Descriptor() } func (LeaveRequest_Action) Type() protoreflect.EnumType { - return &file_livekit_rtc_proto_enumTypes[3] + return &file_livekit_rtc_proto_enumTypes[4] } func (x LeaveRequest_Action) Number() protoreflect.EnumNumber { @@ -287,11 +346,11 @@ func (x RequestResponse_Reason) String() string { } func (RequestResponse_Reason) Descriptor() protoreflect.EnumDescriptor { - return file_livekit_rtc_proto_enumTypes[4].Descriptor() + return file_livekit_rtc_proto_enumTypes[5].Descriptor() } func (RequestResponse_Reason) Type() protoreflect.EnumType { - return &file_livekit_rtc_proto_enumTypes[4] + return &file_livekit_rtc_proto_enumTypes[5] } func (x RequestResponse_Reason) Number() protoreflect.EnumNumber { @@ -333,11 +392,11 @@ func (x WrappedJoinRequest_Compression) String() string { } func (WrappedJoinRequest_Compression) Descriptor() protoreflect.EnumDescriptor { - return file_livekit_rtc_proto_enumTypes[5].Descriptor() + return file_livekit_rtc_proto_enumTypes[6].Descriptor() } func (WrappedJoinRequest_Compression) Type() protoreflect.EnumType { - return &file_livekit_rtc_proto_enumTypes[5] + return &file_livekit_rtc_proto_enumTypes[6] } func (x WrappedJoinRequest_Compression) Number() protoreflect.EnumNumber { @@ -1994,9 +2053,22 @@ type JoinResponse struct { SifTrailer []byte `protobuf:"bytes,13,opt,name=sif_trailer,json=sifTrailer,proto3" json:"sif_trailer,omitempty"` EnabledPublishCodecs []*Codec `protobuf:"bytes,14,rep,name=enabled_publish_codecs,json=enabledPublishCodecs,proto3" json:"enabled_publish_codecs,omitempty"` // when set, client should attempt to establish publish peer connection when joining room to speed up publishing - FastPublish bool `protobuf:"varint,15,opt,name=fast_publish,json=fastPublish,proto3" json:"fast_publish,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + FastPublish bool `protobuf:"varint,15,opt,name=fast_publish,json=fastPublish,proto3" json:"fast_publish,omitempty"` + // when set, every signal message after this JoinResponse is wrapped in + // WrappedSignalRequest/WrappedSignalResponse, in both directions. + // + // The server sets this only if the client advertised + // ClientInfo.CAP_COMPRESSION_DEFLATE_RAW. Unset (the default) means the client MUST + // keep sending bare SignalRequests, so an old server and a new client, or the + // reverse, keep working unchanged. + // + // This JoinResponse itself is NOT wrapped: it is what establishes the agreement, so + // it has to be readable by a client that does not yet know the answer. That leaves + // the join roster uncompressed -- the one place this scheme does not help. See + // ReconnectResponse.signal_compression for the resume path. + SignalCompression bool `protobuf:"varint,16,opt,name=signal_compression,json=signalCompression,proto3" json:"signal_compression,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *JoinResponse) Reset() { @@ -2134,6 +2206,13 @@ func (x *JoinResponse) GetFastPublish() bool { return false } +func (x *JoinResponse) GetSignalCompression() bool { + if x != nil { + return x.SignalCompression + } + return false +} + type ReconnectResponse struct { state protoimpl.MessageState `protogen:"open.v1"` IceServers []*ICEServer `protobuf:"bytes,1,rep,name=ice_servers,json=iceServers,proto3" json:"ice_servers,omitempty"` @@ -2141,8 +2220,15 @@ type ReconnectResponse struct { ServerInfo *ServerInfo `protobuf:"bytes,3,opt,name=server_info,json=serverInfo,proto3" json:"server_info,omitempty"` // last sequence number of reliable message received before resuming LastMessageSeq uint32 `protobuf:"varint,4,opt,name=last_message_seq,json=lastMessageSeq,proto3" json:"last_message_seq,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Same contract as JoinResponse.signal_compression: when set, every signal message + // after this ReconnectResponse is wrapped, in both directions, and this message + // itself is not. + // + // Renegotiated per resume rather than inherited, because a resume may land on a + // different node than the one that answered the original join. + SignalCompression bool `protobuf:"varint,5,opt,name=signal_compression,json=signalCompression,proto3" json:"signal_compression,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ReconnectResponse) Reset() { @@ -2203,6 +2289,13 @@ func (x *ReconnectResponse) GetLastMessageSeq() uint32 { return 0 } +func (x *ReconnectResponse) GetSignalCompression() bool { + if x != nil { + return x.SignalCompression + } + return false +} + type TrackPublishedResponse struct { state protoimpl.MessageState `protogen:"open.v1"` Cid string `protobuf:"bytes,1,opt,name=cid,proto3" json:"cid,omitempty"` @@ -5155,6 +5248,121 @@ func (x *WrappedJoinRequest) GetJoinRequest() []byte { return nil } +// Envelope for a compressed SignalRequest, mirroring WrappedJoinRequest. +// +// Used in place of a bare SignalRequest on the signalling WebSocket once both +// sides have agreed to compress -- see JoinResponse.signal_compression. +// +// Senders SHOULD leave small payloads uncompressed (NONE): below roughly 200 bytes +// the compressed form is usually larger, and the CPU is wasted either way. Senders +// MUST fall back to NONE if compression fails or does not shrink the payload; a +// compression problem must never become a connection failure. Receivers MUST honour +// whatever `compression` says regardless of size. +type WrappedSignalRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Compression SignalCompression `protobuf:"varint,1,opt,name=compression,proto3,enum=livekit.SignalCompression" json:"compression,omitempty"` + SignalRequest []byte `protobuf:"bytes,2,opt,name=signal_request,json=signalRequest,proto3" json:"signal_request,omitempty"` // marshalled SignalRequest + potentially compressed + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *WrappedSignalRequest) Reset() { + *x = WrappedSignalRequest{} + mi := &file_livekit_rtc_proto_msgTypes[58] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *WrappedSignalRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WrappedSignalRequest) ProtoMessage() {} + +func (x *WrappedSignalRequest) ProtoReflect() protoreflect.Message { + mi := &file_livekit_rtc_proto_msgTypes[58] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WrappedSignalRequest.ProtoReflect.Descriptor instead. +func (*WrappedSignalRequest) Descriptor() ([]byte, []int) { + return file_livekit_rtc_proto_rawDescGZIP(), []int{58} +} + +func (x *WrappedSignalRequest) GetCompression() SignalCompression { + if x != nil { + return x.Compression + } + return SignalCompression_SIGNAL_COMPRESSION_NONE +} + +func (x *WrappedSignalRequest) GetSignalRequest() []byte { + if x != nil { + return x.SignalRequest + } + return nil +} + +// Envelope for a compressed SignalResponse. See WrappedSignalRequest. +type WrappedSignalResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Compression SignalCompression `protobuf:"varint,1,opt,name=compression,proto3,enum=livekit.SignalCompression" json:"compression,omitempty"` + SignalResponse []byte `protobuf:"bytes,2,opt,name=signal_response,json=signalResponse,proto3" json:"signal_response,omitempty"` // marshalled SignalResponse + potentially compressed + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *WrappedSignalResponse) Reset() { + *x = WrappedSignalResponse{} + mi := &file_livekit_rtc_proto_msgTypes[59] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *WrappedSignalResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WrappedSignalResponse) ProtoMessage() {} + +func (x *WrappedSignalResponse) ProtoReflect() protoreflect.Message { + mi := &file_livekit_rtc_proto_msgTypes[59] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WrappedSignalResponse.ProtoReflect.Descriptor instead. +func (*WrappedSignalResponse) Descriptor() ([]byte, []int) { + return file_livekit_rtc_proto_rawDescGZIP(), []int{59} +} + +func (x *WrappedSignalResponse) GetCompression() SignalCompression { + if x != nil { + return x.Compression + } + return SignalCompression_SIGNAL_COMPRESSION_NONE +} + +func (x *WrappedSignalResponse) GetSignalResponse() []byte { + if x != nil { + return x.SignalResponse + } + return nil +} + type MediaSectionsRequirement struct { state protoimpl.MessageState `protogen:"open.v1"` NumAudios uint32 `protobuf:"varint,1,opt,name=num_audios,json=numAudios,proto3" json:"num_audios,omitempty"` @@ -5165,7 +5373,7 @@ type MediaSectionsRequirement struct { func (x *MediaSectionsRequirement) Reset() { *x = MediaSectionsRequirement{} - mi := &file_livekit_rtc_proto_msgTypes[58] + mi := &file_livekit_rtc_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5177,7 +5385,7 @@ func (x *MediaSectionsRequirement) String() string { func (*MediaSectionsRequirement) ProtoMessage() {} func (x *MediaSectionsRequirement) ProtoReflect() protoreflect.Message { - mi := &file_livekit_rtc_proto_msgTypes[58] + mi := &file_livekit_rtc_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5190,7 +5398,7 @@ func (x *MediaSectionsRequirement) ProtoReflect() protoreflect.Message { // Deprecated: Use MediaSectionsRequirement.ProtoReflect.Descriptor instead. func (*MediaSectionsRequirement) Descriptor() ([]byte, []int) { - return file_livekit_rtc_proto_rawDescGZIP(), []int{58} + return file_livekit_rtc_proto_rawDescGZIP(), []int{60} } func (x *MediaSectionsRequirement) GetNumAudios() uint32 { @@ -5218,7 +5426,7 @@ type DataTrackSubscriberHandles_PublishedDataTrack struct { func (x *DataTrackSubscriberHandles_PublishedDataTrack) Reset() { *x = DataTrackSubscriberHandles_PublishedDataTrack{} - mi := &file_livekit_rtc_proto_msgTypes[59] + mi := &file_livekit_rtc_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5230,7 +5438,7 @@ func (x *DataTrackSubscriberHandles_PublishedDataTrack) String() string { func (*DataTrackSubscriberHandles_PublishedDataTrack) ProtoMessage() {} func (x *DataTrackSubscriberHandles_PublishedDataTrack) ProtoReflect() protoreflect.Message { - mi := &file_livekit_rtc_proto_msgTypes[59] + mi := &file_livekit_rtc_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5280,7 +5488,7 @@ type UpdateDataSubscription_Update struct { func (x *UpdateDataSubscription_Update) Reset() { *x = UpdateDataSubscription_Update{} - mi := &file_livekit_rtc_proto_msgTypes[62] + mi := &file_livekit_rtc_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5292,7 +5500,7 @@ func (x *UpdateDataSubscription_Update) String() string { func (*UpdateDataSubscription_Update) ProtoMessage() {} func (x *UpdateDataSubscription_Update) ProtoReflect() protoreflect.Message { - mi := &file_livekit_rtc_proto_msgTypes[62] + mi := &file_livekit_rtc_proto_msgTypes[64] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5458,7 +5666,7 @@ const file_livekit_rtc_proto_rawDesc = "" + "\x05final\x18\x03 \x01(\bR\x05final\":\n" + "\x10MuteTrackRequest\x12\x10\n" + "\x03sid\x18\x01 \x01(\tR\x03sid\x12\x14\n" + - "\x05muted\x18\x02 \x01(\bR\x05muted\"\xe8\x05\n" + + "\x05muted\x18\x02 \x01(\bR\x05muted\"\x97\x06\n" + "\fJoinResponse\x12!\n" + "\x04room\x18\x01 \x01(\v2\r.livekit.RoomR\x04room\x12:\n" + "\vparticipant\x18\x02 \x01(\v2\x18.livekit.ParticipantInfoR\vparticipant\x12G\n" + @@ -5478,14 +5686,16 @@ const file_livekit_rtc_proto_rawDesc = "" + "\vsif_trailer\x18\r \x01(\fR\n" + "sifTrailer\x12D\n" + "\x16enabled_publish_codecs\x18\x0e \x03(\v2\x0e.livekit.CodecR\x14enabledPublishCodecs\x12!\n" + - "\ffast_publish\x18\x0f \x01(\bR\vfastPublish\"\xf9\x01\n" + + "\ffast_publish\x18\x0f \x01(\bR\vfastPublish\x12-\n" + + "\x12signal_compression\x18\x10 \x01(\bR\x11signalCompression\"\xa8\x02\n" + "\x11ReconnectResponse\x123\n" + "\vice_servers\x18\x01 \x03(\v2\x12.livekit.ICEServerR\n" + "iceServers\x12O\n" + "\x14client_configuration\x18\x02 \x01(\v2\x1c.livekit.ClientConfigurationR\x13clientConfiguration\x124\n" + "\vserver_info\x18\x03 \x01(\v2\x13.livekit.ServerInfoR\n" + "serverInfo\x12(\n" + - "\x10last_message_seq\x18\x04 \x01(\rR\x0elastMessageSeq\"T\n" + + "\x10last_message_seq\x18\x04 \x01(\rR\x0elastMessageSeq\x12-\n" + + "\x12signal_compression\x18\x05 \x01(\bR\x11signalCompression\"T\n" + "\x16TrackPublishedResponse\x12\x10\n" + "\x03cid\x18\x01 \x01(\tR\x03cid\x12(\n" + "\x05track\x18\x02 \x01(\v2\x12.livekit.TrackInfoR\x05track\"7\n" + @@ -5732,7 +5942,13 @@ const file_livekit_rtc_proto_rawDesc = "" + "\fjoin_request\x18\x02 \x01(\fR\vjoinRequest\"!\n" + "\vCompression\x12\b\n" + "\x04NONE\x10\x00\x12\b\n" + - "\x04GZIP\x10\x01\"X\n" + + "\x04GZIP\x10\x01\"{\n" + + "\x14WrappedSignalRequest\x12<\n" + + "\vcompression\x18\x01 \x01(\x0e2\x1a.livekit.SignalCompressionR\vcompression\x12%\n" + + "\x0esignal_request\x18\x02 \x01(\fR\rsignalRequest\"~\n" + + "\x15WrappedSignalResponse\x12<\n" + + "\vcompression\x18\x01 \x01(\x0e2\x1a.livekit.SignalCompressionR\vcompression\x12'\n" + + "\x0fsignal_response\x18\x02 \x01(\fR\x0esignalResponse\"X\n" + "\x18MediaSectionsRequirement\x12\x1d\n" + "\n" + "num_audios\x18\x01 \x01(\rR\tnumAudios\x12\x1d\n" + @@ -5750,7 +5966,11 @@ const file_livekit_rtc_proto_rawDesc = "" + "\x11CandidateProtocol\x12\a\n" + "\x03UDP\x10\x00\x12\a\n" + "\x03TCP\x10\x01\x12\a\n" + - "\x03TLS\x10\x02BFZ#github.com/livekit/protocol/livekit\xaa\x02\rLiveKit.Proto\xea\x02\x0eLiveKit::Protob\x06proto3" + "\x03TLS\x10\x02*q\n" + + "\x11SignalCompression\x12\x1b\n" + + "\x17SIGNAL_COMPRESSION_NONE\x10\x00\x12\x1b\n" + + "\x17SIGNAL_COMPRESSION_GZIP\x10\x01\x12\"\n" + + "\x1eSIGNAL_COMPRESSION_DEFLATE_RAW\x10\x02BFZ#github.com/livekit/protocol/livekit\xaa\x02\rLiveKit.Proto\xea\x02\x0eLiveKit::Protob\x06proto3" var ( file_livekit_rtc_proto_rawDescOnce sync.Once @@ -5764,254 +5984,259 @@ func file_livekit_rtc_proto_rawDescGZIP() []byte { return file_livekit_rtc_proto_rawDescData } -var file_livekit_rtc_proto_enumTypes = make([]protoimpl.EnumInfo, 6) -var file_livekit_rtc_proto_msgTypes = make([]protoimpl.MessageInfo, 65) +var file_livekit_rtc_proto_enumTypes = make([]protoimpl.EnumInfo, 7) +var file_livekit_rtc_proto_msgTypes = make([]protoimpl.MessageInfo, 67) var file_livekit_rtc_proto_goTypes = []any{ (SignalTarget)(0), // 0: livekit.SignalTarget (StreamState)(0), // 1: livekit.StreamState (CandidateProtocol)(0), // 2: livekit.CandidateProtocol - (LeaveRequest_Action)(0), // 3: livekit.LeaveRequest.Action - (RequestResponse_Reason)(0), // 4: livekit.RequestResponse.Reason - (WrappedJoinRequest_Compression)(0), // 5: livekit.WrappedJoinRequest.Compression - (*SignalRequest)(nil), // 6: livekit.SignalRequest - (*SignalResponse)(nil), // 7: livekit.SignalResponse - (*SimulcastCodec)(nil), // 8: livekit.SimulcastCodec - (*AddTrackRequest)(nil), // 9: livekit.AddTrackRequest - (*PublishDataTrackRequest)(nil), // 10: livekit.PublishDataTrackRequest - (*PublishDataTrackResponse)(nil), // 11: livekit.PublishDataTrackResponse - (*UnpublishDataTrackRequest)(nil), // 12: livekit.UnpublishDataTrackRequest - (*UnpublishDataTrackResponse)(nil), // 13: livekit.UnpublishDataTrackResponse - (*DataTrackSubscriberHandles)(nil), // 14: livekit.DataTrackSubscriberHandles - (*TrickleRequest)(nil), // 15: livekit.TrickleRequest - (*MuteTrackRequest)(nil), // 16: livekit.MuteTrackRequest - (*JoinResponse)(nil), // 17: livekit.JoinResponse - (*ReconnectResponse)(nil), // 18: livekit.ReconnectResponse - (*TrackPublishedResponse)(nil), // 19: livekit.TrackPublishedResponse - (*TrackUnpublishedResponse)(nil), // 20: livekit.TrackUnpublishedResponse - (*SessionDescription)(nil), // 21: livekit.SessionDescription - (*ParticipantUpdate)(nil), // 22: livekit.ParticipantUpdate - (*UpdateSubscription)(nil), // 23: livekit.UpdateSubscription - (*UpdateDataSubscription)(nil), // 24: livekit.UpdateDataSubscription - (*StoreDataBlobRequest)(nil), // 25: livekit.StoreDataBlobRequest - (*StoreDataBlobResponse)(nil), // 26: livekit.StoreDataBlobResponse - (*GetDataBlobRequest)(nil), // 27: livekit.GetDataBlobRequest - (*GetDataBlobResponse)(nil), // 28: livekit.GetDataBlobResponse - (*UpdateTrackSettings)(nil), // 29: livekit.UpdateTrackSettings - (*UpdateLocalAudioTrack)(nil), // 30: livekit.UpdateLocalAudioTrack - (*UpdateLocalVideoTrack)(nil), // 31: livekit.UpdateLocalVideoTrack - (*LeaveRequest)(nil), // 32: livekit.LeaveRequest - (*UpdateVideoLayers)(nil), // 33: livekit.UpdateVideoLayers - (*UpdateParticipantMetadata)(nil), // 34: livekit.UpdateParticipantMetadata - (*ICEServer)(nil), // 35: livekit.ICEServer - (*SpeakersChanged)(nil), // 36: livekit.SpeakersChanged - (*RoomUpdate)(nil), // 37: livekit.RoomUpdate - (*ConnectionQualityInfo)(nil), // 38: livekit.ConnectionQualityInfo - (*ConnectionQualityUpdate)(nil), // 39: livekit.ConnectionQualityUpdate - (*StreamStateInfo)(nil), // 40: livekit.StreamStateInfo - (*StreamStateUpdate)(nil), // 41: livekit.StreamStateUpdate - (*SubscribedQuality)(nil), // 42: livekit.SubscribedQuality - (*SubscribedCodec)(nil), // 43: livekit.SubscribedCodec - (*SubscribedQualityUpdate)(nil), // 44: livekit.SubscribedQualityUpdate - (*SubscribedAudioCodecUpdate)(nil), // 45: livekit.SubscribedAudioCodecUpdate - (*TrackPermission)(nil), // 46: livekit.TrackPermission - (*SubscriptionPermission)(nil), // 47: livekit.SubscriptionPermission - (*SubscriptionPermissionUpdate)(nil), // 48: livekit.SubscriptionPermissionUpdate - (*RoomMovedResponse)(nil), // 49: livekit.RoomMovedResponse - (*SyncState)(nil), // 50: livekit.SyncState - (*DataChannelReceiveState)(nil), // 51: livekit.DataChannelReceiveState - (*DataChannelInfo)(nil), // 52: livekit.DataChannelInfo - (*SimulateScenario)(nil), // 53: livekit.SimulateScenario - (*Ping)(nil), // 54: livekit.Ping - (*Pong)(nil), // 55: livekit.Pong - (*RegionSettings)(nil), // 56: livekit.RegionSettings - (*RegionInfo)(nil), // 57: livekit.RegionInfo - (*SubscriptionResponse)(nil), // 58: livekit.SubscriptionResponse - (*RequestResponse)(nil), // 59: livekit.RequestResponse - (*TrackSubscribed)(nil), // 60: livekit.TrackSubscribed - (*ConnectionSettings)(nil), // 61: livekit.ConnectionSettings - (*JoinRequest)(nil), // 62: livekit.JoinRequest - (*WrappedJoinRequest)(nil), // 63: livekit.WrappedJoinRequest - (*MediaSectionsRequirement)(nil), // 64: livekit.MediaSectionsRequirement - (*DataTrackSubscriberHandles_PublishedDataTrack)(nil), // 65: livekit.DataTrackSubscriberHandles.PublishedDataTrack - nil, // 66: livekit.DataTrackSubscriberHandles.SubHandlesEntry - nil, // 67: livekit.SessionDescription.MidToTrackIdEntry - (*UpdateDataSubscription_Update)(nil), // 68: livekit.UpdateDataSubscription.Update - nil, // 69: livekit.UpdateParticipantMetadata.AttributesEntry - nil, // 70: livekit.JoinRequest.ParticipantAttributesEntry - (*VideoLayer)(nil), // 71: livekit.VideoLayer - (VideoLayer_Mode)(0), // 72: livekit.VideoLayer.Mode - (TrackType)(0), // 73: livekit.TrackType - (TrackSource)(0), // 74: livekit.TrackSource - (Encryption_Type)(0), // 75: livekit.Encryption.Type - (BackupCodecPolicy)(0), // 76: livekit.BackupCodecPolicy - (AudioTrackFeature)(0), // 77: livekit.AudioTrackFeature - (PacketTrailerFeature)(0), // 78: livekit.PacketTrailerFeature - (*DataTrackFrameEncoding)(nil), // 79: livekit.DataTrackFrameEncoding - (*DataTrackSchemaId)(nil), // 80: livekit.DataTrackSchemaId - (*DataTrackInfo)(nil), // 81: livekit.DataTrackInfo - (*Room)(nil), // 82: livekit.Room - (*ParticipantInfo)(nil), // 83: livekit.ParticipantInfo - (*ClientConfiguration)(nil), // 84: livekit.ClientConfiguration - (*ServerInfo)(nil), // 85: livekit.ServerInfo - (*Codec)(nil), // 86: livekit.Codec - (*TrackInfo)(nil), // 87: livekit.TrackInfo - (*ParticipantTracks)(nil), // 88: livekit.ParticipantTracks - (*DataBlob)(nil), // 89: livekit.DataBlob - (*DataBlobKey)(nil), // 90: livekit.DataBlobKey - (VideoQuality)(0), // 91: livekit.VideoQuality - (DisconnectReason)(0), // 92: livekit.DisconnectReason - (*SpeakerInfo)(nil), // 93: livekit.SpeakerInfo - (ConnectionQuality)(0), // 94: livekit.ConnectionQuality - (*SubscribedAudioCodec)(nil), // 95: livekit.SubscribedAudioCodec - (SubscriptionError)(0), // 96: livekit.SubscriptionError - (*ClientInfo)(nil), // 97: livekit.ClientInfo - (ReconnectReason)(0), // 98: livekit.ReconnectReason - (*DataTrackSubscriptionOptions)(nil), // 99: livekit.DataTrackSubscriptionOptions + (SignalCompression)(0), // 3: livekit.SignalCompression + (LeaveRequest_Action)(0), // 4: livekit.LeaveRequest.Action + (RequestResponse_Reason)(0), // 5: livekit.RequestResponse.Reason + (WrappedJoinRequest_Compression)(0), // 6: livekit.WrappedJoinRequest.Compression + (*SignalRequest)(nil), // 7: livekit.SignalRequest + (*SignalResponse)(nil), // 8: livekit.SignalResponse + (*SimulcastCodec)(nil), // 9: livekit.SimulcastCodec + (*AddTrackRequest)(nil), // 10: livekit.AddTrackRequest + (*PublishDataTrackRequest)(nil), // 11: livekit.PublishDataTrackRequest + (*PublishDataTrackResponse)(nil), // 12: livekit.PublishDataTrackResponse + (*UnpublishDataTrackRequest)(nil), // 13: livekit.UnpublishDataTrackRequest + (*UnpublishDataTrackResponse)(nil), // 14: livekit.UnpublishDataTrackResponse + (*DataTrackSubscriberHandles)(nil), // 15: livekit.DataTrackSubscriberHandles + (*TrickleRequest)(nil), // 16: livekit.TrickleRequest + (*MuteTrackRequest)(nil), // 17: livekit.MuteTrackRequest + (*JoinResponse)(nil), // 18: livekit.JoinResponse + (*ReconnectResponse)(nil), // 19: livekit.ReconnectResponse + (*TrackPublishedResponse)(nil), // 20: livekit.TrackPublishedResponse + (*TrackUnpublishedResponse)(nil), // 21: livekit.TrackUnpublishedResponse + (*SessionDescription)(nil), // 22: livekit.SessionDescription + (*ParticipantUpdate)(nil), // 23: livekit.ParticipantUpdate + (*UpdateSubscription)(nil), // 24: livekit.UpdateSubscription + (*UpdateDataSubscription)(nil), // 25: livekit.UpdateDataSubscription + (*StoreDataBlobRequest)(nil), // 26: livekit.StoreDataBlobRequest + (*StoreDataBlobResponse)(nil), // 27: livekit.StoreDataBlobResponse + (*GetDataBlobRequest)(nil), // 28: livekit.GetDataBlobRequest + (*GetDataBlobResponse)(nil), // 29: livekit.GetDataBlobResponse + (*UpdateTrackSettings)(nil), // 30: livekit.UpdateTrackSettings + (*UpdateLocalAudioTrack)(nil), // 31: livekit.UpdateLocalAudioTrack + (*UpdateLocalVideoTrack)(nil), // 32: livekit.UpdateLocalVideoTrack + (*LeaveRequest)(nil), // 33: livekit.LeaveRequest + (*UpdateVideoLayers)(nil), // 34: livekit.UpdateVideoLayers + (*UpdateParticipantMetadata)(nil), // 35: livekit.UpdateParticipantMetadata + (*ICEServer)(nil), // 36: livekit.ICEServer + (*SpeakersChanged)(nil), // 37: livekit.SpeakersChanged + (*RoomUpdate)(nil), // 38: livekit.RoomUpdate + (*ConnectionQualityInfo)(nil), // 39: livekit.ConnectionQualityInfo + (*ConnectionQualityUpdate)(nil), // 40: livekit.ConnectionQualityUpdate + (*StreamStateInfo)(nil), // 41: livekit.StreamStateInfo + (*StreamStateUpdate)(nil), // 42: livekit.StreamStateUpdate + (*SubscribedQuality)(nil), // 43: livekit.SubscribedQuality + (*SubscribedCodec)(nil), // 44: livekit.SubscribedCodec + (*SubscribedQualityUpdate)(nil), // 45: livekit.SubscribedQualityUpdate + (*SubscribedAudioCodecUpdate)(nil), // 46: livekit.SubscribedAudioCodecUpdate + (*TrackPermission)(nil), // 47: livekit.TrackPermission + (*SubscriptionPermission)(nil), // 48: livekit.SubscriptionPermission + (*SubscriptionPermissionUpdate)(nil), // 49: livekit.SubscriptionPermissionUpdate + (*RoomMovedResponse)(nil), // 50: livekit.RoomMovedResponse + (*SyncState)(nil), // 51: livekit.SyncState + (*DataChannelReceiveState)(nil), // 52: livekit.DataChannelReceiveState + (*DataChannelInfo)(nil), // 53: livekit.DataChannelInfo + (*SimulateScenario)(nil), // 54: livekit.SimulateScenario + (*Ping)(nil), // 55: livekit.Ping + (*Pong)(nil), // 56: livekit.Pong + (*RegionSettings)(nil), // 57: livekit.RegionSettings + (*RegionInfo)(nil), // 58: livekit.RegionInfo + (*SubscriptionResponse)(nil), // 59: livekit.SubscriptionResponse + (*RequestResponse)(nil), // 60: livekit.RequestResponse + (*TrackSubscribed)(nil), // 61: livekit.TrackSubscribed + (*ConnectionSettings)(nil), // 62: livekit.ConnectionSettings + (*JoinRequest)(nil), // 63: livekit.JoinRequest + (*WrappedJoinRequest)(nil), // 64: livekit.WrappedJoinRequest + (*WrappedSignalRequest)(nil), // 65: livekit.WrappedSignalRequest + (*WrappedSignalResponse)(nil), // 66: livekit.WrappedSignalResponse + (*MediaSectionsRequirement)(nil), // 67: livekit.MediaSectionsRequirement + (*DataTrackSubscriberHandles_PublishedDataTrack)(nil), // 68: livekit.DataTrackSubscriberHandles.PublishedDataTrack + nil, // 69: livekit.DataTrackSubscriberHandles.SubHandlesEntry + nil, // 70: livekit.SessionDescription.MidToTrackIdEntry + (*UpdateDataSubscription_Update)(nil), // 71: livekit.UpdateDataSubscription.Update + nil, // 72: livekit.UpdateParticipantMetadata.AttributesEntry + nil, // 73: livekit.JoinRequest.ParticipantAttributesEntry + (*VideoLayer)(nil), // 74: livekit.VideoLayer + (VideoLayer_Mode)(0), // 75: livekit.VideoLayer.Mode + (TrackType)(0), // 76: livekit.TrackType + (TrackSource)(0), // 77: livekit.TrackSource + (Encryption_Type)(0), // 78: livekit.Encryption.Type + (BackupCodecPolicy)(0), // 79: livekit.BackupCodecPolicy + (AudioTrackFeature)(0), // 80: livekit.AudioTrackFeature + (PacketTrailerFeature)(0), // 81: livekit.PacketTrailerFeature + (*DataTrackFrameEncoding)(nil), // 82: livekit.DataTrackFrameEncoding + (*DataTrackSchemaId)(nil), // 83: livekit.DataTrackSchemaId + (*DataTrackInfo)(nil), // 84: livekit.DataTrackInfo + (*Room)(nil), // 85: livekit.Room + (*ParticipantInfo)(nil), // 86: livekit.ParticipantInfo + (*ClientConfiguration)(nil), // 87: livekit.ClientConfiguration + (*ServerInfo)(nil), // 88: livekit.ServerInfo + (*Codec)(nil), // 89: livekit.Codec + (*TrackInfo)(nil), // 90: livekit.TrackInfo + (*ParticipantTracks)(nil), // 91: livekit.ParticipantTracks + (*DataBlob)(nil), // 92: livekit.DataBlob + (*DataBlobKey)(nil), // 93: livekit.DataBlobKey + (VideoQuality)(0), // 94: livekit.VideoQuality + (DisconnectReason)(0), // 95: livekit.DisconnectReason + (*SpeakerInfo)(nil), // 96: livekit.SpeakerInfo + (ConnectionQuality)(0), // 97: livekit.ConnectionQuality + (*SubscribedAudioCodec)(nil), // 98: livekit.SubscribedAudioCodec + (SubscriptionError)(0), // 99: livekit.SubscriptionError + (*ClientInfo)(nil), // 100: livekit.ClientInfo + (ReconnectReason)(0), // 101: livekit.ReconnectReason + (*DataTrackSubscriptionOptions)(nil), // 102: livekit.DataTrackSubscriptionOptions } var file_livekit_rtc_proto_depIdxs = []int32{ - 21, // 0: livekit.SignalRequest.offer:type_name -> livekit.SessionDescription - 21, // 1: livekit.SignalRequest.answer:type_name -> livekit.SessionDescription - 15, // 2: livekit.SignalRequest.trickle:type_name -> livekit.TrickleRequest - 9, // 3: livekit.SignalRequest.add_track:type_name -> livekit.AddTrackRequest - 16, // 4: livekit.SignalRequest.mute:type_name -> livekit.MuteTrackRequest - 23, // 5: livekit.SignalRequest.subscription:type_name -> livekit.UpdateSubscription - 29, // 6: livekit.SignalRequest.track_setting:type_name -> livekit.UpdateTrackSettings - 32, // 7: livekit.SignalRequest.leave:type_name -> livekit.LeaveRequest - 33, // 8: livekit.SignalRequest.update_layers:type_name -> livekit.UpdateVideoLayers - 47, // 9: livekit.SignalRequest.subscription_permission:type_name -> livekit.SubscriptionPermission - 50, // 10: livekit.SignalRequest.sync_state:type_name -> livekit.SyncState - 53, // 11: livekit.SignalRequest.simulate:type_name -> livekit.SimulateScenario - 34, // 12: livekit.SignalRequest.update_metadata:type_name -> livekit.UpdateParticipantMetadata - 54, // 13: livekit.SignalRequest.ping_req:type_name -> livekit.Ping - 30, // 14: livekit.SignalRequest.update_audio_track:type_name -> livekit.UpdateLocalAudioTrack - 31, // 15: livekit.SignalRequest.update_video_track:type_name -> livekit.UpdateLocalVideoTrack - 10, // 16: livekit.SignalRequest.publish_data_track_request:type_name -> livekit.PublishDataTrackRequest - 12, // 17: livekit.SignalRequest.unpublish_data_track_request:type_name -> livekit.UnpublishDataTrackRequest - 24, // 18: livekit.SignalRequest.update_data_subscription:type_name -> livekit.UpdateDataSubscription - 25, // 19: livekit.SignalRequest.store_data_blob_request:type_name -> livekit.StoreDataBlobRequest - 27, // 20: livekit.SignalRequest.get_data_blob_request:type_name -> livekit.GetDataBlobRequest - 17, // 21: livekit.SignalResponse.join:type_name -> livekit.JoinResponse - 21, // 22: livekit.SignalResponse.answer:type_name -> livekit.SessionDescription - 21, // 23: livekit.SignalResponse.offer:type_name -> livekit.SessionDescription - 15, // 24: livekit.SignalResponse.trickle:type_name -> livekit.TrickleRequest - 22, // 25: livekit.SignalResponse.update:type_name -> livekit.ParticipantUpdate - 19, // 26: livekit.SignalResponse.track_published:type_name -> livekit.TrackPublishedResponse - 32, // 27: livekit.SignalResponse.leave:type_name -> livekit.LeaveRequest - 16, // 28: livekit.SignalResponse.mute:type_name -> livekit.MuteTrackRequest - 36, // 29: livekit.SignalResponse.speakers_changed:type_name -> livekit.SpeakersChanged - 37, // 30: livekit.SignalResponse.room_update:type_name -> livekit.RoomUpdate - 39, // 31: livekit.SignalResponse.connection_quality:type_name -> livekit.ConnectionQualityUpdate - 41, // 32: livekit.SignalResponse.stream_state_update:type_name -> livekit.StreamStateUpdate - 44, // 33: livekit.SignalResponse.subscribed_quality_update:type_name -> livekit.SubscribedQualityUpdate - 48, // 34: livekit.SignalResponse.subscription_permission_update:type_name -> livekit.SubscriptionPermissionUpdate - 20, // 35: livekit.SignalResponse.track_unpublished:type_name -> livekit.TrackUnpublishedResponse - 18, // 36: livekit.SignalResponse.reconnect:type_name -> livekit.ReconnectResponse - 55, // 37: livekit.SignalResponse.pong_resp:type_name -> livekit.Pong - 58, // 38: livekit.SignalResponse.subscription_response:type_name -> livekit.SubscriptionResponse - 59, // 39: livekit.SignalResponse.request_response:type_name -> livekit.RequestResponse - 60, // 40: livekit.SignalResponse.track_subscribed:type_name -> livekit.TrackSubscribed - 49, // 41: livekit.SignalResponse.room_moved:type_name -> livekit.RoomMovedResponse - 64, // 42: livekit.SignalResponse.media_sections_requirement:type_name -> livekit.MediaSectionsRequirement - 45, // 43: livekit.SignalResponse.subscribed_audio_codec_update:type_name -> livekit.SubscribedAudioCodecUpdate - 11, // 44: livekit.SignalResponse.publish_data_track_response:type_name -> livekit.PublishDataTrackResponse - 13, // 45: livekit.SignalResponse.unpublish_data_track_response:type_name -> livekit.UnpublishDataTrackResponse - 14, // 46: livekit.SignalResponse.data_track_subscriber_handles:type_name -> livekit.DataTrackSubscriberHandles - 26, // 47: livekit.SignalResponse.store_data_blob_response:type_name -> livekit.StoreDataBlobResponse - 28, // 48: livekit.SignalResponse.get_data_blob_response:type_name -> livekit.GetDataBlobResponse - 71, // 49: livekit.SimulcastCodec.layers:type_name -> livekit.VideoLayer - 72, // 50: livekit.SimulcastCodec.video_layer_mode:type_name -> livekit.VideoLayer.Mode - 73, // 51: livekit.AddTrackRequest.type:type_name -> livekit.TrackType - 74, // 52: livekit.AddTrackRequest.source:type_name -> livekit.TrackSource - 71, // 53: livekit.AddTrackRequest.layers:type_name -> livekit.VideoLayer - 8, // 54: livekit.AddTrackRequest.simulcast_codecs:type_name -> livekit.SimulcastCodec - 75, // 55: livekit.AddTrackRequest.encryption:type_name -> livekit.Encryption.Type - 76, // 56: livekit.AddTrackRequest.backup_codec_policy:type_name -> livekit.BackupCodecPolicy - 77, // 57: livekit.AddTrackRequest.audio_features:type_name -> livekit.AudioTrackFeature - 78, // 58: livekit.AddTrackRequest.packet_trailer_features:type_name -> livekit.PacketTrailerFeature - 75, // 59: livekit.PublishDataTrackRequest.encryption:type_name -> livekit.Encryption.Type - 79, // 60: livekit.PublishDataTrackRequest.frame_encoding:type_name -> livekit.DataTrackFrameEncoding - 80, // 61: livekit.PublishDataTrackRequest.schema:type_name -> livekit.DataTrackSchemaId - 81, // 62: livekit.PublishDataTrackResponse.info:type_name -> livekit.DataTrackInfo - 81, // 63: livekit.UnpublishDataTrackResponse.info:type_name -> livekit.DataTrackInfo - 66, // 64: livekit.DataTrackSubscriberHandles.sub_handles:type_name -> livekit.DataTrackSubscriberHandles.SubHandlesEntry + 22, // 0: livekit.SignalRequest.offer:type_name -> livekit.SessionDescription + 22, // 1: livekit.SignalRequest.answer:type_name -> livekit.SessionDescription + 16, // 2: livekit.SignalRequest.trickle:type_name -> livekit.TrickleRequest + 10, // 3: livekit.SignalRequest.add_track:type_name -> livekit.AddTrackRequest + 17, // 4: livekit.SignalRequest.mute:type_name -> livekit.MuteTrackRequest + 24, // 5: livekit.SignalRequest.subscription:type_name -> livekit.UpdateSubscription + 30, // 6: livekit.SignalRequest.track_setting:type_name -> livekit.UpdateTrackSettings + 33, // 7: livekit.SignalRequest.leave:type_name -> livekit.LeaveRequest + 34, // 8: livekit.SignalRequest.update_layers:type_name -> livekit.UpdateVideoLayers + 48, // 9: livekit.SignalRequest.subscription_permission:type_name -> livekit.SubscriptionPermission + 51, // 10: livekit.SignalRequest.sync_state:type_name -> livekit.SyncState + 54, // 11: livekit.SignalRequest.simulate:type_name -> livekit.SimulateScenario + 35, // 12: livekit.SignalRequest.update_metadata:type_name -> livekit.UpdateParticipantMetadata + 55, // 13: livekit.SignalRequest.ping_req:type_name -> livekit.Ping + 31, // 14: livekit.SignalRequest.update_audio_track:type_name -> livekit.UpdateLocalAudioTrack + 32, // 15: livekit.SignalRequest.update_video_track:type_name -> livekit.UpdateLocalVideoTrack + 11, // 16: livekit.SignalRequest.publish_data_track_request:type_name -> livekit.PublishDataTrackRequest + 13, // 17: livekit.SignalRequest.unpublish_data_track_request:type_name -> livekit.UnpublishDataTrackRequest + 25, // 18: livekit.SignalRequest.update_data_subscription:type_name -> livekit.UpdateDataSubscription + 26, // 19: livekit.SignalRequest.store_data_blob_request:type_name -> livekit.StoreDataBlobRequest + 28, // 20: livekit.SignalRequest.get_data_blob_request:type_name -> livekit.GetDataBlobRequest + 18, // 21: livekit.SignalResponse.join:type_name -> livekit.JoinResponse + 22, // 22: livekit.SignalResponse.answer:type_name -> livekit.SessionDescription + 22, // 23: livekit.SignalResponse.offer:type_name -> livekit.SessionDescription + 16, // 24: livekit.SignalResponse.trickle:type_name -> livekit.TrickleRequest + 23, // 25: livekit.SignalResponse.update:type_name -> livekit.ParticipantUpdate + 20, // 26: livekit.SignalResponse.track_published:type_name -> livekit.TrackPublishedResponse + 33, // 27: livekit.SignalResponse.leave:type_name -> livekit.LeaveRequest + 17, // 28: livekit.SignalResponse.mute:type_name -> livekit.MuteTrackRequest + 37, // 29: livekit.SignalResponse.speakers_changed:type_name -> livekit.SpeakersChanged + 38, // 30: livekit.SignalResponse.room_update:type_name -> livekit.RoomUpdate + 40, // 31: livekit.SignalResponse.connection_quality:type_name -> livekit.ConnectionQualityUpdate + 42, // 32: livekit.SignalResponse.stream_state_update:type_name -> livekit.StreamStateUpdate + 45, // 33: livekit.SignalResponse.subscribed_quality_update:type_name -> livekit.SubscribedQualityUpdate + 49, // 34: livekit.SignalResponse.subscription_permission_update:type_name -> livekit.SubscriptionPermissionUpdate + 21, // 35: livekit.SignalResponse.track_unpublished:type_name -> livekit.TrackUnpublishedResponse + 19, // 36: livekit.SignalResponse.reconnect:type_name -> livekit.ReconnectResponse + 56, // 37: livekit.SignalResponse.pong_resp:type_name -> livekit.Pong + 59, // 38: livekit.SignalResponse.subscription_response:type_name -> livekit.SubscriptionResponse + 60, // 39: livekit.SignalResponse.request_response:type_name -> livekit.RequestResponse + 61, // 40: livekit.SignalResponse.track_subscribed:type_name -> livekit.TrackSubscribed + 50, // 41: livekit.SignalResponse.room_moved:type_name -> livekit.RoomMovedResponse + 67, // 42: livekit.SignalResponse.media_sections_requirement:type_name -> livekit.MediaSectionsRequirement + 46, // 43: livekit.SignalResponse.subscribed_audio_codec_update:type_name -> livekit.SubscribedAudioCodecUpdate + 12, // 44: livekit.SignalResponse.publish_data_track_response:type_name -> livekit.PublishDataTrackResponse + 14, // 45: livekit.SignalResponse.unpublish_data_track_response:type_name -> livekit.UnpublishDataTrackResponse + 15, // 46: livekit.SignalResponse.data_track_subscriber_handles:type_name -> livekit.DataTrackSubscriberHandles + 27, // 47: livekit.SignalResponse.store_data_blob_response:type_name -> livekit.StoreDataBlobResponse + 29, // 48: livekit.SignalResponse.get_data_blob_response:type_name -> livekit.GetDataBlobResponse + 74, // 49: livekit.SimulcastCodec.layers:type_name -> livekit.VideoLayer + 75, // 50: livekit.SimulcastCodec.video_layer_mode:type_name -> livekit.VideoLayer.Mode + 76, // 51: livekit.AddTrackRequest.type:type_name -> livekit.TrackType + 77, // 52: livekit.AddTrackRequest.source:type_name -> livekit.TrackSource + 74, // 53: livekit.AddTrackRequest.layers:type_name -> livekit.VideoLayer + 9, // 54: livekit.AddTrackRequest.simulcast_codecs:type_name -> livekit.SimulcastCodec + 78, // 55: livekit.AddTrackRequest.encryption:type_name -> livekit.Encryption.Type + 79, // 56: livekit.AddTrackRequest.backup_codec_policy:type_name -> livekit.BackupCodecPolicy + 80, // 57: livekit.AddTrackRequest.audio_features:type_name -> livekit.AudioTrackFeature + 81, // 58: livekit.AddTrackRequest.packet_trailer_features:type_name -> livekit.PacketTrailerFeature + 78, // 59: livekit.PublishDataTrackRequest.encryption:type_name -> livekit.Encryption.Type + 82, // 60: livekit.PublishDataTrackRequest.frame_encoding:type_name -> livekit.DataTrackFrameEncoding + 83, // 61: livekit.PublishDataTrackRequest.schema:type_name -> livekit.DataTrackSchemaId + 84, // 62: livekit.PublishDataTrackResponse.info:type_name -> livekit.DataTrackInfo + 84, // 63: livekit.UnpublishDataTrackResponse.info:type_name -> livekit.DataTrackInfo + 69, // 64: livekit.DataTrackSubscriberHandles.sub_handles:type_name -> livekit.DataTrackSubscriberHandles.SubHandlesEntry 0, // 65: livekit.TrickleRequest.target:type_name -> livekit.SignalTarget - 82, // 66: livekit.JoinResponse.room:type_name -> livekit.Room - 83, // 67: livekit.JoinResponse.participant:type_name -> livekit.ParticipantInfo - 83, // 68: livekit.JoinResponse.other_participants:type_name -> livekit.ParticipantInfo - 35, // 69: livekit.JoinResponse.ice_servers:type_name -> livekit.ICEServer - 84, // 70: livekit.JoinResponse.client_configuration:type_name -> livekit.ClientConfiguration - 85, // 71: livekit.JoinResponse.server_info:type_name -> livekit.ServerInfo - 86, // 72: livekit.JoinResponse.enabled_publish_codecs:type_name -> livekit.Codec - 35, // 73: livekit.ReconnectResponse.ice_servers:type_name -> livekit.ICEServer - 84, // 74: livekit.ReconnectResponse.client_configuration:type_name -> livekit.ClientConfiguration - 85, // 75: livekit.ReconnectResponse.server_info:type_name -> livekit.ServerInfo - 87, // 76: livekit.TrackPublishedResponse.track:type_name -> livekit.TrackInfo - 67, // 77: livekit.SessionDescription.mid_to_track_id:type_name -> livekit.SessionDescription.MidToTrackIdEntry - 83, // 78: livekit.ParticipantUpdate.participants:type_name -> livekit.ParticipantInfo - 88, // 79: livekit.UpdateSubscription.participant_tracks:type_name -> livekit.ParticipantTracks - 68, // 80: livekit.UpdateDataSubscription.updates:type_name -> livekit.UpdateDataSubscription.Update - 89, // 81: livekit.StoreDataBlobRequest.blob:type_name -> livekit.DataBlob - 90, // 82: livekit.StoreDataBlobResponse.key:type_name -> livekit.DataBlobKey - 90, // 83: livekit.GetDataBlobRequest.key:type_name -> livekit.DataBlobKey - 89, // 84: livekit.GetDataBlobResponse.blob:type_name -> livekit.DataBlob - 91, // 85: livekit.UpdateTrackSettings.quality:type_name -> livekit.VideoQuality - 77, // 86: livekit.UpdateLocalAudioTrack.features:type_name -> livekit.AudioTrackFeature - 92, // 87: livekit.LeaveRequest.reason:type_name -> livekit.DisconnectReason - 3, // 88: livekit.LeaveRequest.action:type_name -> livekit.LeaveRequest.Action - 56, // 89: livekit.LeaveRequest.regions:type_name -> livekit.RegionSettings - 71, // 90: livekit.UpdateVideoLayers.layers:type_name -> livekit.VideoLayer - 69, // 91: livekit.UpdateParticipantMetadata.attributes:type_name -> livekit.UpdateParticipantMetadata.AttributesEntry - 93, // 92: livekit.SpeakersChanged.speakers:type_name -> livekit.SpeakerInfo - 82, // 93: livekit.RoomUpdate.room:type_name -> livekit.Room - 94, // 94: livekit.ConnectionQualityInfo.quality:type_name -> livekit.ConnectionQuality - 38, // 95: livekit.ConnectionQualityUpdate.updates:type_name -> livekit.ConnectionQualityInfo + 85, // 66: livekit.JoinResponse.room:type_name -> livekit.Room + 86, // 67: livekit.JoinResponse.participant:type_name -> livekit.ParticipantInfo + 86, // 68: livekit.JoinResponse.other_participants:type_name -> livekit.ParticipantInfo + 36, // 69: livekit.JoinResponse.ice_servers:type_name -> livekit.ICEServer + 87, // 70: livekit.JoinResponse.client_configuration:type_name -> livekit.ClientConfiguration + 88, // 71: livekit.JoinResponse.server_info:type_name -> livekit.ServerInfo + 89, // 72: livekit.JoinResponse.enabled_publish_codecs:type_name -> livekit.Codec + 36, // 73: livekit.ReconnectResponse.ice_servers:type_name -> livekit.ICEServer + 87, // 74: livekit.ReconnectResponse.client_configuration:type_name -> livekit.ClientConfiguration + 88, // 75: livekit.ReconnectResponse.server_info:type_name -> livekit.ServerInfo + 90, // 76: livekit.TrackPublishedResponse.track:type_name -> livekit.TrackInfo + 70, // 77: livekit.SessionDescription.mid_to_track_id:type_name -> livekit.SessionDescription.MidToTrackIdEntry + 86, // 78: livekit.ParticipantUpdate.participants:type_name -> livekit.ParticipantInfo + 91, // 79: livekit.UpdateSubscription.participant_tracks:type_name -> livekit.ParticipantTracks + 71, // 80: livekit.UpdateDataSubscription.updates:type_name -> livekit.UpdateDataSubscription.Update + 92, // 81: livekit.StoreDataBlobRequest.blob:type_name -> livekit.DataBlob + 93, // 82: livekit.StoreDataBlobResponse.key:type_name -> livekit.DataBlobKey + 93, // 83: livekit.GetDataBlobRequest.key:type_name -> livekit.DataBlobKey + 92, // 84: livekit.GetDataBlobResponse.blob:type_name -> livekit.DataBlob + 94, // 85: livekit.UpdateTrackSettings.quality:type_name -> livekit.VideoQuality + 80, // 86: livekit.UpdateLocalAudioTrack.features:type_name -> livekit.AudioTrackFeature + 95, // 87: livekit.LeaveRequest.reason:type_name -> livekit.DisconnectReason + 4, // 88: livekit.LeaveRequest.action:type_name -> livekit.LeaveRequest.Action + 57, // 89: livekit.LeaveRequest.regions:type_name -> livekit.RegionSettings + 74, // 90: livekit.UpdateVideoLayers.layers:type_name -> livekit.VideoLayer + 72, // 91: livekit.UpdateParticipantMetadata.attributes:type_name -> livekit.UpdateParticipantMetadata.AttributesEntry + 96, // 92: livekit.SpeakersChanged.speakers:type_name -> livekit.SpeakerInfo + 85, // 93: livekit.RoomUpdate.room:type_name -> livekit.Room + 97, // 94: livekit.ConnectionQualityInfo.quality:type_name -> livekit.ConnectionQuality + 39, // 95: livekit.ConnectionQualityUpdate.updates:type_name -> livekit.ConnectionQualityInfo 1, // 96: livekit.StreamStateInfo.state:type_name -> livekit.StreamState - 40, // 97: livekit.StreamStateUpdate.stream_states:type_name -> livekit.StreamStateInfo - 91, // 98: livekit.SubscribedQuality.quality:type_name -> livekit.VideoQuality - 42, // 99: livekit.SubscribedCodec.qualities:type_name -> livekit.SubscribedQuality - 42, // 100: livekit.SubscribedQualityUpdate.subscribed_qualities:type_name -> livekit.SubscribedQuality - 43, // 101: livekit.SubscribedQualityUpdate.subscribed_codecs:type_name -> livekit.SubscribedCodec - 95, // 102: livekit.SubscribedAudioCodecUpdate.subscribed_audio_codecs:type_name -> livekit.SubscribedAudioCodec - 46, // 103: livekit.SubscriptionPermission.track_permissions:type_name -> livekit.TrackPermission - 82, // 104: livekit.RoomMovedResponse.room:type_name -> livekit.Room - 83, // 105: livekit.RoomMovedResponse.participant:type_name -> livekit.ParticipantInfo - 83, // 106: livekit.RoomMovedResponse.other_participants:type_name -> livekit.ParticipantInfo - 21, // 107: livekit.SyncState.answer:type_name -> livekit.SessionDescription - 23, // 108: livekit.SyncState.subscription:type_name -> livekit.UpdateSubscription - 19, // 109: livekit.SyncState.publish_tracks:type_name -> livekit.TrackPublishedResponse - 52, // 110: livekit.SyncState.data_channels:type_name -> livekit.DataChannelInfo - 21, // 111: livekit.SyncState.offer:type_name -> livekit.SessionDescription - 51, // 112: livekit.SyncState.datachannel_receive_states:type_name -> livekit.DataChannelReceiveState - 11, // 113: livekit.SyncState.publish_data_tracks:type_name -> livekit.PublishDataTrackResponse - 24, // 114: livekit.SyncState.data_subscription:type_name -> livekit.UpdateDataSubscription + 41, // 97: livekit.StreamStateUpdate.stream_states:type_name -> livekit.StreamStateInfo + 94, // 98: livekit.SubscribedQuality.quality:type_name -> livekit.VideoQuality + 43, // 99: livekit.SubscribedCodec.qualities:type_name -> livekit.SubscribedQuality + 43, // 100: livekit.SubscribedQualityUpdate.subscribed_qualities:type_name -> livekit.SubscribedQuality + 44, // 101: livekit.SubscribedQualityUpdate.subscribed_codecs:type_name -> livekit.SubscribedCodec + 98, // 102: livekit.SubscribedAudioCodecUpdate.subscribed_audio_codecs:type_name -> livekit.SubscribedAudioCodec + 47, // 103: livekit.SubscriptionPermission.track_permissions:type_name -> livekit.TrackPermission + 85, // 104: livekit.RoomMovedResponse.room:type_name -> livekit.Room + 86, // 105: livekit.RoomMovedResponse.participant:type_name -> livekit.ParticipantInfo + 86, // 106: livekit.RoomMovedResponse.other_participants:type_name -> livekit.ParticipantInfo + 22, // 107: livekit.SyncState.answer:type_name -> livekit.SessionDescription + 24, // 108: livekit.SyncState.subscription:type_name -> livekit.UpdateSubscription + 20, // 109: livekit.SyncState.publish_tracks:type_name -> livekit.TrackPublishedResponse + 53, // 110: livekit.SyncState.data_channels:type_name -> livekit.DataChannelInfo + 22, // 111: livekit.SyncState.offer:type_name -> livekit.SessionDescription + 52, // 112: livekit.SyncState.datachannel_receive_states:type_name -> livekit.DataChannelReceiveState + 12, // 113: livekit.SyncState.publish_data_tracks:type_name -> livekit.PublishDataTrackResponse + 25, // 114: livekit.SyncState.data_subscription:type_name -> livekit.UpdateDataSubscription 0, // 115: livekit.DataChannelInfo.target:type_name -> livekit.SignalTarget 2, // 116: livekit.SimulateScenario.switch_candidate_protocol:type_name -> livekit.CandidateProtocol - 57, // 117: livekit.RegionSettings.regions:type_name -> livekit.RegionInfo - 96, // 118: livekit.SubscriptionResponse.err:type_name -> livekit.SubscriptionError - 4, // 119: livekit.RequestResponse.reason:type_name -> livekit.RequestResponse.Reason - 15, // 120: livekit.RequestResponse.trickle:type_name -> livekit.TrickleRequest - 9, // 121: livekit.RequestResponse.add_track:type_name -> livekit.AddTrackRequest - 16, // 122: livekit.RequestResponse.mute:type_name -> livekit.MuteTrackRequest - 34, // 123: livekit.RequestResponse.update_metadata:type_name -> livekit.UpdateParticipantMetadata - 30, // 124: livekit.RequestResponse.update_audio_track:type_name -> livekit.UpdateLocalAudioTrack - 31, // 125: livekit.RequestResponse.update_video_track:type_name -> livekit.UpdateLocalVideoTrack - 10, // 126: livekit.RequestResponse.publish_data_track:type_name -> livekit.PublishDataTrackRequest - 12, // 127: livekit.RequestResponse.unpublish_data_track:type_name -> livekit.UnpublishDataTrackRequest - 97, // 128: livekit.JoinRequest.client_info:type_name -> livekit.ClientInfo - 61, // 129: livekit.JoinRequest.connection_settings:type_name -> livekit.ConnectionSettings - 70, // 130: livekit.JoinRequest.participant_attributes:type_name -> livekit.JoinRequest.ParticipantAttributesEntry - 9, // 131: livekit.JoinRequest.add_track_requests:type_name -> livekit.AddTrackRequest - 21, // 132: livekit.JoinRequest.publisher_offer:type_name -> livekit.SessionDescription - 98, // 133: livekit.JoinRequest.reconnect_reason:type_name -> livekit.ReconnectReason - 50, // 134: livekit.JoinRequest.sync_state:type_name -> livekit.SyncState - 5, // 135: livekit.WrappedJoinRequest.compression:type_name -> livekit.WrappedJoinRequest.Compression - 65, // 136: livekit.DataTrackSubscriberHandles.SubHandlesEntry.value:type_name -> livekit.DataTrackSubscriberHandles.PublishedDataTrack - 99, // 137: livekit.UpdateDataSubscription.Update.options:type_name -> livekit.DataTrackSubscriptionOptions - 138, // [138:138] is the sub-list for method output_type - 138, // [138:138] is the sub-list for method input_type - 138, // [138:138] is the sub-list for extension type_name - 138, // [138:138] is the sub-list for extension extendee - 0, // [0:138] is the sub-list for field type_name + 58, // 117: livekit.RegionSettings.regions:type_name -> livekit.RegionInfo + 99, // 118: livekit.SubscriptionResponse.err:type_name -> livekit.SubscriptionError + 5, // 119: livekit.RequestResponse.reason:type_name -> livekit.RequestResponse.Reason + 16, // 120: livekit.RequestResponse.trickle:type_name -> livekit.TrickleRequest + 10, // 121: livekit.RequestResponse.add_track:type_name -> livekit.AddTrackRequest + 17, // 122: livekit.RequestResponse.mute:type_name -> livekit.MuteTrackRequest + 35, // 123: livekit.RequestResponse.update_metadata:type_name -> livekit.UpdateParticipantMetadata + 31, // 124: livekit.RequestResponse.update_audio_track:type_name -> livekit.UpdateLocalAudioTrack + 32, // 125: livekit.RequestResponse.update_video_track:type_name -> livekit.UpdateLocalVideoTrack + 11, // 126: livekit.RequestResponse.publish_data_track:type_name -> livekit.PublishDataTrackRequest + 13, // 127: livekit.RequestResponse.unpublish_data_track:type_name -> livekit.UnpublishDataTrackRequest + 100, // 128: livekit.JoinRequest.client_info:type_name -> livekit.ClientInfo + 62, // 129: livekit.JoinRequest.connection_settings:type_name -> livekit.ConnectionSettings + 73, // 130: livekit.JoinRequest.participant_attributes:type_name -> livekit.JoinRequest.ParticipantAttributesEntry + 10, // 131: livekit.JoinRequest.add_track_requests:type_name -> livekit.AddTrackRequest + 22, // 132: livekit.JoinRequest.publisher_offer:type_name -> livekit.SessionDescription + 101, // 133: livekit.JoinRequest.reconnect_reason:type_name -> livekit.ReconnectReason + 51, // 134: livekit.JoinRequest.sync_state:type_name -> livekit.SyncState + 6, // 135: livekit.WrappedJoinRequest.compression:type_name -> livekit.WrappedJoinRequest.Compression + 3, // 136: livekit.WrappedSignalRequest.compression:type_name -> livekit.SignalCompression + 3, // 137: livekit.WrappedSignalResponse.compression:type_name -> livekit.SignalCompression + 68, // 138: livekit.DataTrackSubscriberHandles.SubHandlesEntry.value:type_name -> livekit.DataTrackSubscriberHandles.PublishedDataTrack + 102, // 139: livekit.UpdateDataSubscription.Update.options:type_name -> livekit.DataTrackSubscriptionOptions + 140, // [140:140] is the sub-list for method output_type + 140, // [140:140] is the sub-list for method input_type + 140, // [140:140] is the sub-list for extension type_name + 140, // [140:140] is the sub-list for extension extendee + 0, // [0:140] is the sub-list for field type_name } func init() { file_livekit_rtc_proto_init() } @@ -6104,8 +6329,8 @@ func file_livekit_rtc_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_livekit_rtc_proto_rawDesc), len(file_livekit_rtc_proto_rawDesc)), - NumEnums: 6, - NumMessages: 65, + NumEnums: 7, + NumMessages: 67, NumExtensions: 0, NumServices: 0, }, From 8ed16ab666cd63031177e490e1a89f35c3466cec Mon Sep 17 00:00:00 2001 From: shijing xian Date: Fri, 28 Aug 2026 15:23:04 -0700 Subject: [PATCH 03/10] signalling: share one compression type across both envelopes Replaces the top-level `SignalCompression` enum with a holder message carrying a nested `Type`. Both envelopes now reference `SignalCompression.Type`. The top-level form forced prefixed value names: enum values follow C++ scoping and are siblings of their type, so a bare `NONE` collides with the one already declared in livekit_sip.proto -- verified against protoc, which rejects it outright. Nesting scopes the values, so `NONE`/`GZIP`/`DEFLATE_RAW` read the same way as every other enum in this file. Nesting an enum inside each envelope, mirroring WrappedJoinRequest exactly, would also have avoided the prefix, but at the cost of two structurally identical yet type-incompatible enums. Compression is naturally generic over direction -- the SFU's own internal implementation threads a single compression type through both the request and response paths -- and splitting the type would force conversion code on every implementation for no gain. Value numbers match WrappedJoinRequest.Compression rather than ranking the options; two enums in one file where GZIP has different numbers invites mistakes. Co-Authored-By: Claude Opus 5 (1M context) --- .changeset/signal-payload-compression.md | 2 +- protobufs/livekit_rtc.proto | 35 +++++++++++++++--------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/.changeset/signal-payload-compression.md b/.changeset/signal-payload-compression.md index b5d792cc0..df6bf555a 100644 --- a/.changeset/signal-payload-compression.md +++ b/.changeset/signal-payload-compression.md @@ -3,4 +3,4 @@ "@livekit/protocol": minor --- -signalling: add `WrappedSignalRequest` / `WrappedSignalResponse` envelopes and the `SignalCompression` enum, so signal messages on the WebSocket can be compressed the way `WrappedJoinRequest` already compresses the join payload in the connect URL. Negotiated via the existing `ClientInfo.CAP_COMPRESSION_DEFLATE_RAW` capability and acknowledged by the new `JoinResponse.signal_compression` / `ReconnectResponse.signal_compression` fields; unset means the existing uncompressed wire format is used, so old and new peers interoperate unchanged. +signalling: add `WrappedSignalRequest` / `WrappedSignalResponse` envelopes and the `SignalCompression.Type` enum, so signal messages on the WebSocket can be compressed the way `WrappedJoinRequest` already compresses the join payload in the connect URL. Negotiated via the existing `ClientInfo.CAP_COMPRESSION_DEFLATE_RAW` capability and acknowledged by the new `JoinResponse.signal_compression` / `ReconnectResponse.signal_compression` fields; unset means the existing uncompressed wire format is used, so old and new peers interoperate unchanged. diff --git a/protobufs/livekit_rtc.proto b/protobufs/livekit_rtc.proto index 8050ba4ad..94e50bd40 100644 --- a/protobufs/livekit_rtc.proto +++ b/protobufs/livekit_rtc.proto @@ -690,18 +690,27 @@ message WrappedJoinRequest { // How a wrapped signal payload was compressed. // -// DEFLATE_RAW is preferred over GZIP for per-message compression: it omits gzip's -// ~18 bytes of header and trailer, which is material when the median signal message -// is a few hundred bytes. GZIP is offered for implementations that already have a -// gzip codec wired up (WrappedJoinRequest uses it) and want to reuse it. +// A holder for the enum rather than a top-level enum, so that both directions can +// share one type while keeping bare value names: enum values follow C++ scoping and +// are siblings of their type, so a top-level `NONE` would collide with the one +// already declared in livekit_sip.proto. Nesting scopes them to this message. // -// Values are prefixed, unlike the older bare-valued enums in this file: top-level -// enum values share the package namespace, and a bare `NONE` would collide with the -// one already declared in livekit_sip.proto. -enum SignalCompression { - SIGNAL_COMPRESSION_NONE = 0; - SIGNAL_COMPRESSION_GZIP = 1; - SIGNAL_COMPRESSION_DEFLATE_RAW = 2; +// One shared type, rather than an enum nested in each envelope, because +// compress/decompress is naturally generic over direction -- the SFU's own +// implementation already threads a single compression type through both the request +// and response paths. +message SignalCompression { + enum Type { + NONE = 0; + // Numbered to match WrappedJoinRequest.Compression rather than to rank the + // options: two enums in one file where GZIP has different numbers is a trap for + // anyone mapping between them by hand. + GZIP = 1; + // Preferred for per-message compression: raw deflate omits gzip's ~18 bytes of + // header and trailer, which is material when the median signal message is a few + // hundred bytes. + DEFLATE_RAW = 2; + } } // Envelope for a compressed SignalRequest, mirroring WrappedJoinRequest. @@ -715,13 +724,13 @@ enum SignalCompression { // compression problem must never become a connection failure. Receivers MUST honour // whatever `compression` says regardless of size. message WrappedSignalRequest { - SignalCompression compression = 1; + SignalCompression.Type compression = 1; bytes signal_request = 2; // marshalled SignalRequest + potentially compressed } // Envelope for a compressed SignalResponse. See WrappedSignalRequest. message WrappedSignalResponse { - SignalCompression compression = 1; + SignalCompression.Type compression = 1; bytes signal_response = 2; // marshalled SignalResponse + potentially compressed } From 68c887897ded66ce27bbcdbab9e1e72b1b9f4af7 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 28 Aug 2026 22:24:58 +0000 Subject: [PATCH 04/10] generated protobuf --- livekit/livekit_rtc.pb.go | 437 +++++++++++++++++++++----------------- 1 file changed, 241 insertions(+), 196 deletions(-) diff --git a/livekit/livekit_rtc.pb.go b/livekit/livekit_rtc.pb.go index b8fa548ab..c8aeb2187 100644 --- a/livekit/livekit_rtc.pb.go +++ b/livekit/livekit_rtc.pb.go @@ -177,65 +177,6 @@ func (CandidateProtocol) EnumDescriptor() ([]byte, []int) { return file_livekit_rtc_proto_rawDescGZIP(), []int{2} } -// How a wrapped signal payload was compressed. -// -// DEFLATE_RAW is preferred over GZIP for per-message compression: it omits gzip's -// ~18 bytes of header and trailer, which is material when the median signal message -// is a few hundred bytes. GZIP is offered for implementations that already have a -// gzip codec wired up (WrappedJoinRequest uses it) and want to reuse it. -// -// Values are prefixed, unlike the older bare-valued enums in this file: top-level -// enum values share the package namespace, and a bare `NONE` would collide with the -// one already declared in livekit_sip.proto. -type SignalCompression int32 - -const ( - SignalCompression_SIGNAL_COMPRESSION_NONE SignalCompression = 0 - SignalCompression_SIGNAL_COMPRESSION_GZIP SignalCompression = 1 - SignalCompression_SIGNAL_COMPRESSION_DEFLATE_RAW SignalCompression = 2 -) - -// Enum value maps for SignalCompression. -var ( - SignalCompression_name = map[int32]string{ - 0: "SIGNAL_COMPRESSION_NONE", - 1: "SIGNAL_COMPRESSION_GZIP", - 2: "SIGNAL_COMPRESSION_DEFLATE_RAW", - } - SignalCompression_value = map[string]int32{ - "SIGNAL_COMPRESSION_NONE": 0, - "SIGNAL_COMPRESSION_GZIP": 1, - "SIGNAL_COMPRESSION_DEFLATE_RAW": 2, - } -) - -func (x SignalCompression) Enum() *SignalCompression { - p := new(SignalCompression) - *p = x - return p -} - -func (x SignalCompression) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (SignalCompression) Descriptor() protoreflect.EnumDescriptor { - return file_livekit_rtc_proto_enumTypes[3].Descriptor() -} - -func (SignalCompression) Type() protoreflect.EnumType { - return &file_livekit_rtc_proto_enumTypes[3] -} - -func (x SignalCompression) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use SignalCompression.Descriptor instead. -func (SignalCompression) EnumDescriptor() ([]byte, []int) { - return file_livekit_rtc_proto_rawDescGZIP(), []int{3} -} - // indicates action clients should take on receiving this message type LeaveRequest_Action int32 @@ -270,11 +211,11 @@ func (x LeaveRequest_Action) String() string { } func (LeaveRequest_Action) Descriptor() protoreflect.EnumDescriptor { - return file_livekit_rtc_proto_enumTypes[4].Descriptor() + return file_livekit_rtc_proto_enumTypes[3].Descriptor() } func (LeaveRequest_Action) Type() protoreflect.EnumType { - return &file_livekit_rtc_proto_enumTypes[4] + return &file_livekit_rtc_proto_enumTypes[3] } func (x LeaveRequest_Action) Number() protoreflect.EnumNumber { @@ -346,11 +287,11 @@ func (x RequestResponse_Reason) String() string { } func (RequestResponse_Reason) Descriptor() protoreflect.EnumDescriptor { - return file_livekit_rtc_proto_enumTypes[5].Descriptor() + return file_livekit_rtc_proto_enumTypes[4].Descriptor() } func (RequestResponse_Reason) Type() protoreflect.EnumType { - return &file_livekit_rtc_proto_enumTypes[5] + return &file_livekit_rtc_proto_enumTypes[4] } func (x RequestResponse_Reason) Number() protoreflect.EnumNumber { @@ -392,11 +333,11 @@ func (x WrappedJoinRequest_Compression) String() string { } func (WrappedJoinRequest_Compression) Descriptor() protoreflect.EnumDescriptor { - return file_livekit_rtc_proto_enumTypes[6].Descriptor() + return file_livekit_rtc_proto_enumTypes[5].Descriptor() } func (WrappedJoinRequest_Compression) Type() protoreflect.EnumType { - return &file_livekit_rtc_proto_enumTypes[6] + return &file_livekit_rtc_proto_enumTypes[5] } func (x WrappedJoinRequest_Compression) Number() protoreflect.EnumNumber { @@ -408,6 +349,61 @@ func (WrappedJoinRequest_Compression) EnumDescriptor() ([]byte, []int) { return file_livekit_rtc_proto_rawDescGZIP(), []int{57, 0} } +type SignalCompression_Type int32 + +const ( + SignalCompression_NONE SignalCompression_Type = 0 + // Numbered to match WrappedJoinRequest.Compression rather than to rank the + // options: two enums in one file where GZIP has different numbers is a trap for + // anyone mapping between them by hand. + SignalCompression_GZIP SignalCompression_Type = 1 + // Preferred for per-message compression: raw deflate omits gzip's ~18 bytes of + // header and trailer, which is material when the median signal message is a few + // hundred bytes. + SignalCompression_DEFLATE_RAW SignalCompression_Type = 2 +) + +// Enum value maps for SignalCompression_Type. +var ( + SignalCompression_Type_name = map[int32]string{ + 0: "NONE", + 1: "GZIP", + 2: "DEFLATE_RAW", + } + SignalCompression_Type_value = map[string]int32{ + "NONE": 0, + "GZIP": 1, + "DEFLATE_RAW": 2, + } +) + +func (x SignalCompression_Type) Enum() *SignalCompression_Type { + p := new(SignalCompression_Type) + *p = x + return p +} + +func (x SignalCompression_Type) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SignalCompression_Type) Descriptor() protoreflect.EnumDescriptor { + return file_livekit_rtc_proto_enumTypes[6].Descriptor() +} + +func (SignalCompression_Type) Type() protoreflect.EnumType { + return &file_livekit_rtc_proto_enumTypes[6] +} + +func (x SignalCompression_Type) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SignalCompression_Type.Descriptor instead. +func (SignalCompression_Type) EnumDescriptor() ([]byte, []int) { + return file_livekit_rtc_proto_rawDescGZIP(), []int{58, 0} +} + type SignalRequest struct { state protoimpl.MessageState `protogen:"open.v1"` // Types that are valid to be assigned to Message: @@ -5248,6 +5244,53 @@ func (x *WrappedJoinRequest) GetJoinRequest() []byte { return nil } +// How a wrapped signal payload was compressed. +// +// A holder for the enum rather than a top-level enum, so that both directions can +// share one type while keeping bare value names: enum values follow C++ scoping and +// are siblings of their type, so a top-level `NONE` would collide with the one +// already declared in livekit_sip.proto. Nesting scopes them to this message. +// +// One shared type, rather than an enum nested in each envelope, because +// compress/decompress is naturally generic over direction -- the SFU's own +// implementation already threads a single compression type through both the request +// and response paths. +type SignalCompression struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SignalCompression) Reset() { + *x = SignalCompression{} + mi := &file_livekit_rtc_proto_msgTypes[58] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SignalCompression) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignalCompression) ProtoMessage() {} + +func (x *SignalCompression) ProtoReflect() protoreflect.Message { + mi := &file_livekit_rtc_proto_msgTypes[58] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignalCompression.ProtoReflect.Descriptor instead. +func (*SignalCompression) Descriptor() ([]byte, []int) { + return file_livekit_rtc_proto_rawDescGZIP(), []int{58} +} + // Envelope for a compressed SignalRequest, mirroring WrappedJoinRequest. // // Used in place of a bare SignalRequest on the signalling WebSocket once both @@ -5260,7 +5303,7 @@ func (x *WrappedJoinRequest) GetJoinRequest() []byte { // whatever `compression` says regardless of size. type WrappedSignalRequest struct { state protoimpl.MessageState `protogen:"open.v1"` - Compression SignalCompression `protobuf:"varint,1,opt,name=compression,proto3,enum=livekit.SignalCompression" json:"compression,omitempty"` + Compression SignalCompression_Type `protobuf:"varint,1,opt,name=compression,proto3,enum=livekit.SignalCompression_Type" json:"compression,omitempty"` SignalRequest []byte `protobuf:"bytes,2,opt,name=signal_request,json=signalRequest,proto3" json:"signal_request,omitempty"` // marshalled SignalRequest + potentially compressed unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -5268,7 +5311,7 @@ type WrappedSignalRequest struct { func (x *WrappedSignalRequest) Reset() { *x = WrappedSignalRequest{} - mi := &file_livekit_rtc_proto_msgTypes[58] + mi := &file_livekit_rtc_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5280,7 +5323,7 @@ func (x *WrappedSignalRequest) String() string { func (*WrappedSignalRequest) ProtoMessage() {} func (x *WrappedSignalRequest) ProtoReflect() protoreflect.Message { - mi := &file_livekit_rtc_proto_msgTypes[58] + mi := &file_livekit_rtc_proto_msgTypes[59] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5293,14 +5336,14 @@ func (x *WrappedSignalRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WrappedSignalRequest.ProtoReflect.Descriptor instead. func (*WrappedSignalRequest) Descriptor() ([]byte, []int) { - return file_livekit_rtc_proto_rawDescGZIP(), []int{58} + return file_livekit_rtc_proto_rawDescGZIP(), []int{59} } -func (x *WrappedSignalRequest) GetCompression() SignalCompression { +func (x *WrappedSignalRequest) GetCompression() SignalCompression_Type { if x != nil { return x.Compression } - return SignalCompression_SIGNAL_COMPRESSION_NONE + return SignalCompression_NONE } func (x *WrappedSignalRequest) GetSignalRequest() []byte { @@ -5313,7 +5356,7 @@ func (x *WrappedSignalRequest) GetSignalRequest() []byte { // Envelope for a compressed SignalResponse. See WrappedSignalRequest. type WrappedSignalResponse struct { state protoimpl.MessageState `protogen:"open.v1"` - Compression SignalCompression `protobuf:"varint,1,opt,name=compression,proto3,enum=livekit.SignalCompression" json:"compression,omitempty"` + Compression SignalCompression_Type `protobuf:"varint,1,opt,name=compression,proto3,enum=livekit.SignalCompression_Type" json:"compression,omitempty"` SignalResponse []byte `protobuf:"bytes,2,opt,name=signal_response,json=signalResponse,proto3" json:"signal_response,omitempty"` // marshalled SignalResponse + potentially compressed unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -5321,7 +5364,7 @@ type WrappedSignalResponse struct { func (x *WrappedSignalResponse) Reset() { *x = WrappedSignalResponse{} - mi := &file_livekit_rtc_proto_msgTypes[59] + mi := &file_livekit_rtc_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5333,7 +5376,7 @@ func (x *WrappedSignalResponse) String() string { func (*WrappedSignalResponse) ProtoMessage() {} func (x *WrappedSignalResponse) ProtoReflect() protoreflect.Message { - mi := &file_livekit_rtc_proto_msgTypes[59] + mi := &file_livekit_rtc_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5346,14 +5389,14 @@ func (x *WrappedSignalResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WrappedSignalResponse.ProtoReflect.Descriptor instead. func (*WrappedSignalResponse) Descriptor() ([]byte, []int) { - return file_livekit_rtc_proto_rawDescGZIP(), []int{59} + return file_livekit_rtc_proto_rawDescGZIP(), []int{60} } -func (x *WrappedSignalResponse) GetCompression() SignalCompression { +func (x *WrappedSignalResponse) GetCompression() SignalCompression_Type { if x != nil { return x.Compression } - return SignalCompression_SIGNAL_COMPRESSION_NONE + return SignalCompression_NONE } func (x *WrappedSignalResponse) GetSignalResponse() []byte { @@ -5373,7 +5416,7 @@ type MediaSectionsRequirement struct { func (x *MediaSectionsRequirement) Reset() { *x = MediaSectionsRequirement{} - mi := &file_livekit_rtc_proto_msgTypes[60] + mi := &file_livekit_rtc_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5385,7 +5428,7 @@ func (x *MediaSectionsRequirement) String() string { func (*MediaSectionsRequirement) ProtoMessage() {} func (x *MediaSectionsRequirement) ProtoReflect() protoreflect.Message { - mi := &file_livekit_rtc_proto_msgTypes[60] + mi := &file_livekit_rtc_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5398,7 +5441,7 @@ func (x *MediaSectionsRequirement) ProtoReflect() protoreflect.Message { // Deprecated: Use MediaSectionsRequirement.ProtoReflect.Descriptor instead. func (*MediaSectionsRequirement) Descriptor() ([]byte, []int) { - return file_livekit_rtc_proto_rawDescGZIP(), []int{60} + return file_livekit_rtc_proto_rawDescGZIP(), []int{61} } func (x *MediaSectionsRequirement) GetNumAudios() uint32 { @@ -5426,7 +5469,7 @@ type DataTrackSubscriberHandles_PublishedDataTrack struct { func (x *DataTrackSubscriberHandles_PublishedDataTrack) Reset() { *x = DataTrackSubscriberHandles_PublishedDataTrack{} - mi := &file_livekit_rtc_proto_msgTypes[61] + mi := &file_livekit_rtc_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5438,7 +5481,7 @@ func (x *DataTrackSubscriberHandles_PublishedDataTrack) String() string { func (*DataTrackSubscriberHandles_PublishedDataTrack) ProtoMessage() {} func (x *DataTrackSubscriberHandles_PublishedDataTrack) ProtoReflect() protoreflect.Message { - mi := &file_livekit_rtc_proto_msgTypes[61] + mi := &file_livekit_rtc_proto_msgTypes[62] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5488,7 +5531,7 @@ type UpdateDataSubscription_Update struct { func (x *UpdateDataSubscription_Update) Reset() { *x = UpdateDataSubscription_Update{} - mi := &file_livekit_rtc_proto_msgTypes[64] + mi := &file_livekit_rtc_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5500,7 +5543,7 @@ func (x *UpdateDataSubscription_Update) String() string { func (*UpdateDataSubscription_Update) ProtoMessage() {} func (x *UpdateDataSubscription_Update) ProtoReflect() protoreflect.Message { - mi := &file_livekit_rtc_proto_msgTypes[64] + mi := &file_livekit_rtc_proto_msgTypes[65] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5942,12 +5985,17 @@ const file_livekit_rtc_proto_rawDesc = "" + "\fjoin_request\x18\x02 \x01(\fR\vjoinRequest\"!\n" + "\vCompression\x12\b\n" + "\x04NONE\x10\x00\x12\b\n" + - "\x04GZIP\x10\x01\"{\n" + - "\x14WrappedSignalRequest\x12<\n" + - "\vcompression\x18\x01 \x01(\x0e2\x1a.livekit.SignalCompressionR\vcompression\x12%\n" + - "\x0esignal_request\x18\x02 \x01(\fR\rsignalRequest\"~\n" + - "\x15WrappedSignalResponse\x12<\n" + - "\vcompression\x18\x01 \x01(\x0e2\x1a.livekit.SignalCompressionR\vcompression\x12'\n" + + "\x04GZIP\x10\x01\"@\n" + + "\x11SignalCompression\"+\n" + + "\x04Type\x12\b\n" + + "\x04NONE\x10\x00\x12\b\n" + + "\x04GZIP\x10\x01\x12\x0f\n" + + "\vDEFLATE_RAW\x10\x02\"\x80\x01\n" + + "\x14WrappedSignalRequest\x12A\n" + + "\vcompression\x18\x01 \x01(\x0e2\x1f.livekit.SignalCompression.TypeR\vcompression\x12%\n" + + "\x0esignal_request\x18\x02 \x01(\fR\rsignalRequest\"\x83\x01\n" + + "\x15WrappedSignalResponse\x12A\n" + + "\vcompression\x18\x01 \x01(\x0e2\x1f.livekit.SignalCompression.TypeR\vcompression\x12'\n" + "\x0fsignal_response\x18\x02 \x01(\fR\x0esignalResponse\"X\n" + "\x18MediaSectionsRequirement\x12\x1d\n" + "\n" + @@ -5966,11 +6014,7 @@ const file_livekit_rtc_proto_rawDesc = "" + "\x11CandidateProtocol\x12\a\n" + "\x03UDP\x10\x00\x12\a\n" + "\x03TCP\x10\x01\x12\a\n" + - "\x03TLS\x10\x02*q\n" + - "\x11SignalCompression\x12\x1b\n" + - "\x17SIGNAL_COMPRESSION_NONE\x10\x00\x12\x1b\n" + - "\x17SIGNAL_COMPRESSION_GZIP\x10\x01\x12\"\n" + - "\x1eSIGNAL_COMPRESSION_DEFLATE_RAW\x10\x02BFZ#github.com/livekit/protocol/livekit\xaa\x02\rLiveKit.Proto\xea\x02\x0eLiveKit::Protob\x06proto3" + "\x03TLS\x10\x02BFZ#github.com/livekit/protocol/livekit\xaa\x02\rLiveKit.Proto\xea\x02\x0eLiveKit::Protob\x06proto3" var ( file_livekit_rtc_proto_rawDescOnce sync.Once @@ -5985,15 +6029,15 @@ func file_livekit_rtc_proto_rawDescGZIP() []byte { } var file_livekit_rtc_proto_enumTypes = make([]protoimpl.EnumInfo, 7) -var file_livekit_rtc_proto_msgTypes = make([]protoimpl.MessageInfo, 67) +var file_livekit_rtc_proto_msgTypes = make([]protoimpl.MessageInfo, 68) var file_livekit_rtc_proto_goTypes = []any{ (SignalTarget)(0), // 0: livekit.SignalTarget (StreamState)(0), // 1: livekit.StreamState (CandidateProtocol)(0), // 2: livekit.CandidateProtocol - (SignalCompression)(0), // 3: livekit.SignalCompression - (LeaveRequest_Action)(0), // 4: livekit.LeaveRequest.Action - (RequestResponse_Reason)(0), // 5: livekit.RequestResponse.Reason - (WrappedJoinRequest_Compression)(0), // 6: livekit.WrappedJoinRequest.Compression + (LeaveRequest_Action)(0), // 3: livekit.LeaveRequest.Action + (RequestResponse_Reason)(0), // 4: livekit.RequestResponse.Reason + (WrappedJoinRequest_Compression)(0), // 5: livekit.WrappedJoinRequest.Compression + (SignalCompression_Type)(0), // 6: livekit.SignalCompression.Type (*SignalRequest)(nil), // 7: livekit.SignalRequest (*SignalResponse)(nil), // 8: livekit.SignalResponse (*SimulcastCodec)(nil), // 9: livekit.SimulcastCodec @@ -6052,44 +6096,45 @@ var file_livekit_rtc_proto_goTypes = []any{ (*ConnectionSettings)(nil), // 62: livekit.ConnectionSettings (*JoinRequest)(nil), // 63: livekit.JoinRequest (*WrappedJoinRequest)(nil), // 64: livekit.WrappedJoinRequest - (*WrappedSignalRequest)(nil), // 65: livekit.WrappedSignalRequest - (*WrappedSignalResponse)(nil), // 66: livekit.WrappedSignalResponse - (*MediaSectionsRequirement)(nil), // 67: livekit.MediaSectionsRequirement - (*DataTrackSubscriberHandles_PublishedDataTrack)(nil), // 68: livekit.DataTrackSubscriberHandles.PublishedDataTrack - nil, // 69: livekit.DataTrackSubscriberHandles.SubHandlesEntry - nil, // 70: livekit.SessionDescription.MidToTrackIdEntry - (*UpdateDataSubscription_Update)(nil), // 71: livekit.UpdateDataSubscription.Update - nil, // 72: livekit.UpdateParticipantMetadata.AttributesEntry - nil, // 73: livekit.JoinRequest.ParticipantAttributesEntry - (*VideoLayer)(nil), // 74: livekit.VideoLayer - (VideoLayer_Mode)(0), // 75: livekit.VideoLayer.Mode - (TrackType)(0), // 76: livekit.TrackType - (TrackSource)(0), // 77: livekit.TrackSource - (Encryption_Type)(0), // 78: livekit.Encryption.Type - (BackupCodecPolicy)(0), // 79: livekit.BackupCodecPolicy - (AudioTrackFeature)(0), // 80: livekit.AudioTrackFeature - (PacketTrailerFeature)(0), // 81: livekit.PacketTrailerFeature - (*DataTrackFrameEncoding)(nil), // 82: livekit.DataTrackFrameEncoding - (*DataTrackSchemaId)(nil), // 83: livekit.DataTrackSchemaId - (*DataTrackInfo)(nil), // 84: livekit.DataTrackInfo - (*Room)(nil), // 85: livekit.Room - (*ParticipantInfo)(nil), // 86: livekit.ParticipantInfo - (*ClientConfiguration)(nil), // 87: livekit.ClientConfiguration - (*ServerInfo)(nil), // 88: livekit.ServerInfo - (*Codec)(nil), // 89: livekit.Codec - (*TrackInfo)(nil), // 90: livekit.TrackInfo - (*ParticipantTracks)(nil), // 91: livekit.ParticipantTracks - (*DataBlob)(nil), // 92: livekit.DataBlob - (*DataBlobKey)(nil), // 93: livekit.DataBlobKey - (VideoQuality)(0), // 94: livekit.VideoQuality - (DisconnectReason)(0), // 95: livekit.DisconnectReason - (*SpeakerInfo)(nil), // 96: livekit.SpeakerInfo - (ConnectionQuality)(0), // 97: livekit.ConnectionQuality - (*SubscribedAudioCodec)(nil), // 98: livekit.SubscribedAudioCodec - (SubscriptionError)(0), // 99: livekit.SubscriptionError - (*ClientInfo)(nil), // 100: livekit.ClientInfo - (ReconnectReason)(0), // 101: livekit.ReconnectReason - (*DataTrackSubscriptionOptions)(nil), // 102: livekit.DataTrackSubscriptionOptions + (*SignalCompression)(nil), // 65: livekit.SignalCompression + (*WrappedSignalRequest)(nil), // 66: livekit.WrappedSignalRequest + (*WrappedSignalResponse)(nil), // 67: livekit.WrappedSignalResponse + (*MediaSectionsRequirement)(nil), // 68: livekit.MediaSectionsRequirement + (*DataTrackSubscriberHandles_PublishedDataTrack)(nil), // 69: livekit.DataTrackSubscriberHandles.PublishedDataTrack + nil, // 70: livekit.DataTrackSubscriberHandles.SubHandlesEntry + nil, // 71: livekit.SessionDescription.MidToTrackIdEntry + (*UpdateDataSubscription_Update)(nil), // 72: livekit.UpdateDataSubscription.Update + nil, // 73: livekit.UpdateParticipantMetadata.AttributesEntry + nil, // 74: livekit.JoinRequest.ParticipantAttributesEntry + (*VideoLayer)(nil), // 75: livekit.VideoLayer + (VideoLayer_Mode)(0), // 76: livekit.VideoLayer.Mode + (TrackType)(0), // 77: livekit.TrackType + (TrackSource)(0), // 78: livekit.TrackSource + (Encryption_Type)(0), // 79: livekit.Encryption.Type + (BackupCodecPolicy)(0), // 80: livekit.BackupCodecPolicy + (AudioTrackFeature)(0), // 81: livekit.AudioTrackFeature + (PacketTrailerFeature)(0), // 82: livekit.PacketTrailerFeature + (*DataTrackFrameEncoding)(nil), // 83: livekit.DataTrackFrameEncoding + (*DataTrackSchemaId)(nil), // 84: livekit.DataTrackSchemaId + (*DataTrackInfo)(nil), // 85: livekit.DataTrackInfo + (*Room)(nil), // 86: livekit.Room + (*ParticipantInfo)(nil), // 87: livekit.ParticipantInfo + (*ClientConfiguration)(nil), // 88: livekit.ClientConfiguration + (*ServerInfo)(nil), // 89: livekit.ServerInfo + (*Codec)(nil), // 90: livekit.Codec + (*TrackInfo)(nil), // 91: livekit.TrackInfo + (*ParticipantTracks)(nil), // 92: livekit.ParticipantTracks + (*DataBlob)(nil), // 93: livekit.DataBlob + (*DataBlobKey)(nil), // 94: livekit.DataBlobKey + (VideoQuality)(0), // 95: livekit.VideoQuality + (DisconnectReason)(0), // 96: livekit.DisconnectReason + (*SpeakerInfo)(nil), // 97: livekit.SpeakerInfo + (ConnectionQuality)(0), // 98: livekit.ConnectionQuality + (*SubscribedAudioCodec)(nil), // 99: livekit.SubscribedAudioCodec + (SubscriptionError)(0), // 100: livekit.SubscriptionError + (*ClientInfo)(nil), // 101: livekit.ClientInfo + (ReconnectReason)(0), // 102: livekit.ReconnectReason + (*DataTrackSubscriptionOptions)(nil), // 103: livekit.DataTrackSubscriptionOptions } var file_livekit_rtc_proto_depIdxs = []int32{ 22, // 0: livekit.SignalRequest.offer:type_name -> livekit.SessionDescription @@ -6134,71 +6179,71 @@ var file_livekit_rtc_proto_depIdxs = []int32{ 60, // 39: livekit.SignalResponse.request_response:type_name -> livekit.RequestResponse 61, // 40: livekit.SignalResponse.track_subscribed:type_name -> livekit.TrackSubscribed 50, // 41: livekit.SignalResponse.room_moved:type_name -> livekit.RoomMovedResponse - 67, // 42: livekit.SignalResponse.media_sections_requirement:type_name -> livekit.MediaSectionsRequirement + 68, // 42: livekit.SignalResponse.media_sections_requirement:type_name -> livekit.MediaSectionsRequirement 46, // 43: livekit.SignalResponse.subscribed_audio_codec_update:type_name -> livekit.SubscribedAudioCodecUpdate 12, // 44: livekit.SignalResponse.publish_data_track_response:type_name -> livekit.PublishDataTrackResponse 14, // 45: livekit.SignalResponse.unpublish_data_track_response:type_name -> livekit.UnpublishDataTrackResponse 15, // 46: livekit.SignalResponse.data_track_subscriber_handles:type_name -> livekit.DataTrackSubscriberHandles 27, // 47: livekit.SignalResponse.store_data_blob_response:type_name -> livekit.StoreDataBlobResponse 29, // 48: livekit.SignalResponse.get_data_blob_response:type_name -> livekit.GetDataBlobResponse - 74, // 49: livekit.SimulcastCodec.layers:type_name -> livekit.VideoLayer - 75, // 50: livekit.SimulcastCodec.video_layer_mode:type_name -> livekit.VideoLayer.Mode - 76, // 51: livekit.AddTrackRequest.type:type_name -> livekit.TrackType - 77, // 52: livekit.AddTrackRequest.source:type_name -> livekit.TrackSource - 74, // 53: livekit.AddTrackRequest.layers:type_name -> livekit.VideoLayer + 75, // 49: livekit.SimulcastCodec.layers:type_name -> livekit.VideoLayer + 76, // 50: livekit.SimulcastCodec.video_layer_mode:type_name -> livekit.VideoLayer.Mode + 77, // 51: livekit.AddTrackRequest.type:type_name -> livekit.TrackType + 78, // 52: livekit.AddTrackRequest.source:type_name -> livekit.TrackSource + 75, // 53: livekit.AddTrackRequest.layers:type_name -> livekit.VideoLayer 9, // 54: livekit.AddTrackRequest.simulcast_codecs:type_name -> livekit.SimulcastCodec - 78, // 55: livekit.AddTrackRequest.encryption:type_name -> livekit.Encryption.Type - 79, // 56: livekit.AddTrackRequest.backup_codec_policy:type_name -> livekit.BackupCodecPolicy - 80, // 57: livekit.AddTrackRequest.audio_features:type_name -> livekit.AudioTrackFeature - 81, // 58: livekit.AddTrackRequest.packet_trailer_features:type_name -> livekit.PacketTrailerFeature - 78, // 59: livekit.PublishDataTrackRequest.encryption:type_name -> livekit.Encryption.Type - 82, // 60: livekit.PublishDataTrackRequest.frame_encoding:type_name -> livekit.DataTrackFrameEncoding - 83, // 61: livekit.PublishDataTrackRequest.schema:type_name -> livekit.DataTrackSchemaId - 84, // 62: livekit.PublishDataTrackResponse.info:type_name -> livekit.DataTrackInfo - 84, // 63: livekit.UnpublishDataTrackResponse.info:type_name -> livekit.DataTrackInfo - 69, // 64: livekit.DataTrackSubscriberHandles.sub_handles:type_name -> livekit.DataTrackSubscriberHandles.SubHandlesEntry + 79, // 55: livekit.AddTrackRequest.encryption:type_name -> livekit.Encryption.Type + 80, // 56: livekit.AddTrackRequest.backup_codec_policy:type_name -> livekit.BackupCodecPolicy + 81, // 57: livekit.AddTrackRequest.audio_features:type_name -> livekit.AudioTrackFeature + 82, // 58: livekit.AddTrackRequest.packet_trailer_features:type_name -> livekit.PacketTrailerFeature + 79, // 59: livekit.PublishDataTrackRequest.encryption:type_name -> livekit.Encryption.Type + 83, // 60: livekit.PublishDataTrackRequest.frame_encoding:type_name -> livekit.DataTrackFrameEncoding + 84, // 61: livekit.PublishDataTrackRequest.schema:type_name -> livekit.DataTrackSchemaId + 85, // 62: livekit.PublishDataTrackResponse.info:type_name -> livekit.DataTrackInfo + 85, // 63: livekit.UnpublishDataTrackResponse.info:type_name -> livekit.DataTrackInfo + 70, // 64: livekit.DataTrackSubscriberHandles.sub_handles:type_name -> livekit.DataTrackSubscriberHandles.SubHandlesEntry 0, // 65: livekit.TrickleRequest.target:type_name -> livekit.SignalTarget - 85, // 66: livekit.JoinResponse.room:type_name -> livekit.Room - 86, // 67: livekit.JoinResponse.participant:type_name -> livekit.ParticipantInfo - 86, // 68: livekit.JoinResponse.other_participants:type_name -> livekit.ParticipantInfo + 86, // 66: livekit.JoinResponse.room:type_name -> livekit.Room + 87, // 67: livekit.JoinResponse.participant:type_name -> livekit.ParticipantInfo + 87, // 68: livekit.JoinResponse.other_participants:type_name -> livekit.ParticipantInfo 36, // 69: livekit.JoinResponse.ice_servers:type_name -> livekit.ICEServer - 87, // 70: livekit.JoinResponse.client_configuration:type_name -> livekit.ClientConfiguration - 88, // 71: livekit.JoinResponse.server_info:type_name -> livekit.ServerInfo - 89, // 72: livekit.JoinResponse.enabled_publish_codecs:type_name -> livekit.Codec + 88, // 70: livekit.JoinResponse.client_configuration:type_name -> livekit.ClientConfiguration + 89, // 71: livekit.JoinResponse.server_info:type_name -> livekit.ServerInfo + 90, // 72: livekit.JoinResponse.enabled_publish_codecs:type_name -> livekit.Codec 36, // 73: livekit.ReconnectResponse.ice_servers:type_name -> livekit.ICEServer - 87, // 74: livekit.ReconnectResponse.client_configuration:type_name -> livekit.ClientConfiguration - 88, // 75: livekit.ReconnectResponse.server_info:type_name -> livekit.ServerInfo - 90, // 76: livekit.TrackPublishedResponse.track:type_name -> livekit.TrackInfo - 70, // 77: livekit.SessionDescription.mid_to_track_id:type_name -> livekit.SessionDescription.MidToTrackIdEntry - 86, // 78: livekit.ParticipantUpdate.participants:type_name -> livekit.ParticipantInfo - 91, // 79: livekit.UpdateSubscription.participant_tracks:type_name -> livekit.ParticipantTracks - 71, // 80: livekit.UpdateDataSubscription.updates:type_name -> livekit.UpdateDataSubscription.Update - 92, // 81: livekit.StoreDataBlobRequest.blob:type_name -> livekit.DataBlob - 93, // 82: livekit.StoreDataBlobResponse.key:type_name -> livekit.DataBlobKey - 93, // 83: livekit.GetDataBlobRequest.key:type_name -> livekit.DataBlobKey - 92, // 84: livekit.GetDataBlobResponse.blob:type_name -> livekit.DataBlob - 94, // 85: livekit.UpdateTrackSettings.quality:type_name -> livekit.VideoQuality - 80, // 86: livekit.UpdateLocalAudioTrack.features:type_name -> livekit.AudioTrackFeature - 95, // 87: livekit.LeaveRequest.reason:type_name -> livekit.DisconnectReason - 4, // 88: livekit.LeaveRequest.action:type_name -> livekit.LeaveRequest.Action + 88, // 74: livekit.ReconnectResponse.client_configuration:type_name -> livekit.ClientConfiguration + 89, // 75: livekit.ReconnectResponse.server_info:type_name -> livekit.ServerInfo + 91, // 76: livekit.TrackPublishedResponse.track:type_name -> livekit.TrackInfo + 71, // 77: livekit.SessionDescription.mid_to_track_id:type_name -> livekit.SessionDescription.MidToTrackIdEntry + 87, // 78: livekit.ParticipantUpdate.participants:type_name -> livekit.ParticipantInfo + 92, // 79: livekit.UpdateSubscription.participant_tracks:type_name -> livekit.ParticipantTracks + 72, // 80: livekit.UpdateDataSubscription.updates:type_name -> livekit.UpdateDataSubscription.Update + 93, // 81: livekit.StoreDataBlobRequest.blob:type_name -> livekit.DataBlob + 94, // 82: livekit.StoreDataBlobResponse.key:type_name -> livekit.DataBlobKey + 94, // 83: livekit.GetDataBlobRequest.key:type_name -> livekit.DataBlobKey + 93, // 84: livekit.GetDataBlobResponse.blob:type_name -> livekit.DataBlob + 95, // 85: livekit.UpdateTrackSettings.quality:type_name -> livekit.VideoQuality + 81, // 86: livekit.UpdateLocalAudioTrack.features:type_name -> livekit.AudioTrackFeature + 96, // 87: livekit.LeaveRequest.reason:type_name -> livekit.DisconnectReason + 3, // 88: livekit.LeaveRequest.action:type_name -> livekit.LeaveRequest.Action 57, // 89: livekit.LeaveRequest.regions:type_name -> livekit.RegionSettings - 74, // 90: livekit.UpdateVideoLayers.layers:type_name -> livekit.VideoLayer - 72, // 91: livekit.UpdateParticipantMetadata.attributes:type_name -> livekit.UpdateParticipantMetadata.AttributesEntry - 96, // 92: livekit.SpeakersChanged.speakers:type_name -> livekit.SpeakerInfo - 85, // 93: livekit.RoomUpdate.room:type_name -> livekit.Room - 97, // 94: livekit.ConnectionQualityInfo.quality:type_name -> livekit.ConnectionQuality + 75, // 90: livekit.UpdateVideoLayers.layers:type_name -> livekit.VideoLayer + 73, // 91: livekit.UpdateParticipantMetadata.attributes:type_name -> livekit.UpdateParticipantMetadata.AttributesEntry + 97, // 92: livekit.SpeakersChanged.speakers:type_name -> livekit.SpeakerInfo + 86, // 93: livekit.RoomUpdate.room:type_name -> livekit.Room + 98, // 94: livekit.ConnectionQualityInfo.quality:type_name -> livekit.ConnectionQuality 39, // 95: livekit.ConnectionQualityUpdate.updates:type_name -> livekit.ConnectionQualityInfo 1, // 96: livekit.StreamStateInfo.state:type_name -> livekit.StreamState 41, // 97: livekit.StreamStateUpdate.stream_states:type_name -> livekit.StreamStateInfo - 94, // 98: livekit.SubscribedQuality.quality:type_name -> livekit.VideoQuality + 95, // 98: livekit.SubscribedQuality.quality:type_name -> livekit.VideoQuality 43, // 99: livekit.SubscribedCodec.qualities:type_name -> livekit.SubscribedQuality 43, // 100: livekit.SubscribedQualityUpdate.subscribed_qualities:type_name -> livekit.SubscribedQuality 44, // 101: livekit.SubscribedQualityUpdate.subscribed_codecs:type_name -> livekit.SubscribedCodec - 98, // 102: livekit.SubscribedAudioCodecUpdate.subscribed_audio_codecs:type_name -> livekit.SubscribedAudioCodec + 99, // 102: livekit.SubscribedAudioCodecUpdate.subscribed_audio_codecs:type_name -> livekit.SubscribedAudioCodec 47, // 103: livekit.SubscriptionPermission.track_permissions:type_name -> livekit.TrackPermission - 85, // 104: livekit.RoomMovedResponse.room:type_name -> livekit.Room - 86, // 105: livekit.RoomMovedResponse.participant:type_name -> livekit.ParticipantInfo - 86, // 106: livekit.RoomMovedResponse.other_participants:type_name -> livekit.ParticipantInfo + 86, // 104: livekit.RoomMovedResponse.room:type_name -> livekit.Room + 87, // 105: livekit.RoomMovedResponse.participant:type_name -> livekit.ParticipantInfo + 87, // 106: livekit.RoomMovedResponse.other_participants:type_name -> livekit.ParticipantInfo 22, // 107: livekit.SyncState.answer:type_name -> livekit.SessionDescription 24, // 108: livekit.SyncState.subscription:type_name -> livekit.UpdateSubscription 20, // 109: livekit.SyncState.publish_tracks:type_name -> livekit.TrackPublishedResponse @@ -6210,8 +6255,8 @@ var file_livekit_rtc_proto_depIdxs = []int32{ 0, // 115: livekit.DataChannelInfo.target:type_name -> livekit.SignalTarget 2, // 116: livekit.SimulateScenario.switch_candidate_protocol:type_name -> livekit.CandidateProtocol 58, // 117: livekit.RegionSettings.regions:type_name -> livekit.RegionInfo - 99, // 118: livekit.SubscriptionResponse.err:type_name -> livekit.SubscriptionError - 5, // 119: livekit.RequestResponse.reason:type_name -> livekit.RequestResponse.Reason + 100, // 118: livekit.SubscriptionResponse.err:type_name -> livekit.SubscriptionError + 4, // 119: livekit.RequestResponse.reason:type_name -> livekit.RequestResponse.Reason 16, // 120: livekit.RequestResponse.trickle:type_name -> livekit.TrickleRequest 10, // 121: livekit.RequestResponse.add_track:type_name -> livekit.AddTrackRequest 17, // 122: livekit.RequestResponse.mute:type_name -> livekit.MuteTrackRequest @@ -6220,18 +6265,18 @@ var file_livekit_rtc_proto_depIdxs = []int32{ 32, // 125: livekit.RequestResponse.update_video_track:type_name -> livekit.UpdateLocalVideoTrack 11, // 126: livekit.RequestResponse.publish_data_track:type_name -> livekit.PublishDataTrackRequest 13, // 127: livekit.RequestResponse.unpublish_data_track:type_name -> livekit.UnpublishDataTrackRequest - 100, // 128: livekit.JoinRequest.client_info:type_name -> livekit.ClientInfo + 101, // 128: livekit.JoinRequest.client_info:type_name -> livekit.ClientInfo 62, // 129: livekit.JoinRequest.connection_settings:type_name -> livekit.ConnectionSettings - 73, // 130: livekit.JoinRequest.participant_attributes:type_name -> livekit.JoinRequest.ParticipantAttributesEntry + 74, // 130: livekit.JoinRequest.participant_attributes:type_name -> livekit.JoinRequest.ParticipantAttributesEntry 10, // 131: livekit.JoinRequest.add_track_requests:type_name -> livekit.AddTrackRequest 22, // 132: livekit.JoinRequest.publisher_offer:type_name -> livekit.SessionDescription - 101, // 133: livekit.JoinRequest.reconnect_reason:type_name -> livekit.ReconnectReason + 102, // 133: livekit.JoinRequest.reconnect_reason:type_name -> livekit.ReconnectReason 51, // 134: livekit.JoinRequest.sync_state:type_name -> livekit.SyncState - 6, // 135: livekit.WrappedJoinRequest.compression:type_name -> livekit.WrappedJoinRequest.Compression - 3, // 136: livekit.WrappedSignalRequest.compression:type_name -> livekit.SignalCompression - 3, // 137: livekit.WrappedSignalResponse.compression:type_name -> livekit.SignalCompression - 68, // 138: livekit.DataTrackSubscriberHandles.SubHandlesEntry.value:type_name -> livekit.DataTrackSubscriberHandles.PublishedDataTrack - 102, // 139: livekit.UpdateDataSubscription.Update.options:type_name -> livekit.DataTrackSubscriptionOptions + 5, // 135: livekit.WrappedJoinRequest.compression:type_name -> livekit.WrappedJoinRequest.Compression + 6, // 136: livekit.WrappedSignalRequest.compression:type_name -> livekit.SignalCompression.Type + 6, // 137: livekit.WrappedSignalResponse.compression:type_name -> livekit.SignalCompression.Type + 69, // 138: livekit.DataTrackSubscriberHandles.SubHandlesEntry.value:type_name -> livekit.DataTrackSubscriberHandles.PublishedDataTrack + 103, // 139: livekit.UpdateDataSubscription.Update.options:type_name -> livekit.DataTrackSubscriptionOptions 140, // [140:140] is the sub-list for method output_type 140, // [140:140] is the sub-list for method input_type 140, // [140:140] is the sub-list for extension type_name @@ -6330,7 +6375,7 @@ func file_livekit_rtc_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_livekit_rtc_proto_rawDesc), len(file_livekit_rtc_proto_rawDesc)), NumEnums: 7, - NumMessages: 67, + NumMessages: 68, NumExtensions: 0, NumServices: 0, }, From 3cc007f0aa56c0105fa8bfca5a4797a1dee941e3 Mon Sep 17 00:00:00 2001 From: shijing xian Date: Fri, 28 Aug 2026 15:31:54 -0700 Subject: [PATCH 05/10] signalling: negotiate compression with a first frame, not a response flag Replaces `JoinResponse.signal_compression` and `ReconnectResponse.signal_compression` with a `SignalCompressionAck` arm on the `SignalResponse` oneof, sent unwrapped as the first message on the connection. The flags could not cover the message carrying them. A client has to know whether to parse the first frame as `SignalResponse` or `WrappedSignalResponse` before it can read anything out of it, so a flag inside the JoinResponse necessarily left that JoinResponse uncompressed -- and on a large room the join roster is the single biggest message on the wire, scaling with participant count and unbounded through participant metadata and attributes. Exactly the case worth compressing. A separate first frame removes the circularity without any sniffing. Both possibilities for frame one are a plain `SignalResponse`, so the client parses one type and switches on the arm it receives: `compression_ack` means compress from here on, anything else means an older server and the connection carries on uncompressed. A client that never advertised the capability is never sent the ack. All four old/new combinations keep working, and there is no extra round trip -- the server writes the ack and the JoinResponse back to back. Collapsing the two per-response booleans into one mechanism also drops the question of what a resume inherits: the ack is exchanged per connection, so a resume landing on a different node simply negotiates again. Co-Authored-By: Claude Opus 5 (1M context) --- .changeset/signal-payload-compression.md | 2 +- protobufs/livekit_rtc.proto | 51 ++++++++++++++---------- 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/.changeset/signal-payload-compression.md b/.changeset/signal-payload-compression.md index df6bf555a..3a41c417a 100644 --- a/.changeset/signal-payload-compression.md +++ b/.changeset/signal-payload-compression.md @@ -3,4 +3,4 @@ "@livekit/protocol": minor --- -signalling: add `WrappedSignalRequest` / `WrappedSignalResponse` envelopes and the `SignalCompression.Type` enum, so signal messages on the WebSocket can be compressed the way `WrappedJoinRequest` already compresses the join payload in the connect URL. Negotiated via the existing `ClientInfo.CAP_COMPRESSION_DEFLATE_RAW` capability and acknowledged by the new `JoinResponse.signal_compression` / `ReconnectResponse.signal_compression` fields; unset means the existing uncompressed wire format is used, so old and new peers interoperate unchanged. +signalling: add `WrappedSignalRequest` / `WrappedSignalResponse` envelopes, the `SignalCompression.Type` enum, and a `SignalCompressionAck` message on the `SignalResponse` oneof, so signal messages on the WebSocket can be compressed the way `WrappedJoinRequest` already compresses the join payload in the connect URL. Negotiated via the existing `ClientInfo.CAP_COMPRESSION_DEFLATE_RAW` capability: a server honouring it sends `SignalCompressionAck` as the first message and wraps everything after, including the `JoinResponse`. Servers and clients that do not exchange that message keep using the existing uncompressed wire format, so old and new peers interoperate unchanged. diff --git a/protobufs/livekit_rtc.proto b/protobufs/livekit_rtc.proto index 94e50bd40..644077c99 100644 --- a/protobufs/livekit_rtc.proto +++ b/protobufs/livekit_rtc.proto @@ -133,6 +133,9 @@ message SignalResponse { StoreDataBlobResponse store_data_blob_response = 30; // Sent in response to `GetDataBlobRequest`. GetDataBlobResponse get_data_blob_response = 31; + // Always the FIRST message on a connection that will use signal compression. + // See SignalCompressionAck. + SignalCompressionAck compression_ack = 32; } } @@ -264,19 +267,6 @@ message JoinResponse { repeated Codec enabled_publish_codecs = 14; // when set, client should attempt to establish publish peer connection when joining room to speed up publishing bool fast_publish = 15; - // when set, every signal message after this JoinResponse is wrapped in - // WrappedSignalRequest/WrappedSignalResponse, in both directions. - // - // The server sets this only if the client advertised - // ClientInfo.CAP_COMPRESSION_DEFLATE_RAW. Unset (the default) means the client MUST - // keep sending bare SignalRequests, so an old server and a new client, or the - // reverse, keep working unchanged. - // - // This JoinResponse itself is NOT wrapped: it is what establishes the agreement, so - // it has to be readable by a client that does not yet know the answer. That leaves - // the join roster uncompressed -- the one place this scheme does not help. See - // ReconnectResponse.signal_compression for the resume path. - bool signal_compression = 16; } message ReconnectResponse { @@ -286,14 +276,6 @@ message ReconnectResponse { // last sequence number of reliable message received before resuming uint32 last_message_seq = 4; - - // Same contract as JoinResponse.signal_compression: when set, every signal message - // after this ReconnectResponse is wrapped, in both directions, and this message - // itself is not. - // - // Renegotiated per resume rather than inherited, because a resume may land on a - // different node than the one that answered the original join. - bool signal_compression = 5; } message TrackPublishedResponse { @@ -713,10 +695,35 @@ message SignalCompression { } } +// Turns on signal compression for the rest of the connection, in both directions. +// +// Sent as the FIRST signal message, unwrapped, before the JoinResponse or +// ReconnectResponse. Everything after it is wrapped in +// WrappedSignalRequest/WrappedSignalResponse -- including that JoinResponse, which +// on a large room is the single biggest message on the wire. +// +// Sent only when the client advertised ClientInfo.CAP_COMPRESSION_DEFLATE_RAW. A +// server that does not implement compression, or a client that did not ask for it, +// simply never exchanges this message and the connection stays as it is today. +// +// Being its own message, rather than a flag on JoinResponse, is what lets the +// JoinResponse itself be compressed: a flag would have to be read before the client +// could know how to parse the message carrying it. Here both possibilities for the +// first frame are a plain SignalResponse, so the client parses one type and switches +// on which arm it got -- `compression_ack` means compress from here on, anything else +// means an older server and the connection continues uncompressed. No sniffing, and +// no extra round trip: the server writes this and the JoinResponse back to back. +message SignalCompressionAck { + // The algorithm to use. Senders may still emit NONE per message -- see + // WrappedSignalRequest on the size threshold -- but must not use an algorithm + // other than this one. + SignalCompression.Type compression = 1; +} + // Envelope for a compressed SignalRequest, mirroring WrappedJoinRequest. // // Used in place of a bare SignalRequest on the signalling WebSocket once both -// sides have agreed to compress -- see JoinResponse.signal_compression. +// sides have agreed to compress -- see SignalCompressionAck. // // Senders SHOULD leave small payloads uncompressed (NONE): below roughly 200 bytes // the compressed form is usually larger, and the CPU is wasted either way. Senders From c231d15d2ac95f6bb79f3f64105edee1b6e42549 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 28 Aug 2026 22:32:38 +0000 Subject: [PATCH 06/10] generated protobuf --- livekit/livekit_rtc.pb.go | 450 +++++++++++++++++++++----------------- 1 file changed, 252 insertions(+), 198 deletions(-) diff --git a/livekit/livekit_rtc.pb.go b/livekit/livekit_rtc.pb.go index c8aeb2187..bbc691c02 100644 --- a/livekit/livekit_rtc.pb.go +++ b/livekit/livekit_rtc.pb.go @@ -863,6 +863,7 @@ type SignalResponse struct { // *SignalResponse_DataTrackSubscriberHandles // *SignalResponse_StoreDataBlobResponse // *SignalResponse_GetDataBlobResponse + // *SignalResponse_CompressionAck Message isSignalResponse_Message `protobuf_oneof:"message"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -1175,6 +1176,15 @@ func (x *SignalResponse) GetGetDataBlobResponse() *GetDataBlobResponse { return nil } +func (x *SignalResponse) GetCompressionAck() *SignalCompressionAck { + if x != nil { + if x, ok := x.Message.(*SignalResponse_CompressionAck); ok { + return x.CompressionAck + } + } + return nil +} + type isSignalResponse_Message interface { isSignalResponse_Message() } @@ -1330,6 +1340,12 @@ type SignalResponse_GetDataBlobResponse struct { GetDataBlobResponse *GetDataBlobResponse `protobuf:"bytes,31,opt,name=get_data_blob_response,json=getDataBlobResponse,proto3,oneof"` } +type SignalResponse_CompressionAck struct { + // Always the FIRST message on a connection that will use signal compression. + // See SignalCompressionAck. + CompressionAck *SignalCompressionAck `protobuf:"bytes,32,opt,name=compression_ack,json=compressionAck,proto3,oneof"` +} + func (*SignalResponse_Join) isSignalResponse_Message() {} func (*SignalResponse_Answer) isSignalResponse_Message() {} @@ -1390,6 +1406,8 @@ func (*SignalResponse_StoreDataBlobResponse) isSignalResponse_Message() {} func (*SignalResponse_GetDataBlobResponse) isSignalResponse_Message() {} +func (*SignalResponse_CompressionAck) isSignalResponse_Message() {} + type SimulcastCodec struct { state protoimpl.MessageState `protogen:"open.v1"` Codec string `protobuf:"bytes,1,opt,name=codec,proto3" json:"codec,omitempty"` @@ -2049,22 +2067,9 @@ type JoinResponse struct { SifTrailer []byte `protobuf:"bytes,13,opt,name=sif_trailer,json=sifTrailer,proto3" json:"sif_trailer,omitempty"` EnabledPublishCodecs []*Codec `protobuf:"bytes,14,rep,name=enabled_publish_codecs,json=enabledPublishCodecs,proto3" json:"enabled_publish_codecs,omitempty"` // when set, client should attempt to establish publish peer connection when joining room to speed up publishing - FastPublish bool `protobuf:"varint,15,opt,name=fast_publish,json=fastPublish,proto3" json:"fast_publish,omitempty"` - // when set, every signal message after this JoinResponse is wrapped in - // WrappedSignalRequest/WrappedSignalResponse, in both directions. - // - // The server sets this only if the client advertised - // ClientInfo.CAP_COMPRESSION_DEFLATE_RAW. Unset (the default) means the client MUST - // keep sending bare SignalRequests, so an old server and a new client, or the - // reverse, keep working unchanged. - // - // This JoinResponse itself is NOT wrapped: it is what establishes the agreement, so - // it has to be readable by a client that does not yet know the answer. That leaves - // the join roster uncompressed -- the one place this scheme does not help. See - // ReconnectResponse.signal_compression for the resume path. - SignalCompression bool `protobuf:"varint,16,opt,name=signal_compression,json=signalCompression,proto3" json:"signal_compression,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + FastPublish bool `protobuf:"varint,15,opt,name=fast_publish,json=fastPublish,proto3" json:"fast_publish,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *JoinResponse) Reset() { @@ -2202,13 +2207,6 @@ func (x *JoinResponse) GetFastPublish() bool { return false } -func (x *JoinResponse) GetSignalCompression() bool { - if x != nil { - return x.SignalCompression - } - return false -} - type ReconnectResponse struct { state protoimpl.MessageState `protogen:"open.v1"` IceServers []*ICEServer `protobuf:"bytes,1,rep,name=ice_servers,json=iceServers,proto3" json:"ice_servers,omitempty"` @@ -2216,15 +2214,8 @@ type ReconnectResponse struct { ServerInfo *ServerInfo `protobuf:"bytes,3,opt,name=server_info,json=serverInfo,proto3" json:"server_info,omitempty"` // last sequence number of reliable message received before resuming LastMessageSeq uint32 `protobuf:"varint,4,opt,name=last_message_seq,json=lastMessageSeq,proto3" json:"last_message_seq,omitempty"` - // Same contract as JoinResponse.signal_compression: when set, every signal message - // after this ReconnectResponse is wrapped, in both directions, and this message - // itself is not. - // - // Renegotiated per resume rather than inherited, because a resume may land on a - // different node than the one that answered the original join. - SignalCompression bool `protobuf:"varint,5,opt,name=signal_compression,json=signalCompression,proto3" json:"signal_compression,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ReconnectResponse) Reset() { @@ -2285,13 +2276,6 @@ func (x *ReconnectResponse) GetLastMessageSeq() uint32 { return 0 } -func (x *ReconnectResponse) GetSignalCompression() bool { - if x != nil { - return x.SignalCompression - } - return false -} - type TrackPublishedResponse struct { state protoimpl.MessageState `protogen:"open.v1"` Cid string `protobuf:"bytes,1,opt,name=cid,proto3" json:"cid,omitempty"` @@ -5291,10 +5275,75 @@ func (*SignalCompression) Descriptor() ([]byte, []int) { return file_livekit_rtc_proto_rawDescGZIP(), []int{58} } +// Turns on signal compression for the rest of the connection, in both directions. +// +// Sent as the FIRST signal message, unwrapped, before the JoinResponse or +// ReconnectResponse. Everything after it is wrapped in +// WrappedSignalRequest/WrappedSignalResponse -- including that JoinResponse, which +// on a large room is the single biggest message on the wire. +// +// Sent only when the client advertised ClientInfo.CAP_COMPRESSION_DEFLATE_RAW. A +// server that does not implement compression, or a client that did not ask for it, +// simply never exchanges this message and the connection stays as it is today. +// +// Being its own message, rather than a flag on JoinResponse, is what lets the +// JoinResponse itself be compressed: a flag would have to be read before the client +// could know how to parse the message carrying it. Here both possibilities for the +// first frame are a plain SignalResponse, so the client parses one type and switches +// on which arm it got -- `compression_ack` means compress from here on, anything else +// means an older server and the connection continues uncompressed. No sniffing, and +// no extra round trip: the server writes this and the JoinResponse back to back. +type SignalCompressionAck struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The algorithm to use. Senders may still emit NONE per message -- see + // WrappedSignalRequest on the size threshold -- but must not use an algorithm + // other than this one. + Compression SignalCompression_Type `protobuf:"varint,1,opt,name=compression,proto3,enum=livekit.SignalCompression_Type" json:"compression,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SignalCompressionAck) Reset() { + *x = SignalCompressionAck{} + mi := &file_livekit_rtc_proto_msgTypes[59] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SignalCompressionAck) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignalCompressionAck) ProtoMessage() {} + +func (x *SignalCompressionAck) ProtoReflect() protoreflect.Message { + mi := &file_livekit_rtc_proto_msgTypes[59] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignalCompressionAck.ProtoReflect.Descriptor instead. +func (*SignalCompressionAck) Descriptor() ([]byte, []int) { + return file_livekit_rtc_proto_rawDescGZIP(), []int{59} +} + +func (x *SignalCompressionAck) GetCompression() SignalCompression_Type { + if x != nil { + return x.Compression + } + return SignalCompression_NONE +} + // Envelope for a compressed SignalRequest, mirroring WrappedJoinRequest. // // Used in place of a bare SignalRequest on the signalling WebSocket once both -// sides have agreed to compress -- see JoinResponse.signal_compression. +// sides have agreed to compress -- see SignalCompressionAck. // // Senders SHOULD leave small payloads uncompressed (NONE): below roughly 200 bytes // the compressed form is usually larger, and the CPU is wasted either way. Senders @@ -5311,7 +5360,7 @@ type WrappedSignalRequest struct { func (x *WrappedSignalRequest) Reset() { *x = WrappedSignalRequest{} - mi := &file_livekit_rtc_proto_msgTypes[59] + mi := &file_livekit_rtc_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5323,7 +5372,7 @@ func (x *WrappedSignalRequest) String() string { func (*WrappedSignalRequest) ProtoMessage() {} func (x *WrappedSignalRequest) ProtoReflect() protoreflect.Message { - mi := &file_livekit_rtc_proto_msgTypes[59] + mi := &file_livekit_rtc_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5336,7 +5385,7 @@ func (x *WrappedSignalRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WrappedSignalRequest.ProtoReflect.Descriptor instead. func (*WrappedSignalRequest) Descriptor() ([]byte, []int) { - return file_livekit_rtc_proto_rawDescGZIP(), []int{59} + return file_livekit_rtc_proto_rawDescGZIP(), []int{60} } func (x *WrappedSignalRequest) GetCompression() SignalCompression_Type { @@ -5364,7 +5413,7 @@ type WrappedSignalResponse struct { func (x *WrappedSignalResponse) Reset() { *x = WrappedSignalResponse{} - mi := &file_livekit_rtc_proto_msgTypes[60] + mi := &file_livekit_rtc_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5376,7 +5425,7 @@ func (x *WrappedSignalResponse) String() string { func (*WrappedSignalResponse) ProtoMessage() {} func (x *WrappedSignalResponse) ProtoReflect() protoreflect.Message { - mi := &file_livekit_rtc_proto_msgTypes[60] + mi := &file_livekit_rtc_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5389,7 +5438,7 @@ func (x *WrappedSignalResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WrappedSignalResponse.ProtoReflect.Descriptor instead. func (*WrappedSignalResponse) Descriptor() ([]byte, []int) { - return file_livekit_rtc_proto_rawDescGZIP(), []int{60} + return file_livekit_rtc_proto_rawDescGZIP(), []int{61} } func (x *WrappedSignalResponse) GetCompression() SignalCompression_Type { @@ -5416,7 +5465,7 @@ type MediaSectionsRequirement struct { func (x *MediaSectionsRequirement) Reset() { *x = MediaSectionsRequirement{} - mi := &file_livekit_rtc_proto_msgTypes[61] + mi := &file_livekit_rtc_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5428,7 +5477,7 @@ func (x *MediaSectionsRequirement) String() string { func (*MediaSectionsRequirement) ProtoMessage() {} func (x *MediaSectionsRequirement) ProtoReflect() protoreflect.Message { - mi := &file_livekit_rtc_proto_msgTypes[61] + mi := &file_livekit_rtc_proto_msgTypes[62] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5441,7 +5490,7 @@ func (x *MediaSectionsRequirement) ProtoReflect() protoreflect.Message { // Deprecated: Use MediaSectionsRequirement.ProtoReflect.Descriptor instead. func (*MediaSectionsRequirement) Descriptor() ([]byte, []int) { - return file_livekit_rtc_proto_rawDescGZIP(), []int{61} + return file_livekit_rtc_proto_rawDescGZIP(), []int{62} } func (x *MediaSectionsRequirement) GetNumAudios() uint32 { @@ -5469,7 +5518,7 @@ type DataTrackSubscriberHandles_PublishedDataTrack struct { func (x *DataTrackSubscriberHandles_PublishedDataTrack) Reset() { *x = DataTrackSubscriberHandles_PublishedDataTrack{} - mi := &file_livekit_rtc_proto_msgTypes[62] + mi := &file_livekit_rtc_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5481,7 +5530,7 @@ func (x *DataTrackSubscriberHandles_PublishedDataTrack) String() string { func (*DataTrackSubscriberHandles_PublishedDataTrack) ProtoMessage() {} func (x *DataTrackSubscriberHandles_PublishedDataTrack) ProtoReflect() protoreflect.Message { - mi := &file_livekit_rtc_proto_msgTypes[62] + mi := &file_livekit_rtc_proto_msgTypes[63] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5531,7 +5580,7 @@ type UpdateDataSubscription_Update struct { func (x *UpdateDataSubscription_Update) Reset() { *x = UpdateDataSubscription_Update{} - mi := &file_livekit_rtc_proto_msgTypes[65] + mi := &file_livekit_rtc_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5543,7 +5592,7 @@ func (x *UpdateDataSubscription_Update) String() string { func (*UpdateDataSubscription_Update) ProtoMessage() {} func (x *UpdateDataSubscription_Update) ProtoReflect() protoreflect.Message { - mi := &file_livekit_rtc_proto_msgTypes[65] + mi := &file_livekit_rtc_proto_msgTypes[66] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5610,7 +5659,7 @@ const file_livekit_rtc_proto_rawDesc = "" + "\x18update_data_subscription\x18\x15 \x01(\v2\x1f.livekit.UpdateDataSubscriptionH\x00R\x16updateDataSubscription\x12V\n" + "\x17store_data_blob_request\x18\x16 \x01(\v2\x1d.livekit.StoreDataBlobRequestH\x00R\x14storeDataBlobRequest\x12P\n" + "\x15get_data_blob_request\x18\x17 \x01(\v2\x1b.livekit.GetDataBlobRequestH\x00R\x12getDataBlobRequestB\t\n" + - "\amessage\"\x89\x11\n" + + "\amessage\"\xd3\x11\n" + "\x0eSignalResponse\x12+\n" + "\x04join\x18\x01 \x01(\v2\x15.livekit.JoinResponseH\x00R\x04join\x125\n" + "\x06answer\x18\x02 \x01(\v2\x1b.livekit.SessionDescriptionH\x00R\x06answer\x123\n" + @@ -5644,7 +5693,8 @@ const file_livekit_rtc_proto_rawDesc = "" + "\x1dunpublish_data_track_response\x18\x1c \x01(\v2#.livekit.UnpublishDataTrackResponseH\x00R\x1aunpublishDataTrackResponse\x12h\n" + "\x1ddata_track_subscriber_handles\x18\x1d \x01(\v2#.livekit.DataTrackSubscriberHandlesH\x00R\x1adataTrackSubscriberHandles\x12Y\n" + "\x18store_data_blob_response\x18\x1e \x01(\v2\x1e.livekit.StoreDataBlobResponseH\x00R\x15storeDataBlobResponse\x12S\n" + - "\x16get_data_blob_response\x18\x1f \x01(\v2\x1c.livekit.GetDataBlobResponseH\x00R\x13getDataBlobResponseB\t\n" + + "\x16get_data_blob_response\x18\x1f \x01(\v2\x1c.livekit.GetDataBlobResponseH\x00R\x13getDataBlobResponse\x12H\n" + + "\x0fcompression_ack\x18 \x01(\v2\x1d.livekit.SignalCompressionAckH\x00R\x0ecompressionAckB\t\n" + "\amessage\"\xa9\x01\n" + "\x0eSimulcastCodec\x12\x14\n" + "\x05codec\x18\x01 \x01(\tR\x05codec\x12\x10\n" + @@ -5709,7 +5759,7 @@ const file_livekit_rtc_proto_rawDesc = "" + "\x05final\x18\x03 \x01(\bR\x05final\":\n" + "\x10MuteTrackRequest\x12\x10\n" + "\x03sid\x18\x01 \x01(\tR\x03sid\x12\x14\n" + - "\x05muted\x18\x02 \x01(\bR\x05muted\"\x97\x06\n" + + "\x05muted\x18\x02 \x01(\bR\x05muted\"\xe8\x05\n" + "\fJoinResponse\x12!\n" + "\x04room\x18\x01 \x01(\v2\r.livekit.RoomR\x04room\x12:\n" + "\vparticipant\x18\x02 \x01(\v2\x18.livekit.ParticipantInfoR\vparticipant\x12G\n" + @@ -5729,16 +5779,14 @@ const file_livekit_rtc_proto_rawDesc = "" + "\vsif_trailer\x18\r \x01(\fR\n" + "sifTrailer\x12D\n" + "\x16enabled_publish_codecs\x18\x0e \x03(\v2\x0e.livekit.CodecR\x14enabledPublishCodecs\x12!\n" + - "\ffast_publish\x18\x0f \x01(\bR\vfastPublish\x12-\n" + - "\x12signal_compression\x18\x10 \x01(\bR\x11signalCompression\"\xa8\x02\n" + + "\ffast_publish\x18\x0f \x01(\bR\vfastPublish\"\xf9\x01\n" + "\x11ReconnectResponse\x123\n" + "\vice_servers\x18\x01 \x03(\v2\x12.livekit.ICEServerR\n" + "iceServers\x12O\n" + "\x14client_configuration\x18\x02 \x01(\v2\x1c.livekit.ClientConfigurationR\x13clientConfiguration\x124\n" + "\vserver_info\x18\x03 \x01(\v2\x13.livekit.ServerInfoR\n" + "serverInfo\x12(\n" + - "\x10last_message_seq\x18\x04 \x01(\rR\x0elastMessageSeq\x12-\n" + - "\x12signal_compression\x18\x05 \x01(\bR\x11signalCompression\"T\n" + + "\x10last_message_seq\x18\x04 \x01(\rR\x0elastMessageSeq\"T\n" + "\x16TrackPublishedResponse\x12\x10\n" + "\x03cid\x18\x01 \x01(\tR\x03cid\x12(\n" + "\x05track\x18\x02 \x01(\v2\x12.livekit.TrackInfoR\x05track\"7\n" + @@ -5990,7 +6038,9 @@ const file_livekit_rtc_proto_rawDesc = "" + "\x04Type\x12\b\n" + "\x04NONE\x10\x00\x12\b\n" + "\x04GZIP\x10\x01\x12\x0f\n" + - "\vDEFLATE_RAW\x10\x02\"\x80\x01\n" + + "\vDEFLATE_RAW\x10\x02\"Y\n" + + "\x14SignalCompressionAck\x12A\n" + + "\vcompression\x18\x01 \x01(\x0e2\x1f.livekit.SignalCompression.TypeR\vcompression\"\x80\x01\n" + "\x14WrappedSignalRequest\x12A\n" + "\vcompression\x18\x01 \x01(\x0e2\x1f.livekit.SignalCompression.TypeR\vcompression\x12%\n" + "\x0esignal_request\x18\x02 \x01(\fR\rsignalRequest\"\x83\x01\n" + @@ -6029,7 +6079,7 @@ func file_livekit_rtc_proto_rawDescGZIP() []byte { } var file_livekit_rtc_proto_enumTypes = make([]protoimpl.EnumInfo, 7) -var file_livekit_rtc_proto_msgTypes = make([]protoimpl.MessageInfo, 68) +var file_livekit_rtc_proto_msgTypes = make([]protoimpl.MessageInfo, 69) var file_livekit_rtc_proto_goTypes = []any{ (SignalTarget)(0), // 0: livekit.SignalTarget (StreamState)(0), // 1: livekit.StreamState @@ -6097,44 +6147,45 @@ var file_livekit_rtc_proto_goTypes = []any{ (*JoinRequest)(nil), // 63: livekit.JoinRequest (*WrappedJoinRequest)(nil), // 64: livekit.WrappedJoinRequest (*SignalCompression)(nil), // 65: livekit.SignalCompression - (*WrappedSignalRequest)(nil), // 66: livekit.WrappedSignalRequest - (*WrappedSignalResponse)(nil), // 67: livekit.WrappedSignalResponse - (*MediaSectionsRequirement)(nil), // 68: livekit.MediaSectionsRequirement - (*DataTrackSubscriberHandles_PublishedDataTrack)(nil), // 69: livekit.DataTrackSubscriberHandles.PublishedDataTrack - nil, // 70: livekit.DataTrackSubscriberHandles.SubHandlesEntry - nil, // 71: livekit.SessionDescription.MidToTrackIdEntry - (*UpdateDataSubscription_Update)(nil), // 72: livekit.UpdateDataSubscription.Update - nil, // 73: livekit.UpdateParticipantMetadata.AttributesEntry - nil, // 74: livekit.JoinRequest.ParticipantAttributesEntry - (*VideoLayer)(nil), // 75: livekit.VideoLayer - (VideoLayer_Mode)(0), // 76: livekit.VideoLayer.Mode - (TrackType)(0), // 77: livekit.TrackType - (TrackSource)(0), // 78: livekit.TrackSource - (Encryption_Type)(0), // 79: livekit.Encryption.Type - (BackupCodecPolicy)(0), // 80: livekit.BackupCodecPolicy - (AudioTrackFeature)(0), // 81: livekit.AudioTrackFeature - (PacketTrailerFeature)(0), // 82: livekit.PacketTrailerFeature - (*DataTrackFrameEncoding)(nil), // 83: livekit.DataTrackFrameEncoding - (*DataTrackSchemaId)(nil), // 84: livekit.DataTrackSchemaId - (*DataTrackInfo)(nil), // 85: livekit.DataTrackInfo - (*Room)(nil), // 86: livekit.Room - (*ParticipantInfo)(nil), // 87: livekit.ParticipantInfo - (*ClientConfiguration)(nil), // 88: livekit.ClientConfiguration - (*ServerInfo)(nil), // 89: livekit.ServerInfo - (*Codec)(nil), // 90: livekit.Codec - (*TrackInfo)(nil), // 91: livekit.TrackInfo - (*ParticipantTracks)(nil), // 92: livekit.ParticipantTracks - (*DataBlob)(nil), // 93: livekit.DataBlob - (*DataBlobKey)(nil), // 94: livekit.DataBlobKey - (VideoQuality)(0), // 95: livekit.VideoQuality - (DisconnectReason)(0), // 96: livekit.DisconnectReason - (*SpeakerInfo)(nil), // 97: livekit.SpeakerInfo - (ConnectionQuality)(0), // 98: livekit.ConnectionQuality - (*SubscribedAudioCodec)(nil), // 99: livekit.SubscribedAudioCodec - (SubscriptionError)(0), // 100: livekit.SubscriptionError - (*ClientInfo)(nil), // 101: livekit.ClientInfo - (ReconnectReason)(0), // 102: livekit.ReconnectReason - (*DataTrackSubscriptionOptions)(nil), // 103: livekit.DataTrackSubscriptionOptions + (*SignalCompressionAck)(nil), // 66: livekit.SignalCompressionAck + (*WrappedSignalRequest)(nil), // 67: livekit.WrappedSignalRequest + (*WrappedSignalResponse)(nil), // 68: livekit.WrappedSignalResponse + (*MediaSectionsRequirement)(nil), // 69: livekit.MediaSectionsRequirement + (*DataTrackSubscriberHandles_PublishedDataTrack)(nil), // 70: livekit.DataTrackSubscriberHandles.PublishedDataTrack + nil, // 71: livekit.DataTrackSubscriberHandles.SubHandlesEntry + nil, // 72: livekit.SessionDescription.MidToTrackIdEntry + (*UpdateDataSubscription_Update)(nil), // 73: livekit.UpdateDataSubscription.Update + nil, // 74: livekit.UpdateParticipantMetadata.AttributesEntry + nil, // 75: livekit.JoinRequest.ParticipantAttributesEntry + (*VideoLayer)(nil), // 76: livekit.VideoLayer + (VideoLayer_Mode)(0), // 77: livekit.VideoLayer.Mode + (TrackType)(0), // 78: livekit.TrackType + (TrackSource)(0), // 79: livekit.TrackSource + (Encryption_Type)(0), // 80: livekit.Encryption.Type + (BackupCodecPolicy)(0), // 81: livekit.BackupCodecPolicy + (AudioTrackFeature)(0), // 82: livekit.AudioTrackFeature + (PacketTrailerFeature)(0), // 83: livekit.PacketTrailerFeature + (*DataTrackFrameEncoding)(nil), // 84: livekit.DataTrackFrameEncoding + (*DataTrackSchemaId)(nil), // 85: livekit.DataTrackSchemaId + (*DataTrackInfo)(nil), // 86: livekit.DataTrackInfo + (*Room)(nil), // 87: livekit.Room + (*ParticipantInfo)(nil), // 88: livekit.ParticipantInfo + (*ClientConfiguration)(nil), // 89: livekit.ClientConfiguration + (*ServerInfo)(nil), // 90: livekit.ServerInfo + (*Codec)(nil), // 91: livekit.Codec + (*TrackInfo)(nil), // 92: livekit.TrackInfo + (*ParticipantTracks)(nil), // 93: livekit.ParticipantTracks + (*DataBlob)(nil), // 94: livekit.DataBlob + (*DataBlobKey)(nil), // 95: livekit.DataBlobKey + (VideoQuality)(0), // 96: livekit.VideoQuality + (DisconnectReason)(0), // 97: livekit.DisconnectReason + (*SpeakerInfo)(nil), // 98: livekit.SpeakerInfo + (ConnectionQuality)(0), // 99: livekit.ConnectionQuality + (*SubscribedAudioCodec)(nil), // 100: livekit.SubscribedAudioCodec + (SubscriptionError)(0), // 101: livekit.SubscriptionError + (*ClientInfo)(nil), // 102: livekit.ClientInfo + (ReconnectReason)(0), // 103: livekit.ReconnectReason + (*DataTrackSubscriptionOptions)(nil), // 104: livekit.DataTrackSubscriptionOptions } var file_livekit_rtc_proto_depIdxs = []int32{ 22, // 0: livekit.SignalRequest.offer:type_name -> livekit.SessionDescription @@ -6179,109 +6230,111 @@ var file_livekit_rtc_proto_depIdxs = []int32{ 60, // 39: livekit.SignalResponse.request_response:type_name -> livekit.RequestResponse 61, // 40: livekit.SignalResponse.track_subscribed:type_name -> livekit.TrackSubscribed 50, // 41: livekit.SignalResponse.room_moved:type_name -> livekit.RoomMovedResponse - 68, // 42: livekit.SignalResponse.media_sections_requirement:type_name -> livekit.MediaSectionsRequirement + 69, // 42: livekit.SignalResponse.media_sections_requirement:type_name -> livekit.MediaSectionsRequirement 46, // 43: livekit.SignalResponse.subscribed_audio_codec_update:type_name -> livekit.SubscribedAudioCodecUpdate 12, // 44: livekit.SignalResponse.publish_data_track_response:type_name -> livekit.PublishDataTrackResponse 14, // 45: livekit.SignalResponse.unpublish_data_track_response:type_name -> livekit.UnpublishDataTrackResponse 15, // 46: livekit.SignalResponse.data_track_subscriber_handles:type_name -> livekit.DataTrackSubscriberHandles 27, // 47: livekit.SignalResponse.store_data_blob_response:type_name -> livekit.StoreDataBlobResponse 29, // 48: livekit.SignalResponse.get_data_blob_response:type_name -> livekit.GetDataBlobResponse - 75, // 49: livekit.SimulcastCodec.layers:type_name -> livekit.VideoLayer - 76, // 50: livekit.SimulcastCodec.video_layer_mode:type_name -> livekit.VideoLayer.Mode - 77, // 51: livekit.AddTrackRequest.type:type_name -> livekit.TrackType - 78, // 52: livekit.AddTrackRequest.source:type_name -> livekit.TrackSource - 75, // 53: livekit.AddTrackRequest.layers:type_name -> livekit.VideoLayer - 9, // 54: livekit.AddTrackRequest.simulcast_codecs:type_name -> livekit.SimulcastCodec - 79, // 55: livekit.AddTrackRequest.encryption:type_name -> livekit.Encryption.Type - 80, // 56: livekit.AddTrackRequest.backup_codec_policy:type_name -> livekit.BackupCodecPolicy - 81, // 57: livekit.AddTrackRequest.audio_features:type_name -> livekit.AudioTrackFeature - 82, // 58: livekit.AddTrackRequest.packet_trailer_features:type_name -> livekit.PacketTrailerFeature - 79, // 59: livekit.PublishDataTrackRequest.encryption:type_name -> livekit.Encryption.Type - 83, // 60: livekit.PublishDataTrackRequest.frame_encoding:type_name -> livekit.DataTrackFrameEncoding - 84, // 61: livekit.PublishDataTrackRequest.schema:type_name -> livekit.DataTrackSchemaId - 85, // 62: livekit.PublishDataTrackResponse.info:type_name -> livekit.DataTrackInfo - 85, // 63: livekit.UnpublishDataTrackResponse.info:type_name -> livekit.DataTrackInfo - 70, // 64: livekit.DataTrackSubscriberHandles.sub_handles:type_name -> livekit.DataTrackSubscriberHandles.SubHandlesEntry - 0, // 65: livekit.TrickleRequest.target:type_name -> livekit.SignalTarget - 86, // 66: livekit.JoinResponse.room:type_name -> livekit.Room - 87, // 67: livekit.JoinResponse.participant:type_name -> livekit.ParticipantInfo - 87, // 68: livekit.JoinResponse.other_participants:type_name -> livekit.ParticipantInfo - 36, // 69: livekit.JoinResponse.ice_servers:type_name -> livekit.ICEServer - 88, // 70: livekit.JoinResponse.client_configuration:type_name -> livekit.ClientConfiguration - 89, // 71: livekit.JoinResponse.server_info:type_name -> livekit.ServerInfo - 90, // 72: livekit.JoinResponse.enabled_publish_codecs:type_name -> livekit.Codec - 36, // 73: livekit.ReconnectResponse.ice_servers:type_name -> livekit.ICEServer - 88, // 74: livekit.ReconnectResponse.client_configuration:type_name -> livekit.ClientConfiguration - 89, // 75: livekit.ReconnectResponse.server_info:type_name -> livekit.ServerInfo - 91, // 76: livekit.TrackPublishedResponse.track:type_name -> livekit.TrackInfo - 71, // 77: livekit.SessionDescription.mid_to_track_id:type_name -> livekit.SessionDescription.MidToTrackIdEntry - 87, // 78: livekit.ParticipantUpdate.participants:type_name -> livekit.ParticipantInfo - 92, // 79: livekit.UpdateSubscription.participant_tracks:type_name -> livekit.ParticipantTracks - 72, // 80: livekit.UpdateDataSubscription.updates:type_name -> livekit.UpdateDataSubscription.Update - 93, // 81: livekit.StoreDataBlobRequest.blob:type_name -> livekit.DataBlob - 94, // 82: livekit.StoreDataBlobResponse.key:type_name -> livekit.DataBlobKey - 94, // 83: livekit.GetDataBlobRequest.key:type_name -> livekit.DataBlobKey - 93, // 84: livekit.GetDataBlobResponse.blob:type_name -> livekit.DataBlob - 95, // 85: livekit.UpdateTrackSettings.quality:type_name -> livekit.VideoQuality - 81, // 86: livekit.UpdateLocalAudioTrack.features:type_name -> livekit.AudioTrackFeature - 96, // 87: livekit.LeaveRequest.reason:type_name -> livekit.DisconnectReason - 3, // 88: livekit.LeaveRequest.action:type_name -> livekit.LeaveRequest.Action - 57, // 89: livekit.LeaveRequest.regions:type_name -> livekit.RegionSettings - 75, // 90: livekit.UpdateVideoLayers.layers:type_name -> livekit.VideoLayer - 73, // 91: livekit.UpdateParticipantMetadata.attributes:type_name -> livekit.UpdateParticipantMetadata.AttributesEntry - 97, // 92: livekit.SpeakersChanged.speakers:type_name -> livekit.SpeakerInfo - 86, // 93: livekit.RoomUpdate.room:type_name -> livekit.Room - 98, // 94: livekit.ConnectionQualityInfo.quality:type_name -> livekit.ConnectionQuality - 39, // 95: livekit.ConnectionQualityUpdate.updates:type_name -> livekit.ConnectionQualityInfo - 1, // 96: livekit.StreamStateInfo.state:type_name -> livekit.StreamState - 41, // 97: livekit.StreamStateUpdate.stream_states:type_name -> livekit.StreamStateInfo - 95, // 98: livekit.SubscribedQuality.quality:type_name -> livekit.VideoQuality - 43, // 99: livekit.SubscribedCodec.qualities:type_name -> livekit.SubscribedQuality - 43, // 100: livekit.SubscribedQualityUpdate.subscribed_qualities:type_name -> livekit.SubscribedQuality - 44, // 101: livekit.SubscribedQualityUpdate.subscribed_codecs:type_name -> livekit.SubscribedCodec - 99, // 102: livekit.SubscribedAudioCodecUpdate.subscribed_audio_codecs:type_name -> livekit.SubscribedAudioCodec - 47, // 103: livekit.SubscriptionPermission.track_permissions:type_name -> livekit.TrackPermission - 86, // 104: livekit.RoomMovedResponse.room:type_name -> livekit.Room - 87, // 105: livekit.RoomMovedResponse.participant:type_name -> livekit.ParticipantInfo - 87, // 106: livekit.RoomMovedResponse.other_participants:type_name -> livekit.ParticipantInfo - 22, // 107: livekit.SyncState.answer:type_name -> livekit.SessionDescription - 24, // 108: livekit.SyncState.subscription:type_name -> livekit.UpdateSubscription - 20, // 109: livekit.SyncState.publish_tracks:type_name -> livekit.TrackPublishedResponse - 53, // 110: livekit.SyncState.data_channels:type_name -> livekit.DataChannelInfo - 22, // 111: livekit.SyncState.offer:type_name -> livekit.SessionDescription - 52, // 112: livekit.SyncState.datachannel_receive_states:type_name -> livekit.DataChannelReceiveState - 12, // 113: livekit.SyncState.publish_data_tracks:type_name -> livekit.PublishDataTrackResponse - 25, // 114: livekit.SyncState.data_subscription:type_name -> livekit.UpdateDataSubscription - 0, // 115: livekit.DataChannelInfo.target:type_name -> livekit.SignalTarget - 2, // 116: livekit.SimulateScenario.switch_candidate_protocol:type_name -> livekit.CandidateProtocol - 58, // 117: livekit.RegionSettings.regions:type_name -> livekit.RegionInfo - 100, // 118: livekit.SubscriptionResponse.err:type_name -> livekit.SubscriptionError - 4, // 119: livekit.RequestResponse.reason:type_name -> livekit.RequestResponse.Reason - 16, // 120: livekit.RequestResponse.trickle:type_name -> livekit.TrickleRequest - 10, // 121: livekit.RequestResponse.add_track:type_name -> livekit.AddTrackRequest - 17, // 122: livekit.RequestResponse.mute:type_name -> livekit.MuteTrackRequest - 35, // 123: livekit.RequestResponse.update_metadata:type_name -> livekit.UpdateParticipantMetadata - 31, // 124: livekit.RequestResponse.update_audio_track:type_name -> livekit.UpdateLocalAudioTrack - 32, // 125: livekit.RequestResponse.update_video_track:type_name -> livekit.UpdateLocalVideoTrack - 11, // 126: livekit.RequestResponse.publish_data_track:type_name -> livekit.PublishDataTrackRequest - 13, // 127: livekit.RequestResponse.unpublish_data_track:type_name -> livekit.UnpublishDataTrackRequest - 101, // 128: livekit.JoinRequest.client_info:type_name -> livekit.ClientInfo - 62, // 129: livekit.JoinRequest.connection_settings:type_name -> livekit.ConnectionSettings - 74, // 130: livekit.JoinRequest.participant_attributes:type_name -> livekit.JoinRequest.ParticipantAttributesEntry - 10, // 131: livekit.JoinRequest.add_track_requests:type_name -> livekit.AddTrackRequest - 22, // 132: livekit.JoinRequest.publisher_offer:type_name -> livekit.SessionDescription - 102, // 133: livekit.JoinRequest.reconnect_reason:type_name -> livekit.ReconnectReason - 51, // 134: livekit.JoinRequest.sync_state:type_name -> livekit.SyncState - 5, // 135: livekit.WrappedJoinRequest.compression:type_name -> livekit.WrappedJoinRequest.Compression - 6, // 136: livekit.WrappedSignalRequest.compression:type_name -> livekit.SignalCompression.Type - 6, // 137: livekit.WrappedSignalResponse.compression:type_name -> livekit.SignalCompression.Type - 69, // 138: livekit.DataTrackSubscriberHandles.SubHandlesEntry.value:type_name -> livekit.DataTrackSubscriberHandles.PublishedDataTrack - 103, // 139: livekit.UpdateDataSubscription.Update.options:type_name -> livekit.DataTrackSubscriptionOptions - 140, // [140:140] is the sub-list for method output_type - 140, // [140:140] is the sub-list for method input_type - 140, // [140:140] is the sub-list for extension type_name - 140, // [140:140] is the sub-list for extension extendee - 0, // [0:140] is the sub-list for field type_name + 66, // 49: livekit.SignalResponse.compression_ack:type_name -> livekit.SignalCompressionAck + 76, // 50: livekit.SimulcastCodec.layers:type_name -> livekit.VideoLayer + 77, // 51: livekit.SimulcastCodec.video_layer_mode:type_name -> livekit.VideoLayer.Mode + 78, // 52: livekit.AddTrackRequest.type:type_name -> livekit.TrackType + 79, // 53: livekit.AddTrackRequest.source:type_name -> livekit.TrackSource + 76, // 54: livekit.AddTrackRequest.layers:type_name -> livekit.VideoLayer + 9, // 55: livekit.AddTrackRequest.simulcast_codecs:type_name -> livekit.SimulcastCodec + 80, // 56: livekit.AddTrackRequest.encryption:type_name -> livekit.Encryption.Type + 81, // 57: livekit.AddTrackRequest.backup_codec_policy:type_name -> livekit.BackupCodecPolicy + 82, // 58: livekit.AddTrackRequest.audio_features:type_name -> livekit.AudioTrackFeature + 83, // 59: livekit.AddTrackRequest.packet_trailer_features:type_name -> livekit.PacketTrailerFeature + 80, // 60: livekit.PublishDataTrackRequest.encryption:type_name -> livekit.Encryption.Type + 84, // 61: livekit.PublishDataTrackRequest.frame_encoding:type_name -> livekit.DataTrackFrameEncoding + 85, // 62: livekit.PublishDataTrackRequest.schema:type_name -> livekit.DataTrackSchemaId + 86, // 63: livekit.PublishDataTrackResponse.info:type_name -> livekit.DataTrackInfo + 86, // 64: livekit.UnpublishDataTrackResponse.info:type_name -> livekit.DataTrackInfo + 71, // 65: livekit.DataTrackSubscriberHandles.sub_handles:type_name -> livekit.DataTrackSubscriberHandles.SubHandlesEntry + 0, // 66: livekit.TrickleRequest.target:type_name -> livekit.SignalTarget + 87, // 67: livekit.JoinResponse.room:type_name -> livekit.Room + 88, // 68: livekit.JoinResponse.participant:type_name -> livekit.ParticipantInfo + 88, // 69: livekit.JoinResponse.other_participants:type_name -> livekit.ParticipantInfo + 36, // 70: livekit.JoinResponse.ice_servers:type_name -> livekit.ICEServer + 89, // 71: livekit.JoinResponse.client_configuration:type_name -> livekit.ClientConfiguration + 90, // 72: livekit.JoinResponse.server_info:type_name -> livekit.ServerInfo + 91, // 73: livekit.JoinResponse.enabled_publish_codecs:type_name -> livekit.Codec + 36, // 74: livekit.ReconnectResponse.ice_servers:type_name -> livekit.ICEServer + 89, // 75: livekit.ReconnectResponse.client_configuration:type_name -> livekit.ClientConfiguration + 90, // 76: livekit.ReconnectResponse.server_info:type_name -> livekit.ServerInfo + 92, // 77: livekit.TrackPublishedResponse.track:type_name -> livekit.TrackInfo + 72, // 78: livekit.SessionDescription.mid_to_track_id:type_name -> livekit.SessionDescription.MidToTrackIdEntry + 88, // 79: livekit.ParticipantUpdate.participants:type_name -> livekit.ParticipantInfo + 93, // 80: livekit.UpdateSubscription.participant_tracks:type_name -> livekit.ParticipantTracks + 73, // 81: livekit.UpdateDataSubscription.updates:type_name -> livekit.UpdateDataSubscription.Update + 94, // 82: livekit.StoreDataBlobRequest.blob:type_name -> livekit.DataBlob + 95, // 83: livekit.StoreDataBlobResponse.key:type_name -> livekit.DataBlobKey + 95, // 84: livekit.GetDataBlobRequest.key:type_name -> livekit.DataBlobKey + 94, // 85: livekit.GetDataBlobResponse.blob:type_name -> livekit.DataBlob + 96, // 86: livekit.UpdateTrackSettings.quality:type_name -> livekit.VideoQuality + 82, // 87: livekit.UpdateLocalAudioTrack.features:type_name -> livekit.AudioTrackFeature + 97, // 88: livekit.LeaveRequest.reason:type_name -> livekit.DisconnectReason + 3, // 89: livekit.LeaveRequest.action:type_name -> livekit.LeaveRequest.Action + 57, // 90: livekit.LeaveRequest.regions:type_name -> livekit.RegionSettings + 76, // 91: livekit.UpdateVideoLayers.layers:type_name -> livekit.VideoLayer + 74, // 92: livekit.UpdateParticipantMetadata.attributes:type_name -> livekit.UpdateParticipantMetadata.AttributesEntry + 98, // 93: livekit.SpeakersChanged.speakers:type_name -> livekit.SpeakerInfo + 87, // 94: livekit.RoomUpdate.room:type_name -> livekit.Room + 99, // 95: livekit.ConnectionQualityInfo.quality:type_name -> livekit.ConnectionQuality + 39, // 96: livekit.ConnectionQualityUpdate.updates:type_name -> livekit.ConnectionQualityInfo + 1, // 97: livekit.StreamStateInfo.state:type_name -> livekit.StreamState + 41, // 98: livekit.StreamStateUpdate.stream_states:type_name -> livekit.StreamStateInfo + 96, // 99: livekit.SubscribedQuality.quality:type_name -> livekit.VideoQuality + 43, // 100: livekit.SubscribedCodec.qualities:type_name -> livekit.SubscribedQuality + 43, // 101: livekit.SubscribedQualityUpdate.subscribed_qualities:type_name -> livekit.SubscribedQuality + 44, // 102: livekit.SubscribedQualityUpdate.subscribed_codecs:type_name -> livekit.SubscribedCodec + 100, // 103: livekit.SubscribedAudioCodecUpdate.subscribed_audio_codecs:type_name -> livekit.SubscribedAudioCodec + 47, // 104: livekit.SubscriptionPermission.track_permissions:type_name -> livekit.TrackPermission + 87, // 105: livekit.RoomMovedResponse.room:type_name -> livekit.Room + 88, // 106: livekit.RoomMovedResponse.participant:type_name -> livekit.ParticipantInfo + 88, // 107: livekit.RoomMovedResponse.other_participants:type_name -> livekit.ParticipantInfo + 22, // 108: livekit.SyncState.answer:type_name -> livekit.SessionDescription + 24, // 109: livekit.SyncState.subscription:type_name -> livekit.UpdateSubscription + 20, // 110: livekit.SyncState.publish_tracks:type_name -> livekit.TrackPublishedResponse + 53, // 111: livekit.SyncState.data_channels:type_name -> livekit.DataChannelInfo + 22, // 112: livekit.SyncState.offer:type_name -> livekit.SessionDescription + 52, // 113: livekit.SyncState.datachannel_receive_states:type_name -> livekit.DataChannelReceiveState + 12, // 114: livekit.SyncState.publish_data_tracks:type_name -> livekit.PublishDataTrackResponse + 25, // 115: livekit.SyncState.data_subscription:type_name -> livekit.UpdateDataSubscription + 0, // 116: livekit.DataChannelInfo.target:type_name -> livekit.SignalTarget + 2, // 117: livekit.SimulateScenario.switch_candidate_protocol:type_name -> livekit.CandidateProtocol + 58, // 118: livekit.RegionSettings.regions:type_name -> livekit.RegionInfo + 101, // 119: livekit.SubscriptionResponse.err:type_name -> livekit.SubscriptionError + 4, // 120: livekit.RequestResponse.reason:type_name -> livekit.RequestResponse.Reason + 16, // 121: livekit.RequestResponse.trickle:type_name -> livekit.TrickleRequest + 10, // 122: livekit.RequestResponse.add_track:type_name -> livekit.AddTrackRequest + 17, // 123: livekit.RequestResponse.mute:type_name -> livekit.MuteTrackRequest + 35, // 124: livekit.RequestResponse.update_metadata:type_name -> livekit.UpdateParticipantMetadata + 31, // 125: livekit.RequestResponse.update_audio_track:type_name -> livekit.UpdateLocalAudioTrack + 32, // 126: livekit.RequestResponse.update_video_track:type_name -> livekit.UpdateLocalVideoTrack + 11, // 127: livekit.RequestResponse.publish_data_track:type_name -> livekit.PublishDataTrackRequest + 13, // 128: livekit.RequestResponse.unpublish_data_track:type_name -> livekit.UnpublishDataTrackRequest + 102, // 129: livekit.JoinRequest.client_info:type_name -> livekit.ClientInfo + 62, // 130: livekit.JoinRequest.connection_settings:type_name -> livekit.ConnectionSettings + 75, // 131: livekit.JoinRequest.participant_attributes:type_name -> livekit.JoinRequest.ParticipantAttributesEntry + 10, // 132: livekit.JoinRequest.add_track_requests:type_name -> livekit.AddTrackRequest + 22, // 133: livekit.JoinRequest.publisher_offer:type_name -> livekit.SessionDescription + 103, // 134: livekit.JoinRequest.reconnect_reason:type_name -> livekit.ReconnectReason + 51, // 135: livekit.JoinRequest.sync_state:type_name -> livekit.SyncState + 5, // 136: livekit.WrappedJoinRequest.compression:type_name -> livekit.WrappedJoinRequest.Compression + 6, // 137: livekit.SignalCompressionAck.compression:type_name -> livekit.SignalCompression.Type + 6, // 138: livekit.WrappedSignalRequest.compression:type_name -> livekit.SignalCompression.Type + 6, // 139: livekit.WrappedSignalResponse.compression:type_name -> livekit.SignalCompression.Type + 70, // 140: livekit.DataTrackSubscriberHandles.SubHandlesEntry.value:type_name -> livekit.DataTrackSubscriberHandles.PublishedDataTrack + 104, // 141: livekit.UpdateDataSubscription.Update.options:type_name -> livekit.DataTrackSubscriptionOptions + 142, // [142:142] is the sub-list for method output_type + 142, // [142:142] is the sub-list for method input_type + 142, // [142:142] is the sub-list for extension type_name + 142, // [142:142] is the sub-list for extension extendee + 0, // [0:142] is the sub-list for field type_name } func init() { file_livekit_rtc_proto_init() } @@ -6345,6 +6398,7 @@ func file_livekit_rtc_proto_init() { (*SignalResponse_DataTrackSubscriberHandles)(nil), (*SignalResponse_StoreDataBlobResponse)(nil), (*SignalResponse_GetDataBlobResponse)(nil), + (*SignalResponse_CompressionAck)(nil), } file_livekit_rtc_proto_msgTypes[4].OneofWrappers = []any{} file_livekit_rtc_proto_msgTypes[47].OneofWrappers = []any{ @@ -6375,7 +6429,7 @@ func file_livekit_rtc_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_livekit_rtc_proto_rawDesc), len(file_livekit_rtc_proto_rawDesc)), NumEnums: 7, - NumMessages: 68, + NumMessages: 69, NumExtensions: 0, NumServices: 0, }, From 676bc3dcac21ad305bf8e214d6a1db77ffd2c4e9 Mon Sep 17 00:00:00 2001 From: shijing xian Date: Fri, 28 Aug 2026 15:38:13 -0700 Subject: [PATCH 07/10] signalling: carry compression as a oneof arm, not an envelope Replaces WrappedSignalRequest/WrappedSignalResponse and the SignalCompressionAck handshake with a `compressed` arm on the SignalRequest and SignalResponse oneofs. The envelope form needed a negotiation handshake for one reason: a receiver had to know whether to parse a frame as SignalResponse or WrappedSignalResponse before it could read anything out of it. That forced an agreement to be established first, and whatever message established it could not itself be compressed. As an arm of the oneof, the tag is the discriminator. The receiver always parses a SignalResponse and switches on the arm it got, so nothing needs to be agreed in advance and the very first message can be compressed -- including JoinResponse, which in a large room is the biggest message on the wire and the one this is most worth doing for. That removes the extra frame, the ack message, and the two per-response booleans that preceded it. It is also cheaper on the wire. Under the envelope, once compression was on every message paid envelope overhead, including messages too small to be worth compressing and sent with compression NONE. Here a small message is sent as its ordinary arm and costs nothing, so the threshold has no downside. Gating is unchanged: the arm is used only against a peer that advertised CAP_COMPRESSION_DEFLATE_RAW, since an older peer would see an unknown field and silently drop the message. Co-Authored-By: Claude Opus 5 (1M context) --- .changeset/signal-payload-compression.md | 2 +- protobufs/livekit_rtc.proto | 73 +++++++++++------------- 2 files changed, 34 insertions(+), 41 deletions(-) diff --git a/.changeset/signal-payload-compression.md b/.changeset/signal-payload-compression.md index 3a41c417a..704a97844 100644 --- a/.changeset/signal-payload-compression.md +++ b/.changeset/signal-payload-compression.md @@ -3,4 +3,4 @@ "@livekit/protocol": minor --- -signalling: add `WrappedSignalRequest` / `WrappedSignalResponse` envelopes, the `SignalCompression.Type` enum, and a `SignalCompressionAck` message on the `SignalResponse` oneof, so signal messages on the WebSocket can be compressed the way `WrappedJoinRequest` already compresses the join payload in the connect URL. Negotiated via the existing `ClientInfo.CAP_COMPRESSION_DEFLATE_RAW` capability: a server honouring it sends `SignalCompressionAck` as the first message and wraps everything after, including the `JoinResponse`. Servers and clients that do not exchange that message keep using the existing uncompressed wire format, so old and new peers interoperate unchanged. +signalling: allow signal messages on the WebSocket to be compressed, the way `WrappedJoinRequest` already compresses the join payload in the connect URL. Adds a `compressed` arm to the `SignalRequest` and `SignalResponse` oneofs, carrying `CompressedSignalRequest` / `CompressedSignalResponse` plus the shared `SignalCompression.Type` enum. Because the compressed form is an arm of the oneof rather than an envelope around it, no negotiation handshake is needed — the receiver always parses a `SignalRequest`/`SignalResponse` and the oneof tag says whether the payload is compressed, so even the first message can be compressed. Senders use the arm only when the peer advertised `ClientInfo.CAP_COMPRESSION_DEFLATE_RAW`, so old and new peers interoperate unchanged. diff --git a/protobufs/livekit_rtc.proto b/protobufs/livekit_rtc.proto index 644077c99..88c18c96e 100644 --- a/protobufs/livekit_rtc.proto +++ b/protobufs/livekit_rtc.proto @@ -67,6 +67,8 @@ message SignalRequest { StoreDataBlobRequest store_data_blob_request = 22; // Retrieve a stored data blob. GetDataBlobRequest get_data_blob_request = 23; + // A compressed SignalRequest. See CompressedSignalRequest. + CompressedSignalRequest compressed = 24; } } @@ -133,9 +135,8 @@ message SignalResponse { StoreDataBlobResponse store_data_blob_response = 30; // Sent in response to `GetDataBlobRequest`. GetDataBlobResponse get_data_blob_response = 31; - // Always the FIRST message on a connection that will use signal compression. - // See SignalCompressionAck. - SignalCompressionAck compression_ack = 32; + // A compressed SignalResponse. See CompressedSignalResponse. + CompressedSignalResponse compressed = 32; } } @@ -677,12 +678,15 @@ message WrappedJoinRequest { // are siblings of their type, so a top-level `NONE` would collide with the one // already declared in livekit_sip.proto. Nesting scopes them to this message. // -// One shared type, rather than an enum nested in each envelope, because +// One shared type, rather than an enum nested in each message, because // compress/decompress is naturally generic over direction -- the SFU's own // implementation already threads a single compression type through both the request // and response paths. message SignalCompression { enum Type { + // Not used by CompressedSignalRequest/Response: an uncompressed message is sent + // as its ordinary oneof arm, not as a compressed one claiming NONE. Present + // because proto3 enums must have a zero value. NONE = 0; // Numbered to match WrappedJoinRequest.Compression rather than to rank the // options: two enums in one file where GZIP has different numbers is a trap for @@ -695,50 +699,39 @@ message SignalCompression { } } -// Turns on signal compression for the rest of the connection, in both directions. +// A SignalRequest that has been compressed, carried as an arm of SignalRequest's own +// oneof: `signal_request` holds a marshalled SignalRequest, compressed with +// `compression`. Receivers decompress and parse the result as a SignalRequest. // -// Sent as the FIRST signal message, unwrapped, before the JoinResponse or -// ReconnectResponse. Everything after it is wrapped in -// WrappedSignalRequest/WrappedSignalResponse -- including that JoinResponse, which -// on a large room is the single biggest message on the wire. +// Being an arm of the oneof, rather than an envelope around it, is what makes this +// need no negotiation handshake. The receiver always parses a SignalRequest; the +// oneof tag itself says whether the payload is compressed. Nothing has to be agreed +// before the first message, so the very first message can be compressed -- which +// matters most for JoinResponse, the largest message on the wire in a big room. // -// Sent only when the client advertised ClientInfo.CAP_COMPRESSION_DEFLATE_RAW. A -// server that does not implement compression, or a client that did not ask for it, -// simply never exchanges this message and the connection stays as it is today. +// It also costs nothing when compression does not pay: a message under the threshold +// is simply sent as its ordinary arm, rather than as an envelope announcing that it +// was left uncompressed. // -// Being its own message, rather than a flag on JoinResponse, is what lets the -// JoinResponse itself be compressed: a flag would have to be read before the client -// could know how to parse the message carrying it. Here both possibilities for the -// first frame are a plain SignalResponse, so the client parses one type and switches -// on which arm it got -- `compression_ack` means compress from here on, anything else -// means an older server and the connection continues uncompressed. No sniffing, and -// no extra round trip: the server writes this and the JoinResponse back to back. -message SignalCompressionAck { - // The algorithm to use. Senders may still emit NONE per message -- see - // WrappedSignalRequest on the size threshold -- but must not use an algorithm - // other than this one. - SignalCompression.Type compression = 1; -} - -// Envelope for a compressed SignalRequest, mirroring WrappedJoinRequest. -// -// Used in place of a bare SignalRequest on the signalling WebSocket once both -// sides have agreed to compress -- see SignalCompressionAck. +// Senders MUST NOT nest -- the payload is always an ordinary SignalRequest, never +// another CompressedSignalRequest -- and MUST send this arm only when the peer has +// advertised ClientInfo.CAP_COMPRESSION_DEFLATE_RAW, since an older peer would parse +// it as an unknown field and silently drop the message. // -// Senders SHOULD leave small payloads uncompressed (NONE): below roughly 200 bytes -// the compressed form is usually larger, and the CPU is wasted either way. Senders -// MUST fall back to NONE if compression fails or does not shrink the payload; a -// compression problem must never become a connection failure. Receivers MUST honour -// whatever `compression` says regardless of size. -message WrappedSignalRequest { +// Senders SHOULD leave payloads below roughly 200 bytes uncompressed, sending the +// ordinary arm instead: below that the compressed form is usually larger and the CPU +// is wasted either way. Senders MUST fall back to the ordinary arm if compression +// fails or does not shrink the payload; a compression problem must never become a +// connection failure. +message CompressedSignalRequest { SignalCompression.Type compression = 1; - bytes signal_request = 2; // marshalled SignalRequest + potentially compressed + bytes signal_request = 2; // marshalled SignalRequest, compressed } -// Envelope for a compressed SignalResponse. See WrappedSignalRequest. -message WrappedSignalResponse { +// A compressed SignalResponse. See CompressedSignalRequest. +message CompressedSignalResponse { SignalCompression.Type compression = 1; - bytes signal_response = 2; // marshalled SignalResponse + potentially compressed + bytes signal_response = 2; // marshalled SignalResponse, compressed } message MediaSectionsRequirement { From 8f4743d7bd8ec9f0d63baaad8642d93418fe14c7 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 28 Aug 2026 22:38:50 +0000 Subject: [PATCH 08/10] generated protobuf --- livekit/livekit_rtc.pb.go | 551 ++++++++++++++++++-------------------- 1 file changed, 261 insertions(+), 290 deletions(-) diff --git a/livekit/livekit_rtc.pb.go b/livekit/livekit_rtc.pb.go index bbc691c02..a8b7c1fe5 100644 --- a/livekit/livekit_rtc.pb.go +++ b/livekit/livekit_rtc.pb.go @@ -352,6 +352,9 @@ func (WrappedJoinRequest_Compression) EnumDescriptor() ([]byte, []int) { type SignalCompression_Type int32 const ( + // Not used by CompressedSignalRequest/Response: an uncompressed message is sent + // as its ordinary oneof arm, not as a compressed one claiming NONE. Present + // because proto3 enums must have a zero value. SignalCompression_NONE SignalCompression_Type = 0 // Numbered to match WrappedJoinRequest.Compression rather than to rank the // options: two enums in one file where GZIP has different numbers is a trap for @@ -430,6 +433,7 @@ type SignalRequest struct { // *SignalRequest_UpdateDataSubscription // *SignalRequest_StoreDataBlobRequest // *SignalRequest_GetDataBlobRequest + // *SignalRequest_Compressed Message isSignalRequest_Message `protobuf_oneof:"message"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -671,6 +675,15 @@ func (x *SignalRequest) GetGetDataBlobRequest() *GetDataBlobRequest { return nil } +func (x *SignalRequest) GetCompressed() *CompressedSignalRequest { + if x != nil { + if x, ok := x.Message.(*SignalRequest_Compressed); ok { + return x.Compressed + } + } + return nil +} + type isSignalRequest_Message interface { isSignalRequest_Message() } @@ -785,6 +798,11 @@ type SignalRequest_GetDataBlobRequest struct { GetDataBlobRequest *GetDataBlobRequest `protobuf:"bytes,23,opt,name=get_data_blob_request,json=getDataBlobRequest,proto3,oneof"` } +type SignalRequest_Compressed struct { + // A compressed SignalRequest. See CompressedSignalRequest. + Compressed *CompressedSignalRequest `protobuf:"bytes,24,opt,name=compressed,proto3,oneof"` +} + func (*SignalRequest_Offer) isSignalRequest_Message() {} func (*SignalRequest_Answer) isSignalRequest_Message() {} @@ -829,6 +847,8 @@ func (*SignalRequest_StoreDataBlobRequest) isSignalRequest_Message() {} func (*SignalRequest_GetDataBlobRequest) isSignalRequest_Message() {} +func (*SignalRequest_Compressed) isSignalRequest_Message() {} + type SignalResponse struct { state protoimpl.MessageState `protogen:"open.v1"` // Types that are valid to be assigned to Message: @@ -863,7 +883,7 @@ type SignalResponse struct { // *SignalResponse_DataTrackSubscriberHandles // *SignalResponse_StoreDataBlobResponse // *SignalResponse_GetDataBlobResponse - // *SignalResponse_CompressionAck + // *SignalResponse_Compressed Message isSignalResponse_Message `protobuf_oneof:"message"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -1176,10 +1196,10 @@ func (x *SignalResponse) GetGetDataBlobResponse() *GetDataBlobResponse { return nil } -func (x *SignalResponse) GetCompressionAck() *SignalCompressionAck { +func (x *SignalResponse) GetCompressed() *CompressedSignalResponse { if x != nil { - if x, ok := x.Message.(*SignalResponse_CompressionAck); ok { - return x.CompressionAck + if x, ok := x.Message.(*SignalResponse_Compressed); ok { + return x.Compressed } } return nil @@ -1340,10 +1360,9 @@ type SignalResponse_GetDataBlobResponse struct { GetDataBlobResponse *GetDataBlobResponse `protobuf:"bytes,31,opt,name=get_data_blob_response,json=getDataBlobResponse,proto3,oneof"` } -type SignalResponse_CompressionAck struct { - // Always the FIRST message on a connection that will use signal compression. - // See SignalCompressionAck. - CompressionAck *SignalCompressionAck `protobuf:"bytes,32,opt,name=compression_ack,json=compressionAck,proto3,oneof"` +type SignalResponse_Compressed struct { + // A compressed SignalResponse. See CompressedSignalResponse. + Compressed *CompressedSignalResponse `protobuf:"bytes,32,opt,name=compressed,proto3,oneof"` } func (*SignalResponse_Join) isSignalResponse_Message() {} @@ -1406,7 +1425,7 @@ func (*SignalResponse_StoreDataBlobResponse) isSignalResponse_Message() {} func (*SignalResponse_GetDataBlobResponse) isSignalResponse_Message() {} -func (*SignalResponse_CompressionAck) isSignalResponse_Message() {} +func (*SignalResponse_Compressed) isSignalResponse_Message() {} type SimulcastCodec struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -5235,7 +5254,7 @@ func (x *WrappedJoinRequest) GetJoinRequest() []byte { // are siblings of their type, so a top-level `NONE` would collide with the one // already declared in livekit_sip.proto. Nesting scopes them to this message. // -// One shared type, rather than an enum nested in each envelope, because +// One shared type, rather than an enum nested in each message, because // compress/decompress is naturally generic over direction -- the SFU's own // implementation already threads a single compression type through both the request // and response paths. @@ -5275,48 +5294,52 @@ func (*SignalCompression) Descriptor() ([]byte, []int) { return file_livekit_rtc_proto_rawDescGZIP(), []int{58} } -// Turns on signal compression for the rest of the connection, in both directions. +// A SignalRequest that has been compressed, carried as an arm of SignalRequest's own +// oneof: `signal_request` holds a marshalled SignalRequest, compressed with +// `compression`. Receivers decompress and parse the result as a SignalRequest. // -// Sent as the FIRST signal message, unwrapped, before the JoinResponse or -// ReconnectResponse. Everything after it is wrapped in -// WrappedSignalRequest/WrappedSignalResponse -- including that JoinResponse, which -// on a large room is the single biggest message on the wire. +// Being an arm of the oneof, rather than an envelope around it, is what makes this +// need no negotiation handshake. The receiver always parses a SignalRequest; the +// oneof tag itself says whether the payload is compressed. Nothing has to be agreed +// before the first message, so the very first message can be compressed -- which +// matters most for JoinResponse, the largest message on the wire in a big room. // -// Sent only when the client advertised ClientInfo.CAP_COMPRESSION_DEFLATE_RAW. A -// server that does not implement compression, or a client that did not ask for it, -// simply never exchanges this message and the connection stays as it is today. +// It also costs nothing when compression does not pay: a message under the threshold +// is simply sent as its ordinary arm, rather than as an envelope announcing that it +// was left uncompressed. // -// Being its own message, rather than a flag on JoinResponse, is what lets the -// JoinResponse itself be compressed: a flag would have to be read before the client -// could know how to parse the message carrying it. Here both possibilities for the -// first frame are a plain SignalResponse, so the client parses one type and switches -// on which arm it got -- `compression_ack` means compress from here on, anything else -// means an older server and the connection continues uncompressed. No sniffing, and -// no extra round trip: the server writes this and the JoinResponse back to back. -type SignalCompressionAck struct { - state protoimpl.MessageState `protogen:"open.v1"` - // The algorithm to use. Senders may still emit NONE per message -- see - // WrappedSignalRequest on the size threshold -- but must not use an algorithm - // other than this one. +// Senders MUST NOT nest -- the payload is always an ordinary SignalRequest, never +// another CompressedSignalRequest -- and MUST send this arm only when the peer has +// advertised ClientInfo.CAP_COMPRESSION_DEFLATE_RAW, since an older peer would parse +// it as an unknown field and silently drop the message. +// +// Senders SHOULD leave payloads below roughly 200 bytes uncompressed, sending the +// ordinary arm instead: below that the compressed form is usually larger and the CPU +// is wasted either way. Senders MUST fall back to the ordinary arm if compression +// fails or does not shrink the payload; a compression problem must never become a +// connection failure. +type CompressedSignalRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` Compression SignalCompression_Type `protobuf:"varint,1,opt,name=compression,proto3,enum=livekit.SignalCompression_Type" json:"compression,omitempty"` + SignalRequest []byte `protobuf:"bytes,2,opt,name=signal_request,json=signalRequest,proto3" json:"signal_request,omitempty"` // marshalled SignalRequest, compressed unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *SignalCompressionAck) Reset() { - *x = SignalCompressionAck{} +func (x *CompressedSignalRequest) Reset() { + *x = CompressedSignalRequest{} mi := &file_livekit_rtc_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *SignalCompressionAck) String() string { +func (x *CompressedSignalRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SignalCompressionAck) ProtoMessage() {} +func (*CompressedSignalRequest) ProtoMessage() {} -func (x *SignalCompressionAck) ProtoReflect() protoreflect.Message { +func (x *CompressedSignalRequest) ProtoReflect() protoreflect.Message { mi := &file_livekit_rtc_proto_msgTypes[59] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -5328,104 +5351,49 @@ func (x *SignalCompressionAck) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SignalCompressionAck.ProtoReflect.Descriptor instead. -func (*SignalCompressionAck) Descriptor() ([]byte, []int) { +// Deprecated: Use CompressedSignalRequest.ProtoReflect.Descriptor instead. +func (*CompressedSignalRequest) Descriptor() ([]byte, []int) { return file_livekit_rtc_proto_rawDescGZIP(), []int{59} } -func (x *SignalCompressionAck) GetCompression() SignalCompression_Type { - if x != nil { - return x.Compression - } - return SignalCompression_NONE -} - -// Envelope for a compressed SignalRequest, mirroring WrappedJoinRequest. -// -// Used in place of a bare SignalRequest on the signalling WebSocket once both -// sides have agreed to compress -- see SignalCompressionAck. -// -// Senders SHOULD leave small payloads uncompressed (NONE): below roughly 200 bytes -// the compressed form is usually larger, and the CPU is wasted either way. Senders -// MUST fall back to NONE if compression fails or does not shrink the payload; a -// compression problem must never become a connection failure. Receivers MUST honour -// whatever `compression` says regardless of size. -type WrappedSignalRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - Compression SignalCompression_Type `protobuf:"varint,1,opt,name=compression,proto3,enum=livekit.SignalCompression_Type" json:"compression,omitempty"` - SignalRequest []byte `protobuf:"bytes,2,opt,name=signal_request,json=signalRequest,proto3" json:"signal_request,omitempty"` // marshalled SignalRequest + potentially compressed - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *WrappedSignalRequest) Reset() { - *x = WrappedSignalRequest{} - mi := &file_livekit_rtc_proto_msgTypes[60] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *WrappedSignalRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*WrappedSignalRequest) ProtoMessage() {} - -func (x *WrappedSignalRequest) ProtoReflect() protoreflect.Message { - mi := &file_livekit_rtc_proto_msgTypes[60] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use WrappedSignalRequest.ProtoReflect.Descriptor instead. -func (*WrappedSignalRequest) Descriptor() ([]byte, []int) { - return file_livekit_rtc_proto_rawDescGZIP(), []int{60} -} - -func (x *WrappedSignalRequest) GetCompression() SignalCompression_Type { +func (x *CompressedSignalRequest) GetCompression() SignalCompression_Type { if x != nil { return x.Compression } return SignalCompression_NONE } -func (x *WrappedSignalRequest) GetSignalRequest() []byte { +func (x *CompressedSignalRequest) GetSignalRequest() []byte { if x != nil { return x.SignalRequest } return nil } -// Envelope for a compressed SignalResponse. See WrappedSignalRequest. -type WrappedSignalResponse struct { +// A compressed SignalResponse. See CompressedSignalRequest. +type CompressedSignalResponse struct { state protoimpl.MessageState `protogen:"open.v1"` Compression SignalCompression_Type `protobuf:"varint,1,opt,name=compression,proto3,enum=livekit.SignalCompression_Type" json:"compression,omitempty"` - SignalResponse []byte `protobuf:"bytes,2,opt,name=signal_response,json=signalResponse,proto3" json:"signal_response,omitempty"` // marshalled SignalResponse + potentially compressed + SignalResponse []byte `protobuf:"bytes,2,opt,name=signal_response,json=signalResponse,proto3" json:"signal_response,omitempty"` // marshalled SignalResponse, compressed unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *WrappedSignalResponse) Reset() { - *x = WrappedSignalResponse{} - mi := &file_livekit_rtc_proto_msgTypes[61] +func (x *CompressedSignalResponse) Reset() { + *x = CompressedSignalResponse{} + mi := &file_livekit_rtc_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *WrappedSignalResponse) String() string { +func (x *CompressedSignalResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WrappedSignalResponse) ProtoMessage() {} +func (*CompressedSignalResponse) ProtoMessage() {} -func (x *WrappedSignalResponse) ProtoReflect() protoreflect.Message { - mi := &file_livekit_rtc_proto_msgTypes[61] +func (x *CompressedSignalResponse) ProtoReflect() protoreflect.Message { + mi := &file_livekit_rtc_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5436,19 +5404,19 @@ func (x *WrappedSignalResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use WrappedSignalResponse.ProtoReflect.Descriptor instead. -func (*WrappedSignalResponse) Descriptor() ([]byte, []int) { - return file_livekit_rtc_proto_rawDescGZIP(), []int{61} +// Deprecated: Use CompressedSignalResponse.ProtoReflect.Descriptor instead. +func (*CompressedSignalResponse) Descriptor() ([]byte, []int) { + return file_livekit_rtc_proto_rawDescGZIP(), []int{60} } -func (x *WrappedSignalResponse) GetCompression() SignalCompression_Type { +func (x *CompressedSignalResponse) GetCompression() SignalCompression_Type { if x != nil { return x.Compression } return SignalCompression_NONE } -func (x *WrappedSignalResponse) GetSignalResponse() []byte { +func (x *CompressedSignalResponse) GetSignalResponse() []byte { if x != nil { return x.SignalResponse } @@ -5465,7 +5433,7 @@ type MediaSectionsRequirement struct { func (x *MediaSectionsRequirement) Reset() { *x = MediaSectionsRequirement{} - mi := &file_livekit_rtc_proto_msgTypes[62] + mi := &file_livekit_rtc_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5477,7 +5445,7 @@ func (x *MediaSectionsRequirement) String() string { func (*MediaSectionsRequirement) ProtoMessage() {} func (x *MediaSectionsRequirement) ProtoReflect() protoreflect.Message { - mi := &file_livekit_rtc_proto_msgTypes[62] + mi := &file_livekit_rtc_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5490,7 +5458,7 @@ func (x *MediaSectionsRequirement) ProtoReflect() protoreflect.Message { // Deprecated: Use MediaSectionsRequirement.ProtoReflect.Descriptor instead. func (*MediaSectionsRequirement) Descriptor() ([]byte, []int) { - return file_livekit_rtc_proto_rawDescGZIP(), []int{62} + return file_livekit_rtc_proto_rawDescGZIP(), []int{61} } func (x *MediaSectionsRequirement) GetNumAudios() uint32 { @@ -5518,7 +5486,7 @@ type DataTrackSubscriberHandles_PublishedDataTrack struct { func (x *DataTrackSubscriberHandles_PublishedDataTrack) Reset() { *x = DataTrackSubscriberHandles_PublishedDataTrack{} - mi := &file_livekit_rtc_proto_msgTypes[63] + mi := &file_livekit_rtc_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5530,7 +5498,7 @@ func (x *DataTrackSubscriberHandles_PublishedDataTrack) String() string { func (*DataTrackSubscriberHandles_PublishedDataTrack) ProtoMessage() {} func (x *DataTrackSubscriberHandles_PublishedDataTrack) ProtoReflect() protoreflect.Message { - mi := &file_livekit_rtc_proto_msgTypes[63] + mi := &file_livekit_rtc_proto_msgTypes[62] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5580,7 +5548,7 @@ type UpdateDataSubscription_Update struct { func (x *UpdateDataSubscription_Update) Reset() { *x = UpdateDataSubscription_Update{} - mi := &file_livekit_rtc_proto_msgTypes[66] + mi := &file_livekit_rtc_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5592,7 +5560,7 @@ func (x *UpdateDataSubscription_Update) String() string { func (*UpdateDataSubscription_Update) ProtoMessage() {} func (x *UpdateDataSubscription_Update) ProtoReflect() protoreflect.Message { - mi := &file_livekit_rtc_proto_msgTypes[66] + mi := &file_livekit_rtc_proto_msgTypes[65] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5633,7 +5601,7 @@ var File_livekit_rtc_proto protoreflect.FileDescriptor const file_livekit_rtc_proto_rawDesc = "" + "\n" + - "\x11livekit_rtc.proto\x12\alivekit\x1a\x14livekit_models.proto\x1a\x14logger/options.proto\"\xed\v\n" + + "\x11livekit_rtc.proto\x12\alivekit\x1a\x14livekit_models.proto\x1a\x14logger/options.proto\"\xb1\f\n" + "\rSignalRequest\x123\n" + "\x05offer\x18\x01 \x01(\v2\x1b.livekit.SessionDescriptionH\x00R\x05offer\x125\n" + "\x06answer\x18\x02 \x01(\v2\x1b.livekit.SessionDescriptionH\x00R\x06answer\x123\n" + @@ -5658,8 +5626,11 @@ const file_livekit_rtc_proto_rawDesc = "" + "\x1cunpublish_data_track_request\x18\x14 \x01(\v2\".livekit.UnpublishDataTrackRequestH\x00R\x19unpublishDataTrackRequest\x12[\n" + "\x18update_data_subscription\x18\x15 \x01(\v2\x1f.livekit.UpdateDataSubscriptionH\x00R\x16updateDataSubscription\x12V\n" + "\x17store_data_blob_request\x18\x16 \x01(\v2\x1d.livekit.StoreDataBlobRequestH\x00R\x14storeDataBlobRequest\x12P\n" + - "\x15get_data_blob_request\x18\x17 \x01(\v2\x1b.livekit.GetDataBlobRequestH\x00R\x12getDataBlobRequestB\t\n" + - "\amessage\"\xd3\x11\n" + + "\x15get_data_blob_request\x18\x17 \x01(\v2\x1b.livekit.GetDataBlobRequestH\x00R\x12getDataBlobRequest\x12B\n" + + "\n" + + "compressed\x18\x18 \x01(\v2 .livekit.CompressedSignalRequestH\x00R\n" + + "compressedB\t\n" + + "\amessage\"\xce\x11\n" + "\x0eSignalResponse\x12+\n" + "\x04join\x18\x01 \x01(\v2\x15.livekit.JoinResponseH\x00R\x04join\x125\n" + "\x06answer\x18\x02 \x01(\v2\x1b.livekit.SessionDescriptionH\x00R\x06answer\x123\n" + @@ -5693,8 +5664,10 @@ const file_livekit_rtc_proto_rawDesc = "" + "\x1dunpublish_data_track_response\x18\x1c \x01(\v2#.livekit.UnpublishDataTrackResponseH\x00R\x1aunpublishDataTrackResponse\x12h\n" + "\x1ddata_track_subscriber_handles\x18\x1d \x01(\v2#.livekit.DataTrackSubscriberHandlesH\x00R\x1adataTrackSubscriberHandles\x12Y\n" + "\x18store_data_blob_response\x18\x1e \x01(\v2\x1e.livekit.StoreDataBlobResponseH\x00R\x15storeDataBlobResponse\x12S\n" + - "\x16get_data_blob_response\x18\x1f \x01(\v2\x1c.livekit.GetDataBlobResponseH\x00R\x13getDataBlobResponse\x12H\n" + - "\x0fcompression_ack\x18 \x01(\v2\x1d.livekit.SignalCompressionAckH\x00R\x0ecompressionAckB\t\n" + + "\x16get_data_blob_response\x18\x1f \x01(\v2\x1c.livekit.GetDataBlobResponseH\x00R\x13getDataBlobResponse\x12C\n" + + "\n" + + "compressed\x18 \x01(\v2!.livekit.CompressedSignalResponseH\x00R\n" + + "compressedB\t\n" + "\amessage\"\xa9\x01\n" + "\x0eSimulcastCodec\x12\x14\n" + "\x05codec\x18\x01 \x01(\tR\x05codec\x12\x10\n" + @@ -6038,13 +6011,11 @@ const file_livekit_rtc_proto_rawDesc = "" + "\x04Type\x12\b\n" + "\x04NONE\x10\x00\x12\b\n" + "\x04GZIP\x10\x01\x12\x0f\n" + - "\vDEFLATE_RAW\x10\x02\"Y\n" + - "\x14SignalCompressionAck\x12A\n" + - "\vcompression\x18\x01 \x01(\x0e2\x1f.livekit.SignalCompression.TypeR\vcompression\"\x80\x01\n" + - "\x14WrappedSignalRequest\x12A\n" + + "\vDEFLATE_RAW\x10\x02\"\x83\x01\n" + + "\x17CompressedSignalRequest\x12A\n" + "\vcompression\x18\x01 \x01(\x0e2\x1f.livekit.SignalCompression.TypeR\vcompression\x12%\n" + - "\x0esignal_request\x18\x02 \x01(\fR\rsignalRequest\"\x83\x01\n" + - "\x15WrappedSignalResponse\x12A\n" + + "\x0esignal_request\x18\x02 \x01(\fR\rsignalRequest\"\x86\x01\n" + + "\x18CompressedSignalResponse\x12A\n" + "\vcompression\x18\x01 \x01(\x0e2\x1f.livekit.SignalCompression.TypeR\vcompression\x12'\n" + "\x0fsignal_response\x18\x02 \x01(\fR\x0esignalResponse\"X\n" + "\x18MediaSectionsRequirement\x12\x1d\n" + @@ -6079,7 +6050,7 @@ func file_livekit_rtc_proto_rawDescGZIP() []byte { } var file_livekit_rtc_proto_enumTypes = make([]protoimpl.EnumInfo, 7) -var file_livekit_rtc_proto_msgTypes = make([]protoimpl.MessageInfo, 69) +var file_livekit_rtc_proto_msgTypes = make([]protoimpl.MessageInfo, 68) var file_livekit_rtc_proto_goTypes = []any{ (SignalTarget)(0), // 0: livekit.SignalTarget (StreamState)(0), // 1: livekit.StreamState @@ -6147,45 +6118,44 @@ var file_livekit_rtc_proto_goTypes = []any{ (*JoinRequest)(nil), // 63: livekit.JoinRequest (*WrappedJoinRequest)(nil), // 64: livekit.WrappedJoinRequest (*SignalCompression)(nil), // 65: livekit.SignalCompression - (*SignalCompressionAck)(nil), // 66: livekit.SignalCompressionAck - (*WrappedSignalRequest)(nil), // 67: livekit.WrappedSignalRequest - (*WrappedSignalResponse)(nil), // 68: livekit.WrappedSignalResponse - (*MediaSectionsRequirement)(nil), // 69: livekit.MediaSectionsRequirement - (*DataTrackSubscriberHandles_PublishedDataTrack)(nil), // 70: livekit.DataTrackSubscriberHandles.PublishedDataTrack - nil, // 71: livekit.DataTrackSubscriberHandles.SubHandlesEntry - nil, // 72: livekit.SessionDescription.MidToTrackIdEntry - (*UpdateDataSubscription_Update)(nil), // 73: livekit.UpdateDataSubscription.Update - nil, // 74: livekit.UpdateParticipantMetadata.AttributesEntry - nil, // 75: livekit.JoinRequest.ParticipantAttributesEntry - (*VideoLayer)(nil), // 76: livekit.VideoLayer - (VideoLayer_Mode)(0), // 77: livekit.VideoLayer.Mode - (TrackType)(0), // 78: livekit.TrackType - (TrackSource)(0), // 79: livekit.TrackSource - (Encryption_Type)(0), // 80: livekit.Encryption.Type - (BackupCodecPolicy)(0), // 81: livekit.BackupCodecPolicy - (AudioTrackFeature)(0), // 82: livekit.AudioTrackFeature - (PacketTrailerFeature)(0), // 83: livekit.PacketTrailerFeature - (*DataTrackFrameEncoding)(nil), // 84: livekit.DataTrackFrameEncoding - (*DataTrackSchemaId)(nil), // 85: livekit.DataTrackSchemaId - (*DataTrackInfo)(nil), // 86: livekit.DataTrackInfo - (*Room)(nil), // 87: livekit.Room - (*ParticipantInfo)(nil), // 88: livekit.ParticipantInfo - (*ClientConfiguration)(nil), // 89: livekit.ClientConfiguration - (*ServerInfo)(nil), // 90: livekit.ServerInfo - (*Codec)(nil), // 91: livekit.Codec - (*TrackInfo)(nil), // 92: livekit.TrackInfo - (*ParticipantTracks)(nil), // 93: livekit.ParticipantTracks - (*DataBlob)(nil), // 94: livekit.DataBlob - (*DataBlobKey)(nil), // 95: livekit.DataBlobKey - (VideoQuality)(0), // 96: livekit.VideoQuality - (DisconnectReason)(0), // 97: livekit.DisconnectReason - (*SpeakerInfo)(nil), // 98: livekit.SpeakerInfo - (ConnectionQuality)(0), // 99: livekit.ConnectionQuality - (*SubscribedAudioCodec)(nil), // 100: livekit.SubscribedAudioCodec - (SubscriptionError)(0), // 101: livekit.SubscriptionError - (*ClientInfo)(nil), // 102: livekit.ClientInfo - (ReconnectReason)(0), // 103: livekit.ReconnectReason - (*DataTrackSubscriptionOptions)(nil), // 104: livekit.DataTrackSubscriptionOptions + (*CompressedSignalRequest)(nil), // 66: livekit.CompressedSignalRequest + (*CompressedSignalResponse)(nil), // 67: livekit.CompressedSignalResponse + (*MediaSectionsRequirement)(nil), // 68: livekit.MediaSectionsRequirement + (*DataTrackSubscriberHandles_PublishedDataTrack)(nil), // 69: livekit.DataTrackSubscriberHandles.PublishedDataTrack + nil, // 70: livekit.DataTrackSubscriberHandles.SubHandlesEntry + nil, // 71: livekit.SessionDescription.MidToTrackIdEntry + (*UpdateDataSubscription_Update)(nil), // 72: livekit.UpdateDataSubscription.Update + nil, // 73: livekit.UpdateParticipantMetadata.AttributesEntry + nil, // 74: livekit.JoinRequest.ParticipantAttributesEntry + (*VideoLayer)(nil), // 75: livekit.VideoLayer + (VideoLayer_Mode)(0), // 76: livekit.VideoLayer.Mode + (TrackType)(0), // 77: livekit.TrackType + (TrackSource)(0), // 78: livekit.TrackSource + (Encryption_Type)(0), // 79: livekit.Encryption.Type + (BackupCodecPolicy)(0), // 80: livekit.BackupCodecPolicy + (AudioTrackFeature)(0), // 81: livekit.AudioTrackFeature + (PacketTrailerFeature)(0), // 82: livekit.PacketTrailerFeature + (*DataTrackFrameEncoding)(nil), // 83: livekit.DataTrackFrameEncoding + (*DataTrackSchemaId)(nil), // 84: livekit.DataTrackSchemaId + (*DataTrackInfo)(nil), // 85: livekit.DataTrackInfo + (*Room)(nil), // 86: livekit.Room + (*ParticipantInfo)(nil), // 87: livekit.ParticipantInfo + (*ClientConfiguration)(nil), // 88: livekit.ClientConfiguration + (*ServerInfo)(nil), // 89: livekit.ServerInfo + (*Codec)(nil), // 90: livekit.Codec + (*TrackInfo)(nil), // 91: livekit.TrackInfo + (*ParticipantTracks)(nil), // 92: livekit.ParticipantTracks + (*DataBlob)(nil), // 93: livekit.DataBlob + (*DataBlobKey)(nil), // 94: livekit.DataBlobKey + (VideoQuality)(0), // 95: livekit.VideoQuality + (DisconnectReason)(0), // 96: livekit.DisconnectReason + (*SpeakerInfo)(nil), // 97: livekit.SpeakerInfo + (ConnectionQuality)(0), // 98: livekit.ConnectionQuality + (*SubscribedAudioCodec)(nil), // 99: livekit.SubscribedAudioCodec + (SubscriptionError)(0), // 100: livekit.SubscriptionError + (*ClientInfo)(nil), // 101: livekit.ClientInfo + (ReconnectReason)(0), // 102: livekit.ReconnectReason + (*DataTrackSubscriptionOptions)(nil), // 103: livekit.DataTrackSubscriptionOptions } var file_livekit_rtc_proto_depIdxs = []int32{ 22, // 0: livekit.SignalRequest.offer:type_name -> livekit.SessionDescription @@ -6209,127 +6179,127 @@ var file_livekit_rtc_proto_depIdxs = []int32{ 25, // 18: livekit.SignalRequest.update_data_subscription:type_name -> livekit.UpdateDataSubscription 26, // 19: livekit.SignalRequest.store_data_blob_request:type_name -> livekit.StoreDataBlobRequest 28, // 20: livekit.SignalRequest.get_data_blob_request:type_name -> livekit.GetDataBlobRequest - 18, // 21: livekit.SignalResponse.join:type_name -> livekit.JoinResponse - 22, // 22: livekit.SignalResponse.answer:type_name -> livekit.SessionDescription - 22, // 23: livekit.SignalResponse.offer:type_name -> livekit.SessionDescription - 16, // 24: livekit.SignalResponse.trickle:type_name -> livekit.TrickleRequest - 23, // 25: livekit.SignalResponse.update:type_name -> livekit.ParticipantUpdate - 20, // 26: livekit.SignalResponse.track_published:type_name -> livekit.TrackPublishedResponse - 33, // 27: livekit.SignalResponse.leave:type_name -> livekit.LeaveRequest - 17, // 28: livekit.SignalResponse.mute:type_name -> livekit.MuteTrackRequest - 37, // 29: livekit.SignalResponse.speakers_changed:type_name -> livekit.SpeakersChanged - 38, // 30: livekit.SignalResponse.room_update:type_name -> livekit.RoomUpdate - 40, // 31: livekit.SignalResponse.connection_quality:type_name -> livekit.ConnectionQualityUpdate - 42, // 32: livekit.SignalResponse.stream_state_update:type_name -> livekit.StreamStateUpdate - 45, // 33: livekit.SignalResponse.subscribed_quality_update:type_name -> livekit.SubscribedQualityUpdate - 49, // 34: livekit.SignalResponse.subscription_permission_update:type_name -> livekit.SubscriptionPermissionUpdate - 21, // 35: livekit.SignalResponse.track_unpublished:type_name -> livekit.TrackUnpublishedResponse - 19, // 36: livekit.SignalResponse.reconnect:type_name -> livekit.ReconnectResponse - 56, // 37: livekit.SignalResponse.pong_resp:type_name -> livekit.Pong - 59, // 38: livekit.SignalResponse.subscription_response:type_name -> livekit.SubscriptionResponse - 60, // 39: livekit.SignalResponse.request_response:type_name -> livekit.RequestResponse - 61, // 40: livekit.SignalResponse.track_subscribed:type_name -> livekit.TrackSubscribed - 50, // 41: livekit.SignalResponse.room_moved:type_name -> livekit.RoomMovedResponse - 69, // 42: livekit.SignalResponse.media_sections_requirement:type_name -> livekit.MediaSectionsRequirement - 46, // 43: livekit.SignalResponse.subscribed_audio_codec_update:type_name -> livekit.SubscribedAudioCodecUpdate - 12, // 44: livekit.SignalResponse.publish_data_track_response:type_name -> livekit.PublishDataTrackResponse - 14, // 45: livekit.SignalResponse.unpublish_data_track_response:type_name -> livekit.UnpublishDataTrackResponse - 15, // 46: livekit.SignalResponse.data_track_subscriber_handles:type_name -> livekit.DataTrackSubscriberHandles - 27, // 47: livekit.SignalResponse.store_data_blob_response:type_name -> livekit.StoreDataBlobResponse - 29, // 48: livekit.SignalResponse.get_data_blob_response:type_name -> livekit.GetDataBlobResponse - 66, // 49: livekit.SignalResponse.compression_ack:type_name -> livekit.SignalCompressionAck - 76, // 50: livekit.SimulcastCodec.layers:type_name -> livekit.VideoLayer - 77, // 51: livekit.SimulcastCodec.video_layer_mode:type_name -> livekit.VideoLayer.Mode - 78, // 52: livekit.AddTrackRequest.type:type_name -> livekit.TrackType - 79, // 53: livekit.AddTrackRequest.source:type_name -> livekit.TrackSource - 76, // 54: livekit.AddTrackRequest.layers:type_name -> livekit.VideoLayer - 9, // 55: livekit.AddTrackRequest.simulcast_codecs:type_name -> livekit.SimulcastCodec - 80, // 56: livekit.AddTrackRequest.encryption:type_name -> livekit.Encryption.Type - 81, // 57: livekit.AddTrackRequest.backup_codec_policy:type_name -> livekit.BackupCodecPolicy - 82, // 58: livekit.AddTrackRequest.audio_features:type_name -> livekit.AudioTrackFeature - 83, // 59: livekit.AddTrackRequest.packet_trailer_features:type_name -> livekit.PacketTrailerFeature - 80, // 60: livekit.PublishDataTrackRequest.encryption:type_name -> livekit.Encryption.Type - 84, // 61: livekit.PublishDataTrackRequest.frame_encoding:type_name -> livekit.DataTrackFrameEncoding - 85, // 62: livekit.PublishDataTrackRequest.schema:type_name -> livekit.DataTrackSchemaId - 86, // 63: livekit.PublishDataTrackResponse.info:type_name -> livekit.DataTrackInfo - 86, // 64: livekit.UnpublishDataTrackResponse.info:type_name -> livekit.DataTrackInfo - 71, // 65: livekit.DataTrackSubscriberHandles.sub_handles:type_name -> livekit.DataTrackSubscriberHandles.SubHandlesEntry - 0, // 66: livekit.TrickleRequest.target:type_name -> livekit.SignalTarget - 87, // 67: livekit.JoinResponse.room:type_name -> livekit.Room - 88, // 68: livekit.JoinResponse.participant:type_name -> livekit.ParticipantInfo - 88, // 69: livekit.JoinResponse.other_participants:type_name -> livekit.ParticipantInfo - 36, // 70: livekit.JoinResponse.ice_servers:type_name -> livekit.ICEServer - 89, // 71: livekit.JoinResponse.client_configuration:type_name -> livekit.ClientConfiguration - 90, // 72: livekit.JoinResponse.server_info:type_name -> livekit.ServerInfo - 91, // 73: livekit.JoinResponse.enabled_publish_codecs:type_name -> livekit.Codec - 36, // 74: livekit.ReconnectResponse.ice_servers:type_name -> livekit.ICEServer - 89, // 75: livekit.ReconnectResponse.client_configuration:type_name -> livekit.ClientConfiguration - 90, // 76: livekit.ReconnectResponse.server_info:type_name -> livekit.ServerInfo - 92, // 77: livekit.TrackPublishedResponse.track:type_name -> livekit.TrackInfo - 72, // 78: livekit.SessionDescription.mid_to_track_id:type_name -> livekit.SessionDescription.MidToTrackIdEntry - 88, // 79: livekit.ParticipantUpdate.participants:type_name -> livekit.ParticipantInfo - 93, // 80: livekit.UpdateSubscription.participant_tracks:type_name -> livekit.ParticipantTracks - 73, // 81: livekit.UpdateDataSubscription.updates:type_name -> livekit.UpdateDataSubscription.Update - 94, // 82: livekit.StoreDataBlobRequest.blob:type_name -> livekit.DataBlob - 95, // 83: livekit.StoreDataBlobResponse.key:type_name -> livekit.DataBlobKey - 95, // 84: livekit.GetDataBlobRequest.key:type_name -> livekit.DataBlobKey - 94, // 85: livekit.GetDataBlobResponse.blob:type_name -> livekit.DataBlob - 96, // 86: livekit.UpdateTrackSettings.quality:type_name -> livekit.VideoQuality - 82, // 87: livekit.UpdateLocalAudioTrack.features:type_name -> livekit.AudioTrackFeature - 97, // 88: livekit.LeaveRequest.reason:type_name -> livekit.DisconnectReason - 3, // 89: livekit.LeaveRequest.action:type_name -> livekit.LeaveRequest.Action - 57, // 90: livekit.LeaveRequest.regions:type_name -> livekit.RegionSettings - 76, // 91: livekit.UpdateVideoLayers.layers:type_name -> livekit.VideoLayer - 74, // 92: livekit.UpdateParticipantMetadata.attributes:type_name -> livekit.UpdateParticipantMetadata.AttributesEntry - 98, // 93: livekit.SpeakersChanged.speakers:type_name -> livekit.SpeakerInfo - 87, // 94: livekit.RoomUpdate.room:type_name -> livekit.Room - 99, // 95: livekit.ConnectionQualityInfo.quality:type_name -> livekit.ConnectionQuality - 39, // 96: livekit.ConnectionQualityUpdate.updates:type_name -> livekit.ConnectionQualityInfo - 1, // 97: livekit.StreamStateInfo.state:type_name -> livekit.StreamState - 41, // 98: livekit.StreamStateUpdate.stream_states:type_name -> livekit.StreamStateInfo - 96, // 99: livekit.SubscribedQuality.quality:type_name -> livekit.VideoQuality - 43, // 100: livekit.SubscribedCodec.qualities:type_name -> livekit.SubscribedQuality - 43, // 101: livekit.SubscribedQualityUpdate.subscribed_qualities:type_name -> livekit.SubscribedQuality - 44, // 102: livekit.SubscribedQualityUpdate.subscribed_codecs:type_name -> livekit.SubscribedCodec - 100, // 103: livekit.SubscribedAudioCodecUpdate.subscribed_audio_codecs:type_name -> livekit.SubscribedAudioCodec - 47, // 104: livekit.SubscriptionPermission.track_permissions:type_name -> livekit.TrackPermission - 87, // 105: livekit.RoomMovedResponse.room:type_name -> livekit.Room - 88, // 106: livekit.RoomMovedResponse.participant:type_name -> livekit.ParticipantInfo - 88, // 107: livekit.RoomMovedResponse.other_participants:type_name -> livekit.ParticipantInfo - 22, // 108: livekit.SyncState.answer:type_name -> livekit.SessionDescription - 24, // 109: livekit.SyncState.subscription:type_name -> livekit.UpdateSubscription - 20, // 110: livekit.SyncState.publish_tracks:type_name -> livekit.TrackPublishedResponse - 53, // 111: livekit.SyncState.data_channels:type_name -> livekit.DataChannelInfo - 22, // 112: livekit.SyncState.offer:type_name -> livekit.SessionDescription - 52, // 113: livekit.SyncState.datachannel_receive_states:type_name -> livekit.DataChannelReceiveState - 12, // 114: livekit.SyncState.publish_data_tracks:type_name -> livekit.PublishDataTrackResponse - 25, // 115: livekit.SyncState.data_subscription:type_name -> livekit.UpdateDataSubscription - 0, // 116: livekit.DataChannelInfo.target:type_name -> livekit.SignalTarget - 2, // 117: livekit.SimulateScenario.switch_candidate_protocol:type_name -> livekit.CandidateProtocol - 58, // 118: livekit.RegionSettings.regions:type_name -> livekit.RegionInfo - 101, // 119: livekit.SubscriptionResponse.err:type_name -> livekit.SubscriptionError - 4, // 120: livekit.RequestResponse.reason:type_name -> livekit.RequestResponse.Reason - 16, // 121: livekit.RequestResponse.trickle:type_name -> livekit.TrickleRequest - 10, // 122: livekit.RequestResponse.add_track:type_name -> livekit.AddTrackRequest - 17, // 123: livekit.RequestResponse.mute:type_name -> livekit.MuteTrackRequest - 35, // 124: livekit.RequestResponse.update_metadata:type_name -> livekit.UpdateParticipantMetadata - 31, // 125: livekit.RequestResponse.update_audio_track:type_name -> livekit.UpdateLocalAudioTrack - 32, // 126: livekit.RequestResponse.update_video_track:type_name -> livekit.UpdateLocalVideoTrack - 11, // 127: livekit.RequestResponse.publish_data_track:type_name -> livekit.PublishDataTrackRequest - 13, // 128: livekit.RequestResponse.unpublish_data_track:type_name -> livekit.UnpublishDataTrackRequest - 102, // 129: livekit.JoinRequest.client_info:type_name -> livekit.ClientInfo - 62, // 130: livekit.JoinRequest.connection_settings:type_name -> livekit.ConnectionSettings - 75, // 131: livekit.JoinRequest.participant_attributes:type_name -> livekit.JoinRequest.ParticipantAttributesEntry - 10, // 132: livekit.JoinRequest.add_track_requests:type_name -> livekit.AddTrackRequest - 22, // 133: livekit.JoinRequest.publisher_offer:type_name -> livekit.SessionDescription - 103, // 134: livekit.JoinRequest.reconnect_reason:type_name -> livekit.ReconnectReason - 51, // 135: livekit.JoinRequest.sync_state:type_name -> livekit.SyncState - 5, // 136: livekit.WrappedJoinRequest.compression:type_name -> livekit.WrappedJoinRequest.Compression - 6, // 137: livekit.SignalCompressionAck.compression:type_name -> livekit.SignalCompression.Type - 6, // 138: livekit.WrappedSignalRequest.compression:type_name -> livekit.SignalCompression.Type - 6, // 139: livekit.WrappedSignalResponse.compression:type_name -> livekit.SignalCompression.Type - 70, // 140: livekit.DataTrackSubscriberHandles.SubHandlesEntry.value:type_name -> livekit.DataTrackSubscriberHandles.PublishedDataTrack - 104, // 141: livekit.UpdateDataSubscription.Update.options:type_name -> livekit.DataTrackSubscriptionOptions + 66, // 21: livekit.SignalRequest.compressed:type_name -> livekit.CompressedSignalRequest + 18, // 22: livekit.SignalResponse.join:type_name -> livekit.JoinResponse + 22, // 23: livekit.SignalResponse.answer:type_name -> livekit.SessionDescription + 22, // 24: livekit.SignalResponse.offer:type_name -> livekit.SessionDescription + 16, // 25: livekit.SignalResponse.trickle:type_name -> livekit.TrickleRequest + 23, // 26: livekit.SignalResponse.update:type_name -> livekit.ParticipantUpdate + 20, // 27: livekit.SignalResponse.track_published:type_name -> livekit.TrackPublishedResponse + 33, // 28: livekit.SignalResponse.leave:type_name -> livekit.LeaveRequest + 17, // 29: livekit.SignalResponse.mute:type_name -> livekit.MuteTrackRequest + 37, // 30: livekit.SignalResponse.speakers_changed:type_name -> livekit.SpeakersChanged + 38, // 31: livekit.SignalResponse.room_update:type_name -> livekit.RoomUpdate + 40, // 32: livekit.SignalResponse.connection_quality:type_name -> livekit.ConnectionQualityUpdate + 42, // 33: livekit.SignalResponse.stream_state_update:type_name -> livekit.StreamStateUpdate + 45, // 34: livekit.SignalResponse.subscribed_quality_update:type_name -> livekit.SubscribedQualityUpdate + 49, // 35: livekit.SignalResponse.subscription_permission_update:type_name -> livekit.SubscriptionPermissionUpdate + 21, // 36: livekit.SignalResponse.track_unpublished:type_name -> livekit.TrackUnpublishedResponse + 19, // 37: livekit.SignalResponse.reconnect:type_name -> livekit.ReconnectResponse + 56, // 38: livekit.SignalResponse.pong_resp:type_name -> livekit.Pong + 59, // 39: livekit.SignalResponse.subscription_response:type_name -> livekit.SubscriptionResponse + 60, // 40: livekit.SignalResponse.request_response:type_name -> livekit.RequestResponse + 61, // 41: livekit.SignalResponse.track_subscribed:type_name -> livekit.TrackSubscribed + 50, // 42: livekit.SignalResponse.room_moved:type_name -> livekit.RoomMovedResponse + 68, // 43: livekit.SignalResponse.media_sections_requirement:type_name -> livekit.MediaSectionsRequirement + 46, // 44: livekit.SignalResponse.subscribed_audio_codec_update:type_name -> livekit.SubscribedAudioCodecUpdate + 12, // 45: livekit.SignalResponse.publish_data_track_response:type_name -> livekit.PublishDataTrackResponse + 14, // 46: livekit.SignalResponse.unpublish_data_track_response:type_name -> livekit.UnpublishDataTrackResponse + 15, // 47: livekit.SignalResponse.data_track_subscriber_handles:type_name -> livekit.DataTrackSubscriberHandles + 27, // 48: livekit.SignalResponse.store_data_blob_response:type_name -> livekit.StoreDataBlobResponse + 29, // 49: livekit.SignalResponse.get_data_blob_response:type_name -> livekit.GetDataBlobResponse + 67, // 50: livekit.SignalResponse.compressed:type_name -> livekit.CompressedSignalResponse + 75, // 51: livekit.SimulcastCodec.layers:type_name -> livekit.VideoLayer + 76, // 52: livekit.SimulcastCodec.video_layer_mode:type_name -> livekit.VideoLayer.Mode + 77, // 53: livekit.AddTrackRequest.type:type_name -> livekit.TrackType + 78, // 54: livekit.AddTrackRequest.source:type_name -> livekit.TrackSource + 75, // 55: livekit.AddTrackRequest.layers:type_name -> livekit.VideoLayer + 9, // 56: livekit.AddTrackRequest.simulcast_codecs:type_name -> livekit.SimulcastCodec + 79, // 57: livekit.AddTrackRequest.encryption:type_name -> livekit.Encryption.Type + 80, // 58: livekit.AddTrackRequest.backup_codec_policy:type_name -> livekit.BackupCodecPolicy + 81, // 59: livekit.AddTrackRequest.audio_features:type_name -> livekit.AudioTrackFeature + 82, // 60: livekit.AddTrackRequest.packet_trailer_features:type_name -> livekit.PacketTrailerFeature + 79, // 61: livekit.PublishDataTrackRequest.encryption:type_name -> livekit.Encryption.Type + 83, // 62: livekit.PublishDataTrackRequest.frame_encoding:type_name -> livekit.DataTrackFrameEncoding + 84, // 63: livekit.PublishDataTrackRequest.schema:type_name -> livekit.DataTrackSchemaId + 85, // 64: livekit.PublishDataTrackResponse.info:type_name -> livekit.DataTrackInfo + 85, // 65: livekit.UnpublishDataTrackResponse.info:type_name -> livekit.DataTrackInfo + 70, // 66: livekit.DataTrackSubscriberHandles.sub_handles:type_name -> livekit.DataTrackSubscriberHandles.SubHandlesEntry + 0, // 67: livekit.TrickleRequest.target:type_name -> livekit.SignalTarget + 86, // 68: livekit.JoinResponse.room:type_name -> livekit.Room + 87, // 69: livekit.JoinResponse.participant:type_name -> livekit.ParticipantInfo + 87, // 70: livekit.JoinResponse.other_participants:type_name -> livekit.ParticipantInfo + 36, // 71: livekit.JoinResponse.ice_servers:type_name -> livekit.ICEServer + 88, // 72: livekit.JoinResponse.client_configuration:type_name -> livekit.ClientConfiguration + 89, // 73: livekit.JoinResponse.server_info:type_name -> livekit.ServerInfo + 90, // 74: livekit.JoinResponse.enabled_publish_codecs:type_name -> livekit.Codec + 36, // 75: livekit.ReconnectResponse.ice_servers:type_name -> livekit.ICEServer + 88, // 76: livekit.ReconnectResponse.client_configuration:type_name -> livekit.ClientConfiguration + 89, // 77: livekit.ReconnectResponse.server_info:type_name -> livekit.ServerInfo + 91, // 78: livekit.TrackPublishedResponse.track:type_name -> livekit.TrackInfo + 71, // 79: livekit.SessionDescription.mid_to_track_id:type_name -> livekit.SessionDescription.MidToTrackIdEntry + 87, // 80: livekit.ParticipantUpdate.participants:type_name -> livekit.ParticipantInfo + 92, // 81: livekit.UpdateSubscription.participant_tracks:type_name -> livekit.ParticipantTracks + 72, // 82: livekit.UpdateDataSubscription.updates:type_name -> livekit.UpdateDataSubscription.Update + 93, // 83: livekit.StoreDataBlobRequest.blob:type_name -> livekit.DataBlob + 94, // 84: livekit.StoreDataBlobResponse.key:type_name -> livekit.DataBlobKey + 94, // 85: livekit.GetDataBlobRequest.key:type_name -> livekit.DataBlobKey + 93, // 86: livekit.GetDataBlobResponse.blob:type_name -> livekit.DataBlob + 95, // 87: livekit.UpdateTrackSettings.quality:type_name -> livekit.VideoQuality + 81, // 88: livekit.UpdateLocalAudioTrack.features:type_name -> livekit.AudioTrackFeature + 96, // 89: livekit.LeaveRequest.reason:type_name -> livekit.DisconnectReason + 3, // 90: livekit.LeaveRequest.action:type_name -> livekit.LeaveRequest.Action + 57, // 91: livekit.LeaveRequest.regions:type_name -> livekit.RegionSettings + 75, // 92: livekit.UpdateVideoLayers.layers:type_name -> livekit.VideoLayer + 73, // 93: livekit.UpdateParticipantMetadata.attributes:type_name -> livekit.UpdateParticipantMetadata.AttributesEntry + 97, // 94: livekit.SpeakersChanged.speakers:type_name -> livekit.SpeakerInfo + 86, // 95: livekit.RoomUpdate.room:type_name -> livekit.Room + 98, // 96: livekit.ConnectionQualityInfo.quality:type_name -> livekit.ConnectionQuality + 39, // 97: livekit.ConnectionQualityUpdate.updates:type_name -> livekit.ConnectionQualityInfo + 1, // 98: livekit.StreamStateInfo.state:type_name -> livekit.StreamState + 41, // 99: livekit.StreamStateUpdate.stream_states:type_name -> livekit.StreamStateInfo + 95, // 100: livekit.SubscribedQuality.quality:type_name -> livekit.VideoQuality + 43, // 101: livekit.SubscribedCodec.qualities:type_name -> livekit.SubscribedQuality + 43, // 102: livekit.SubscribedQualityUpdate.subscribed_qualities:type_name -> livekit.SubscribedQuality + 44, // 103: livekit.SubscribedQualityUpdate.subscribed_codecs:type_name -> livekit.SubscribedCodec + 99, // 104: livekit.SubscribedAudioCodecUpdate.subscribed_audio_codecs:type_name -> livekit.SubscribedAudioCodec + 47, // 105: livekit.SubscriptionPermission.track_permissions:type_name -> livekit.TrackPermission + 86, // 106: livekit.RoomMovedResponse.room:type_name -> livekit.Room + 87, // 107: livekit.RoomMovedResponse.participant:type_name -> livekit.ParticipantInfo + 87, // 108: livekit.RoomMovedResponse.other_participants:type_name -> livekit.ParticipantInfo + 22, // 109: livekit.SyncState.answer:type_name -> livekit.SessionDescription + 24, // 110: livekit.SyncState.subscription:type_name -> livekit.UpdateSubscription + 20, // 111: livekit.SyncState.publish_tracks:type_name -> livekit.TrackPublishedResponse + 53, // 112: livekit.SyncState.data_channels:type_name -> livekit.DataChannelInfo + 22, // 113: livekit.SyncState.offer:type_name -> livekit.SessionDescription + 52, // 114: livekit.SyncState.datachannel_receive_states:type_name -> livekit.DataChannelReceiveState + 12, // 115: livekit.SyncState.publish_data_tracks:type_name -> livekit.PublishDataTrackResponse + 25, // 116: livekit.SyncState.data_subscription:type_name -> livekit.UpdateDataSubscription + 0, // 117: livekit.DataChannelInfo.target:type_name -> livekit.SignalTarget + 2, // 118: livekit.SimulateScenario.switch_candidate_protocol:type_name -> livekit.CandidateProtocol + 58, // 119: livekit.RegionSettings.regions:type_name -> livekit.RegionInfo + 100, // 120: livekit.SubscriptionResponse.err:type_name -> livekit.SubscriptionError + 4, // 121: livekit.RequestResponse.reason:type_name -> livekit.RequestResponse.Reason + 16, // 122: livekit.RequestResponse.trickle:type_name -> livekit.TrickleRequest + 10, // 123: livekit.RequestResponse.add_track:type_name -> livekit.AddTrackRequest + 17, // 124: livekit.RequestResponse.mute:type_name -> livekit.MuteTrackRequest + 35, // 125: livekit.RequestResponse.update_metadata:type_name -> livekit.UpdateParticipantMetadata + 31, // 126: livekit.RequestResponse.update_audio_track:type_name -> livekit.UpdateLocalAudioTrack + 32, // 127: livekit.RequestResponse.update_video_track:type_name -> livekit.UpdateLocalVideoTrack + 11, // 128: livekit.RequestResponse.publish_data_track:type_name -> livekit.PublishDataTrackRequest + 13, // 129: livekit.RequestResponse.unpublish_data_track:type_name -> livekit.UnpublishDataTrackRequest + 101, // 130: livekit.JoinRequest.client_info:type_name -> livekit.ClientInfo + 62, // 131: livekit.JoinRequest.connection_settings:type_name -> livekit.ConnectionSettings + 74, // 132: livekit.JoinRequest.participant_attributes:type_name -> livekit.JoinRequest.ParticipantAttributesEntry + 10, // 133: livekit.JoinRequest.add_track_requests:type_name -> livekit.AddTrackRequest + 22, // 134: livekit.JoinRequest.publisher_offer:type_name -> livekit.SessionDescription + 102, // 135: livekit.JoinRequest.reconnect_reason:type_name -> livekit.ReconnectReason + 51, // 136: livekit.JoinRequest.sync_state:type_name -> livekit.SyncState + 5, // 137: livekit.WrappedJoinRequest.compression:type_name -> livekit.WrappedJoinRequest.Compression + 6, // 138: livekit.CompressedSignalRequest.compression:type_name -> livekit.SignalCompression.Type + 6, // 139: livekit.CompressedSignalResponse.compression:type_name -> livekit.SignalCompression.Type + 69, // 140: livekit.DataTrackSubscriberHandles.SubHandlesEntry.value:type_name -> livekit.DataTrackSubscriberHandles.PublishedDataTrack + 103, // 141: livekit.UpdateDataSubscription.Update.options:type_name -> livekit.DataTrackSubscriptionOptions 142, // [142:142] is the sub-list for method output_type 142, // [142:142] is the sub-list for method input_type 142, // [142:142] is the sub-list for extension type_name @@ -6366,6 +6336,7 @@ func file_livekit_rtc_proto_init() { (*SignalRequest_UpdateDataSubscription)(nil), (*SignalRequest_StoreDataBlobRequest)(nil), (*SignalRequest_GetDataBlobRequest)(nil), + (*SignalRequest_Compressed)(nil), } file_livekit_rtc_proto_msgTypes[1].OneofWrappers = []any{ (*SignalResponse_Join)(nil), @@ -6398,7 +6369,7 @@ func file_livekit_rtc_proto_init() { (*SignalResponse_DataTrackSubscriberHandles)(nil), (*SignalResponse_StoreDataBlobResponse)(nil), (*SignalResponse_GetDataBlobResponse)(nil), - (*SignalResponse_CompressionAck)(nil), + (*SignalResponse_Compressed)(nil), } file_livekit_rtc_proto_msgTypes[4].OneofWrappers = []any{} file_livekit_rtc_proto_msgTypes[47].OneofWrappers = []any{ @@ -6429,7 +6400,7 @@ func file_livekit_rtc_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_livekit_rtc_proto_rawDesc), len(file_livekit_rtc_proto_rawDesc)), NumEnums: 7, - NumMessages: 69, + NumMessages: 68, NumExtensions: 0, NumServices: 0, }, From 44d41d14e775083b4659bb5a5e69a8069a1be17e Mon Sep 17 00:00:00 2001 From: shijing xian Date: Fri, 28 Aug 2026 15:44:05 -0700 Subject: [PATCH 09/10] signalling: let the server announce that it can decode compressed requests The capability gate only covered one direction. ClientInfo.CAP_COMPRESSION_DEFLATE_RAW tells the server what the client can decode, so server-to-server compression was safe. Nothing told the client whether the server could decode a compressed SignalRequest. Guessing wrong fails in the worst possible way. An older server parses the unknown field into its unknown-field set and leaves the oneof unset; the switch in livekit-server's signalhandler has no default case, so the message is dropped with no error and no warning. A resume would stall on a SyncState that never arrived rather than failing and escalating. Adds accepts_compressed_signal to JoinResponse and ReconnectResponse. This is not the circular arrangement removed earlier: that flag had to be read before the client could parse the message carrying it, whereas this one gates only what the client SENDS. Parsing is still decided by the oneof tag alone, so the JoinResponse carrying the flag can itself be compressed. ReconnectResponse repeats it because a resume may land on a different node, and because the largest client-to-server message of all -- SyncState, carrying two session descriptions plus the subscription and publish lists -- is sent immediately after it. Co-Authored-By: Claude Opus 5 (1M context) --- .changeset/signal-payload-compression.md | 2 +- protobufs/livekit_rtc.proto | 33 +++++++++++++++++++++--- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/.changeset/signal-payload-compression.md b/.changeset/signal-payload-compression.md index 704a97844..91cc04193 100644 --- a/.changeset/signal-payload-compression.md +++ b/.changeset/signal-payload-compression.md @@ -3,4 +3,4 @@ "@livekit/protocol": minor --- -signalling: allow signal messages on the WebSocket to be compressed, the way `WrappedJoinRequest` already compresses the join payload in the connect URL. Adds a `compressed` arm to the `SignalRequest` and `SignalResponse` oneofs, carrying `CompressedSignalRequest` / `CompressedSignalResponse` plus the shared `SignalCompression.Type` enum. Because the compressed form is an arm of the oneof rather than an envelope around it, no negotiation handshake is needed — the receiver always parses a `SignalRequest`/`SignalResponse` and the oneof tag says whether the payload is compressed, so even the first message can be compressed. Senders use the arm only when the peer advertised `ClientInfo.CAP_COMPRESSION_DEFLATE_RAW`, so old and new peers interoperate unchanged. +signalling: allow signal messages on the WebSocket to be compressed, the way `WrappedJoinRequest` already compresses the join payload in the connect URL. Adds a `compressed` arm to the `SignalRequest` and `SignalResponse` oneofs, carrying `CompressedSignalRequest` / `CompressedSignalResponse` plus the shared `SignalCompression.Type` enum. Because the compressed form is an arm of the oneof rather than an envelope around it, no negotiation handshake is needed — the receiver always parses a `SignalRequest`/`SignalResponse` and the oneof tag says whether the payload is compressed, so even the first message can be compressed. Each direction is gated separately so old and new peers interoperate unchanged: the server compresses only for a client that advertised `ClientInfo.CAP_COMPRESSION_DEFLATE_RAW`, and the client compresses only for a server that set the new `JoinResponse.accepts_compressed_signal` / `ReconnectResponse.accepts_compressed_signal`. diff --git a/protobufs/livekit_rtc.proto b/protobufs/livekit_rtc.proto index 88c18c96e..03a47af02 100644 --- a/protobufs/livekit_rtc.proto +++ b/protobufs/livekit_rtc.proto @@ -268,6 +268,18 @@ message JoinResponse { repeated Codec enabled_publish_codecs = 14; // when set, client should attempt to establish publish peer connection when joining room to speed up publishing bool fast_publish = 15; + // when set, this server understands SignalRequest.compressed and the client MAY + // use it. Unset means the client MUST NOT: an older server parses the unknown + // field into its unknown-field set, leaves the oneof unset, and drops the message + // without an error -- so sending compressed to a server that cannot read it loses + // signalling silently rather than failing cleanly. + // + // Only the client-to-server direction needs announcing. The server learns what the + // client can decode from ClientInfo.CAP_COMPRESSION_DEFLATE_RAW in the connect URL, + // which it has before it replies. Note this is not the circular arrangement of an + // earlier revision: this flag gates what the client SENDS, never how it parses, so + // the JoinResponse carrying it can itself be compressed. + bool accepts_compressed_signal = 16; } message ReconnectResponse { @@ -277,6 +289,13 @@ message ReconnectResponse { // last sequence number of reliable message received before resuming uint32 last_message_seq = 4; + + // Same meaning as JoinResponse.accepts_compressed_signal, repeated because a resume + // may land on a different node than answered the original join, and because the + // largest client-to-server message of all -- SyncState, carrying two session + // descriptions plus the subscription and publish lists -- is sent immediately after + // this response. + bool accepts_compressed_signal = 5; } message TrackPublishedResponse { @@ -714,9 +733,17 @@ message SignalCompression { // was left uncompressed. // // Senders MUST NOT nest -- the payload is always an ordinary SignalRequest, never -// another CompressedSignalRequest -- and MUST send this arm only when the peer has -// advertised ClientInfo.CAP_COMPRESSION_DEFLATE_RAW, since an older peer would parse -// it as an unknown field and silently drop the message. +// another CompressedSignalRequest -- and MUST NOT use this arm unless the peer has +// said it can decode one. An older peer parses the unknown field into its +// unknown-field set, leaves the oneof unset, and drops the message without an error, +// so guessing wrong loses signalling silently rather than failing cleanly. +// +// Each direction learns that separately, and neither needs a handshake: +// - server -> client: gated by ClientInfo.CAP_COMPRESSION_DEFLATE_RAW, which the +// server has from the connect URL before it sends anything. +// - client -> server: gated by JoinResponse.accepts_compressed_signal (or +// ReconnectResponse.accepts_compressed_signal), which the client has before it +// sends anything of consequence. // // Senders SHOULD leave payloads below roughly 200 bytes uncompressed, sending the // ordinary arm instead: below that the compressed form is usually larger and the CPU From 6febbf7a519524e2719f680bd5a2604ba44f1730 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 28 Aug 2026 22:44:55 +0000 Subject: [PATCH 10/10] generated protobuf --- livekit/livekit_rtc.pb.go | 64 ++++++++++++++++++++++++++++++++------- 1 file changed, 53 insertions(+), 11 deletions(-) diff --git a/livekit/livekit_rtc.pb.go b/livekit/livekit_rtc.pb.go index a8b7c1fe5..06417c9ea 100644 --- a/livekit/livekit_rtc.pb.go +++ b/livekit/livekit_rtc.pb.go @@ -2086,9 +2086,21 @@ type JoinResponse struct { SifTrailer []byte `protobuf:"bytes,13,opt,name=sif_trailer,json=sifTrailer,proto3" json:"sif_trailer,omitempty"` EnabledPublishCodecs []*Codec `protobuf:"bytes,14,rep,name=enabled_publish_codecs,json=enabledPublishCodecs,proto3" json:"enabled_publish_codecs,omitempty"` // when set, client should attempt to establish publish peer connection when joining room to speed up publishing - FastPublish bool `protobuf:"varint,15,opt,name=fast_publish,json=fastPublish,proto3" json:"fast_publish,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + FastPublish bool `protobuf:"varint,15,opt,name=fast_publish,json=fastPublish,proto3" json:"fast_publish,omitempty"` + // when set, this server understands SignalRequest.compressed and the client MAY + // use it. Unset means the client MUST NOT: an older server parses the unknown + // field into its unknown-field set, leaves the oneof unset, and drops the message + // without an error -- so sending compressed to a server that cannot read it loses + // signalling silently rather than failing cleanly. + // + // Only the client-to-server direction needs announcing. The server learns what the + // client can decode from ClientInfo.CAP_COMPRESSION_DEFLATE_RAW in the connect URL, + // which it has before it replies. Note this is not the circular arrangement of an + // earlier revision: this flag gates what the client SENDS, never how it parses, so + // the JoinResponse carrying it can itself be compressed. + AcceptsCompressedSignal bool `protobuf:"varint,16,opt,name=accepts_compressed_signal,json=acceptsCompressedSignal,proto3" json:"accepts_compressed_signal,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *JoinResponse) Reset() { @@ -2226,6 +2238,13 @@ func (x *JoinResponse) GetFastPublish() bool { return false } +func (x *JoinResponse) GetAcceptsCompressedSignal() bool { + if x != nil { + return x.AcceptsCompressedSignal + } + return false +} + type ReconnectResponse struct { state protoimpl.MessageState `protogen:"open.v1"` IceServers []*ICEServer `protobuf:"bytes,1,rep,name=ice_servers,json=iceServers,proto3" json:"ice_servers,omitempty"` @@ -2233,8 +2252,14 @@ type ReconnectResponse struct { ServerInfo *ServerInfo `protobuf:"bytes,3,opt,name=server_info,json=serverInfo,proto3" json:"server_info,omitempty"` // last sequence number of reliable message received before resuming LastMessageSeq uint32 `protobuf:"varint,4,opt,name=last_message_seq,json=lastMessageSeq,proto3" json:"last_message_seq,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Same meaning as JoinResponse.accepts_compressed_signal, repeated because a resume + // may land on a different node than answered the original join, and because the + // largest client-to-server message of all -- SyncState, carrying two session + // descriptions plus the subscription and publish lists -- is sent immediately after + // this response. + AcceptsCompressedSignal bool `protobuf:"varint,5,opt,name=accepts_compressed_signal,json=acceptsCompressedSignal,proto3" json:"accepts_compressed_signal,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ReconnectResponse) Reset() { @@ -2295,6 +2320,13 @@ func (x *ReconnectResponse) GetLastMessageSeq() uint32 { return 0 } +func (x *ReconnectResponse) GetAcceptsCompressedSignal() bool { + if x != nil { + return x.AcceptsCompressedSignal + } + return false +} + type TrackPublishedResponse struct { state protoimpl.MessageState `protogen:"open.v1"` Cid string `protobuf:"bytes,1,opt,name=cid,proto3" json:"cid,omitempty"` @@ -5309,9 +5341,17 @@ func (*SignalCompression) Descriptor() ([]byte, []int) { // was left uncompressed. // // Senders MUST NOT nest -- the payload is always an ordinary SignalRequest, never -// another CompressedSignalRequest -- and MUST send this arm only when the peer has -// advertised ClientInfo.CAP_COMPRESSION_DEFLATE_RAW, since an older peer would parse -// it as an unknown field and silently drop the message. +// another CompressedSignalRequest -- and MUST NOT use this arm unless the peer has +// said it can decode one. An older peer parses the unknown field into its +// unknown-field set, leaves the oneof unset, and drops the message without an error, +// so guessing wrong loses signalling silently rather than failing cleanly. +// +// Each direction learns that separately, and neither needs a handshake: +// - server -> client: gated by ClientInfo.CAP_COMPRESSION_DEFLATE_RAW, which the +// server has from the connect URL before it sends anything. +// - client -> server: gated by JoinResponse.accepts_compressed_signal (or +// ReconnectResponse.accepts_compressed_signal), which the client has before it +// sends anything of consequence. // // Senders SHOULD leave payloads below roughly 200 bytes uncompressed, sending the // ordinary arm instead: below that the compressed form is usually larger and the CPU @@ -5732,7 +5772,7 @@ const file_livekit_rtc_proto_rawDesc = "" + "\x05final\x18\x03 \x01(\bR\x05final\":\n" + "\x10MuteTrackRequest\x12\x10\n" + "\x03sid\x18\x01 \x01(\tR\x03sid\x12\x14\n" + - "\x05muted\x18\x02 \x01(\bR\x05muted\"\xe8\x05\n" + + "\x05muted\x18\x02 \x01(\bR\x05muted\"\xa4\x06\n" + "\fJoinResponse\x12!\n" + "\x04room\x18\x01 \x01(\v2\r.livekit.RoomR\x04room\x12:\n" + "\vparticipant\x18\x02 \x01(\v2\x18.livekit.ParticipantInfoR\vparticipant\x12G\n" + @@ -5752,14 +5792,16 @@ const file_livekit_rtc_proto_rawDesc = "" + "\vsif_trailer\x18\r \x01(\fR\n" + "sifTrailer\x12D\n" + "\x16enabled_publish_codecs\x18\x0e \x03(\v2\x0e.livekit.CodecR\x14enabledPublishCodecs\x12!\n" + - "\ffast_publish\x18\x0f \x01(\bR\vfastPublish\"\xf9\x01\n" + + "\ffast_publish\x18\x0f \x01(\bR\vfastPublish\x12:\n" + + "\x19accepts_compressed_signal\x18\x10 \x01(\bR\x17acceptsCompressedSignal\"\xb5\x02\n" + "\x11ReconnectResponse\x123\n" + "\vice_servers\x18\x01 \x03(\v2\x12.livekit.ICEServerR\n" + "iceServers\x12O\n" + "\x14client_configuration\x18\x02 \x01(\v2\x1c.livekit.ClientConfigurationR\x13clientConfiguration\x124\n" + "\vserver_info\x18\x03 \x01(\v2\x13.livekit.ServerInfoR\n" + "serverInfo\x12(\n" + - "\x10last_message_seq\x18\x04 \x01(\rR\x0elastMessageSeq\"T\n" + + "\x10last_message_seq\x18\x04 \x01(\rR\x0elastMessageSeq\x12:\n" + + "\x19accepts_compressed_signal\x18\x05 \x01(\bR\x17acceptsCompressedSignal\"T\n" + "\x16TrackPublishedResponse\x12\x10\n" + "\x03cid\x18\x01 \x01(\tR\x03cid\x12(\n" + "\x05track\x18\x02 \x01(\v2\x12.livekit.TrackInfoR\x05track\"7\n" +