in dwds/web/client.dart [41:177]
Future<void> main() {
return runZonedGuarded(() async {
// Set the unique id for this instance of the app.
// Test apps may already have this set.
dartAppInstanceId ??= const Uuid().v1();
var fixedPath = _fixProtocol(dwdsDevHandlerPath);
var fixedUri = Uri.parse(fixedPath);
var client = fixedUri.isScheme('ws') || fixedUri.isScheme('wss')
? WebSocketClient(WebSocketChannel.connect(fixedUri))
: SseSocketClient(SseClient(fixedPath));
Restarter restarter;
if (dartModuleStrategy == 'require-js') {
restarter = await RequireRestarter.create();
} else if (dartModuleStrategy == 'legacy') {
restarter = LegacyRestarter();
} else {
throw StateError('Unknown module strategy: $dartModuleStrategy');
}
var manager = ReloadingManager(client, restarter);
hotRestartJs = allowInterop((String runId) {
return toPromise(manager.hotRestart(runId: runId));
});
var debugEventController =
BatchedStreamController<DebugEvent>(delay: _batchDelayMilliseconds);
debugEventController.stream.listen((events) {
client.sink.add(jsonEncode(serializers.serialize(BatchedDebugEvents(
(b) => b.events = ListBuilder<DebugEvent>(events)))));
});
emitDebugEvent = allowInterop((String kind, String eventData) {
if (dartEmitDebugEvents) {
debugEventController.sink.add(DebugEvent((b) => b
..timestamp = (DateTime.now().millisecondsSinceEpoch)
..kind = kind
..eventData = eventData));
}
});
emitRegisterEvent = allowInterop((String eventData) {
client.sink.add(jsonEncode(serializers.serialize(RegisterEvent((b) => b
..timestamp = (DateTime.now().millisecondsSinceEpoch)
..eventData = eventData))));
});
launchDevToolsJs = allowInterop(() {
if (!_isChromium) {
window.alert(
'Dart DevTools is only supported on Chromium based browsers.');
return;
}
client.sink.add(jsonEncode(serializers.serialize(DevToolsRequest((b) => b
..appId = dartAppId
..instanceId = dartAppInstanceId))));
});
client.stream.listen((serialized) async {
var event = serializers.deserialize(jsonDecode(serialized));
if (event is BuildResult) {
if (reloadConfiguration == 'ReloadConfiguration.liveReload') {
manager.reloadPage();
} else if (reloadConfiguration == 'ReloadConfiguration.hotRestart') {
await manager.hotRestart();
} else if (reloadConfiguration == 'ReloadConfiguration.hotReload') {
print('Hot reload is currently unsupported. Ignoring change.');
}
} else if (event is DevToolsResponse) {
if (!event.success) {
var alert = 'DevTools failed to open with:\n${event.error}';
if (event.promptExtension && window.confirm(alert)) {
// ignore: unsafe_html
window.open('https://goo.gle/dart-debug-extension', '_blank');
} else {
window.alert(alert);
}
}
} else if (event is RunRequest) {
runMain();
} else if (event is ErrorResponse) {
window.console.error('Error from backend:\n\nError: ${event.error}\n\n'
'Stack Trace:\n${event.stackTrace}');
}
}, onError: (error) {
// An error is propagated on a full page reload as Chrome presumably
// forces the SSE connection to close in a bad state. This does not cause
// any adverse effects so simply swallow this error as to not print the
// misleading unhandled error message.
});
if (dwdsEnableDevtoolsLaunch) {
window.onKeyDown.listen((Event e) {
if (e is KeyboardEvent &&
const [
'd',
'D',
'∂', // alt-d output on Mac
'Î', // shift-alt-D output on Mac
].contains(e.key) &&
e.altKey &&
!e.ctrlKey &&
!e.metaKey) {
e.preventDefault();
launchDevToolsJs();
}
});
}
if (_isChromium) {
client.sink.add(jsonEncode(serializers.serialize(ConnectRequest((b) => b
..appId = dartAppId
..instanceId = dartAppInstanceId
..entrypointPath = dartEntrypointPath))));
} else {
// If not Chromium we just invoke main, devtools aren't supported.
runMain();
}
dispatchEvent(CustomEvent('dart-app-ready'));
}, (error, stackTrace) {
print('''
Unhandled error detected in the injected client.js script.
You can disable this script in webdev by passing --no-injected-client if it
is preventing your app from loading, but note that this will also prevent
all debugging and hot reload/restart functionality from working.
The original error is below, please file an issue at
https://github.com/dart-lang/webdev/issues/new and attach this output:
$error
$stackTrace
''');
});
}