executeRequest<RequestType extends DeekWebRequest, ResponseType> method

Future<DeekWebResponse<RequestType, ResponseType>> executeRequest<RequestType extends DeekWebRequest, ResponseType>(
  1. DeekWebRequest<ResponseType> request
)

Executes a DeekWebRequest asynchronously.

Implementation

Future<DeekWebResponse<RequestType, ResponseType>>
    executeRequest<RequestType extends DeekWebRequest, ResponseType>(
        DeekWebRequest<ResponseType> request) async {
  // Generate a new CV and notify listeners.
  // TODO: Optionally pass in the CV with the request.
  String requestId = const Uuid().v4().toString();
  _notifyRequestStarted(requestId, request.name);

  var latencyTimer = Stopwatch();
  latencyTimer.start();

  late DeekWebResponse<RequestType, ResponseType> result;
  try {
    _logger?.info(
        "DeekWebClient: [$requestId] Starting ${request.method} request ${request.name} to ${request.uriForLogging}");

    // Execute the request and mark the time
    var response = await _executeRequest(request, requestId);
    int httpTime = latencyTimer.elapsedMilliseconds;
    _logger?.verbose(
        "DeekWebClient: [$requestId] http time: $httpTime ms, response code ${response.statusCode}");

    // Handle the response, including parsing it to the <ResponseType>
    result = _handleResponse(response, request, latencyTimer, requestId);
    int parseTime = latencyTimer.elapsedMilliseconds - httpTime;
    _logger?.verbose("DeekWebClient: [$requestId] parse time: $parseTime ms");

    // Notify listeners that the request is complete
    _logger?.verbose(
        "DeekWebClient: [$requestId] Completed ${request.name} in ${result.latencyMs} ms");
    _notifyRequestCompleted(requestId, response.statusCode);
  } on SocketException catch (e) {
    // SocketException typically happens when there is no / broken network
    // connection.
    _logger?.error("DeekWebClient: [$requestId] SocketException: $e");
    result = DeekWebResponse.fromError(
        request: request, exception: DeekWebException.fromException(e));
    _notifyRequestError(requestId, error: "SocketException");
  } on ClientException catch (e) {
    // ClientException is thrown by web when there is no / broken network
    // connection.
    _logger?.error("DeekWebClient: [$requestId] ClientException: $e");
    result = DeekWebResponse.fromError(
        request: request, exception: DeekWebException.fromException(e));
    _notifyRequestError(requestId, error: "ClientException");
  }
  return result;
}