fake-engine.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. /**
  2. * 假引擎:模拟「长时间运行 + 能被叫停」,**完全不碰 TikTok**。
  3. *
  4. * 用途:验证界面侧的运行态交互(状态条、进度、两步停止)。
  5. * 用真引擎验证这些时,它会把 TikTok 拉到前台,我就没法同时操作界面上的按钮了 ——
  6. * 而这个假引擎不切应用,界面始终留在前台,正好把 UI 交互测干净。
  7. *
  8. * 协议与真引擎完全一致:读 --config/--state/--stop-flag/--run-id,写 run-state.json。
  9. */
  10. function argOf(argv, key) {
  11. for (var i = 0; argv && argv[i] !== undefined; i += 1) {
  12. if (String(argv[i]) === key) { return String(argv[i + 1]); }
  13. }
  14. return "";
  15. }
  16. var argv = engines.myEngine().execArgv;
  17. var STATE = argOf(argv, "--state");
  18. var STOP = argOf(argv, "--stop-flag");
  19. var RUN_ID = argOf(argv, "--run-id");
  20. function report(payload) {
  21. payload.runId = RUN_ID;
  22. payload.updatedAt = Date.now();
  23. files.write(STATE, JSON.stringify(payload));
  24. }
  25. report({ status: "running", phase: "假引擎运行中", done: 0, total: 3 });
  26. var began = Date.now();
  27. var tick = 0;
  28. var done = 0;
  29. while (Date.now() - began < 60000) {
  30. tick += 1;
  31. /* 每 3 秒推进一格进度:用来验证状态条会跟着引擎上报刷新 */
  32. if (tick % 10 === 0 && done < 3) {
  33. done += 1;
  34. report({ status: "running", phase: "已处理 " + done + "/3", done: done, total: 3 });
  35. }
  36. var content = "";
  37. try {
  38. if (files.exists(STOP)) {
  39. content = String(files.read(STOP)).replace(/\s/g, "");
  40. }
  41. } catch (e) { }
  42. if (content !== "" && content === RUN_ID) {
  43. report({ status: "stopped", phase: "", message: "已停止(假引擎)" });
  44. exit();
  45. }
  46. sleep(300);
  47. }
  48. report({ status: "finished", phase: "", done: 3, total: 3, message: "跑完了(假引擎)" });