public void Configure( IApplicationBuilder app, IHostApplicationLifetime lifetime, IBrowserLauncher browserLauncher, IDirectoryAccessor directoryAccessor, PackageRegistry packageRegistry) { using (var operation = Log.OnEnterAndConfirmOnExit()) { lifetime.ApplicationStopping.Register(() => _disposables.Dispose()); ConfigureForOrchestratorProxy(app); // Serve Blazor on the /LocalCodeRunner/blazor-console prefix app.Map("/LocalCodeRunner/blazor-console", blazor => { blazor.UseClientSideBlazorFiles <MLS.Blazor.Startup>(); blazor.UseRouting(); blazor.UseEndpoints(endpoints => { endpoints.MapFallbackToClientSideBlazor <MLS.Blazor.Startup>("index.html"); }); }); var budget = new Budget(); _disposables.Add(() => budget.Cancel()); BlazorPackageConfiguration.Configure(app, app.ApplicationServices, packageRegistry, budget, !StartupOptions.IsLanguageService); app.UseMvc() .UseDefaultFiles() .UseStaticFilesFromToolLocationAndRootDirectory(directoryAccessor.GetFullyQualifiedRoot()); operation.Succeed(); if (StartupOptions.Mode == StartupMode.Try && !StartupOptions.IsJupyter) { var uri = new Uri(app.ServerFeatures.Get <IServerAddressesFeature>().Addresses.First()); Clock.Current .Schedule(_ => LaunchBrowser(browserLauncher, directoryAccessor, uri), TimeSpan.FromSeconds(1)); } } }
public void Configure( IApplicationBuilder app, IApplicationLifetime lifetime, IBrowserLauncher browserLauncher, IDirectoryAccessor directoryAccessor, PackageRegistry packageRegistry) { using (var operation = Log.OnEnterAndConfirmOnExit()) { lifetime.ApplicationStopping.Register(() => _disposables.Dispose()); ConfigureForOrchestratorProxy(app); app.Map("/LocalCodeRunner/blazor-console", builder => { builder.UsePathBase("/LocalCodeRunner/blazor-console/"); builder.EnableCachingBlazorContent(); builder.UseBlazor <MLS.Blazor.Program>(); }); app.Map("/LocalCodeRunner/humanizer.api", builder => { builder.UsePathBase("/LocalCodeRunner/humanizer/"); builder.EnableCachingBlazorContent(); builder.UseBlazor <MLS.HumanizerRunner.Program>(); }); var budget = new Budget(); _disposables.Add(() => budget.Cancel()); BlazorPackageConfiguration.Configure(app, app.ApplicationServices, packageRegistry, budget, !StartupOptions.IsLanguageService); app.UseDefaultFiles() .UseStaticFilesFromToolLocation() .UseRouter(new StaticFilesProxyRouter()) .UseMvc(); operation.Succeed(); if (StartupOptions.Mode == StartupMode.Try) { Clock.Current .Schedule(_ => LaunchBrowser(browserLauncher, directoryAccessor), TimeSpan.FromSeconds(1)); } } }
public async Task StopAsync(CancellationToken cancellationToken) { // Stop called without start if (_executingTask == null) { return; } _budget.Cancel(); // Wait until the task completes or the stop token triggers await Task.WhenAny( _executingTask, Task.Delay(-1, cancellationToken)); // Throw if cancellation triggered cancellationToken.ThrowIfCancellationRequested(); }
public async Task Budget_throws_an_informative_exception_after_it_is_cancelled() { var budget = new Budget(); await Clock.Current.Wait(1.Seconds()); budget.RecordEntry("one"); await Clock.Current.Wait(10.Seconds()); budget.Cancel(); Action action = () => budget.RecordEntryAndThrowIfBudgetExceeded("two"); action.Should().Throw <BudgetExceededException>() .Which .Message .Should() .Be($"Budget exceeded.{NewLine}" + $" ✔ one @ 1.00 seconds{NewLine}" + $" ❌ two @ 11.00 seconds"); }
public void Dispose() => _budget?.Cancel();