public async Task <HotReloadPageResponse> Any(HotReloadFiles request)
        {
            var vfs = UseVirtualFiles ?? VirtualFileSources;

            var startedAt       = DateTime.UtcNow;
            var maxLastModified = DateTime.MinValue;
            var shouldReload    = false;

            while (DateTime.UtcNow - startedAt < LongPollDuration)
            {
                maxLastModified = DateTime.MinValue;

                var patterns = (!string.IsNullOrEmpty(request.Pattern)
                    ? request.Pattern
                    : DefaultPattern).Split(';');

                foreach (var pattern in patterns)
                {
                    var files = vfs.GetAllMatchingFiles(pattern.Trim());
                    foreach (var file in files)
                    {
                        if (ExcludePatterns.Any(exclude => file.Name.Glob(exclude)))
                        {
                            continue;
                        }

                        file.Refresh();
                        if (file.LastModified > maxLastModified)
                        {
                            maxLastModified = file.LastModified;
                        }
                    }
                }

                if (string.IsNullOrEmpty(request.ETag))
                {
                    return new HotReloadPageResponse {
                               ETag = maxLastModified.Ticks.ToString()
                    }
                }
                ;

                shouldReload = maxLastModified != DateTime.MinValue && maxLastModified.Ticks > long.Parse(request.ETag);
                if (shouldReload)
                {
                    await Task.Delay(ModifiedDelay);

                    break;
                }

                await Task.Delay(CheckDelay);
            }

            return(new HotReloadPageResponse {
                Reload = shouldReload, ETag = maxLastModified.Ticks.ToString()
            });
        }
    }
        public async Task <HotReloadPageResponse> Any(HotReloadFiles request)
        {
            var vfs = UseVirtualFiles ?? VirtualFileSources;

            // Remove embedded ResourceVirtualFiles from scan list
            if (vfs is MultiVirtualFiles multiVfs)
            {
                vfs = new MultiVirtualFiles(multiVfs.ChildProviders.Where(x => !(x is ResourceVirtualFiles)).ToArray());
            }

            var          startedAt       = DateTime.UtcNow;
            var          maxLastModified = DateTime.MinValue;
            IVirtualFile maxLastFile     = null;
            var          shouldReload    = false;

            while (DateTime.UtcNow - startedAt < LongPollDuration)
            {
                maxLastModified = DateTime.MinValue;

                var patterns = (!string.IsNullOrEmpty(request.Pattern)
                    ? request.Pattern
                    : DefaultPattern).Split(';');

                foreach (var pattern in patterns)
                {
                    var files = vfs.GetAllMatchingFiles(pattern.Trim()).ToList();
                    foreach (var file in files)
                    {
                        if (ExcludePatterns.Any(exclude => file.Name.Glob(exclude)))
                        {
                            continue;
                        }

                        file.Refresh();
                        if (file.LastModified > maxLastModified)
                        {
                            maxLastModified = file.LastModified;
                            maxLastFile     = file;
                        }
                    }
                }

                if (string.IsNullOrEmpty(request.ETag))
                {
                    return new HotReloadPageResponse {
                               ETag = maxLastModified.Ticks.ToString()
                    }
                }
                ;

                shouldReload = maxLastModified != DateTime.MinValue && maxLastModified.Ticks > long.Parse(request.ETag);
                if (shouldReload)
                {
                    await Task.Delay(ModifiedDelay).ConfigAwait();

                    break;
                }

                await Task.Delay(CheckDelay).ConfigAwait();
            }

            return(new HotReloadPageResponse {
                Reload = shouldReload,
                ETag = maxLastModified.Ticks.ToString(),
                LastUpdatedPath = maxLastFile?.VirtualPath,
            });
        }
    }