tgstation-server 6.19.1
The /tg/station 13 server suite
Loading...
Searching...
No Matches
InstanceFactory.cs
Go to the documentation of this file.
1using System;
2using System.Collections.Generic;
3using System.Globalization;
4using System.Threading;
5using System.Threading.Tasks;
6
7using Microsoft.Extensions.Logging;
8using Microsoft.Extensions.Options;
9
10using Prometheus;
11
31
33{
36 {
41
46
51
55 readonly ILoggerFactory loggerFactory;
56
61
66
71
76
81
86
91
96
101
106
111
116
121
126
131
136
141
146
150 readonly IMetricFactory metricFactory;
151
155 readonly IOptionsMonitor<GeneralConfiguration> generalConfigurationOptions;
156
160 readonly IOptionsMonitor<SessionConfiguration> sessionConfigurationOptions;
161
167 static IIOManager CreateGameIOManager(IIOManager instanceIOManager) => instanceIOManager.CreateResolverForSubdirectory("Game");
168
169#pragma warning disable CA1502 // TODO: Decomplexify
198 public InstanceFactory(
202 ILoggerFactory loggerFactory,
221 IMetricFactory metricFactory,
222 IOptionsMonitor<GeneralConfiguration> generalConfigurationOptions,
223 IOptionsMonitor<SessionConfiguration> sessionConfigurationOptions)
224 {
225 this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
226 this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
227 this.assemblyInformationProvider = assemblyInformationProvider ?? throw new ArgumentNullException(nameof(assemblyInformationProvider));
228 this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
229 this.topicClientFactory = topicClientFactory ?? throw new ArgumentNullException(nameof(topicClientFactory));
230 this.cryptographySuite = cryptographySuite ?? throw new ArgumentNullException(nameof(cryptographySuite));
231 this.synchronousIOManager = synchronousIOManager ?? throw new ArgumentNullException(nameof(synchronousIOManager));
232 this.linkFactory = linkFactory ?? throw new ArgumentNullException(nameof(linkFactory));
233 this.engineInstaller = engineInstaller ?? throw new ArgumentNullException(nameof(engineInstaller));
234 this.chatFactory = chatFactory ?? throw new ArgumentNullException(nameof(chatFactory));
235 this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
236 this.postWriteHandler = postWriteHandler ?? throw new ArgumentNullException(nameof(postWriteHandler));
237 this.watchdogFactory = watchdogFactory ?? throw new ArgumentNullException(nameof(watchdogFactory));
238 this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
239 this.networkPromptReaper = networkPromptReaper ?? throw new ArgumentNullException(nameof(networkPromptReaper));
240 this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
241 this.repositoryManagerFactory = repositoryManagerFactory ?? throw new ArgumentNullException(nameof(repositoryManagerFactory));
242 this.serverPortProvider = serverPortProvider ?? throw new ArgumentNullException(nameof(serverPortProvider));
243 this.fileTransferService = fileTransferService ?? throw new ArgumentNullException(nameof(fileTransferService));
244 this.remoteDeploymentManagerFactory = remoteDeploymentManagerFactory ?? throw new ArgumentNullException(nameof(remoteDeploymentManagerFactory));
245 this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
246 this.dotnetDumpService = dotnetDumpService ?? throw new ArgumentNullException(nameof(dotnetDumpService));
247 this.metricFactory = metricFactory ?? throw new ArgumentNullException(nameof(metricFactory));
248 this.generalConfigurationOptions = generalConfigurationOptions ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
249 this.sessionConfigurationOptions = sessionConfigurationOptions ?? throw new ArgumentNullException(nameof(sessionConfigurationOptions));
250 }
251#pragma warning restore CA1502
252
254 public IIOManager CreateGameIOManager(Models.Instance metadata)
255 {
256 ArgumentNullException.ThrowIfNull(metadata);
257
258 var instanceIoManager = CreateInstanceIOManager(metadata);
259 return CreateGameIOManager(instanceIoManager);
260 }
261
263#pragma warning disable CA1506 // TODO: Decomplexify
264 public async ValueTask<IInstance> CreateInstance(IBridgeRegistrar bridgeRegistrar, Models.Instance metadata)
265 {
266 ArgumentNullException.ThrowIfNull(bridgeRegistrar);
267 ArgumentNullException.ThrowIfNull(metadata);
268
269 // Create the ioManager for the instance
270 var instanceIoManager = CreateInstanceIOManager(metadata);
271
272 // various other ioManagers
273 var repoIoManager = instanceIoManager.CreateResolverForSubdirectory("Repository");
274 var byondIOManager = instanceIoManager.CreateResolverForSubdirectory("Byond");
275 var gameIoManager = CreateGameIOManager(instanceIoManager);
276 var diagnosticsIOManager = instanceIoManager.CreateResolverForSubdirectory("Diagnostics");
277 var configurationIoManager = instanceIoManager.CreateResolverForSubdirectory("Configuration");
278
279 var metricFactory = this.metricFactory.WithLabels(
280 new Dictionary<string, string>
281 {
282 { "instance_name", metadata.Name! },
283 { "instance_id", metadata.Id!.Value.ToString(CultureInfo.InvariantCulture) },
284 });
285
286 var configuration = new StaticFiles.Configuration(
287 configurationIoManager,
296 loggerFactory.CreateLogger<StaticFiles.Configuration>(),
297 metadata);
298 var eventConsumer = new EventConsumer(configuration);
299 var repoManager = repositoryManagerFactory.CreateRepositoryManager(repoIoManager, eventConsumer);
300 try
301 {
302 var dmbFactory = new DmbFactory(
304 gameIoManager,
306 eventConsumer,
308 loggerFactory.CreateLogger<DmbFactory>(),
309 metadata);
310 try
311 {
312 var engineManager = new EngineManager(
313 byondIOManager,
315 eventConsumer,
316 dmbFactory,
317 loggerFactory.CreateLogger<EngineManager>());
318 try
319 {
320 var commandFactory = new CommandFactory(assemblyInformationProvider, engineManager, repoManager, databaseContextFactory, dmbFactory, metadata);
321
322 var chatManager = chatFactory.CreateChatManager(commandFactory, metadata.ChatSettings);
323 try
324 {
325 var reattachInfoHandler = new SessionPersistor(
327 dmbFactory,
329 loggerFactory.CreateLogger<SessionPersistor>(),
330 metadata);
331
332 var dreamMaker = new DreamMaker(
333 engineManager,
334 gameIoManager,
335 configuration,
336 eventConsumer,
337 chatManager,
339 dmbFactory,
340 repoManager,
345 loggerFactory.CreateLogger<DreamMaker>(),
346 metadata);
347
348 var sessionControllerFactory = new SessionControllerFactory(
350 engineManager,
354 gameIoManager,
355 diagnosticsIOManager,
356 chatManager,
359 bridgeRegistrar,
361 eventConsumer,
363 dreamMaker,
370 metadata);
371
372 dreamMaker.SetSessionControllerFactory(sessionControllerFactory);
373
374 var watchdog = watchdogFactory.CreateWatchdog(
375 chatManager,
376 dmbFactory,
377 reattachInfoHandler,
378 sessionControllerFactory,
379 gameIoManager,
380 diagnosticsIOManager,
381 configuration, // watchdog doesn't need itself as an event consumer
384 metadata,
385 metadata.DreamDaemonSettings!);
386 try
387 {
388 eventConsumer.SetWatchdog(watchdog);
389 commandFactory.SetWatchdog(watchdog);
390
391 Instance? instance = null;
392 instance = new Instance(
393 metadata,
394 repoManager,
395 engineManager,
396 dreamMaker,
397 watchdog,
398 chatManager,
399 configuration,
400 dmbFactory,
402 eventConsumer,
405 loggerFactory.CreateLogger<Instance>());
406
407 return instance;
408 }
409 catch
410 {
411 await watchdog.DisposeAsync();
412 throw;
413 }
414 }
415 catch
416 {
417 await chatManager.DisposeAsync();
418 throw;
419 }
420 }
421 catch
422 {
423 engineManager.Dispose();
424 throw;
425 }
426 }
427 catch
428 {
429 dmbFactory.Dispose();
430 throw;
431 }
432 }
433 catch
434 {
435 repoManager.Dispose();
436 throw;
437 }
438 }
439#pragma warning restore CA1506
440
442 public Task StartAsync(CancellationToken cancellationToken)
443 => Task.WhenAll(
444 repositoryManagerFactory.StartAsync(cancellationToken),
445 engineInstaller.CleanCache(cancellationToken));
446
448 public Task StopAsync(CancellationToken cancellationToken) => repositoryManagerFactory.StopAsync(cancellationToken);
449
455 IIOManager CreateInstanceIOManager(Models.Instance metadata) => ioManager.CreateResolverForSubdirectory(metadata.Path!);
456 }
457}
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 IEngineInstaller engineInstaller
The IEngineInstaller for the InstanceFactory.
readonly IIOManager ioManager
The IIOManager for the InstanceFactory.
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the InstanceFactory.
readonly IOptionsMonitor< GeneralConfiguration > generalConfigurationOptions
The IOptionsMonitor<TOptions> of GeneralConfiguration for the InstanceFactory.
readonly IMetricFactory metricFactory
The IMetricFactory 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.
IIOManager CreateInstanceIOManager(Models.Instance metadata)
Create the IIOManager for a given set of instance metadata .
readonly IOptionsMonitor< SessionConfiguration > sessionConfigurationOptions
The IOptionsMonitor<TOptions> of SessionConfiguration for the InstanceFactory.
readonly IRepositoryManagerFactory repositoryManagerFactory
The IRepositoryManagerFactory for the InstanceFactory.
readonly IServerPortProvider serverPortProvider
The IServerPortProvider for the InstanceFactory.
Task StartAsync(CancellationToken cancellationToken)
Task StopAsync(CancellationToken cancellationToken)
readonly IWatchdogFactory watchdogFactory
The IWatchdogFactory for the InstanceFactory.
readonly IAssemblyInformationProvider assemblyInformationProvider
The IAssemblyInformationProvider for the InstanceFactory.
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 IDotnetDumpService dotnetDumpService
The IDotnetDumpService for the InstanceFactory.
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.
static IIOManager CreateGameIOManager(IIOManager instanceIOManager)
Create the IIOManager pointing to the "Game" directory of a given instanceIOManager .
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, IMetricFactory metricFactory, 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:14
IIOManager CreateResolverForSubdirectory(string subdirectoryPath)
Create a new IIOManager that resolves paths to the specified subdirectoryPath .
Handles changing file modes/permissions after writing.
For accessing the disk in a synchronous manner.
Manages the runtime of Jobs.
Contains various cryptographic functions.
Service for managing the dotnet-dump installation.
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.