From ef3bb65eaac07ea46ac5514551d2129699befc98 Mon Sep 17 00:00:00 2001 From: shishirng Date: Wed, 6 May 2026 09:37:40 -0400 Subject: [PATCH 1/3] add eot obs (#1535) Signed-off-by: shishir gowda --- observability/gatewayobs/gen_reporter.go | 4 +++- observability/gatewayobs/gen_reporter_noop.go | 4 ++++ observability/gatewayobs/gen_source.go | 8 ++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/observability/gatewayobs/gen_reporter.go b/observability/gatewayobs/gen_reporter.go index 4f7808701..ca515c36c 100644 --- a/observability/gatewayobs/gen_reporter.go +++ b/observability/gatewayobs/gen_reporter.go @@ -6,7 +6,7 @@ import ( "time" ) -const Version_NI039G8 = true +const Version_IN1F4V8 = true type KeyResolver interface { Resolve(string) @@ -114,6 +114,8 @@ type modelReporter interface { ReportBargeInRequests(v uint64) ReportBargeInRequestTypes(v ModelBargeInRequestTypes) ReportVoiceCloneRequests(v uint64) + ReportEotRequests(v uint64) + ReportRequestTypes(v ModelRequestTypes) } type ModelTx interface { diff --git a/observability/gatewayobs/gen_reporter_noop.go b/observability/gatewayobs/gen_reporter_noop.go index 5086ad87b..8fdd8c6bd 100644 --- a/observability/gatewayobs/gen_reporter_noop.go +++ b/observability/gatewayobs/gen_reporter_noop.go @@ -169,6 +169,8 @@ func (r *noopModelReporter) ReportTtsChars(v uint32) func (r *noopModelReporter) ReportBargeInRequests(v uint64) {} func (r *noopModelReporter) ReportBargeInRequestTypes(v ModelBargeInRequestTypes) {} func (r *noopModelReporter) ReportVoiceCloneRequests(v uint64) {} +func (r *noopModelReporter) ReportEotRequests(v uint64) {} +func (r *noopModelReporter) ReportRequestTypes(v ModelRequestTypes) {} type noopModelTx struct{} @@ -187,3 +189,5 @@ func (t *noopModelTx) ReportTtsChars(v uint32) {} func (t *noopModelTx) ReportBargeInRequests(v uint64) {} func (t *noopModelTx) ReportBargeInRequestTypes(v ModelBargeInRequestTypes) {} func (t *noopModelTx) ReportVoiceCloneRequests(v uint64) {} +func (t *noopModelTx) ReportEotRequests(v uint64) {} +func (t *noopModelTx) ReportRequestTypes(v ModelRequestTypes) {} diff --git a/observability/gatewayobs/gen_source.go b/observability/gatewayobs/gen_source.go index 0e5d9ab64..06b56d90d 100644 --- a/observability/gatewayobs/gen_source.go +++ b/observability/gatewayobs/gen_source.go @@ -9,6 +9,14 @@ const ( ModelBargeInRequestTypesSelfHosted ModelBargeInRequestTypes = "self_hosted" ) +type ModelRequestTypes string + +const ( + ModelRequestTypesUndefined ModelRequestTypes = "" + ModelRequestTypesCloud ModelRequestTypes = "cloud" + ModelRequestTypesSelfHosted ModelRequestTypes = "self_hosted" +) + type Rollup string const ( From 729648d8e81b2de18106679ee8234fdfd5162fd7 Mon Sep 17 00:00:00 2001 From: David Zhao Date: Wed, 6 May 2026 09:13:45 -0700 Subject: [PATCH 2/3] fix: ensure we don't reject tokens with unknown fields (#1536) * fix: ensure we don't reject tokens with unknown fields * changeset * add other top level fields to test --- .changeset/witty-donuts-nail.md | 5 ++++ auth/grants.go | 8 +++++- auth/verifier_test.go | 47 +++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 .changeset/witty-donuts-nail.md diff --git a/.changeset/witty-donuts-nail.md b/.changeset/witty-donuts-nail.md new file mode 100644 index 000000000..20e300749 --- /dev/null +++ b/.changeset/witty-donuts-nail.md @@ -0,0 +1,5 @@ +--- +"github.com/livekit/protocol": patch +--- + +fix: ensure we don't reject tokens on unknown fields diff --git a/auth/grants.go b/auth/grants.go index df5e684bd..8fc0bf00a 100644 --- a/auth/grants.go +++ b/auth/grants.go @@ -35,6 +35,12 @@ var tokenMarshaler = protojson.MarshalOptions{ EmitDefaultValues: false, } +// tokenUnmarshaler discards unknown fields so that older servers can accept +// tokens issued by newer clients that include fields the server does not yet know about. +var tokenUnmarshaler = protojson.UnmarshalOptions{ + DiscardUnknown: true, +} + var ErrSensitiveCredentials = errors.New("room configuration should not contain sensitive credentials") func (c *RoomConfiguration) Clone() *RoomConfiguration { @@ -49,7 +55,7 @@ func (c *RoomConfiguration) MarshalJSON() ([]byte, error) { } func (c *RoomConfiguration) UnmarshalJSON(data []byte) error { - return protojson.Unmarshal(data, (*livekit.RoomConfiguration)(c)) + return tokenUnmarshaler.Unmarshal(data, (*livekit.RoomConfiguration)(c)) } // CheckCredentials checks if the room configuration contains sensitive credentials diff --git a/auth/verifier_test.go b/auth/verifier_test.go index 37d8f2ab3..c608f340f 100644 --- a/auth/verifier_test.go +++ b/auth/verifier_test.go @@ -18,7 +18,9 @@ import ( "testing" "time" + "github.com/go-jose/go-jose/v3" "github.com/go-jose/go-jose/v3/json" + "github.com/go-jose/go-jose/v3/jwt" "github.com/stretchr/testify/require" "github.com/livekit/protocol/auth" @@ -95,6 +97,51 @@ func TestVerifier(t *testing.T) { require.EqualValues(t, attrs, decoded.Attributes) }) + t.Run("unknown fields are ignored for forward compatibility", func(t *testing.T) { + // Simulate a token issued by a newer client whose claims include fields + // this server does not yet know about. The server should still accept the + // token rather than failing with `unknown field`. This guards against + // requiring server upgrades before client upgrades can roll out. + sig, err := jose.NewSigner( + jose.SigningKey{Algorithm: jose.HS256, Key: []byte(secret)}, + (&jose.SignerOptions{}).WithType("JWT"), + ) + require.NoError(t, err) + + claims := map[string]interface{}{ + "iss": apiKey, + "sub": "me", + "nbf": jwt.NewNumericDate(time.Now()), + "exp": jwt.NewNumericDate(time.Now().Add(time.Minute)), + // unknown top-level claim grants field + "someFutureGrant": map[string]interface{}{"enabled": true}, + "video": map[string]interface{}{ + "roomJoin": true, + "room": "myroom", + // unknown field inside a known grant + "someFutureVideoField": "future-value", + }, + "roomConfig": map[string]interface{}{ + "name": "myroom", + // unknown field inside a protojson-decoded message + "someFutureRoomConfigField": "future-value", + }, + } + token, err := jwt.Signed(sig).Claims(claims).CompactSerialize() + require.NoError(t, err) + + v, err := auth.ParseAPIToken(token) + require.NoError(t, err) + + _, decoded, err := v.Verify(secret) + require.NoError(t, err) + require.NotNil(t, decoded.Video) + require.Equal(t, "myroom", decoded.Video.Room) + require.True(t, decoded.Video.RoomJoin) + require.NotNil(t, decoded.RoomConfig) + require.Equal(t, "myroom", decoded.RoomConfig.Name) + }) + t.Run("nil permissions are handled", func(t *testing.T) { grant := &auth.VideoGrant{ Room: "myroom", From a0e714995ccbf0a2f4c8df29630e4910c8c9a09a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 6 May 2026 09:15:13 -0700 Subject: [PATCH 3/3] Version Packages (#1533) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/purple-needles-juggle.md | 5 ----- .changeset/sip-codecs.md | 7 ------- .changeset/witty-donuts-nail.md | 5 ----- CHANGELOG.md | 8 ++++++++ package.json | 2 +- packages/javascript/CHANGELOG.md | 8 ++++++++ packages/javascript/package.json | 2 +- 7 files changed, 18 insertions(+), 19 deletions(-) delete mode 100644 .changeset/purple-needles-juggle.md delete mode 100644 .changeset/sip-codecs.md delete mode 100644 .changeset/witty-donuts-nail.md diff --git a/.changeset/purple-needles-juggle.md b/.changeset/purple-needles-juggle.md deleted file mode 100644 index 829f5a9b8..000000000 --- a/.changeset/purple-needles-juggle.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@livekit/protocol": patch ---- - -rename agent environment to deployment diff --git a/.changeset/sip-codecs.md b/.changeset/sip-codecs.md deleted file mode 100644 index 4a7d7ce15..000000000 --- a/.changeset/sip-codecs.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@livekit/protocol": patch -"github.com/livekit/protocol": patch ---- - -Allow setting a list of SIP codecs for SDP. - diff --git a/.changeset/witty-donuts-nail.md b/.changeset/witty-donuts-nail.md deleted file mode 100644 index 20e300749..000000000 --- a/.changeset/witty-donuts-nail.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"github.com/livekit/protocol": patch ---- - -fix: ensure we don't reject tokens on unknown fields diff --git a/CHANGELOG.md b/CHANGELOG.md index dbaaeee51..2a5b5411c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # github.com/livekit/protocol +## 1.45.8 + +### Patch Changes + +- Allow setting a list of SIP codecs for SDP. - [#1530](https://github.com/livekit/protocol/pull/1530) ([@dennwc](https://github.com/dennwc)) + +- fix: ensure we don't reject tokens on unknown fields - [#1536](https://github.com/livekit/protocol/pull/1536) ([@davidzhao](https://github.com/davidzhao)) + ## 1.45.7 ### Patch Changes diff --git a/package.json b/package.json index 0b1343a21..9aeb1db91 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "github.com/livekit/protocol", "private": true, - "version": "1.45.7", + "version": "1.45.8", "scripts": { "changeset": "changeset", "ci:publish": "pnpm --filter @livekit/protocol run build && changeset publish" diff --git a/packages/javascript/CHANGELOG.md b/packages/javascript/CHANGELOG.md index 8e0bcd4da..9a788d63e 100644 --- a/packages/javascript/CHANGELOG.md +++ b/packages/javascript/CHANGELOG.md @@ -1,5 +1,13 @@ # @livekit/protocol +## 1.45.8 + +### Patch Changes + +- rename agent environment to deployment - [#1532](https://github.com/livekit/protocol/pull/1532) ([@paulwe](https://github.com/paulwe)) + +- Allow setting a list of SIP codecs for SDP. - [#1530](https://github.com/livekit/protocol/pull/1530) ([@dennwc](https://github.com/dennwc)) + ## 1.45.7 ### Patch Changes diff --git a/packages/javascript/package.json b/packages/javascript/package.json index b8a657b8c..6bc7311dd 100644 --- a/packages/javascript/package.json +++ b/packages/javascript/package.json @@ -1,6 +1,6 @@ { "name": "@livekit/protocol", - "version": "1.45.7", + "version": "1.45.8", "description": "", "type": "module", "require": "dist/index.cjs",