78 lines
1.7 KiB
V
78 lines
1.7 KiB
V
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
|
|
}
|