handleRawMessage method

Future<String> handleRawMessage(
  1. String message
)

Implementation

Future<String> handleRawMessage(String message) async {
  var requestId = 'unknown';
  try {
    final decoded = jsonDecode(message);
    if (decoded is! Map<Object?, Object?>) {
      return _encodeBridgeError(
        requestId: requestId,
        statusCode: 400,
        error: 'bridgeInvalidMessage',
        message: 'Bridge message payload must be a JSON object.',
      );
    }
    final requestJson = Map<String, Object?>.from(decoded);
    final rawRequestId = requestJson['requestId'];
    if (rawRequestId is String && rawRequestId.isNotEmpty) {
      requestId = rawRequestId;
    }

    final request = CockpitRemoteBridgeRequest.fromJson(requestJson);
    requestId = request.requestId;
    final endpointResponse = await _requestHandler(
      CockpitRemoteSessionEndpointRequest(
        method: request.method,
        uri: request.uri,
        jsonBody: request.jsonBody ?? const <String, Object?>{},
      ),
    );
    return jsonEncode(
      (await _bridgeResponseFromEndpointResponse(
        requestId: requestId,
        response: endpointResponse,
      )).toJson(),
    );
  } on FormatException catch (error) {
    return _encodeBridgeError(
      requestId: requestId,
      statusCode: 400,
      error: 'bridgeInvalidMessage',
      message: error.message,
    );
  } on Object catch (error) {
    return _encodeBridgeError(
      requestId: requestId,
      statusCode: 500,
      error: 'bridgeRequestFailed',
      message: '$error',
    );
  }
}