From d098874e30e991e12621de2c85e6cfc3caa16b91 Mon Sep 17 00:00:00 2001 From: Sidhanth B H Date: Fri, 30 May 2025 16:55:11 +0530 Subject: [PATCH 1/2] RDKEMW-3466 : JSRuntimeWidget Reason for change: Added a new file JSRuntimeLauncher Test Procedure: build should be successful. Risks: low Priority: P2 --- CMakeLists.txt | 15 ++ src/JSRuntimeLauncher.cpp | 264 ++++++++++++++++++++++++++++++++++ src/NativeJSRenderer.cpp | 14 +- src/jsc/JavaScriptContext.cpp | 12 ++ 4 files changed, 302 insertions(+), 3 deletions(-) create mode 100644 src/JSRuntimeLauncher.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 878a350..6751722 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,6 +26,7 @@ option(BUILD_JSRUNTIME_APP "BUILD_JSRUNTIME_APP" ON) option(ENABLE_JSRUNTIME_SERVER "ENABLE_JSRUNTIME_SERVER" OFF) option(BUILD_JSRUNTIME_CLIENT "BUILD_JSRUNTIME_CLIENT" OFF) option(NATIVEJS_DEVELOPER_MODE "NATIVEJS_DEVELOPER_MODE" OFF) +option(ENABLE_JSRUNTIME_LAUNCHER "ENABLE_JSRUNTIME_LAUNCHER" OFF) #can be jsc or node or v8 or quickjs option(JSRUNTIME_ENGINE_NAME "JSRUNTIME_ENGINE_NAME" "jsc") @@ -105,6 +106,10 @@ set(JSRUNTIME_APP_FILES ${JSRUNTIME_COMMON_SOURCE_DIRECTORY}/jsruntime.cpp ) +set(JSRUNTIME_LAUNCHER_FILES + ${JSRUNTIME_COMMON_SOURCE_DIRECTORY}/JSRuntimeLauncher.cpp +) + if ( ENABLE_JSRUNTIME_SERVER ) add_definitions("-DENABLE_JSRUNTIME_SERVER") add_definitions("-DWS_SERVER_PORT=9112") @@ -175,6 +180,16 @@ if (BUILD_JSRUNTIME_CLIENT) target_link_libraries(jsruntime_client ${JSRUNTIME_LIBRARY_LINK_DIRECTORIES} -lpthread) endif (BUILD_JSRUNTIME_CLIENT) +if (ENABLE_JSRUNTIME_LAUNCHER) + message("Enabling build support for jsruntime launcher - widget") + add_executable(jsruntime_launcher ${JSRUNTIME_LAUNCHER_FILES}) + add_dependencies(${JSRUNTIME_LIBRARY_NAME} ${JSRUNTIME_ENGINE_DEPENDENT_LIBRARY_NAME}) + add_dependencies(jsruntime_launcher ${JSRUNTIME_LIBRARY_NAME} ${JSRUNTIME_ENGINE_DEPENDENT_LIBRARY_NAME} ) + target_include_directories(jsruntime_launcher PRIVATE ${JSRUNTIME_INCLUDE_DIRECTORIES}) + set_target_properties(jsruntime_launcher PROPERTIES OUTPUT_NAME "JSRuntimeLauncher") + target_link_libraries(jsruntime_launcher ${JSRUNTIME_LIBRARY_LINK_DIRECTORIES} -l${JSRUNTIME_LIBRARY_NAME} ${JSRUNTIME_LINK_LIBRARIES}) +endif (ENABLE_JSRUNTIME_LAUNCHER) + set(UWEBSOCKETS_TARGET "Linux") if (APPLE) set(UWEBSOCKETS_TARGET "Darwin") diff --git a/src/JSRuntimeLauncher.cpp b/src/JSRuntimeLauncher.cpp new file mode 100644 index 0000000..63eb255 --- /dev/null +++ b/src/JSRuntimeLauncher.cpp @@ -0,0 +1,264 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "rapidjson/document.h" +#include +#include +#include +#include + +using namespace rapidjson; +using namespace std; +using namespace JsRuntime; + +string source="/package/index.js"; +std::vector flags; + +void extractJSFilePaths(const std::string& jsFilePath) { + std::ifstream file(jsFilePath); + + if (!file.is_open()) { + std::cerr << "Error: Could not open file '" << jsFilePath << "'\n"; + return; + } + + std::string line; + while (std::getline(file, line)) { + if (!line.empty()) { + std::cout<<"line:"< options; + for (SizeType i = 0; i < flagsarr.Size(); i++) { + const Value& flagOption = flagsarr[i]; + if (!flagOption.IsObject()) + continue; + + if (flagOption.HasMember("name") && flagOption.HasMember("enable")) { + const Value& name = flagOption["name"]; + const Value& enable = flagOption["enable"]; + + if(name=="player" && enable==true) + { + flags.push_back("--enablePlayer"); + } + else if(name=="xhr" && enable==true) + { + flags.push_back("--enableXHR"); + } + else if(name=="websocket" && enable==true) + { + flags.push_back("--enableWebSocket"); + } + else if(name=="http" && enable==true) + { + flags.push_back("--enableHttp"); + } + else if(name=="websocketenhanced" && enable==true) + { + flags.push_back("--enableWebSocketEnhanced"); + } + else if(name=="fetch" && enable==true) + { + flags.push_back("--enableFetch"); + } + else if(name=="jsdom" && enable==true) + { + flags.push_back("--enableJSDOM"); + } + else if(name=="window" && enable==true) + { + flags.push_back("--enableWindow"); + } + else if(name=="console" && enable==true) + { + flags.push_back("--console"); + } + else if(name=="display" && enable==true) + { + flags.push_back("--display"); + } + else{ + continue; + } + + } + } + } +} + +int main(int argc, char *argv[]) { + const char* filename = "/package/rdk.config"; + std::ifstream file(filename); + if (file.good()) + { + std::string jsonStr, line; + while (std::getline(file, line)) { + jsonStr += line + "\n"; + } + file.close(); + cJSON* root = cJSON_Parse(jsonStr.c_str()); + if (root){ + cJSON* envs = cJSON_GetObjectItem(root, "configuration"); + cJSON* envArray = cJSON_GetObjectItem(envs, "envs"); + cJSON* env; + cJSON_ArrayForEach(env, envArray) { + cJSON* key = cJSON_GetObjectItem(env, "key"); + cJSON* value = cJSON_GetObjectItem(env, "value"); + if (key && value && cJSON_IsString(key) && cJSON_IsString(value)) { + setenv(key->valuestring, value->valuestring, 1); + } + } + cJSON_Delete(root); + } + } + vector c_flags; + std::string fileName = "/package/app.config"; + Json_parsing(fileName); + extractJSFilePaths(source); + for(auto& flag : flags) + { + c_flags.push_back((char*)(flag.c_str())); + } + if (c_flags.size() < 2) + { + NativeJSLogger::log(WARN, "Pass the URL to run\n"); + return -1; + } + bool runServer = false; + std::string waylanddisplay(""); + bool enableJSDOM = false, enableWindow = false, enablePlayer = false, enableWebSocketEnhanced = false, enableFetch = false; + int i = 0, appendindex=c_flags.size()-1; + std::vector applications; + ModuleSettings moduleSettings; + bool consoleMode = false; + + while (i renderer = std::make_shared(waylanddisplay); + if (consoleMode) { + renderer->setEnvForConsoleMode(moduleSettings); + } + if (!renderer) + { + NativeJSLogger::log(ERROR, "Unable to run application\n"); + return -1; + } + +#if defined(ENABLE_JSRUNTIME_SERVER) + if (runServer == true) + { + JSRuntimeServer *server = JSRuntimeServer::getInstance(); + server->initialize(WS_SERVER_PORT, renderer); + server->start(); + } +#endif + + uint32_t id = renderer->createApplication(moduleSettings); + for (int j = 0; j < applications.size(); j++) { + std::string url = applications[j]; + NativeJSLogger::log(INFO, "Application URL is %s\n", (url.size() ? url.c_str() : "empty")); + renderer->runApplication(id, url); + } + + renderer->run(); + return 0; +} diff --git a/src/NativeJSRenderer.cpp b/src/NativeJSRenderer.cpp index 5967279..1ffa020 100644 --- a/src/NativeJSRenderer.cpp +++ b/src/NativeJSRenderer.cpp @@ -252,7 +252,7 @@ std::list NativeJSRenderer::getApplications() ApplicationDetails appData; appData.id = key; appData.url = value.url; - NativeJSLogger::log(DEBUG, "Found application with ID: %d and URL: %s\n", key, value.url); + NativeJSLogger::log(DEBUG, "Found application with ID: %d and URL: %s\n", key, value.url.c_str()); runningApplication.push_back(appData); } } @@ -326,9 +326,13 @@ void NativeJSRenderer::runApplicationInternal(ApplicationRequest& appRequest) return ; } JavaScriptContext* context = (JavaScriptContext*)mContextMap[id].context; - std::cout << "nativeJS application thunder execution url " << url << " result " << ret << std::endl; + std::stringstream window; + window<<"window.location = {\"href\":\"" << url << "\"};"; + NativeJSLogger::log(INFO, "Adding the window location: %s to js file\n", window.str().c_str()); + context->runScript(window.str().c_str(),true, url, nullptr, true); + NativeJSLogger::log(INFO, "nativeJS application thunder execution url: %s, result: %d\n", url.c_str(), ret ? 1 : 0); ret = context->runScript(chunk.contentsBuffer, true, url, nullptr, true); - std::cout << "nativeJS application execution result " << ret << std::endl; + NativeJSLogger::log(INFO, "nativeJS application execution result: %d\n", ret ? 1 : 0); double duration = context->getExecutionDuration(); context->setAppdata(id, url); NativeJSLogger::log(INFO, "Execution duration(runApplicationDuration) for ID %d | URL %s : %.3f ms\n", id, url.c_str(), duration); @@ -337,6 +341,10 @@ void NativeJSRenderer::runApplicationInternal(ApplicationRequest& appRequest) { NativeJSLogger::log(INFO, "About to launch local app\n"); JavaScriptContext* context = (JavaScriptContext*)mContextMap[id].context; + std::stringstream window; + window<<"window.location = {\"href\":\"file:/" << url << "\"};"; + NativeJSLogger::log(INFO, "Adding the window location: %s to js file\n", window.str().c_str()); + context->runScript(window.str().c_str(),true, url, nullptr, true); NativeJSLogger::log(INFO, "Running test application: %s\n", url); bool ret = context->runFile(url.c_str(), nullptr, true); NativeJSLogger::log(INFO, "Test application execution result: %d\n", ret ? 1 : 0); diff --git a/src/jsc/JavaScriptContext.cpp b/src/jsc/JavaScriptContext.cpp index 55064f1..f8b203f 100644 --- a/src/jsc/JavaScriptContext.cpp +++ b/src/jsc/JavaScriptContext.cpp @@ -447,6 +447,18 @@ if (mModuleSettings.enablePlayer) runFile("modules/linkedjsdom.js", nullptr/*, true*/); runFile("modules/linkedjsdomwrapper.js", nullptr/*, true*/); runFile("modules/windowwrapper.js", nullptr/*, true*/); + if(getenv("FIREBOLT_ENDPOINT")!=NULL) + { + auto FireboltEndpoint = std::string(getenv("FIREBOLT_ENDPOINT")); + std::stringstream ss; + ss << "window.__firebolt = {\"endpoint\":\"" << FireboltEndpoint << "\"};"; + NativeJSLogger::log(INFO, "Adding the Firebolt EndPoint value: %s to window.js file\n", FireboltEndpoint.c_str()); + ss << "var self = window;"; + ss << "let videoDiv = document.createElement(\"div\");"; + ss << "videoDiv.id = \"videoDiv\";"; + ss << "document.body.appendChild(videoDiv)"; + evaluateScript(ss.str().c_str(),nullptr); + } } } From 87a4588627f8f11f8fb6ac8881efd4fdcdf1f969 Mon Sep 17 00:00:00 2001 From: Sidhanth B H Date: Fri, 30 May 2025 16:55:11 +0530 Subject: [PATCH 2/2] RDKEMW-3466 : JSRuntimeWidget Reason for change: Added a new file JSRuntimeLauncher Test Procedure: build should be successful. Risks: low Priority: P2 --- src/JSRuntimeLauncher.cpp | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/JSRuntimeLauncher.cpp b/src/JSRuntimeLauncher.cpp index 63eb255..7f73da8 100644 --- a/src/JSRuntimeLauncher.cpp +++ b/src/JSRuntimeLauncher.cpp @@ -220,12 +220,6 @@ int main(int argc, char *argv[]) { { consoleMode = true; } -#if defined(ENABLE_JSRUNTIME_SERVER) - else if (strcmp(c_flags[i], "--server") == 0) - { - runServer = true; - } -#endif else { applications.push_back(c_flags[i]); @@ -243,15 +237,6 @@ int main(int argc, char *argv[]) { return -1; } -#if defined(ENABLE_JSRUNTIME_SERVER) - if (runServer == true) - { - JSRuntimeServer *server = JSRuntimeServer::getInstance(); - server->initialize(WS_SERVER_PORT, renderer); - server->start(); - } -#endif - uint32_t id = renderer->createApplication(moduleSettings); for (int j = 0; j < applications.size(); j++) { std::string url = applications[j];