tgstation-server 6.1.2
The /tg/station 13 server suite
Loading...
Searching...
No Matches
InstanceFactory.cs
Go to the documentation of this file.
1using System;
2using System.Threading;
3using System.Threading.Tasks;
4
5using Microsoft.Extensions.Logging;
6using Microsoft.Extensions.Options;
7
27
29{
32 {
37
42
47
51 readonly ILoggerFactory loggerFactory;
52
57
62
67
72
77
82
87
92
97
102
107
112
117
122
127
132
137
142
147
153 static ResolvingIOManager CreateGameIOManager(IIOManager instanceIOManager) => new(instanceIOManager, "Game");
154
155#pragma warning disable CA1502 // TODO: Decomplexify
182 public InstanceFactory(
186 ILoggerFactory loggerFactory,
204 IOptions<GeneralConfiguration> generalConfigurationOptions,
205 IOptions<SessionConfiguration> sessionConfigurationOptions)
206 {
207 this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
208 this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
209 this.assemblyInformationProvider = assemblyInformationProvider ?? throw new ArgumentNullException(nameof(assemblyInformationProvider));
210 this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
211 this.topicClientFactory = topicClientFactory ?? throw new ArgumentNullException(nameof(topicClientFactory));
212 this.cryptographySuite = cryptographySuite ?? throw new ArgumentNullException(nameof(cryptographySuite));
213 this.synchronousIOManager = synchronousIOManager ?? throw new ArgumentNullException(nameof(synchronousIOManager));
214 this.linkFactory = linkFactory ?? throw new ArgumentNullException(nameof(linkFactory));
215 this.engineInstaller = engineInstaller ?? throw new ArgumentNullException(nameof(engineInstaller));
216 this.chatFactory = chatFactory ?? throw new ArgumentNullException(nameof(chatFactory));
217 this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
218 this.postWriteHandler = postWriteHandler ?? throw new ArgumentNullException(nameof(postWriteHandler));
219 this.watchdogFactory = watchdogFactory ?? throw new ArgumentNullException(nameof(watchdogFactory));
220 this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
221 this.networkPromptReaper = networkPromptReaper ?? throw new ArgumentNullException(nameof(networkPromptReaper));
222 this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
223 this.repositoryManagerFactory = repositoryManagerFactory ?? throw new ArgumentNullException(nameof(repositoryManagerFactory));
224 this.serverPortProvider = serverPortProvider ?? throw new ArgumentNullException(nameof(serverPortProvider));
225 this.fileTransferService = fileTransferService ?? throw new ArgumentNullException(nameof(fileTransferService));
226 this.remoteDeploymentManagerFactory = remoteDeploymentManagerFactory ?? throw new ArgumentNullException(nameof(remoteDeploymentManagerFactory));
227 this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
228 generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
229 sessionConfiguration = sessionConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(sessionConfigurationOptions));
230 }
231#pragma warning restore CA1502
232
234 public IIOManager CreateGameIOManager(Models.Instance metadata)
235 {
236 ArgumentNullException.ThrowIfNull(metadata);
237
238 var instanceIoManager = CreateInstanceIOManager(metadata);
239 return CreateGameIOManager(instanceIoManager);
240 }
241
243#pragma warning disable CA1506 // TODO: Decomplexify
244 public async ValueTask<IInstance> CreateInstance(IBridgeRegistrar bridgeRegistrar, Models.Instance metadata)
245 {
246 ArgumentNullException.ThrowIfNull(bridgeRegistrar);
247 ArgumentNullException.ThrowIfNull(metadata);
248
249 // Create the ioManager for the instance
250 var instanceIoManager = CreateInstanceIOManager(metadata);
251
252 // various other ioManagers
253 var repoIoManager = new ResolvingIOManager(instanceIoManager, "Repository");
254 var byondIOManager = new ResolvingIOManager(instanceIoManager, "Byond");
255 var gameIoManager = CreateGameIOManager(instanceIoManager);
256 var diagnosticsIOManager = new ResolvingIOManager(instanceIoManager, "Diagnostics");
257 var configurationIoManager = new ResolvingIOManager(instanceIoManager, "Configuration");
258
259 var configuration = new StaticFiles.Configuration(
260 configurationIoManager,
267 loggerFactory.CreateLogger<StaticFiles.Configuration>(),
270 var eventConsumer = new EventConsumer(configuration);
271 var repoManager = repositoryManagerFactory.CreateRepositoryManager(repoIoManager, eventConsumer);
272 try
273 {
274 var engineManager = new EngineManager(byondIOManager, engineInstaller, eventConsumer, loggerFactory.CreateLogger<EngineManager>());
275
276 var dmbFactory = new DmbFactory(
278 gameIoManager,
280 eventConsumer,
281 loggerFactory.CreateLogger<DmbFactory>(),
282 metadata);
283 try
284 {
285 var commandFactory = new CommandFactory(assemblyInformationProvider, engineManager, repoManager, databaseContextFactory, dmbFactory, metadata);
286
287 var chatManager = chatFactory.CreateChatManager(commandFactory, metadata.ChatSettings);
288 try
289 {
290 var reattachInfoHandler = new SessionPersistor(
292 dmbFactory,
294 loggerFactory.CreateLogger<SessionPersistor>(),
295 metadata);
296
297 var sessionControllerFactory = new SessionControllerFactory(
299 engineManager,
303 gameIoManager,
304 diagnosticsIOManager,
305 chatManager,
308 bridgeRegistrar,
310 eventConsumer,
315 metadata);
316
317 var watchdog = watchdogFactory.CreateWatchdog(
318 chatManager,
319 dmbFactory,
320 reattachInfoHandler,
321 sessionControllerFactory,
322 gameIoManager,
323 diagnosticsIOManager,
324 configuration, // watchdog doesn't need itself as an event consumer
326 metadata,
327 metadata.DreamDaemonSettings!);
328 try
329 {
330 eventConsumer.SetWatchdog(watchdog);
331 commandFactory.SetWatchdog(watchdog);
332
333 Instance? instance = null;
334 var dreamMaker = new DreamMaker(
335 engineManager,
336 gameIoManager,
337 configuration,
338 sessionControllerFactory,
339 eventConsumer,
340 chatManager,
342 dmbFactory,
343 repoManager,
346 loggerFactory.CreateLogger<DreamMaker>(),
348 metadata);
349
350 instance = new Instance(
351 metadata,
352 repoManager,
353 engineManager,
354 dreamMaker,
355 watchdog,
356 chatManager,
357 configuration,
358 dmbFactory,
360 eventConsumer,
363 loggerFactory.CreateLogger<Instance>());
364
365 return instance;
366 }
367 catch
368 {
369 await watchdog.DisposeAsync();
370 throw;
371 }
372 }
373 catch
374 {
375 await chatManager.DisposeAsync();
376 throw;
377 }
378 }
379 catch
380 {
381 dmbFactory.Dispose();
382 throw;
383 }
384 }
385 catch
386 {
387 repoManager.Dispose();
388 throw;
389 }
390 }
391#pragma warning restore CA1506
392
394 public Task StartAsync(CancellationToken cancellationToken)
395 => Task.WhenAll(
396 repositoryManagerFactory.StartAsync(cancellationToken),
397 engineInstaller.CleanCache(cancellationToken));
398
400 public Task StopAsync(CancellationToken cancellationToken) => repositoryManagerFactory.StopAsync(cancellationToken);
401
407 ResolvingIOManager CreateInstanceIOManager(Models.Instance metadata) => new(ioManager, metadata.Path!);
408 }
409}
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the InstanceFactory.
readonly ITopicClientFactory topicClientFactory
The ITopicClientFactory for the InstanceFactory.
readonly ISynchronousIOManager synchronousIOManager
The ISynchronousIOManager for the InstanceFactory.
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the InstanceFactory.
readonly SessionConfiguration sessionConfiguration
The SessionConfiguration for the InstanceFactory.
readonly IEngineInstaller engineInstaller
The IEngineInstaller for the InstanceFactory.
readonly IIOManager ioManager
The IIOManager for the InstanceFactory.
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the InstanceFactory.
readonly IProcessExecutor processExecutor
The IProcessExecutor for the InstanceFactory.
readonly IJobManager jobManager
The IJobManager for the InstanceFactory.
readonly IChatManagerFactory chatFactory
The IChatManagerFactory for the InstanceFactory.
readonly IRepositoryManagerFactory repositoryManagerFactory
The IRepositoryManagerFactory for the InstanceFactory.
readonly IServerPortProvider serverPortProvider
The IServerPortProvider for the InstanceFactory.
readonly GeneralConfiguration generalConfiguration
The GeneralConfiguration for the InstanceFactory.
Task StartAsync(CancellationToken cancellationToken)
Task StopAsync(CancellationToken cancellationToken)
readonly IWatchdogFactory watchdogFactory
The IWatchdogFactory for the InstanceFactory.
static ResolvingIOManager CreateGameIOManager(IIOManager instanceIOManager)
Create the IIOManager pointing to the "Game" directory of a given instanceIOManager .
readonly IAssemblyInformationProvider assemblyInformationProvider
The IAssemblyInformationProvider for the InstanceFactory.
ResolvingIOManager CreateInstanceIOManager(Models.Instance metadata)
Create the IIOManager for a given set of instance metadata .
readonly IPostWriteHandler postWriteHandler
The IPostWriteHandler for the InstanceFactory.
IIOManager CreateGameIOManager(Models.Instance metadata)
Create an IIOManager that resolves to the "Game" directory of the Models.Instance defined by metadata...
readonly ICryptographySuite cryptographySuite
The ICryptographySuite for the InstanceFactory.
async ValueTask< IInstance > CreateInstance(IBridgeRegistrar bridgeRegistrar, Models.Instance metadata)
Create an IInstance. A ValueTask<TResult> resulting in a new IInstance.
readonly IFileTransferTicketProvider fileTransferService
The IFileTransferTicketProvider for the InstanceFactory.
readonly INetworkPromptReaper networkPromptReaper
The INetworkPromptReaper for the InstanceFactory.
readonly IFilesystemLinkFactory linkFactory
The IFilesystemLinkFactory for the InstanceFactory.
readonly IRemoteDeploymentManagerFactory remoteDeploymentManagerFactory
The IRemoteDeploymentManagerFactory for the InstanceFactory.
readonly ILoggerFactory loggerFactory
The ILoggerFactory for the InstanceFactory.
Configuration options for the game sessions.
An IIOManager that resolve relative paths from another IIOManager to a subdirectory of that.
IChatManager CreateChatManager(ICommandFactory commandFactory, IEnumerable< Models.ChatBot > initialChatBots)
Create a IChatManager.
For downloading and installing game engines for a given system.
Task CleanCache(CancellationToken cancellationToken)
Attempts to cleans the engine's cache folder for the system.
IRepositoryManager CreateRepositoryManager(IIOManager ioManager, IEventConsumer eventConsumer)
Create a IRepositoryManager.
IWatchdog CreateWatchdog(IChatManager chat, IDmbFactory dmbFactory, ISessionPersistor sessionPersistor, ISessionControllerFactory sessionControllerFactory, IIOManager gameIOManager, IIOManager diagnosticsIOManager, IEventConsumer eventConsumer, IRemoteDeploymentManagerFactory remoteDeploymentManagerFactory, Api.Models.Instance instance, DreamDaemonSettings settings)
Creates a IWatchdog.
Provides access to the server's HttpApiPort.
Factory for scoping usage of IDatabaseContexts. Meant for use by Components.
Interface for using filesystems.
Definition: IIOManager.cs:13
Handles changing file modes/permissions after writing.
For accessing the disk in a synchronous manner.
Manages the runtime of Jobs.
Definition: IJobManager.cs:13
Contains various cryptographic functions.
On Windows, DreamDaemon will show an unskippable prompt when using /world/proc/OpenPort()....
For identifying the current platform.
Service for temporarily storing files to be downloaded or uploaded.