evaluateInWorker.ts 1.0 KB

1234567891011121314151617181920212223242526272829303132333435
  1. import { spawn, Thread, Worker } from 'threads/dist';
  2. /**
  3. * @param {string} code
  4. * @param {(result: any, code: string) => void} resultCallback
  5. * @param {(error: Error, code: string) => void} errorCallback
  6. * @param {() => void} timeoutCallback
  7. * @param {number} waitTimeout
  8. * @returns {Promise<void>}
  9. */
  10. export async function evaluateInWorker(
  11. code: string,
  12. resultCallback: (result: any, code: string) => void,
  13. errorCallback: (error: Error, code: string) => void,
  14. timeoutCallback: () => void,
  15. waitTimeout: number
  16. ): Promise<void> {
  17. const evaluationWorker = await spawn(new Worker('./workers/evaluation-worker'));
  18. const timeout = setTimeout(async () => {
  19. await Thread.terminate(evaluationWorker);
  20. timeoutCallback();
  21. }, waitTimeout);
  22. try {
  23. const result: string = await evaluationWorker.evaluate(code);
  24. resultCallback(result, code);
  25. } catch (error) {
  26. errorCallback(error, code);
  27. } finally {
  28. clearTimeout(timeout);
  29. await Thread.terminate(evaluationWorker);
  30. }
  31. }