public Task InvokeAsync(HttpContext context)
        {
            if (WebSocketsTelemetry.Log.IsEnabled())
            {
                if (context.Features.Get <IHttpUpgradeFeature>() is { IsUpgradableRequest : true } upgradeFeature)
                {
                    var upgradeWrapper = new HttpUpgradeFeatureWrapper(_clock, context, upgradeFeature);
                    return(InvokeAsyncCore(upgradeWrapper, _next));
                }
            }

            return(_next(context));
        }
        private static async Task InvokeAsyncCore(HttpUpgradeFeatureWrapper upgradeWrapper, RequestDelegate next)
        {
            upgradeWrapper.HttpContext.Features.Set <IHttpUpgradeFeature>(upgradeWrapper);

            try
            {
                await next(upgradeWrapper.HttpContext);
            }
            finally
            {
                if (upgradeWrapper.TelemetryStream is { } telemetryStream)
                {
                    WebSocketsTelemetry.Log.WebSocketClosed(
                        telemetryStream.EstablishedTime.Ticks,
                        telemetryStream.GetCloseReason(upgradeWrapper.HttpContext),
                        telemetryStream.MessagesRead,
                        telemetryStream.MessagesWritten);
                }

                upgradeWrapper.HttpContext.Features.Set(upgradeWrapper.InnerUpgradeFeature);
            }
        }