Add environment object to function context and return it back to caller

This commit is contained in:
Peter Stockings
2023-12-18 14:09:39 +11:00
parent ab04b77526
commit 0ce54f112f

View File

@@ -19,7 +19,12 @@ app.use((req, res, next) => {
const TIMEOUT_MS = 5000; // Set timeout to 5000 milliseconds (5 seconds) const TIMEOUT_MS = 5000; // Set timeout to 5000 milliseconds (5 seconds)
async function executeUserCode(code, requestObject, timeout = TIMEOUT_MS) { async function executeUserCode(
code,
requestObject,
environment = {},
timeout = TIMEOUT_MS
) {
const logs = []; const logs = [];
const States = { const States = {
@@ -90,16 +95,18 @@ async function executeUserCode(code, requestObject, timeout = TIMEOUT_MS) {
}, },
}); });
const Result = (state, result) => { const Result = (state, result, environment) => {
console.log(`Status: ${state}`); console.log(`Status: ${state}`);
console.log(`Result: ${JSON.stringify(result, null, 2)}`); console.log(`Result: ${JSON.stringify(result, null, 2)}`);
console.log(`Logs: ${JSON.stringify(logs, null, 2)}`); console.log(`Logs: ${JSON.stringify(logs, null, 2)}`);
console.log(`Environment (post): ${JSON.stringify(environment, null, 2)}`);
console.log(`\n`); console.log(`\n`);
return { return {
state, state,
result, result,
logs, logs,
environment,
}; };
}; };
@@ -125,6 +132,7 @@ async function executeUserCode(code, requestObject, timeout = TIMEOUT_MS) {
}, },
}, },
requestObject, requestObject,
environment,
HTTP_STATUS_CODES, HTTP_STATUS_CODES,
Response, Response,
JsonResponse, JsonResponse,
@@ -143,29 +151,32 @@ async function executeUserCode(code, requestObject, timeout = TIMEOUT_MS) {
console.log(`Function: ${code}`); console.log(`Function: ${code}`);
let requestObjectString = JSON.stringify(requestObject, null, 2); let requestObjectString = JSON.stringify(requestObject, null, 2);
console.log(`Request: ${requestObjectString}`); console.log(`Request: ${requestObjectString}`);
console.log(
`Environment (pre): ${JSON.stringify(environment, null, 2)})`
);
// Call the user function with request object // Call the user function with request object
let result = await userFunction(requestObject); let result = await userFunction(requestObject);
return Result(States.SUCCESS, result); return Result(States.SUCCESS, result, environment);
} else { } else {
return Result(States.NOT_A_FUNCTION, null); return Result(States.NOT_A_FUNCTION, null, environment);
} }
} catch (err) { } catch (err) {
if (err.message === "Script execution timed out.") { if (err.message === "Script execution timed out.") {
return Result(States.TIMEOUT, null); return Result(States.TIMEOUT, null, environment);
} else { } else {
return Result(States.SCRIPT_ERROR, err.message || err); return Result(States.SCRIPT_ERROR, err.message || err, environment);
} }
} }
} }
app.post("/execute", async (req, res) => { app.post("/execute", async (req, res) => {
const { code, request } = req.body; const { code, request, environment } = req.body;
const timeout = req.query.timeout || TIMEOUT_MS; const timeout = req.query.timeout || TIMEOUT_MS;
const result = await executeUserCode(code, request, timeout); const result = await executeUserCode(code, request, environment, timeout);
res.send(result); res.send(result);
}); });