(state: &mut State<'gc>, args: Vec<Value<'gc>>)
| 168 | } |
| 169 | |
| 170 | fn jwt_encode<'gc>(state: &mut State<'gc>, args: Vec<Value<'gc>>) -> Result<Value<'gc>, VmError> { |
| 171 | if args.len() != 3 { |
| 172 | return Err(VmError::RuntimeError( |
| 173 | "encode() requires claims object, secret key, and algorithm".into(), |
| 174 | )); |
| 175 | } |
| 176 | |
| 177 | // Get claims object |
| 178 | let claims_obj = match &args[0] { |
| 179 | Value::Object(obj) => obj, |
| 180 | _ => { |
| 181 | return Err(VmError::RuntimeError( |
| 182 | "First argument must be claims object".into(), |
| 183 | )); |
| 184 | } |
| 185 | }; |
| 186 | |
| 187 | // Get secret key |
| 188 | let secret = args[1].as_string()?; |
| 189 | let secret_str = secret.to_str().unwrap(); |
| 190 | |
| 191 | // Get algorithm |
| 192 | let alg = args[2].as_string()?; |
| 193 | let algorithm = parse_algorithm(alg.to_str().unwrap())?; |
| 194 | |
| 195 | // Build header |
| 196 | let header = Header::new(algorithm); |
| 197 | |
| 198 | // Build claims |
| 199 | let claims = build_claims(claims_obj)?; |
| 200 | |
| 201 | // Create encoding key |
| 202 | let key = EncodingKey::from_secret(secret_str.as_bytes()); |
| 203 | |
| 204 | // Generate token |
| 205 | let token = encode(&header, &claims, &key) |
| 206 | .map_err(|e| VmError::RuntimeError(format!("JWT encoding error: {}", e)))?; |
| 207 | |
| 208 | Ok(Value::String(state.intern(token.as_bytes()))) |
| 209 | } |
| 210 | |
| 211 | fn jwt_decode<'gc>(state: &mut State<'gc>, args: Vec<Value<'gc>>) -> Result<Value<'gc>, VmError> { |
| 212 | if args.len() != 3 { |
nothing calls this directly
no test coverage detected