private Task SendMessage(byte[] message, CancellationToken cancellationToken)
        {
            if (_refreshServer is null)
            {
                return(Task.CompletedTask);
            }

            return(_refreshServer.SendMessage(message, cancellationToken));
        }
        public async ValueTask ProcessAsync(DotNetWatchContext context, CancellationToken cancellationToken)
        {
            if (_suppressLaunchBrowser)
            {
                return;
            }

            if (context.Iteration == 0)
            {
                _reporter = context.Reporter;

                if (CanLaunchBrowser(context, out var launchPath))
                {
                    context.Reporter.Verbose("dotnet-watch is configured to launch a browser on ASP.NET Core application startup.");
                    _canLaunchBrowser  = true;
                    _launchPath        = launchPath;
                    _cancellationToken = cancellationToken;

                    _refreshServer = new BrowserRefreshServer(context.Reporter);
                    var serverUrl = await _refreshServer.StartAsync(cancellationToken);

                    context.Reporter.Verbose($"Refresh server running at {serverUrl}.");
                    context.ProcessSpec.EnvironmentVariables["DOTNET_WATCH_REFRESH_URL"] = serverUrl;

                    context.ProcessSpec.OnOutput += OnOutput;
                }
            }

            if (_canLaunchBrowser)
            {
                if (context.Iteration > 0)
                {
                    // We've detected a change. Notify the browser.
                    await _refreshServer.SendMessage(WaitMessage, cancellationToken);
                }
            }
        }
        internal static async ValueTask TryHandleFileAction(BrowserRefreshServer browserRefreshServer, FileItem fileItem, CancellationToken cancellationToken)
        {
            var filePath    = fileItem.StaticWebAssetPath;
            var bytesToRent = UpdateCssMessageLength + Encoding.UTF8.GetMaxByteCount(filePath.Length);
            var bytes       = ArrayPool <byte> .Shared.Rent(bytesToRent);

            try
            {
                UpdateCssMessage.CopyTo(bytes.AsSpan());
                var length = UpdateCssMessageLength;
                length += Encoding.UTF8.GetBytes(filePath, bytes.AsSpan(length));

                await browserRefreshServer.SendMessage(bytes.AsMemory(0, length), cancellationToken);
            }
            finally
            {
                ArrayPool <byte> .Shared.Return(bytes);
            }
        }