diff --git a/src/server.js b/src/server.js index 909838b..303e18a 100644 --- a/src/server.js +++ b/src/server.js @@ -69,36 +69,54 @@ function loadGlobalObjects() { } /** - * Load helpers module using vm.Script and store in globalVariableContext - * Pattern: helpers.js returns object with utility functions via IIFE + * Load all .js files from globalVariables/ directory using vm.Script + * Pattern: globalVariables/filename.js -> globalVariableContext['filename'] + * Each .js file must return an object via IIFE */ -function loadHelpers() { - const helpersPath = join(__dirname, "globalVariables", "helpers.js"); - +function loadGlobalVariableFunctions() { + const globalDir = join(__dirname, "globalVariables"); + try { - const helpersCode = readFileSync(helpersPath, "utf-8"); - const helpersScript = new vm.Script(helpersCode, { filename: "helpers.js" }); - - // Execute helpers.js in context with crypto and console - // Returns object with all helper functions - const tempContext = vm.createContext({ - crypto, - console: logger, - }); - const helpers = helpersScript.runInContext(tempContext); - - // Store in globalVariableContext to be spread into per-request context - globalVariableContext.helpers = helpers; - - logger.info("Loaded helpers module", { - functions: Object.keys(helpers).length, - exports: Object.keys(helpers), + const files = readdirSync(globalDir).filter( + (f) => f.endsWith(".js") && !f.endsWith(".example.js"), + ); + + files.forEach((file) => { + const functionName = file.replace(".js", ""); + const filePath = join(globalDir, file); + + try { + const code = readFileSync(filePath, "utf-8"); + const script = new vm.Script(code, { filename: file }); + + // Execute in context with crypto and console + // Expects file to return an object via IIFE + const tempContext = vm.createContext({ + crypto, + console: logger, + }); + const exportedObject = script.runInContext(tempContext); + + globalVariableContext[functionName] = exportedObject; + logger.info(`Loaded global function module: ${functionName}`, { + file: file, + exports: Object.keys(exportedObject || {}).length, + }); + } catch (error) { + logger.error(`Failed to load global function module from ${file}`, { + error: error.message, + }); + throw error; + } }); + + logger.info( + `Loaded ${files.length} global function modules from ${globalDir}`, + ); } catch (error) { - logger.error("Failed to load helpers module", { - path: helpersPath, + logger.error("Failed to load global function modules", { + directory: globalDir, error: error.message, - stack: error.stack, }); throw error; } @@ -158,8 +176,8 @@ async function startServer() { // Load global objects from globalVariables/ directory (e.g., service account keys) loadGlobalObjects(); - // Load helpers module via vm.Script and add to globalVariableContext - loadHelpers(); + // Load global function modules from globalVariables/ directory (e.g., helpers.js) + loadGlobalVariableFunctions(); logger.info("Starting Proxy Script Server..."); logger.info(