getOtelHeadersFromHelper function

Map<String, String> getOtelHeadersFromHelper()

Get OTel headers from the configured helper.

Implementation

Map<String, String> getOtelHeadersFromHelper() {
  final otelHeadersHelper = getConfiguredOtelHeadersHelper();
  if (otelHeadersHelper == null) return {};

  final debounceMs =
      int.tryParse(
        Platform.environment['MAGE_OTEL_HEADERS_HELPER_DEBOUNCE_MS'] ?? '',
      ) ??
      defaultOtelHeadersDebounceMs;

  if (_cachedOtelHeaders != null &&
      DateTime.now().millisecondsSinceEpoch - _cachedOtelHeadersTimestamp <
          debounceMs) {
    return _cachedOtelHeaders!;
  }

  if (isOtelHeadersHelperFromProjectOrLocalSettings()) {
    return {};
  }

  try {
    final result = Process.runSync(
      Platform.isWindows ? 'cmd' : 'sh',
      Platform.isWindows
          ? ['/c', otelHeadersHelper]
          : ['-c', otelHeadersHelper],
    );
    final output = (result.stdout as String).trim();
    if (output.isEmpty) {
      throw Exception('otelHeadersHelper did not return a valid value');
    }

    final headers = json.decode(output);
    if (headers is! Map<String, dynamic>) {
      throw Exception(
        'otelHeadersHelper must return a JSON object with string key-value pairs',
      );
    }

    final validated = <String, String>{};
    for (final entry in headers.entries) {
      if (entry.value is! String) {
        throw Exception(
          'otelHeadersHelper returned non-string value for key "${entry.key}"',
        );
      }
      validated[entry.key] = entry.value as String;
    }

    _cachedOtelHeaders = validated;
    _cachedOtelHeadersTimestamp = DateTime.now().millisecondsSinceEpoch;
    return validated;
  } catch (e) {
    rethrow;
  }
}