handleRequest<ResultType, Item> method
Future<ApiResponse<ResultType, Item> >
handleRequest<ResultType, Item>(
- ApiRequest<
ResultType, Item> request, { - int? timeout,
- 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));
}