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, }); } }