Skip to content

Commit b482e16

Browse files
committed
release: Delegate loading promotions to CDN.
1 parent b0a63a6 commit b482e16

File tree

19 files changed

+142
-140
lines changed

19 files changed

+142
-140
lines changed

src/Flarial.Launcher.Runtime/Client/FlarialClient.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,18 @@ sealed class FlarialClientRelease : FlarialClient
2020

2121
public abstract class FlarialClient
2222
{
23-
internal FlarialClient() { }
23+
protected FlarialClient() { }
2424

2525
public static FlarialClient Current { get; } = new FlarialClientRelease();
26-
static readonly JsonService<Dictionary<string, string>> s_json = JsonService<Dictionary<string, string>>.GetJson();
26+
27+
static readonly JsonSerializer<Dictionary<string, string>> s_serializer = JsonSerializer<Dictionary<string, string>>.Get();
2728

2829
protected abstract string Build { get; }
2930
protected abstract string FileName { get; }
3031
protected abstract string DownloadUri { get; }
3132
protected abstract string WindowClass { get; }
3233

33-
public bool? Launch(bool initialized)
34+
public bool Launch(bool initialized)
3435
{
3536
if (Minecraft.GetWindow(WindowClass) is { } client)
3637
{
@@ -43,8 +44,8 @@ internal FlarialClient() { }
4344
}
4445

4546
Library library = new(FileName);
46-
if (!library.IsLoadable) return null;
47-
47+
if (!library.IsLoadable) return false;
48+
4849
return Injector.Launch(initialized, library) is { };
4950
}
5051

@@ -56,7 +57,7 @@ internal FlarialClient() { }
5657
async Task<string> GetRemoteHashAsync()
5758
{
5859
using var stream = await HttpService.GetStreamAsync(HashesUrl);
59-
return s_json.ReadStream(stream)[Build];
60+
return s_serializer.Deserialize(stream)[Build];
6061
}
6162

6263
async Task<string> GetLocalHashAsync() => await Task.Run(() =>

src/Flarial.Launcher.Runtime/Client/FlarialLauncher.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ static FlarialLauncher()
4040
const string Arguments = "/e:on /f:off /v:off /d /c call \"{0}\" & \"{1}\" /c start \"\" \"{2}\"";
4141

4242
static readonly string s_filename, s_arguments, s_version, s_source, s_script, s_content;
43-
static readonly JsonService<Dictionary<string, string>> s_json = JsonService<Dictionary<string, string>>.GetJson();
43+
static readonly JsonSerializer<Dictionary<string, string> > s_serializer = JsonSerializer<Dictionary<string, string>>.Get();
4444

4545
public static async Task<bool> ConnectAsync()
4646
{
@@ -55,7 +55,7 @@ public static async Task<bool> ConnectAsync()
5555
public static async Task<bool> CheckAsync()
5656
{
5757
using var stream = await HttpService.GetStreamAsync(LauncherVersionUri);
58-
return s_version != s_json.ReadStream(stream)["version"];
58+
return s_version != s_serializer.Deserialize(stream)["version"];
5959
}
6060

6161
public static async Task DownloadAsync(Action<int> callback)

src/Flarial.Launcher.Runtime/Game/Minecraft.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ internal Minecraft() { }
2626
public static Minecraft Current { get; } = new MinecraftGDK();
2727
public static string PackageFamilyName { get; } = "Microsoft.MinecraftUWP_8wekyb3d8bbwe";
2828

29-
internal static Package Package => PackageService.GetPackage(PackageFamilyName)!;
29+
internal static Package Package => PackageService.Get(PackageFamilyName)!;
3030
internal static string Version { get { var _ = Package.Id.Version; return $"{_.Major}.{_.Minor}.{_.Build / 100}"; } }
3131

3232
protected abstract uint? Activate();
@@ -42,7 +42,7 @@ internal Minecraft() { }
4242

4343
public static bool IsInstalled => Package is { };
4444
public static bool IsPackaged => Package.SignatureKind is PackageSignatureKind.Store;
45-
public static bool IsGamingServicesInstalled => PackageService.GetPackage("Microsoft.GamingServices_8wekyb3d8bbwe") is { };
45+
public static bool IsGamingServicesInstalled => PackageService.Get("Microsoft.GamingServices_8wekyb3d8bbwe") is { };
4646

4747
static uint? GetProcessId(string processName)
4848
{
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
using System;
2+
using System.Collections;
3+
using System.Collections.Generic;
4+
using System.IO;
5+
using System.Runtime.Serialization;
6+
using System.Runtime.Serialization.Json;
7+
8+
namespace Flarial.Launcher.Runtime.Services;
9+
10+
sealed class JsonSerializer<T>
11+
{
12+
JsonSerializer() { }
13+
14+
static JsonSerializer()
15+
{
16+
s_serializers = [];
17+
s_lock = ((ICollection)s_serializers).SyncRoot;
18+
s_settings = new()
19+
{
20+
UseSimpleDictionaryFormat = true,
21+
MaxItemsInObjectGraph = int.MaxValue,
22+
EmitTypeInformation = EmitTypeInformation.Never
23+
};
24+
}
25+
26+
static readonly object s_lock;
27+
static readonly Dictionary<Type, JsonSerializer<T>> s_serializers;
28+
static readonly DataContractJsonSerializerSettings s_settings = new();
29+
30+
readonly DataContractJsonSerializer _serializer = new(typeof(T), s_settings);
31+
32+
internal T Deserialize(Stream stream) => (T)_serializer.ReadObject(stream);
33+
34+
internal static JsonSerializer<T> Get()
35+
{
36+
lock (s_lock)
37+
{
38+
var type = typeof(T);
39+
40+
if (!s_serializers.TryGetValue(type, out var serializer))
41+
{
42+
serializer = new();
43+
s_serializers.Add(type, serializer);
44+
}
45+
46+
return serializer;
47+
}
48+
}
49+
}

src/Flarial.Launcher.Runtime/Services/JsonService.cs

Lines changed: 0 additions & 37 deletions
This file was deleted.

src/Flarial.Launcher.Runtime/Services/PackageService.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ unsafe static class PackageService
1212
{
1313
static readonly PackageManager s_pm = new();
1414

15-
internal static Package? GetPackage(string packageFamilyName) => s_pm.FindPackagesForUser(string.Empty, packageFamilyName).FirstOrDefault();
15+
internal static Package? Get(string packageFamilyName) => s_pm.FindPackagesForUser(string.Empty, packageFamilyName).FirstOrDefault();
1616

17-
internal static bool AddPackage(Uri uri, Action<int> callback)
17+
internal static bool Add(Uri uri, Action<int> callback)
1818
{
1919
var handle = CreateEvent(null, true, false, null);
2020
var info = s_pm.AddPackageAsync(uri, null, ForceApplicationShutdown | ForceUpdateFromAnyVersion);
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using System.Runtime.Serialization;
2+
using System.Threading.Tasks;
3+
4+
namespace Flarial.Launcher.Runtime.Services;
5+
6+
public static class PromotionManager
7+
{
8+
const string PromotionUri = "https://cdn.flarial.xyz/launcher/Promotions.json";
9+
10+
static readonly JsonSerializer<Promotion[]> s_serializer = JsonSerializer<Promotion[]>.Get();
11+
12+
public static async Task<Promotion[]> GetDetailsAsync()
13+
{
14+
try
15+
{
16+
using var stream = await HttpService.GetStreamAsync(PromotionUri);
17+
return await Task.Run(() => s_serializer.Deserialize(stream));
18+
}
19+
catch { return []; }
20+
}
21+
}
22+
23+
[DataContract]
24+
public sealed class Promotion
25+
{
26+
Promotion() { }
27+
28+
[DataMember]
29+
public readonly string Uri = null!;
30+
31+
[DataMember]
32+
public readonly string Image = null!;
33+
}

src/Flarial.Launcher.Runtime/Versions/GDKVersionItem.cs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,17 @@ sealed class GDKVersionItem : VersionItem
1818
const string GameLaunchHelperUri = "https://cdn.flarial.xyz/launcher/gamelaunchhelper.dll";
1919
const string MSIXVCPackagesUri = "https://cdn.jsdelivr.net/gh/MinecraftBedrockArchiver/GdkLinks@latest/urls.json";
2020

21-
static readonly JsonService<Dictionary<string, Dictionary<string, string[]>>> s_json;
22-
static GDKVersionItem() => s_json = JsonService<Dictionary<string, Dictionary<string, string[]>>>.GetJson();
21+
static readonly JsonSerializer<Dictionary<string, Dictionary<string, string[]>>> s_serializer;
22+
static GDKVersionItem() => s_serializer = JsonSerializer<Dictionary<string, Dictionary<string, string[]>>>.Get();
2323

24-
readonly string[] _uris;
24+
readonly string[] _downloadUris;
2525
readonly byte[] _gameLaunchHelper;
2626

27-
GDKVersionItem(string version, string[] uris, byte[] gameLaunchHelper) : base(version) => (_uris, _gameLaunchHelper) = (uris, gameLaunchHelper);
27+
GDKVersionItem(string version, string[] downloadUris, byte[] gameLaunchHelper) : base(version)
28+
{
29+
_downloadUris = downloadUris;
30+
_gameLaunchHelper = gameLaunchHelper;
31+
}
2832

2933
internal static async Task QueryAsync(SortedDictionary<string, VersionRegistry.VersionEntry> registry) => await Task.Run(async () =>
3034
{
@@ -35,7 +39,7 @@ internal static async Task QueryAsync(SortedDictionary<string, VersionRegistry.V
3539
var gameLaunchHelper = await gameLaunchHelperTask;
3640
using var msixvcPackages = await msixvcPackagesTask;
3741

38-
foreach (var item in s_json.ReadStream(msixvcPackages)["release"])
42+
foreach (var item in s_serializer.Deserialize(msixvcPackages)["release"])
3943
{
4044
var index = item.Key.LastIndexOf('.');
4145
var key = item.Key.Substring(0, index);
@@ -64,7 +68,7 @@ internal static async Task QueryAsync(SortedDictionary<string, VersionRegistry.V
6468
protected override async Task<string> GetUriAsync()
6569
{
6670
using CancellationTokenSource source = new();
67-
HashSet<Task<string?>> tasks = [.. _uris.Select(_ => PingAsync(_, source.Token))];
71+
HashSet<Task<string?>> tasks = [.. _downloadUris.Select(_ => PingAsync(_, source.Token))];
6872

6973
while (tasks.Count > 0)
7074
{

src/Flarial.Launcher.Runtime/Versions/VersionItem.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,6 @@ public virtual async Task InstallAsync(Action<int, bool> callback)
3131

3232
var path = Path.Combine(s_path, Path.GetRandomFileName());
3333
await HttpService.DownloadAsync(await GetUriAsync(), path, (_) => callback(_, false));
34-
await Task.Run(() => PackageService.AddPackage(new(path), _ => callback(_, true)));
34+
await Task.Run(() => PackageService.Add(new(path), _ => callback(_, true)));
3535
}
3636
}

src/Flarial.Launcher.Runtime/Versions/VersionRegistry.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ internal sealed class VersionEntry
1818
}
1919

2020
static readonly VersionItemComparer s_comparer = new();
21-
static readonly JsonService<Dictionary<string, bool>> s_json = JsonService<Dictionary<string, bool>>.GetJson();
21+
static readonly JsonSerializer<Dictionary<string, bool>> s_serializer = JsonSerializer<Dictionary<string, bool>>.Get();
2222

2323
const string SupportedVersionsUri = "https://cdn.flarial.xyz/launcher/Supported.json";
2424

@@ -56,7 +56,7 @@ public static async Task<VersionRegistry> CreateAsync() => await Task.Run(static
5656
SortedDictionary<string, VersionEntry> registry = new(s_comparer);
5757
using var stream = await HttpService.GetStreamAsync(SupportedVersionsUri);
5858

59-
foreach (var item in s_json.ReadStream(stream))
59+
foreach (var item in s_serializer.Deserialize(stream))
6060
registry.Add(item.Key, new(item.Value));
6161

6262
await GDKVersionItem.QueryAsync(registry);

0 commit comments

Comments
 (0)