module livekit import time import rand import crypto.hmac import crypto.sha256 import encoding.base64 import json // Struct representing grants pub struct ClaimGrants { pub mut: video VideoGrant iss string exp i64 nbf int sub string name string } // VideoGrant struct placeholder pub struct VideoGrant { pub mut: room string room_join bool @[json: 'roomJoin'] room_list bool @[json: 'roomList'] can_publish bool @[json: 'canPublish'] can_publish_data bool @[json: 'canPublishData'] can_subscribe bool @[json: 'canSubscribe'] } // SIPGrant struct placeholder struct SIPGrant {} // AccessToken class pub struct AccessToken { mut: api_key string api_secret string grants ClaimGrants identity string ttl int } // Method to add a video grant to the token pub fn (mut token AccessToken) add_video_grant(grant VideoGrant) { token.grants.video = grant } // Method to generate a JWT token pub fn (token AccessToken) to_jwt() !string { // Create JWT payload payload := json.encode(token.grants) println('payload: ${payload}') // Create JWT header header := '{"alg":"HS256","typ":"JWT"}' // Encode header and payload in base64 header_encoded := base64.url_encode_str(header) payload_encoded := base64.url_encode_str(payload) // Create the unsigned token unsigned_token := '${header_encoded}.${payload_encoded}' // Create the HMAC-SHA256 signature signature := hmac.new(token.api_secret.bytes(), unsigned_token.bytes(), sha256.sum, sha256.block_size) // Encode the signature in base64 signature_encoded := base64.url_encode(signature) // Create the final JWT jwt := '${unsigned_token}.${signature_encoded}' return jwt }