in dwds/lib/src/handlers/dev_handler.dart [129:214]
Future<DebugService> _startLocalDebugService(
ChromeConnection chromeConnection, AppConnection appConnection) async {
ChromeTab appTab;
ExecutionContext executionContext;
WipConnection tabConnection;
var appInstanceId = appConnection.request.instanceId;
for (var tab in await chromeConnection.getTabs()) {
if (tab.isChromeExtension || tab.isBackgroundPage) continue;
tabConnection = await tab.connect();
if (_enableLogging) {
tabConnection.onSend.listen((message) {
_log(' wip', '==> $message');
});
tabConnection.onReceive.listen((message) {
_log(' wip', '<== $message');
});
tabConnection.onNotification.listen((message) {
_log(' wip', '<== $message');
});
}
var contextIds = tabConnection.runtime.onExecutionContextCreated
.map((context) => context.id)
// There is no way to calculate the number of existing execution
// contexts so keep receiving them until there is a 50ms gap after
// receiving the last one.
.takeUntilGap(const Duration(milliseconds: 50));
// We enqueue this work as we need to begin listening (`.hasNext`)
// before events are received.
unawaited(Future.microtask(() => tabConnection.runtime.enable()));
await for (var contextId in contextIds) {
var result = await tabConnection.sendCommand('Runtime.evaluate', {
'expression': r'window["$dartAppInstanceId"];',
'contextId': contextId,
});
var evaluatedAppId = result.result['result']['value'];
if (evaluatedAppId == appInstanceId) {
appTab = tab;
executionContext = RemoteDebuggerExecutionContext(
contextId, WebkitDebugger(WipDebugger(tabConnection)));
break;
}
}
if (appTab != null) break;
unawaited(tabConnection.close());
}
if (appTab == null) {
throw AppConnectionException(
'Could not connect to application with appInstanceId: '
'$appInstanceId');
}
var webkitDebugger = WebkitDebugger(WipDebugger(tabConnection));
return DebugService.start(
// We assume the user will connect to the debug service on the same
// machine. This allows consumers of DWDS to provide a `hostname` for
// debugging through the Dart Debug Extension without impacting the local
// debug workflow.
'localhost',
webkitDebugger,
executionContext,
appTab.url,
_assetReader,
_loadStrategy,
appConnection,
_urlEncoder,
onResponse: (response) {
if (response['error'] == null) return;
_logger.finest('VmService proxy responded with an error:\n$response');
if (_enableLogging) {
_log('vm', '<== ${response.toString().replaceAll('\n', ' ')}');
}
},
onRequest: (request) {
if (_enableLogging) {
_log('vm', '==> ${request.toString().replaceAll('\n', ' ')}');
}
},
// This will provide a websocket based service.
useSse: false,
expressionCompiler: _expressionCompiler,
spawnDds: _spawnDds,
);
}