private async Task <ProxyHost> CreateProxyHostAsync(CancellationToken cancellation) { var tcpClient = await _tcpClientLazy.Task.WithCancellation(cancellation); var logger = _loggerFactory?.CreateLogger <DisposeAwareStream>(); // TODO: Graceful shutdown var stream = new DisposeAwareStream(tcpClient.GetStream(), () => { Environment.FailFast(""); return(Task.CompletedTask); }, logger); var endPoint = _remoteOptions.LocalEndPoint; var metadata = await _metadataAccessor.GetMetadataAsync(cancellation); var module = metadata.Module; var version = metadata.Version; var properties = new DebugModuleProperties(endPoint, module, version); await properties.WriteAsync(stream, cancellation); return(new ProxyHost(stream, _serviceProvider)); }
public DebugSession(DebugPort debugServer, TcpClient tcpClient, IServiceProvider serviceProvider, ILoggerFactory loggerFactory) { if (debugServer == null) { throw new ArgumentNullException(nameof(debugServer)); } if (tcpClient == null) { throw new ArgumentNullException(nameof(tcpClient)); } if (serviceProvider == null) { throw new ArgumentNullException(nameof(serviceProvider)); } _debugServer = debugServer; _tcpClient = tcpClient; Address = tcpClient.Client.RemoteEndPoint as IPEndPoint; _serviceProvider = serviceProvider; _loggerFactory = loggerFactory; _logger = _loggerFactory?.CreateLogger <DebugSession>(); var streamLogger = _loggerFactory?.CreateLogger <DisposeAwareStream>(); _stream = new DisposeAwareStream(_tcpClient.GetStream(), OnDebugStreamsCloses, streamLogger); _propertiesLazy = new DisposableAsyncLazy <DebugModuleProperties>( factory: CreatePropertiesAsync, disposal: DisposePropertiesAsync, options: DisposableAsyncLazyOptions.Autostart | DisposableAsyncLazyOptions.ExecuteOnCallingThread); _proxyHostLazy = new DisposableAsyncLazy <ProxyHost>( factory: CreateProxyHostAsync, disposal: proxyHost => proxyHost.DisposeAsync(), options: DisposableAsyncLazyOptions.Autostart | DisposableAsyncLazyOptions.ExecuteOnCallingThread); }