Exemple #1
0
        private JavaScriptModuleRecord CreateModule(JavaScriptModuleRecord?parent, JSFileObject file)
        {
            if (moduleCache.ContainsKey(file.Path))
            {
                return(moduleCache[file.Path]);
            }

            var result = JavaScriptModuleRecord.Create(parent, file.Path);

            moduleCache.Add(file.Path, result);
            result.HostUrl = file.Path;

            JavaScriptModuleRecord.SetFetchModuleCallback(
                result,
                (JavaScriptModuleRecord reference, JavaScriptValue name, out JavaScriptModuleRecord record) =>
            {
                var moduleName = name.ToString();
                var parentPath = reference.HostUrl;

                if (_predefinedModules.ContainsKey(moduleName))
                {
                    record = CreateModule(reference, _predefinedModules[moduleName]);

                    return(JavaScriptErrorCode.NoError);
                }

                var modulePath = string.IsNullOrWhiteSpace(parentPath)
                        ? moduleName
                        : Path.GetFullPath($"{Path.Combine(Path.GetDirectoryName(parentPath), moduleName)}");

                modulePath = RemovePathToResources(modulePath);

                var module = Resources.Load <JSFileObject>(modulePath);

                if (module == null)
                {
                    throw new EntryPointNotFoundException($"Module {modulePath} doesn't exist'");
                }

                record = CreateModule(reference, module);

                return(JavaScriptErrorCode.NoError);
            });

            JavaScriptModuleRecord.SetFetchModuleScriptCallback(result, FetchImportedModuleFromScript);
            JavaScriptModuleRecord.SetNotifyReady(result, ModuleNotifyReady);

            if (file.Path != null)
            {
                _moduleParseQueue.Enqueue(() =>
                {
                    JavaScriptModuleRecord.ParseScript(result, file.Code, _currentSourceContext++);
                    // Debug.Log($"module {file.Path} Parsed");
                });
            }

            // Debug.Log($"{file.Path} module created");
            return(result);
        }
Exemple #2
0
        private JavaScriptModuleRecord createModule(JavaScriptModuleRecord?parent, string name)
        {
            var result = API.JavaScriptModuleRecord.Create(parent, name);

            JavaScriptModuleRecord.SetFetchModuleCallback(result, FetchImportedModule);
            JavaScriptModuleRecord.SetFetchModuleScriptCallback(result, FetchImportedModuleFromScript);
            //if (parent==null)//root module, set notify ready callback
            //{
            JavaScriptModuleRecord.SetNotifyReady(result, ModuleNotifyReady);
            //}
            if (name != null)
            {
                moduleParseQueue.Enqueue(() =>
                {
                    JavaScriptModuleRecord.ParseScript(result, loadScript(name));
                    System.Diagnostics.Debug.WriteLine($"module {name} Parsed");
                });
            }

            System.Diagnostics.Debug.WriteLine($"{name} module created");
            return(result);
        }
Exemple #3
0
        private JavaScriptModuleRecord createModule(JavaScriptModuleRecord?parent, string name, Func <string, string> loadModuleCallback)
        {
            bool isCreateFromSourceCode = string.IsNullOrEmpty(name);

            //if module is cached, return cached value
            if (!isCreateFromSourceCode && moduleCache.ContainsKey(name))
            {
                return(moduleCache[name]);
            }

            IRuntimeDebuggingService debugService = CurrentNode.GetService <IRuntimeDebuggingService>();
            var result = JavaScriptModuleRecord.Create(parent, name);

            #region init moudle callback delegates
            FetchImportedModuleDelegate fetchImported = (JavaScriptModuleRecord reference, JavaScriptValue scriptName, out JavaScriptModuleRecord output) =>
            {
                output = createModule(reference, scriptName.ToString(), loadModuleCallback);

                return(JavaScriptErrorCode.NoError);
            };

            FetchImportedModuleFromScriptDelegate fetchImportedFromScript = (JavaScriptSourceContext sourceContext, JavaScriptValue scriptName, out JavaScriptModuleRecord output) =>
            {
                output = createModule(null, scriptName.ToString(), loadModuleCallback);
                return(JavaScriptErrorCode.NoError);
            };

            NotifyModuleReadyCallbackDelegate notifyReady = (module, jsvalue) =>
            {
                moduleReadyEvent.Set();
                if (jsvalue.IsValid)
                {
                    var valueService = CurrentNode.GetService <IJSValueService>();
                    valueService.ThrowIfErrorValue(jsvalue);
                }
                debugService.NotifyScriptReady();
                return(JavaScriptErrorCode.NoError);
            };
            #endregion


            Action parseModule = () =>
            {
                string script = loadModuleCallback(name);
                JavaScriptModuleRecord.ParseScript(result, script, debugService.GetScriptContext(name, script));
                //debugService.AddScriptSource(name, script);
                System.Diagnostics.Debug.WriteLine($"module {name} Parsed");
            };

            JavaScriptModuleRecord.SetFetchModuleCallback(result, fetchImported);
            JavaScriptModuleRecord.SetFetchModuleScriptCallback(result, fetchImportedFromScript);
            JavaScriptModuleRecord.SetNotifyReady(result, notifyReady);
            if (!string.IsNullOrEmpty(name))
            {
                JavaScriptModuleRecord.SetHostUrl(result, name);
            }
            else
            {
                JavaScriptModuleRecord.SetHostUrl(result, "<Generated_ModuleRoot>");
            }


            moduleParseQueue.Add(new moduleItem(
                                     parseModule,
                                     fetchImported,
                                     fetchImportedFromScript,
                                     notifyReady));

            if (!isCreateFromSourceCode)
            {
                moduleCache.Add(name, result);//cache the module if it's not directly from RunModule function
            }


            System.Diagnostics.Debug.WriteLine($"{name} module created");
            return(result);
        }