Skip to content

Commit

Permalink
setup changes implemented
Browse files Browse the repository at this point in the history
  • Loading branch information
hrajwade96 committed Oct 3, 2024
1 parent ae58738 commit 2bfbe1c
Show file tree
Hide file tree
Showing 3 changed files with 121 additions and 54 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import 'dart:convert';

import 'package:devtools_app_shared/utils.dart';
import 'package:flutter/foundation.dart';
import 'package:logging/logging.dart';
import 'package:vm_service/vm_service.dart';

import '../../shared/config_specific/import_export/import_export.dart';
Expand All @@ -23,6 +24,9 @@ import 'har_network_data.dart';
import 'network_model.dart';
import 'network_screen.dart';
import 'network_service.dart';
import 'offline_network_data.dart';

final _log = Logger('http_request_data');

/// Different types of Network Response which can be used to visualise response
/// on Response tab
Expand Down Expand Up @@ -53,6 +57,7 @@ class NetworkController extends DisposableController
OfflineScreenControllerMixin,
AutoDisposeControllerMixin {
NetworkController() {
_initHelper();
_networkService = NetworkService(this);
_currentNetworkRequests = CurrentNetworkRequests();
addAutoDisposeListener(
Expand Down Expand Up @@ -162,6 +167,47 @@ class NetworkController extends DisposableController
@visibleForTesting
bool get isPolling => _pollingTimer != null;

void _initHelper() async {
try {
if (offlineDataController.showingOfflineData.value == true) {
await maybeLoadOfflineData(
NetworkScreen.id,
createData: (json) => OfflineNetworkData.fromJson(json),
shouldLoad: (data) => data != null,
loadData: (data) => loadOfflineData(data),
);
}
cancelListeners();
if (!offlineDataController.showingOfflineData.value) {
unawaited(startRecording());
debugPrint('started recording');
addAutoDisposeListener(
serviceConnection.serviceManager.isolateManager.mainIsolate,
() {
if (serviceConnection
.serviceManager.isolateManager.mainIsolate.value !=
null) {
unawaited(startRecording());
}
},
);
}
} catch (e) {
_log.shout('Could not load offline data: $e');
}
}

void loadOfflineData(OfflineNetworkData offlineData) {
filteredData
..clear()
..addAll(offlineData.requests);

if (offlineData.selectedRequestId != null) {
selectedRequest.value =
_currentNetworkRequests.getRequest(offlineData.selectedRequestId!);
}
}

@visibleForTesting
void processNetworkTrafficHelper(
List<SocketStatistic> sockets,
Expand Down Expand Up @@ -392,23 +438,17 @@ class NetworkController extends DisposableController

@override
OfflineScreenData prepareOfflineScreenData() {
final requests =
filteredData.value.whereType<DartIOHttpRequestData>().toList();
final offlineData = OfflineNetworkData(
requests: filteredData.value.whereType<DartIOHttpRequestData>().toList(),
selectedRequestId: selectedRequest.value?.id,
);

return OfflineScreenData(
screenId: NetworkScreen.id,
data: serializeRequestDataForOfflineMode(requests),
data: offlineData.toJson(),
);
}
}

Map<String, Object> serializeRequestDataForOfflineMode(
List<DartIOHttpRequestData>? requests,
) {
if (requests == null) return {};
return {
'requests': requests.map((request) => request.toJson()).toList(),
};

Future<void> _fetchFullDataBeforeExport() => Future.wait(
filteredData.value
.whereType<DartIOHttpRequestData>()
Expand Down
42 changes: 0 additions & 42 deletions packages/devtools_app/lib/src/screens/network/network_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import 'package:devtools_app_shared/ui.dart';
import 'package:devtools_app_shared/utils.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:logging/logging.dart';
import 'package:provider/provider.dart';

import '../../shared/analytics/analytics.dart' as ga;
Expand All @@ -30,8 +29,6 @@ import 'network_controller.dart';
import 'network_model.dart';
import 'network_request_inspector.dart';

final _log = Logger('http_request_data');

class NetworkScreen extends Screen {
NetworkScreen() : super.fromMetaData(ScreenMetaData.network);

Expand Down Expand Up @@ -126,45 +123,6 @@ class _NetworkScreenBodyState extends State<NetworkScreenBody>
void didChangeDependencies() {
super.didChangeDependencies();
if (!initController()) return;
try {
if (offlineDataController.showingOfflineData.value == true) {
loadOfflineData(offlineDataController.offlineDataJson);
}
cancelListeners();
if (!offlineDataController.showingOfflineData.value) {
unawaited(controller.startRecording());
debugPrint('started recording');
addAutoDisposeListener(
serviceConnection.serviceManager.isolateManager.mainIsolate,
() {
if (serviceConnection
.serviceManager.isolateManager.mainIsolate.value !=
null) {
unawaited(controller.startRecording());
}
},
);
}
} catch (e) {
_log.shout('Could not load offline data: $e');
}
}

void loadOfflineData(Map<String, dynamic> offlineData) {
final requestsMap = (offlineData['network']
as Map<String, dynamic>)['requests'] as List<dynamic>;
final requests = requestsMap
.map(
(e) => DartIOHttpRequestData.fromJson(
e as Map<String, dynamic>,
null,
null,
),
)
.toList();
controller.filteredData
..clear()
..addAll(requests);
}

@override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
// Copyright 2024 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:convert';

import 'package:devtools_shared/devtools_shared.dart';

import '../../shared/http/http_request_data.dart';

/// Class to encapsulate offline data for the NetworkController.
/// It is responsible for serializing and deserializing offline network data.
class OfflineNetworkData with Serializable {
OfflineNetworkData({
required this.requests,
this.selectedRequestId,
this.recording = false,
});

/// Creates an instance of [OfflineNetworkData] from a JSON map.
factory OfflineNetworkData.fromJson(Map<String, dynamic> json) {
final List<dynamic> requestsJson = json['requests'] ?? [];
final requests = requestsJson
.map(
(e) => DartIOHttpRequestData.fromJson(
e as Map<String, dynamic>,
null,
null,
),
)
.toList();

return OfflineNetworkData(
requests: requests,
selectedRequestId: json['selectedRequestId'] as String?,
recording: json['recording'] as bool? ?? false,
);
}

/// List of current [DartIOHttpRequestData] network requests.
final List<DartIOHttpRequestData> requests;

/// The ID of the currently selected request, if any.
final String? selectedRequestId;

/// Whether the recording state is enabled.
final bool recording;

/// Converts the current offline data to a JSON format.
@override
Map<String, dynamic> toJson() {
return {
'requests': requests.map((request) => request.toJson()).toList(),
'selectedRequestId': selectedRequestId,
'recording': recording,
};
}

/// Serialize the instance to a JSON-encoded string.
String toJsonString() {
return jsonEncode(toJson());
}

/// Deserialize a JSON-encoded string to an [OfflineNetworkData] instance.
static OfflineNetworkData fromJsonString(String jsonString) {
final Map<String, dynamic> json = jsonDecode(jsonString);
return OfflineNetworkData.fromJson(json);
}
}

0 comments on commit 2bfbe1c

Please sign in to comment.