tgstation-server 5.12.7
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
152
157
163 static IIOManager CreateGameIOManager(IIOManager instanceIOManager) => new ResolvingIOManager(instanceIOManager, "Game");
164
165#pragma warning disable CA1502 // TODO: Decomplexify
194 public InstanceFactory(
198 ILoggerFactory loggerFactory,
218 IOptions<GeneralConfiguration> generalConfigurationOptions,
219 IOptions<SessionConfiguration> sessionConfigurationOptions)
220 {
221 this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
222 this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
223 this.assemblyInformationProvider = assemblyInformationProvider ?? throw new ArgumentNullException(nameof(assemblyInformationProvider));
224 this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
225 this.topicClientFactory = topicClientFactory ?? throw new ArgumentNullException(nameof(topicClientFactory));
226 this.cryptographySuite = cryptographySuite ?? throw new ArgumentNullException(nameof(cryptographySuite));
227 this.synchronousIOManager = synchronousIOManager ?? throw new ArgumentNullException(nameof(synchronousIOManager));
228 this.symlinkFactory = symlinkFactory ?? throw new ArgumentNullException(nameof(symlinkFactory));
229 this.byondInstaller = byondInstaller ?? throw new ArgumentNullException(nameof(byondInstaller));
230 this.chatFactory = chatFactory ?? throw new ArgumentNullException(nameof(chatFactory));
231 this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor));
232 this.postWriteHandler = postWriteHandler ?? throw new ArgumentNullException(nameof(postWriteHandler));
233 this.watchdogFactory = watchdogFactory ?? throw new ArgumentNullException(nameof(watchdogFactory));
234 this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
235 this.networkPromptReaper = networkPromptReaper ?? throw new ArgumentNullException(nameof(networkPromptReaper));
236 this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
237 this.repositoryFactory = repositoryFactory ?? throw new ArgumentNullException(nameof(repositoryFactory));
238 this.repositoryCommands = repositoryCommands ?? throw new ArgumentNullException(nameof(repositoryCommands));
239 this.serverPortProvider = serverPortProvider ?? throw new ArgumentNullException(nameof(serverPortProvider));
240 this.fileTransferService = fileTransferService ?? throw new ArgumentNullException(nameof(fileTransferService));
241 this.gitRemoteFeaturesFactory = gitRemoteFeaturesFactory ?? throw new ArgumentNullException(nameof(gitRemoteFeaturesFactory));
242 this.remoteDeploymentManagerFactory = remoteDeploymentManagerFactory ?? throw new ArgumentNullException(nameof(remoteDeploymentManagerFactory));
243 this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
244 generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
245 sessionConfiguration = sessionConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(sessionConfigurationOptions));
246 }
247#pragma warning restore CA1502
248
250 public IIOManager CreateGameIOManager(Models.Instance metadata)
251 {
252 ArgumentNullException.ThrowIfNull(metadata);
253
254 var instanceIoManager = CreateInstanceIOManager(metadata);
255 return CreateGameIOManager(instanceIoManager);
256 }
257
259#pragma warning disable CA1506 // TODO: Decomplexify
260 public async Task<IInstance> CreateInstance(IBridgeRegistrar bridgeRegistrar, Models.Instance metadata)
261 {
262 ArgumentNullException.ThrowIfNull(bridgeRegistrar);
263 ArgumentNullException.ThrowIfNull(metadata);
264
265 // Create the ioManager for the instance
266 var instanceIoManager = CreateInstanceIOManager(metadata);
267
268 // various other ioManagers
269 var repoIoManager = new ResolvingIOManager(instanceIoManager, "Repository");
270 var byondIOManager = new ResolvingIOManager(instanceIoManager, "Byond");
271 var gameIoManager = CreateGameIOManager(instanceIoManager);
272 var diagnosticsIOManager = new ResolvingIOManager(instanceIoManager, "Diagnostics");
273 var configurationIoManager = new ResolvingIOManager(instanceIoManager, "Configuration");
274
275 var configuration = new StaticFiles.Configuration(
276 configurationIoManager,
283 loggerFactory.CreateLogger<StaticFiles.Configuration>(),
286 var eventConsumer = new EventConsumer(configuration);
287 var repoManager = new RepositoryManager(
290 repoIoManager,
291 eventConsumer,
294 loggerFactory.CreateLogger<Repository.Repository>(),
295 loggerFactory.CreateLogger<RepositoryManager>(),
297 try
298 {
299 var byond = new ByondManager(byondIOManager, byondInstaller, eventConsumer, loggerFactory.CreateLogger<ByondManager>());
300
301 var dmbFactory = new DmbFactory(
303 gameIoManager,
305 eventConsumer,
306 loggerFactory.CreateLogger<DmbFactory>(),
307 metadata);
308 try
309 {
310 var commandFactory = new CommandFactory(assemblyInformationProvider, byond, repoManager, databaseContextFactory, dmbFactory, metadata);
311
312 var chatManager = chatFactory.CreateChatManager(commandFactory, metadata.ChatSettings);
313 try
314 {
315 var reattachInfoHandler = new SessionPersistor(
317 dmbFactory,
319 loggerFactory.CreateLogger<SessionPersistor>(),
320 metadata);
321
322 var sessionControllerFactory = new SessionControllerFactory(
324 byond,
328 gameIoManager,
329 diagnosticsIOManager,
330 chatManager,
333 bridgeRegistrar,
335 eventConsumer,
340 metadata);
341
342 var watchdog = watchdogFactory.CreateWatchdog(
343 chatManager,
344 dmbFactory,
345 reattachInfoHandler,
346 sessionControllerFactory,
347 gameIoManager,
348 diagnosticsIOManager,
349 configuration, // watchdog doesn't need itself as an event consumer
351 metadata,
352 metadata.DreamDaemonSettings);
353 try
354 {
355 eventConsumer.SetWatchdog(watchdog);
356 commandFactory.SetWatchdog(watchdog);
357
358 Instance instance = null;
359 var dreamMaker = new DreamMaker(
360 byond,
361 gameIoManager,
362 configuration,
363 sessionControllerFactory,
364 eventConsumer,
365 chatManager,
367 dmbFactory,
368 repoManager,
371 loggerFactory.CreateLogger<DreamMaker>(),
373 metadata);
374
375 instance = new Instance(
376 metadata,
377 repoManager,
378 byond,
379 dreamMaker,
380 watchdog,
381 chatManager,
382 configuration,
383 dmbFactory,
385 eventConsumer,
388 loggerFactory.CreateLogger<Instance>());
389
390 return instance;
391 }
392 catch
393 {
394 await watchdog.DisposeAsync();
395 throw;
396 }
397 }
398 catch
399 {
400 await chatManager.DisposeAsync();
401 throw;
402 }
403 }
404 catch
405 {
406 dmbFactory.Dispose();
407 throw;
408 }
409 }
410 catch
411 {
412 repoManager.Dispose();
413 throw;
414 }
415 }
416#pragma warning restore CA1506
417
419 public Task StartAsync(CancellationToken cancellationToken)
420 {
422 return byondInstaller.CleanCache(cancellationToken);
423 }
424
426 public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
427
432
438 IIOManager CreateInstanceIOManager(Models.Instance metadata) => new ResolvingIOManager(ioManager, metadata.Path);
439 }
440}
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 IIOManager ioManager
The IIOManager for the InstanceFactory.
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the InstanceFactory.
readonly IGitRemoteFeaturesFactory gitRemoteFeaturesFactory
The IGitRemoteFeaturesFactory for the InstanceFactory.
readonly IProcessExecutor processExecutor
The IProcessExecutor for the InstanceFactory.
readonly IJobManager jobManager
The IJobManager for the InstanceFactory.
readonly ILibGit2RepositoryFactory repositoryFactory
The ILibGit2RepositoryFactory 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 IServerPortProvider serverPortProvider
The IServerPortProvider for the InstanceFactory.
readonly IByondInstaller byondInstaller
The IByondInstaller for the InstanceFactory.
readonly ILibGit2Commands repositoryCommands
The ILibGit2Commands 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.
readonly IAssemblyInformationProvider assemblyInformationProvider
The IAssemblyInformationProvider for the InstanceFactory.
readonly IPostWriteHandler postWriteHandler
The IPostWriteHandler for the InstanceFactory.
void CheckSystemCompatibility()
Test that the repositoryFactory is functional.
IIOManager CreateGameIOManager(Models.Instance metadata)
Create an IIOManager that resolves to the "Game" directory of the Models.Instance defined by metadata...
async Task< IInstance > CreateInstance(IBridgeRegistrar bridgeRegistrar, Models.Instance metadata)
Create an IInstance. A Task<TResult> resulting in a new IInstance.
readonly ICryptographySuite cryptographySuite
The ICryptographySuite for the InstanceFactory.
readonly ISymlinkFactory symlinkFactory
The ISymlinkFactory for the InstanceFactory.
readonly IFileTransferTicketProvider fileTransferService
The IFileTransferTicketProvider for the InstanceFactory.
readonly INetworkPromptReaper networkPromptReaper
The INetworkPromptReaper 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 .
Repository(LibGit2Sharp.IRepository libGitRepo, ILibGit2Commands commands, IIOManager ioMananger, IEventConsumer eventConsumer, ICredentialsProvider credentialsProvider, IPostWriteHandler postWriteHandler, IGitRemoteFeaturesFactory gitRemoteFeaturesFactory, ILogger< Repository > logger, GeneralConfiguration generalConfiguration, Action onDispose)
Initializes a new instance of the Repository class.
Definition: Repository.cs:139
Configuration options for the game sessions.
An IIOManager that resolve relative paths from another IIOManager to a subdirectory of that.
For downloading and installing BYOND extractions for a given system.
Task CleanCache(CancellationToken cancellationToken)
Attempts to cleans the BYOND cache folder for the system.
IChatManager CreateChatManager(ICommandFactory commandFactory, IEnumerable< Models.ChatBot > initialChatBots)
Create a IChatManager.
For low level interactions with a LibGit2Sharp.IRepository.
void CreateInMemory()
Create and destory an in-memeory LibGit2Sharp.IRepository.
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.