Skip to content

Commit c820e2a

Browse files
committed
Converge in-app restarts with restarts from an IDE
1 parent e2d14f1 commit c820e2a

File tree

5 files changed

+588
-651
lines changed

5 files changed

+588
-651
lines changed

dwds/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
- Remove unused `clientFuture` arg from `DwdsVmClient` methods.
55
- Fix pausing starting of `main` after the hot restart.
66
- Updating bootstrapper for DDC library bundler module format + Frontend Server.
7+
- Fix setting up breakpoints when handling in-app restarts with attached debugger.
78

89
## 26.2.2
910

dwds/lib/src/connections/app_connection.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'dart:async';
66
import 'dart:convert';
77

88
import 'package:dwds/data/connect_request.dart';
9+
import 'package:dwds/data/hot_restart_request.dart';
910
import 'package:dwds/data/run_request.dart';
1011
import 'package:dwds/data/serializers.dart';
1112
import 'package:dwds/src/handlers/socket_connections.dart';
@@ -46,4 +47,11 @@ class AppConnection {
4647
_connection.sink.add(jsonEncode(serializers.serialize(RunRequest())));
4748
_startedCompleter.complete();
4849
}
50+
51+
/// The request to restart when no debugger attached.
52+
///
53+
/// In this case, there's no need to block main execution until the debugger
54+
/// resends breakpoints.
55+
void hotRestart(HotRestartRequest request) =>
56+
_connection.sink.add(jsonEncode(serializers.serialize(request)));
4957
}

dwds/lib/src/handlers/dev_handler.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import 'package:dwds/data/debug_event.dart';
1414
import 'package:dwds/data/devtools_request.dart';
1515
import 'package:dwds/data/error_response.dart';
1616
import 'package:dwds/data/hot_reload_response.dart';
17+
import 'package:dwds/data/hot_restart_request.dart';
1718
import 'package:dwds/data/hot_restart_response.dart';
1819
import 'package:dwds/data/isolate_events.dart';
1920
import 'package:dwds/data/register_event.dart';
@@ -413,6 +414,11 @@ class DevHandler {
413414
final proxyService = _servicesByAppId[appId]?.proxyService;
414415

415416
if (proxyService == null) {
417+
if (message is HotRestartRequest) {
418+
_logger.finest('No debugger, let the app handle the restart itself.');
419+
connection.hotRestart(message);
420+
return;
421+
}
416422
_logger.warning(
417423
'No proxy service found for appId: $appId to process $message',
418424
);
@@ -436,6 +442,20 @@ class DevHandler {
436442
proxyService.parseDebugEvent(message);
437443
} else if (message is RegisterEvent) {
438444
proxyService.parseRegisterEvent(message);
445+
} else if (message is HotRestartRequest) {
446+
final services = _servicesByAppId[appId]!;
447+
if (services.dwdsVmClient is! ChromeDwdsVmClient ||
448+
services.proxyService is! ChromeProxyService) {
449+
throw UnsupportedError(
450+
'In-app restart requests are only supported by '
451+
'ChromeDwdsVmClient and ChromeProxyService',
452+
);
453+
}
454+
final chromeClient = services.dwdsVmClient as ChromeDwdsVmClient;
455+
final chromeProxyService = services.proxyService as ChromeProxyService;
456+
unawaited(
457+
chromeClient.hotRestart(chromeProxyService, chromeClient.client),
458+
);
439459
} else {
440460
final serviceType = proxyService is WebSocketProxyService
441461
? 'WebSocket'

0 commit comments

Comments
 (0)