index.js 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. 'use strict';
  2. const vm = require('vm');
  3. async function runScript(code, variableContext, contextEnv) {
  4. // 外部包裹一个自执行函数
  5. const wrappedCode = `
  6. (async function () {
  7. ${code}
  8. })();
  9. `;
  10. // 创建一个 vm.Script 实例, 编译要执行的代码
  11. const script = new vm.Script(wrappedCode);
  12. // 创建沙箱环境
  13. const sandbox = {
  14. require,
  15. console,
  16. process,
  17. setTimeout,
  18. setInterval,
  19. Promise,
  20. contextEnv: contextEnv
  21. ? {
  22. Source: contextEnv.WEDA_SOURCE,
  23. Uid: contextEnv.WEDA_UUID,
  24. RequestId: contextEnv['X-Request-Id'],
  25. }
  26. : {},
  27. ...variableContext,
  28. };
  29. // 创建一个 context, 绑定沙箱环境,作为全局对象
  30. const context = vm.createContext(sandbox);
  31. // 运行上面编译的代码
  32. const result = await script.runInNewContext(context, { timeout: 30000 });
  33. return result;
  34. }
  35. exports.main = async (event, context) => {
  36. const result = await runScript(
  37. event.code,
  38. event.variableContext,
  39. JSON.parse(context.environment || '{}'),
  40. );
  41. return result;
  42. };