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); }
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); }
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); }