1313# limitations under the License.
1414
1515import calendar
16- import dataclasses
1716import re
1817import datetime
1918import os
2019import jwt
20+ import dataclasses
21+ from dataclasses import dataclass
2122from typing import Optional , List , Literal
2223from google .protobuf .json_format import MessageToDict , ParseDict
2324
2728DEFAULT_LEEWAY = datetime .timedelta (minutes = 1 )
2829
2930
30- @dataclasses . dataclass
31+ @dataclass
3132class VideoGrants :
3233 # actions on rooms
3334 room_create : Optional [bool ] = None
@@ -68,21 +69,27 @@ class VideoGrants:
6869 agent : Optional [bool ] = None
6970
7071
71- @dataclasses . dataclass
72+ @dataclass
7273class SIPGrants :
7374 # manage sip resources
7475 admin : bool = False
7576 # make outbound calls
7677 call : bool = False
7778
7879
79- @dataclasses . dataclass
80+ @dataclass
8081class InferenceGrants :
8182 # perform inference
8283 perform : bool = False
8384
8485
85- @dataclasses .dataclass
86+ @dataclass
87+ class ObservabilityGrants :
88+ # write grants to publish observability data
89+ write : bool = False
90+
91+
92+ @dataclass
8693class Claims :
8794 identity : str = ""
8895 name : str = ""
@@ -91,13 +98,14 @@ class Claims:
9198 video : Optional [VideoGrants ] = None
9299 sip : Optional [SIPGrants ] = None
93100 inference : Optional [InferenceGrants ] = None
101+ observability : Optional [ObservabilityGrants ] = None
94102 attributes : Optional [dict [str , str ]] = None
95103 sha256 : Optional [str ] = None
96104 room_preset : Optional [str ] = None
97105 room_config : Optional [RoomConfiguration ] = None
98106
99107 def asdict (self ) -> dict :
100- # in order to produce minimal JWT size, exclude None or empty values
108+ # in order to produce minimal jwt size, exclude None or empty values
101109 claims = dataclasses .asdict (
102110 self ,
103111 dict_factory = lambda items : {
@@ -143,6 +151,10 @@ def with_sip_grants(self, grants: SIPGrants) -> "AccessToken":
143151 self .claims .sip = grants
144152 return self
145153
154+ def with_observability_grants (self , grants : ObservabilityGrants ) -> "AccessToken" :
155+ self .claims .observability = grants
156+ return self
157+
146158 def with_inference_grants (self , grants : InferenceGrants ) -> "AccessToken" :
147159 self .claims .inference = grants
148160 return self
0 commit comments