feat: Add support for emscripten module exports (#66868)
authorJérôme Laban <jerome.laban@nventive.com>
Tue, 29 Mar 2022 14:57:42 +0000 (10:57 -0400)
committerGitHub <noreply@github.com>
Tue, 29 Mar 2022 14:57:42 +0000 (09:57 -0500)
src/mono/wasm/runtime/dotnet.d.ts
src/mono/wasm/runtime/startup.ts
src/mono/wasm/runtime/types.ts

index d6a86af..617b572 100644 (file)
@@ -197,6 +197,7 @@ declare type DotnetModuleConfig = {
     onConfigLoaded?: (config: MonoConfig) => Promise<void>;
     onDotnetReady?: () => void;
     imports?: DotnetModuleConfigImports;
+    exports?: string[];
 } & Partial<EmscriptenModule>;
 declare type DotnetModuleConfigImports = {
     require?: (name: string) => any;
index 9112a35..aa10c27 100644 (file)
@@ -266,6 +266,8 @@ function _apply_configuration_from_args(config: MonoConfig) {
 }
 
 function finalize_startup(config: MonoConfig | MonoConfigError | undefined): void {
+    const globalThisAny = globalThis as any;
+
     try {
         if (!config || config.isError) {
             return;
@@ -276,6 +278,23 @@ function finalize_startup(config: MonoConfig | MonoConfigError | undefined): voi
 
         const moduleExt = Module as DotnetModule;
 
+        if(!Module.disableDotnet6Compatibility && Module.exports){
+            // Export emscripten defined in module through EXPORTED_RUNTIME_METHODS
+            // Useful to export IDBFS or other similar types generally exposed as 
+            // global types when emscripten is not modularized.
+            for (let i = 0; i < Module.exports.length; ++i) {
+                const exportName = Module.exports[i];
+                const exportValue = (<any>Module)[exportName];
+
+                if(exportValue) {
+                    globalThisAny[exportName] = exportValue;
+                }
+                else{
+                    console.warn(`MONO_WASM: The exported symbol ${exportName} could not be found in the emscripten module`);
+                }
+            }
+        }
+
         try {
             _apply_configuration_from_args(config);
 
index cc0d1b2..aa7481f 100644 (file)
@@ -166,6 +166,7 @@ export type DotnetModuleConfig = {
     onDotnetReady?: () => void;
 
     imports?: DotnetModuleConfigImports;
+    exports?: string[];
 } & Partial<EmscriptenModule>
 
 export type DotnetModuleConfigImports = {