tgstation-server
The /tg/station 13 server suite
InstanceFactory.cs
Go to the documentation of this file.
1 using Byond.TopicSender;
2 using Microsoft.Extensions.Logging;
3 using System;
4 using System.Threading;
5 using System.Threading.Tasks;
13 using Tgstation.Server.Host.IO;
15 
16 namespace Tgstation.Server.Host.Components
17 {
20  {
25 
30 
35 
39  readonly ILoggerFactory loggerFactory;
40 
44  readonly IByondTopicSender byondTopicSender;
45 
50 
55 
60 
65 
70 
75 
80 
85 
90 
95 
100 
105 
110 
132  public InstanceFactory(IIOManager ioManager, IDatabaseContextFactory databaseContextFactory, IApplication application, ILoggerFactory loggerFactory, IByondTopicSender byondTopicSender, ICryptographySuite cryptographySuite, ISynchronousIOManager synchronousIOManager, ISymlinkFactory symlinkFactory, IByondInstaller byondInstaller, IChatFactory chatFactory, IProcessExecutor processExecutor, IPostWriteHandler postWriteHandler, IWatchdogFactory watchdogFactory, IJobManager jobManager, ICredentialsProvider credentialsProvider, INetworkPromptReaper networkPromptReaper, IGitHubClientFactory gitHubClientFactory, IPlatformIdentifier platformIdentifier)
133  {
134  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
135  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
136  this.application = application ?? throw new ArgumentNullException(nameof(application));
137  this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
138  this.byondTopicSender = byondTopicSender ?? throw new ArgumentNullException(nameof(byondTopicSender));
139  this.cryptographySuite = cryptographySuite ?? throw new ArgumentNullException(nameof(cryptographySuite));
140  this.synchronousIOManager = synchronousIOManager ?? throw new ArgumentNullException(nameof(synchronousIOManager));
141  this.symlinkFactory = symlinkFactory ?? throw new ArgumentNullException(nameof(symlinkFactory));
142  this.byondInstaller = byondInstaller ?? throw new ArgumentNullException(nameof(byondInstaller));
143  this.chatFactory = chatFactory ?? throw new ArgumentNullException(nameof(chatFactory));
144  this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
145  this.postWriteHandler = postWriteHandler ?? throw new ArgumentNullException(nameof(postWriteHandler));
146  this.watchdogFactory = watchdogFactory ?? throw new ArgumentNullException(nameof(watchdogFactory));
147  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
148  this.credentialsProvider = credentialsProvider ?? throw new ArgumentNullException(nameof(credentialsProvider));
149  this.networkPromptReaper = networkPromptReaper ?? throw new ArgumentNullException(nameof(networkPromptReaper));
150  this.gitHubClientFactory = gitHubClientFactory ?? throw new ArgumentNullException(nameof(gitHubClientFactory));
151  this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
152  }
153 
155  public IInstance CreateInstance(Models.Instance metadata)
156  {
157  //Create the ioManager for the instance
158  var instanceIoManager = new ResolvingIOManager(ioManager, metadata.Path);
159 
160  //various other ioManagers
161  var repoIoManager = new ResolvingIOManager(instanceIoManager, "Repository");
162  var byondIOManager = new ResolvingIOManager(instanceIoManager, "Byond");
163  var gameIoManager = new ResolvingIOManager(instanceIoManager, "Game");
164  var configurationIoManager = new ResolvingIOManager(instanceIoManager, "Configuration");
165 
166  var configuration = new StaticFiles.Configuration(configurationIoManager, synchronousIOManager, symlinkFactory, processExecutor, postWriteHandler, platformIdentifier, loggerFactory.CreateLogger<StaticFiles.Configuration>());
167  var eventConsumer = new EventConsumer(configuration);
168 
169  var dmbFactory = new DmbFactory(databaseContextFactory, gameIoManager, loggerFactory.CreateLogger<DmbFactory>(), metadata.CloneMetadata());
170  try
171  {
172  var repoManager = new RepositoryManager(metadata.RepositorySettings, repoIoManager, eventConsumer, credentialsProvider, loggerFactory.CreateLogger<Repository.Repository>(), loggerFactory.CreateLogger<RepositoryManager>());
173  try
174  {
175  var byond = new ByondManager(byondIOManager, byondInstaller, eventConsumer, loggerFactory.CreateLogger<ByondManager>());
176 
177  var commandFactory = new CommandFactory(application, byond, repoManager, databaseContextFactory, metadata);
178 
179  var chat = chatFactory.CreateChat(instanceIoManager, commandFactory, metadata.ChatSettings);
180  try
181  {
182  var sessionControllerFactory = new SessionControllerFactory(processExecutor, byond, byondTopicSender, cryptographySuite, application, gameIoManager, chat, networkPromptReaper, platformIdentifier, loggerFactory, metadata.CloneMetadata());
183  var reattachInfoHandler = new ReattachInfoHandler(databaseContextFactory, dmbFactory, loggerFactory.CreateLogger<ReattachInfoHandler>(), metadata.CloneMetadata());
184  var watchdog = watchdogFactory.CreateWatchdog(chat, dmbFactory, reattachInfoHandler, configuration, sessionControllerFactory, metadata.CloneMetadata(), metadata.DreamDaemonSettings);
185  eventConsumer.SetWatchdog(watchdog);
186  commandFactory.SetWatchdog(watchdog);
187  try
188  {
189  var dreamMaker = new DreamMaker(byond, gameIoManager, configuration, sessionControllerFactory, dmbFactory, application, eventConsumer, chat, processExecutor, watchdog, loggerFactory.CreateLogger<DreamMaker>());
190 
191  return new Instance(metadata.CloneMetadata(), repoManager, byond, dreamMaker, watchdog, chat, configuration, dmbFactory, databaseContextFactory, dmbFactory, jobManager, eventConsumer, gitHubClientFactory, loggerFactory.CreateLogger<Instance>());
192  }
193  catch
194  {
195  watchdog.Dispose();
196  throw;
197  }
198  }
199  catch
200  {
201  chat.Dispose();
202  throw;
203  }
204  }
205  catch
206  {
207  repoManager.Dispose();
208  throw;
209  }
210  }
211  catch
212  {
213  dmbFactory.Dispose();
214  throw;
215  }
216  }
217 
219  public Task StartAsync(CancellationToken cancellationToken) => byondInstaller.CleanCache(cancellationToken);
220 
222  public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
223  }
224 }
readonly ISynchronousIOManager synchronousIOManager
The ISynchronousIOManager for the InstanceFactory
Manages the runtime of Jobs
Definition: IJobManager.cs:12
readonly IByondInstaller byondInstaller
The IByondInstaller for the InstanceFactory
An IIOManager that resolve relative paths from another IIOManager to a subdirectory of that ...
Configures the ASP.NET Core web application
Definition: IApplication.cs:8
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the InstanceFactory
Factory for scoping usage of IDatabaseContexts. Meant for use by Components
readonly IByondTopicSender byondTopicSender
The IByondTopicSender for the InstanceFactory
InstanceFactory(IIOManager ioManager, IDatabaseContextFactory databaseContextFactory, IApplication application, ILoggerFactory loggerFactory, IByondTopicSender byondTopicSender, ICryptographySuite cryptographySuite, ISynchronousIOManager synchronousIOManager, ISymlinkFactory symlinkFactory, IByondInstaller byondInstaller, IChatFactory chatFactory, IProcessExecutor processExecutor, IPostWriteHandler postWriteHandler, IWatchdogFactory watchdogFactory, IJobManager jobManager, ICredentialsProvider credentialsProvider, INetworkPromptReaper networkPromptReaper, IGitHubClientFactory gitHubClientFactory, IPlatformIdentifier platformIdentifier)
Construct an InstanceFactory
readonly ICryptographySuite cryptographySuite
The ICryptographySuite for the InstanceFactory
readonly IApplication application
The IApplication for the InstanceFactory
Repository(LibGit2Sharp.IRepository repository, IIOManager ioMananger, IEventConsumer eventConsumer, ICredentialsProvider credentialsProvider, ILogger< Repository > logger, Action onDispose)
Construct a Repository
Definition: Repository.cs:118
Contains various cryptographic functions
readonly IProcessExecutor processExecutor
The IProcessExecutor for the InstanceFactory
readonly INetworkPromptReaper networkPromptReaper
The INetworkPromptReaper for the InstanceFactory
readonly IPostWriteHandler postWriteHandler
The IPostWriteHandler for the InstanceFactory
For downloading and installing BYOND extractions for a given system
For accessing the disk in a synchronous manner
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the InstanceFactory
readonly IWatchdogFactory watchdogFactory
The IWatchdogFactory for the InstanceFactory
For interacting with the instance services
Definition: IInstance.cs:17
readonly ICredentialsProvider credentialsProvider
The ICredentialsProvider for the InstanceFactory
readonly IIOManager ioManager
The IIOManager for the InstanceFactory
readonly IGitHubClientFactory gitHubClientFactory
The IGitHubClientFactory for the InstanceFactory
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the InstanceFactory
readonly ISymlinkFactory symlinkFactory
The ISymlinkFactory for the InstanceFactory
readonly IJobManager jobManager
The IJobManager for the InstanceFactory
readonly IChatFactory chatFactory
The IProviderFactory for the InstanceFactory
IInstance CreateInstance(Models.Instance metadata)
Create an IInstance
Interface for using filesystems
Definition: IIOManager.cs:11
On Windows, DreamDaemon will show an unskippable prompt when using /world/proc/OpenPort(). This looks out for those prompts and immediately clicks "Yes" if the owning process has registered for it
For identifying the current platform