handleJavascriptBlock.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. export default function (data) {
  2. let timeout;
  3. const scriptId = `script${data.id}`;
  4. const propertyName = `automa${data.id}`;
  5. const isScriptExists = document.querySelector(`#${scriptId}`);
  6. if (isScriptExists) {
  7. window.top.postMessage(
  8. {
  9. id: data.id,
  10. type: 'sandbox',
  11. result: {
  12. columns: {},
  13. variables: {},
  14. },
  15. },
  16. '*'
  17. );
  18. return;
  19. }
  20. const preloadScripts = data.preloadScripts.map((item) => {
  21. const scriptEl = document.createElement('script');
  22. scriptEl.textContent = item.script;
  23. document.body.appendChild(scriptEl);
  24. return scriptEl;
  25. });
  26. if (!data.blockData.code.includes('automaNextBlock')) {
  27. data.blockData.code += `\n automaNextBlock()`;
  28. }
  29. const script = document.createElement('script');
  30. script.id = scriptId;
  31. script.textContent = `
  32. (() => {
  33. function automaRefData(keyword, path = '') {
  34. return window.$getNestedProperties(${propertyName}.refData, keyword + '.' + path);
  35. }
  36. function automaSetVariable(name, value) {
  37. ${propertyName}.refData.variables[name] = value;
  38. }
  39. function automaNextBlock(data = {}, insert = true) {
  40. ${propertyName}.nextBlock({ data, insert });
  41. }
  42. function automaResetTimeout() {
  43. ${propertyName}.resetTimeout();
  44. }
  45. try {
  46. ${data.blockData.code}
  47. } catch (error) {
  48. console.error(error);
  49. automaNextBlock({ $error: true, message: error.message });
  50. }
  51. })();
  52. `;
  53. function cleanUp() {
  54. script.remove();
  55. preloadScripts.forEach((preloadScript) => {
  56. preloadScript.remove();
  57. });
  58. delete window[propertyName];
  59. }
  60. window[propertyName] = {
  61. refData: data.refData,
  62. nextBlock: (result) => {
  63. cleanUp();
  64. window.top.postMessage(
  65. {
  66. id: data.id,
  67. type: 'sandbox',
  68. result: {
  69. variables: data?.refData?.variables,
  70. columns: {
  71. data: result?.data,
  72. insert: result?.insert,
  73. },
  74. },
  75. },
  76. '*'
  77. );
  78. },
  79. resetTimeout: () => {
  80. clearTimeout(timeout);
  81. timeout = setTimeout(cleanUp, data.blockData.timeout);
  82. },
  83. };
  84. timeout = setTimeout(cleanUp, data.blockData.timeout);
  85. document.body.appendChild(script);
  86. }