Skip to content

Commit

Permalink
- RonSijm.Blazyload 1.1.1 - Added validation so see which dlls are a…
Browse files Browse the repository at this point in the history
…lready non-lazy loaded, so we don't have to attempt to lazy load them at all.
  • Loading branch information
RonSijm committed May 19, 2023
1 parent 4e7dd14 commit 97bf31d
Show file tree
Hide file tree
Showing 7 changed files with 120 additions and 3 deletions.
1 change: 1 addition & 0 deletions RonSijm.Blazyload.WithExamples.sln.DotSettings
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
<s:Boolean x:Key="/Default/UserDictionary/Words/=Blazyload/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Bootstapper/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Bootstapping/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=dlls/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Pathing/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Sijm/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=unattempted/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
42 changes: 40 additions & 2 deletions src/RonSijm.Blazyload/Features/DIComponents/BlazyAssemblyLoader.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
namespace RonSijm.Blazyload.Features.DIComponents;
using System.Net.Http.Json;
using RonSijm.Blazyload.Features.DIComponents.Models;

namespace RonSijm.Blazyload.Features.DIComponents;

public class BlazyAssemblyLoader
{
Expand All @@ -7,6 +10,8 @@ public class BlazyAssemblyLoader
private readonly BlazyServiceProvider _blazyServiceProvider;
private readonly NavigationManager _navigationManager;

private HashSet<string> _preloadedDlls;

public BlazyAssemblyLoader(BlazyServiceProvider blazyServiceProvider, NavigationManager navigationManager)
{
_navigationManager = navigationManager;
Expand All @@ -31,8 +36,12 @@ public async Task<List<Assembly>> LoadAssembliesAsync(IEnumerable<string> assemb
/// </summary>
private async Task<List<Assembly>> LoadAssembliesAsync(IEnumerable<string> assembliesToLoad, bool isRecursive)
{
_preloadedDlls ??= await GetPreloadedAssemblies();

var assembliesToLoadAsList = assembliesToLoad as List<string> ?? assembliesToLoad.ToList();
var unattemptedAssemblies = assembliesToLoadAsList.Where(x => !_loadedAssemblies.Contains(x)).ToList();
var unattemptedAssemblies = assembliesToLoadAsList
.Where(x => !_loadedAssemblies.Contains(x))
.Where(x => !_preloadedDlls.Contains(x)).ToList();

var loadedAssemblies = new List<Assembly>();

Expand Down Expand Up @@ -79,6 +88,7 @@ private async Task<List<Assembly>> LoadAssembliesAsync(IEnumerable<string> assem
{
if (!isRecursive || BlazyOptions.EnableLoggingForCascadeErrors)
{

Console.WriteLine(e);
}
}
Expand All @@ -95,6 +105,31 @@ private async Task<List<Assembly>> LoadAssembliesAsync(IEnumerable<string> assem
return loadedAssemblies;
}

private async Task<HashSet<string>> GetPreloadedAssemblies()
{
var preloadedDlls = new HashSet<string>();

try
{
using var client = new HttpClient();
var result = await client.GetFromJsonAsync<BlazorBootModel>($"{_navigationManager.BaseUri}/_framework/blazor.boot.json");

foreach (var assembly in result.Resources.Assembly)
{
preloadedDlls.Add(assembly.Key);
}

return preloadedDlls;
}
catch (Exception e)
{
Console.WriteLine("Error while attempting discover preloaded dlls.");
Console.WriteLine(e);
}

return preloadedDlls;
}

private async Task<Assembly[]> LoadAssembliesWithByOptions(List<(string assemblyToLoad, BlazyAssemblyOptions options)> assembliesToLoad)
{
var loadedAssemblies = new List<Assembly>();
Expand All @@ -119,6 +154,9 @@ private async Task<Assembly[]> LoadAssembliesWithByOptions(List<(string assembly
}

var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();

// TODO: We could add an option to do enable sha- validation

var contentBytes = await response.Content.ReadAsStreamAsync();
var assembly = AssemblyLoadContext.Default.LoadFromStream(contentBytes);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using System.Text.Json.Serialization;

namespace RonSijm.Blazyload.Features.DIComponents.Models;

public class BlazorBootModel
{
[JsonPropertyName("cacheBootResources")]
public bool CacheBootResources { get; set; }

[JsonPropertyName("config")]
public List<object> Config { get; set; }

[JsonPropertyName("debugBuild")]
public bool DebugBuild { get; set; }

[JsonPropertyName("entryAssembly")]
public string EntryAssembly { get; set; }

[JsonPropertyName("icuDataMode")]
public int IcuDataMode { get; set; }

[JsonPropertyName("linkerEnabled")]
public bool LinkerEnabled { get; set; }

[JsonPropertyName("resources")]
public Resources Resources { get; set; }
}
12 changes: 12 additions & 0 deletions src/RonSijm.Blazyload/Features/DIComponents/Models/DotnetWasm.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System.Text.Json.Serialization;

namespace RonSijm.Blazyload.Features.DIComponents.Models;

public class DotnetWasm
{
[JsonPropertyName("behavior")]
public string Behavior { get; set; }

[JsonPropertyName("hash")]
public string Hash { get; set; }
}
30 changes: 30 additions & 0 deletions src/RonSijm.Blazyload/Features/DIComponents/Models/Resources.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using System.Text.Json.Serialization;

namespace RonSijm.Blazyload.Features.DIComponents.Models;

public class Resources
{
[JsonPropertyName("assembly")]
public Dictionary<string, string> Assembly { get; set; }

[JsonPropertyName("extensions")]
public object Extensions { get; set; }

[JsonPropertyName("lazyAssembly")]
public Dictionary<string, string> LazyAssembly { get; set; }

[JsonPropertyName("libraryInitializers")]
public object LibraryInitializers { get; set; }

[JsonPropertyName("pdb")]
public Dictionary<string, string> Pdb { get; set; }

[JsonPropertyName("runtime")]
public Dictionary<string, string> Runtime { get; set; }

[JsonPropertyName("runtimeAssets")]
public RuntimeAssets RuntimeAssets { get; set; }

[JsonPropertyName("satelliteResources")]
public object SatelliteResources { get; set; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using System.Text.Json.Serialization;

namespace RonSijm.Blazyload.Features.DIComponents.Models;

public class RuntimeAssets
{
[JsonPropertyName("dotnet.wasm")]
public DotnetWasm DotnetWasm { get; set; }
}
2 changes: 1 addition & 1 deletion src/RonSijm.Blazyload/RonSijm.Blazyload.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<PropertyGroup>
<TargetFrameworks>net6.0;net7.0</TargetFrameworks>
<LangVersion>preview</LangVersion>
<VersionPrefix>1.1.0.1</VersionPrefix>
<VersionPrefix>1.1.1</VersionPrefix>
<ImplicitUsings>enable</ImplicitUsings>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<Title>RonSijm.Blazyload</Title>
Expand Down

0 comments on commit 97bf31d

Please sign in to comment.