exchangeForControlPlaneToken function

Future<({int expiresAt, String token})?> exchangeForControlPlaneToken(
  1. String firebaseToken, {
  2. String? controlPlaneUrl,
})

Exchanges a Firebase ID token for a Control Plane JWT.

firebaseToken is the Firebase ID token. controlPlaneUrl is the Control Plane API URL (optional).

Returns null if the exchange fails (non-critical).

Implementation

Future<({String token, int expiresAt})?> exchangeForControlPlaneToken(
  String firebaseToken, {
  String? controlPlaneUrl,
}) async {
  final baseUrl = controlPlaneUrl ?? getControlPlaneUrl();
  final url = Uri.parse('$baseUrl/api/control-plane/token');

  try {
    final response = await http.post(
      url,
      headers: {'Authorization': 'Bearer $firebaseToken'},
    ).timeout(const Duration(seconds: 10));

    if (response.statusCode != 200) {
      return null;
    }

    final data = jsonDecode(response.body) as Map<String, dynamic>;
    return (
      token: data['token'] as String,
      expiresAt: (data['expires_at'] as num).toInt(),
    );
  } catch (_) {
    // CP exchange failure is non-critical
    return null;
  }
}