tgstation-server  4.4.0
The /tg/station 13 server suite
ServerFactory.cs
Go to the documentation of this file.
1 using Microsoft.AspNetCore.Hosting;
2 using Microsoft.AspNetCore.Server.Kestrel.Core;
3 using Microsoft.Extensions.Configuration;
4 using Microsoft.Extensions.DependencyInjection;
5 using Microsoft.Extensions.Hosting;
6 using System;
7 using System.Threading;
8 using System.Threading.Tasks;
11 using Tgstation.Server.Host.IO;
14 
15 namespace Tgstation.Server.Host
16 {
21  {
26 
28  public IIOManager IOManager { get; }
29 
35  internal ServerFactory(IAssemblyInformationProvider assemblyInformationProvider, IIOManager ioManager)
36  {
37  this.assemblyInformationProvider = assemblyInformationProvider ?? throw new ArgumentNullException(nameof(assemblyInformationProvider));
38  IOManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
39  }
40 
42  public async Task<IServer> CreateServer(string[] args, string updatePath, CancellationToken cancellationToken)
43  {
44  if (args == null)
45  throw new ArgumentNullException(nameof(args));
46 
47  IHostBuilder CreateDefaultBuilder() => Microsoft.Extensions.Hosting.Host.CreateDefaultBuilder(args)
48  .ConfigureAppConfiguration((context, configuration) => configuration
49  .SetBasePath(
50  IOManager.ResolvePath()));
51 
52  var setupWizardHostBuilder = CreateDefaultBuilder()
53  .UseSetupApplication();
54 
55  IPostSetupServices postSetupServices;
56  using (var setupHost = setupWizardHostBuilder.Build())
57  {
58  postSetupServices = setupHost.Services.GetRequiredService<IPostSetupServices>();
59  await setupHost.RunAsync(cancellationToken).ConfigureAwait(false);
60  }
61 
62  var hostBuilder = CreateDefaultBuilder()
63  .ConfigureWebHost(webHostBuilder =>
64  webHostBuilder
65  .UseKestrel(kestrelOptions =>
66  {
67  var serverPortProvider = kestrelOptions.ApplicationServices.GetRequiredService<IServerPortProvider>();
68  kestrelOptions.ListenAnyIP(
69  serverPortProvider.HttpApiPort,
70  listenOptions => listenOptions.Protocols = HttpProtocols.Http1AndHttp2);
71  })
72  .UseIIS()
73  .UseIISIntegration()
74  .UseApplication(postSetupServices)
75  .SuppressStatusMessages(true)
76  .UseShutdownTimeout(TimeSpan.FromMilliseconds(postSetupServices.GeneralConfiguration.RestartTimeout)));
77 
78  if (updatePath != null)
79  hostBuilder.UseContentRoot(
80  IOManager.ResolvePath(
81  IOManager.GetDirectoryName(assemblyInformationProvider.Path)));
82 
83  return new Server(hostBuilder, updatePath);
84  }
85  }
86 }
async Task< IServer > CreateServer(string[] args, string updatePath, CancellationToken cancellationToken)
Create a IServer
string Path
Gets the path to the executing assembly.
Implementation of IServerFactory.
readonly IAssemblyInformationProvider assemblyInformationProvider
The IAssemblyInformationProvider for the ServerFactory.
Set of objects needed to configure an Core.Application.
GeneralConfiguration GeneralConfiguration
The Configuration.GeneralConfiguration.
Interface for using filesystems
Definition: IIOManager.cs:11
Provides access to the server&#39;s HttpApiPort.