handleRequest<ResultType, Item> method

Future<ApiResponse<ResultType, Item>> handleRequest<ResultType, Item>(
  1. ApiRequest<ResultType, Item> request, {
  2. int? timeout,
  3. RequestOptions options = const RequestOptions(),
})

makes a network request

Implementation

Future<ApiResponse<ResultType, Item>> handleRequest<ResultType, Item>(
  ApiRequest<ResultType, Item> request, {
  int? timeout,
  RequestOptions options = const RequestOptions(),
}) {
  if (timeout != null) {
    options = RequestOptions(
      cancelToken: options.cancelToken,
      retry: options.retry,
      onSendProgress: options.onSendProgress,
      onReceiveProgress: options.onReceiveProgress,
      timeout: timeout,
      skipDeduplication: options.skipDeduplication,
    );
  }

  // De-duplication is only safe for calls with no per-caller streaming or
  // cancellation, and only for methods that are safe to share.
  final key = _deduplicationKey<ResultType, Item>(request, options);
  if (key == null) return _attempt<ResultType, Item>(request, options);

  final existing = _inFlight[key];
  if (existing != null) {
    ApiConfig().log('joining in-flight request $key');
    return existing.then((r) => r as ApiResponse<ResultType, Item>);
  }

  final future = _attempt<ResultType, Item>(request, options);
  _inFlight[key] = future;
  return future.whenComplete(() => _inFlight.remove(key));
}