diff --git a/lib/untis/fetch.dart b/lib/untis/fetch.dart index f9e8a4e3d4948abb613a0416af92828aebd4201b..2552f61fc534f0b9d92de48cb0b1c1e052bc08c3 100644 --- a/lib/untis/fetch.dart +++ b/lib/untis/fetch.dart @@ -11,7 +11,7 @@ import 'element_type.dart'; import 'lecture.dart'; typedef RequestOptions = (String path, String method, Json params); -typedef JsonWithCookies = (Json json, List<Cookie> cookies); +typedef RequestResult = (Json json, List<Cookie> cookies, FetchStats stats); class UntisFetch { static const String apiBase = '/WebUntis/api/public'; @@ -64,10 +64,10 @@ class UntisFetch { return response; } - Future<JsonWithCookies> _requestJson(RequestOptions options) async { + Future<RequestResult> _requestJson(RequestOptions options) async { final (_, String method, _) = options; - final before = DateTime.now(); + final onStart = DateTime.now(); final response = await _request(method, _makeUri(options)); final cookies = response.cookies; @@ -79,30 +79,19 @@ class UntisFetch { } } - final afterDownloadStart = DateTime.now(); - final responseTime = afterDownloadStart.difference(before); + final onDownloadStart = DateTime.now(); final responseString = await utf8.decodeStream(response); - - final afterDownloadEnd = DateTime.now(); - final downloadTime = afterDownloadEnd.difference(afterDownloadStart); + final onDownloadEnd = DateTime.now(); final bodyJson = jsonDecode(responseString); - final afterDecode = DateTime.now(); - final decodeTime = afterDecode.difference(afterDownloadEnd); + final onDecodeEnd = DateTime.now(); - final timeStats = { - 'Ping': responseTime, - 'Download': downloadTime, - 'JSON': decodeTime, - }; + final stats = + FetchStats(onStart, onDownloadStart, onDownloadEnd, onDecodeEnd); - print(timeStats.entries - .map((e) => '${e.key}: ${e.value.inMilliseconds}ms') - .join(', ')); - - return (bodyJson as Json, resultCookies); + return (bodyJson as Json, resultCookies, stats); } Future<Json> requestOptions(RequestOptions options) async { @@ -112,9 +101,10 @@ class UntisFetch { final methodPadded = method.padRight(8); print('$methodPadded $uri'); - final (result, cookies) = await compute(_requestJson, options); + final (result, cookies, stats) = await compute(_requestJson, options); _sessionCookies.addAll(cookies); + print('$stats'); return result; } @@ -127,3 +117,34 @@ class UntisFetch { return await requestOptions(options); } } + +class FetchStats { + final DateTime onStart; + final DateTime onDownloadStart; + final DateTime onDownloadEnd; + final DateTime onDecodeEnd; + + FetchStats( + this.onStart, + this.onDownloadStart, + this.onDownloadEnd, + this.onDecodeEnd, + ); + + @override + String toString() { + final responseTime = onDownloadStart.difference(onStart); + final downloadTime = onDownloadEnd.difference(onDownloadStart); + final decodeTime = onDecodeEnd.difference(onDownloadEnd); + + final timeStats = { + 'Ping': responseTime, + 'Download': downloadTime, + 'JSON': decodeTime, + }; + + return timeStats.entries + .map((e) => '${e.key}: ${e.value.inMilliseconds}ms') + .join(', '); + } +}