@@ -153,9 +153,11 @@ public override bool Execute()
153
153
RemoveDuplicateAssets ( ) ;
154
154
GeneratePackageFolder ( ) ;
155
155
BuildServiceWorker ( ) ;
156
+ BuildServiceWorkerClassic ( ) ;
156
157
GenerateEmbeddedJs ( ) ;
157
158
GenerateIndexHtml ( ) ;
158
159
GenerateConfig ( ) ;
160
+ GenerateConfigScript ( ) ;
159
161
RemoveDuplicateAssets ( ) ;
160
162
}
161
163
finally
@@ -312,6 +314,24 @@ private void BuildServiceWorker()
312
314
CopyStreamToOutput ( "service-worker.js" , memoryStream , DeployMode . Root ) ;
313
315
}
314
316
317
+ // Case for browsers that do not support modules for service workers: Firefox for example
318
+ private void BuildServiceWorkerClassic ( )
319
+ {
320
+ using var resourceStream = GetType ( ) . Assembly . GetManifestResourceStream ( "Uno.Wasm.Bootstrap.v0.Embedded.service-worker-classic.js" ) ;
321
+ using var reader = new StreamReader ( resourceStream ) ;
322
+
323
+ var worker = TouchServiceWorker ( reader . ReadToEnd ( ) ) ;
324
+ var memoryStream = new MemoryStream ( ) ;
325
+
326
+ using var writer = new StreamWriter ( memoryStream , Encoding . UTF8 ) ;
327
+ writer . Write ( worker ) ;
328
+ writer . Flush ( ) ;
329
+
330
+ memoryStream . Position = 0 ;
331
+
332
+ CopyStreamToOutput ( "service-worker-classic.js" , memoryStream , DeployMode . Root ) ;
333
+ }
334
+
315
335
private void ExtractAdditionalJS ( )
316
336
{
317
337
BuildResourceSearchList ( ) ;
@@ -535,7 +555,8 @@ private void GenerateConfig()
535
555
. Where ( d =>
536
556
! d . EndsWith ( "require.js" )
537
557
&& ! d . EndsWith ( "uno-bootstrap.js" )
538
- && ! d . EndsWith ( "service-worker.js" ) )
558
+ && ! d . EndsWith ( "service-worker.js" )
559
+ && ! d . EndsWith ( "service-worker-classic.js" ) )
539
560
. Select ( dep => BuildDependencyPath ( dep , baseLookup ) ) ) ;
540
561
541
562
var config = new StringBuilder ( ) ;
@@ -625,6 +646,108 @@ private void GenerateConfig()
625
646
}
626
647
}
627
648
649
+
650
+
651
+ private void GenerateConfigScript ( )
652
+ {
653
+ var unoConfigJsPath = Path . Combine ( _intermediateAssetsPath , "uno-config-script.js" ) ;
654
+
655
+ using ( var w = new StreamWriter ( unoConfigJsPath , false , _utf8Encoding ) )
656
+ {
657
+ var baseLookup = _shellMode == ShellMode . Node ? "" : $ "{ WebAppBasePath } { PackageAssetsFolder } /";
658
+ var dependencies = string . Join ( ", " , _dependencies
659
+ . Where ( d =>
660
+ ! d . EndsWith ( "require.js" )
661
+ && ! d . EndsWith ( "uno-bootstrap.js" )
662
+ && ! d . EndsWith ( "service-worker.js" )
663
+ && ! d . EndsWith ( "service-worker-classic.js" ) )
664
+ . Select ( dep => BuildDependencyPath ( dep , baseLookup ) ) ) ;
665
+
666
+ var config = new StringBuilder ( ) ;
667
+
668
+ var enablePWA = ! string . IsNullOrEmpty ( PWAManifestFile ) ;
669
+
670
+ var sanitizedOfflineFiles = StaticWebContent
671
+ . Select ( f => f . GetMetadata ( "Link" )
672
+ . Replace ( "\\ " , "/" )
673
+ . Replace ( "wwwroot/" , "" ) )
674
+ . Concat ( [ $ "uno-config-script.js", "_framework/blazor.boot.json" , "." ] ) ;
675
+
676
+ var offlineFiles = enablePWA ? string . Join ( ", " , sanitizedOfflineFiles . Select ( f => $ "\" { WebAppBasePath } { f } \" ") ) : "" ;
677
+
678
+ var emccExportedRuntimeMethodsParams = string . Join (
679
+ "," ,
680
+ GetEmccExportedRuntimeMethods ( ) . Select ( f => $ "\' { f } \' ") ) ;
681
+
682
+ var runtimeOptionsSet = string . Join ( "," , ( RuntimeOptions ? . Split ( ' ' ) ?? [ ] ) . Select ( f => $ "\' { f } \' ") ) ;
683
+
684
+ config . AppendLine ( $ "self.config = {{}};") ;
685
+ config . AppendLine ( $ "self.config.uno_remote_managedpath = \" _framework\" ;") ;
686
+ config . AppendLine ( $ "self.config.uno_app_base = \" { WebAppBasePath } { PackageAssetsFolder } \" ;") ;
687
+ config . AppendLine ( $ "self.config.uno_dependencies = [{ dependencies } ];") ;
688
+ config . AppendLine ( $ "self.config.uno_runtime_options = [{ runtimeOptionsSet } ];") ;
689
+ config . AppendLine ( $ "self.config.enable_pwa = { enablePWA . ToString ( ) . ToLowerInvariant ( ) } ;") ;
690
+ config . AppendLine ( $ "self.config.offline_files = ['{ WebAppBasePath } ', { offlineFiles } ];") ;
691
+ config . AppendLine ( $ "self.config.uno_shell_mode = \" { _shellMode } \" ;") ;
692
+ config . AppendLine ( $ "self.config.uno_debugging_enabled = { ( ! Optimize ) . ToString ( ) . ToLowerInvariant ( ) } ;") ;
693
+ config . AppendLine ( $ "self.config.uno_enable_tracing = { EnableTracing . ToString ( ) . ToLowerInvariant ( ) } ;") ;
694
+ config . AppendLine ( $ "self.config.uno_load_all_satellite_resources = { LoadAllSatelliteResources . ToString ( ) . ToLowerInvariant ( ) } ;") ;
695
+ config . AppendLine ( $ "self.config.emcc_exported_runtime_methods = [{ emccExportedRuntimeMethodsParams } ];") ;
696
+
697
+ if ( GenerateAOTProfile )
698
+ {
699
+ config . AppendLine ( $ "self.config.generate_aot_profile = true;") ;
700
+ }
701
+
702
+ config . AppendLine ( $ "self.config.environmentVariables = self.config.environmentVariables || {{}};") ;
703
+
704
+ void AddEnvironmentVariable ( string name , string value ) => config . AppendLine ( $ "self.config.environmentVariables[\" { name } \" ] = \" { value } \" ;") ;
705
+
706
+ if ( MonoEnvironment != null )
707
+ {
708
+ foreach ( var env in MonoEnvironment )
709
+ {
710
+ AddEnvironmentVariable ( env . ItemSpec , env . GetMetadata ( "Value" ) ) ;
711
+ }
712
+ }
713
+
714
+ var isProfiledAOT = UseAotProfile && _runtimeExecutionMode == RuntimeExecutionMode . InterpreterAndAOT ;
715
+
716
+ AddEnvironmentVariable ( "UNO_BOOTSTRAP_MONO_RUNTIME_MODE" , _runtimeExecutionMode . ToString ( ) ) ;
717
+ AddEnvironmentVariable ( "UNO_BOOTSTRAP_MONO_PROFILED_AOT" , isProfiledAOT . ToString ( ) ) ;
718
+ AddEnvironmentVariable ( "UNO_BOOTSTRAP_LINKER_ENABLED" , ( PublishTrimmed && RunILLink ) . ToString ( ) ) ;
719
+ AddEnvironmentVariable ( "UNO_BOOTSTRAP_DEBUGGER_ENABLED" , ( ! Optimize ) . ToString ( ) ) ;
720
+ AddEnvironmentVariable ( "UNO_BOOTSTRAP_MONO_RUNTIME_CONFIGURATION" , "Release" ) ;
721
+ AddEnvironmentVariable ( "UNO_BOOTSTRAP_MONO_RUNTIME_FEATURES" , BuildRuntimeFeatures ( ) ) ;
722
+ AddEnvironmentVariable ( "UNO_BOOTSTRAP_APP_BASE" , PackageAssetsFolder ) ;
723
+ AddEnvironmentVariable ( "UNO_BOOTSTRAP_WEBAPP_BASE_PATH" , WebAppBasePath ) ;
724
+
725
+ if ( EmccFlags ? . Any ( f => f . ItemSpec ? . Contains ( "MAXIMUM_MEMORY=4GB" ) ?? false ) ?? false )
726
+ {
727
+ // Detects the use of the 4GB flag: https://v8.dev/blog/4gb-wasm-memory
728
+ AddEnvironmentVariable ( "UNO_BOOTSTRAP_EMSCRIPTEN_MAXIMUM_MEMORY" , "4GB" ) ;
729
+ }
730
+
731
+ if ( EnableLogProfiler )
732
+ {
733
+ AddEnvironmentVariable ( "UNO_BOOTSTRAP_LOG_PROFILER_OPTIONS" , LogProfilerOptions ) ;
734
+ }
735
+
736
+ w . Write ( config . ToString ( ) ) ;
737
+
738
+ TaskItem indexMetadata = new (
739
+ unoConfigJsPath , new Dictionary < string , string >
740
+ {
741
+ [ "CopyToOutputDirectory" ] = "PreserveNewest" ,
742
+ [ "ContentRoot" ] = _intermediateAssetsPath ,
743
+ [ "Link" ] = $ "wwwroot/{ PackageAssetsFolder } /" + Path . GetFileName ( unoConfigJsPath ) ,
744
+ } ) ;
745
+
746
+ StaticWebContent = StaticWebContent . Concat ( [ indexMetadata ] ) . ToArray ( ) ;
747
+ }
748
+ }
749
+
750
+
628
751
private void GenerateIndexHtml ( )
629
752
{
630
753
if ( _shellMode != ShellMode . Browser )
0 commit comments