in dwds/debug_extension/web/background.dart [331:420]
Future<void> _startSseClient(
Uri uri,
String appId,
String instanceId,
int contextId,
Tab currentTab,
String dwdsVersion,
) async {
if (Version.parse(dwdsVersion ?? '0.0.0') >= Version.parse('9.1.0')) {
var authUri = uri.replace(path: authenticationPath);
if (authUri.scheme == 'ws') authUri = authUri.replace(scheme: 'http');
if (authUri.scheme == 'wss') authUri = authUri.replace(scheme: 'https');
var authUrl = authUri.toString();
try {
var response = await HttpRequest.request(authUrl,
method: 'GET', withCredentials: true);
if (!response.responseText
.contains('Dart Debug Authentication Success!')) {
throw Exception('Not authenticated.');
}
} catch (_) {
if (window.confirm(
'Authentication required.\n\nClick OK to authenticate then try again.')) {
// TODO(grouma) - see if we can get a callback on a successful auth
// and automatically reinitiate the dev workflow.
window.open(authUrl, 'Dart DevTools Authentication');
detach(Debuggee(tabId: currentTab.id), allowInterop(() {}));
}
return;
}
}
// Specifies whether the debugger is attached.
//
// A debugger is detached if it is closed by user or the target is closed.
var client = uri.isScheme('ws') || uri.isScheme('wss')
? WebSocketClient(WebSocketChannel.connect(uri))
: SseSocketClient(SseClient(uri.toString()));
_debugSessions.add(DebugSession(client, currentTab.id));
print('Connected to DWDS version $dwdsVersion with appId=$appId');
client.stream.listen((data) {
var message = serializers.deserialize(jsonDecode(data));
if (message is ExtensionRequest) {
var params =
BuiltMap<String, Object>(json.decode(message.commandParams)).toMap();
sendCommand(Debuggee(tabId: currentTab.id), message.command,
js_util.jsify(params), allowInterop(([e]) {
// No arguments indicate that an error occurred.
if (e == null) {
client.sink
.add(jsonEncode(serializers.serialize(ExtensionResponse((b) => b
..id = message.id
..success = false
..result = stringify(lastError)))));
} else {
client.sink
.add(jsonEncode(serializers.serialize(ExtensionResponse((b) => b
..id = message.id
..success = true
..result = stringify(e)))));
}
}));
} else if (message is ExtensionEvent) {
if (message.method == 'dwds.encodedUri') {
sendMessageToExtensions(Request(
name: 'dwds.encodedUri',
tabId: currentTab.id,
options: message.params));
_tabIdToEncodedUri[currentTab.id] = message.params;
}
}
}, onDone: () {
_tabIdToEncodedUri.remove(currentTab.id);
client.close();
return;
}, onError: (_) {
_tabIdToEncodedUri.remove(currentTab.id);
alert('Lost app connection.');
client.close();
}, cancelOnError: true);
client.sink.add(jsonEncode(serializers.serialize(DevToolsRequest((b) => b
..appId = appId
..instanceId = instanceId
..contextId = contextId
..tabUrl = currentTab.url))));
sendCommand(Debuggee(tabId: currentTab.id), 'Runtime.enable', EmptyParam(),
allowInterop((e) {}));
}