1313# limitations under the License.
1414
1515import calendar
16- import dataclasses
1716import re
1817import datetime
1918import os
2019import jwt
20+ from dataclasses import dataclass
2121from typing import Optional , List , Literal
2222from google .protobuf .json_format import MessageToDict , ParseDict
2323
2727DEFAULT_LEEWAY = datetime .timedelta (minutes = 1 )
2828
2929
30- @dataclasses . dataclass
30+ @dataclass
3131class VideoGrants :
3232 # actions on rooms
3333 room_create : Optional [bool ] = None
@@ -68,21 +68,27 @@ class VideoGrants:
6868 agent : Optional [bool ] = None
6969
7070
71- @dataclasses . dataclass
71+ @dataclass
7272class SIPGrants :
7373 # manage sip resources
7474 admin : bool = False
7575 # make outbound calls
7676 call : bool = False
7777
7878
79- @dataclasses . dataclass
79+ @dataclass
8080class InferenceGrants :
8181 # perform inference
8282 perform : bool = False
8383
8484
85- @dataclasses .dataclass
85+ @dataclass
86+ class ObservabilityGrants :
87+ # write grants to publish observability data
88+ write : bool = False
89+
90+
91+ @dataclass
8692class Claims :
8793 identity : str = ""
8894 name : str = ""
@@ -91,13 +97,14 @@ class Claims:
9197 video : Optional [VideoGrants ] = None
9298 sip : Optional [SIPGrants ] = None
9399 inference : Optional [InferenceGrants ] = None
100+ observability : Optional [ObservabilityGrants ] = None
94101 attributes : Optional [dict [str , str ]] = None
95102 sha256 : Optional [str ] = None
96103 room_preset : Optional [str ] = None
97104 room_config : Optional [RoomConfiguration ] = None
98105
99106 def asdict (self ) -> dict :
100- # in order to produce minimal JWT size, exclude None or empty values
107+ # in order to produce minimal jwt size, exclude None or empty values
101108 claims = dataclasses .asdict (
102109 self ,
103110 dict_factory = lambda items : {
@@ -143,6 +150,10 @@ def with_sip_grants(self, grants: SIPGrants) -> "AccessToken":
143150 self .claims .sip = grants
144151 return self
145152
153+ def with_observability_grants (self , grants : ObservabiliyGrants ) -> "AccessToken" :
154+ self .claims .observability = grants
155+ return self
156+
146157 def with_inference_grants (self , grants : InferenceGrants ) -> "AccessToken" :
147158 self .claims .inference = grants
148159 return self
0 commit comments