Repository navigation
Expand file tree
/
Copy pathUniScanServer.Initializers.cs
More file actions
117 lines (92 loc) · 5.01 KB
/
Copy pathUniScanServer.Initializers.cs
File metadata and controls
117 lines (92 loc) · 5.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
using System.Collections.Immutable;
using System.Text;
using Microsoft.Extensions.DependencyInjection;
using Serilog;
using Shiki.TaskPipeline.Context;
using UniScan.Core.Serialization;
using UniScan.Network.Group;
using UniScan.Network.Registry;
using UniScan.Network.Registry.Source.Sources;
using UniScan.Network.Server;
using UniScan.Network.Server.HostMethod;
using UniScan.Network.Socket.Configuration;
using UniScan.Server.Authentication.Session;
using UniScan.Server.Core.Host;
using UniScan.Server.Core.Pipeline;
using UniScan.Server.Core.Social;
namespace UniScan.Server.Core;
public partial class UniScanServer
{
internal void InitializeServer(UniScanServerInitializationPipeline.TaskContexts.PreEnvironment ctx,
ITaskExecutionContext execCtx)
{
execCtx.Status.Value = "Initializing server class";
RootDirectory = ctx.RootDirectory;
_moduleStorage = ctx.ModuleStorage;
_packetRegistry = new PacketRegistry();
SessionManager = new SessionManager();
DeviceManager = new DeviceHostManager();
ctx.ServiceCollection.AddSingleton(DeviceManager);
ctx.ServiceCollection.AddSingleton(SessionManager);
ctx.ServiceCollection.AddSingleton(_packetRegistry);
ctx.ServiceCollection.AddSingleton(ctx.ModuleStorage);
}
internal void ConfigureModules(UniScanServerInitializationPipeline.TaskContexts.PreServiceProvider ctx,
ITaskExecutionContext execCtx)
{
foreach (var module in _moduleStorage.Modules) module.Value.ConfigureDi(ctx.ServiceCollection);
}
internal async Task InitializeSettingsAsync(UniScanServerInitializationPipeline.TaskContexts.PreSettings ctx,
ITaskExecutionContext execCtx)
{
execCtx.Status.Value = "Loading settings";
var res = await ctx.SettingsBuilder.BuildAndLoadAsync();
var errors = res.Results.Where(r => r is { IsSuccessful: false, Error: not null }).Select(e => e.Error!).ToArray();
if (errors.Length != 0)
{
StringBuilder b = new();
foreach (Exception r in errors)
{
b.Append($"- {r.ToString()}\n");
}
Log.Error("Errors were encountered during settings load: \n{Errors}", b);
throw new AggregateException(errors);//halt server because if settings are fucked this could cause administration issues
}
ctx.SettingsManager = res.settingsManager;
ctx.ServiceCollection.AddSingleton(_ => res.settingsManager);
Settings = ctx.SettingsManager;
}
internal void InitializeRemoteInfoManager(UniScanServerInitializationPipeline.TaskContexts.PreServiceProvider ctx,
ITaskExecutionContext execCtx)
{
execCtx.Status.Value = "Initializing remote info manager";
ctx.ServiceCollection.AddSingleton(sp => new RemoteInfoManager(Path.Combine(ctx.RootDirectory, "settings"), ctx.FileManager,
ctx.DirectoryManager,
PolymorphicJsonTypeInfoResolverFactory.FancySerializerOptions));
}
internal UniScanServerInitializationPipeline.TaskContexts.ServerReady InitializeServiceProvider(UniScanServerInitializationPipeline.TaskContexts.PreServiceProvider ctx,
ITaskExecutionContext execCtx)
{
execCtx.Status.Value = "Initializing Serverside Rendering";
ServiceProvider provider = ctx.ServiceCollection.BuildServiceProvider();
ServiceProvider = provider;
return new UniScanServerInitializationPipeline.TaskContexts.ServerReady(this, provider);
}
public void InitializeNetworking(UniScanServerInitializationPipeline.TaskContexts.ServerReady ctx,
ITaskExecutionContext execCtx)
{
execCtx.Status.Value = "Initializing Networking";
_packetRegistry.RegisterFromSource<AssembliesPacketSource>();
//now init channel initializer
var configurators = ctx.ServiceProvider.GetServices<IPipelineConfigurator>().ToImmutableList();
_channelInitializer = new UniScanServerChannelInitializer(_packetRegistry, configurators, ctx.ServiceProvider);
//init socket
Socket = new ServerSocket(_channelInitializer, Settings.TryGetGroup<MainOptionGroup>()?.HostMethods ?? [], ctx.ServiceProvider.GetRequiredService<IHostNetworkGroupManager>());
}
public void FinishInitialization(UniScanServerInitializationPipeline.TaskContexts.ServerReady ctx,
ITaskExecutionContext execCtx)
{
execCtx.Status.Value = "Finishing up";
RemoteInfoManager = ctx.ServiceProvider.GetRequiredService<RemoteInfoManager>();
}
}