From 8b7166e4ed3827e27569dbabd08ebf68cdd296a7 Mon Sep 17 00:00:00 2001 From: David Walker Date: Sun, 30 Apr 2023 16:31:29 -0700 Subject: [PATCH] UI: Fix (most) perf issues in Active Scripts (#498) --- .../WorkerScriptStartStopEventEmitter.ts | 4 --- src/Netscript/killWorkerScript.ts | 2 -- src/NetscriptWorker.ts | 2 -- src/ui/ActiveScripts/ActiveScriptsRoot.tsx | 2 +- src/ui/ActiveScripts/ServerAccordions.tsx | 13 +--------- test/jest/Netscript/RunScript.test.ts | 26 +++++++------------ 6 files changed, 11 insertions(+), 38 deletions(-) delete mode 100644 src/Netscript/WorkerScriptStartStopEventEmitter.ts diff --git a/src/Netscript/WorkerScriptStartStopEventEmitter.ts b/src/Netscript/WorkerScriptStartStopEventEmitter.ts deleted file mode 100644 index 45a703fdc..000000000 --- a/src/Netscript/WorkerScriptStartStopEventEmitter.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { EventEmitter } from "../utils/EventEmitter"; - -/** Event emitter that triggers when scripts are started/stopped */ -export const WorkerScriptStartStopEventEmitter = new EventEmitter<[]>(); diff --git a/src/Netscript/killWorkerScript.ts b/src/Netscript/killWorkerScript.ts index 354ed2912..0d0195477 100644 --- a/src/Netscript/killWorkerScript.ts +++ b/src/Netscript/killWorkerScript.ts @@ -5,7 +5,6 @@ import { ScriptDeath } from "./ScriptDeath"; import { WorkerScript } from "./WorkerScript"; import { workerScripts } from "./WorkerScripts"; -import { WorkerScriptStartStopEventEmitter } from "./WorkerScriptStartStopEventEmitter"; import { GetServer } from "../Server/AllServers"; import { AddRecentScript } from "./RecentScripts"; @@ -91,5 +90,4 @@ function removeWorkerScript(workerScript: WorkerScript): void { workerScripts.delete(workerScript.pid); AddRecentScript(workerScript); - WorkerScriptStartStopEventEmitter.emit(); } diff --git a/src/NetscriptWorker.ts b/src/NetscriptWorker.ts index 12a9914c1..91cc8dd1e 100644 --- a/src/NetscriptWorker.ts +++ b/src/NetscriptWorker.ts @@ -6,7 +6,6 @@ import { killWorkerScript } from "./Netscript/killWorkerScript"; import { ScriptDeath } from "./Netscript/ScriptDeath"; import { WorkerScript } from "./Netscript/WorkerScript"; import { workerScripts } from "./Netscript/WorkerScripts"; -import { WorkerScriptStartStopEventEmitter } from "./Netscript/WorkerScriptStartStopEventEmitter"; import { generateNextPid } from "./Netscript/Pid"; import { CONSTANTS } from "./Constants"; @@ -311,7 +310,6 @@ function createAndAddWorkerScript(runningScriptObj: RunningScript, server: BaseS // Add the WorkerScript to the global pool workerScripts.set(pid, workerScript); - WorkerScriptStartStopEventEmitter.emit(); // Start the script's execution using the correct function for file type (workerScript.name.endsWith(".js") ? startNetscript2Script : startNetscript1Script)(workerScript) diff --git a/src/ui/ActiveScripts/ActiveScriptsRoot.tsx b/src/ui/ActiveScripts/ActiveScriptsRoot.tsx index b62d4ee33..601288d63 100644 --- a/src/ui/ActiveScripts/ActiveScriptsRoot.tsx +++ b/src/ui/ActiveScripts/ActiveScriptsRoot.tsx @@ -17,7 +17,7 @@ interface IProps { export function ActiveScriptsRoot(props: IProps): React.ReactElement { const [tab, setTab] = useState<"active" | "recent">("active"); - useRerender(200); + useRerender(400); function handleChange(event: React.SyntheticEvent, tab: "active" | "recent"): void { setTab(tab); diff --git a/src/ui/ActiveScripts/ServerAccordions.tsx b/src/ui/ActiveScripts/ServerAccordions.tsx index 11820219b..956c4791c 100644 --- a/src/ui/ActiveScripts/ServerAccordions.tsx +++ b/src/ui/ActiveScripts/ServerAccordions.tsx @@ -2,7 +2,7 @@ * React Component for rendering the Accordion elements for all servers * on which scripts are running */ -import React, { useState, useEffect } from "react"; +import React, { useState } from "react"; import { ServerAccordion } from "./ServerAccordion"; @@ -10,13 +10,11 @@ import TextField from "@mui/material/TextField"; import List from "@mui/material/List"; import TablePagination from "@mui/material/TablePagination"; import { WorkerScript } from "../../Netscript/WorkerScript"; -import { WorkerScriptStartStopEventEmitter } from "../../Netscript/WorkerScriptStartStopEventEmitter"; import { GetServer } from "../../Server/AllServers"; import { BaseServer } from "../../Server/BaseServer"; import { Settings } from "../../Settings/Settings"; import { TablePaginationActionsAll } from "../React/TablePaginationActionsAll"; import SearchIcon from "@mui/icons-material/Search"; -import { useRerender } from "../React/hooks"; import { matchScriptPathUnanchored } from "../../utils/helpers/scriptKey"; import lodash from "lodash"; @@ -38,13 +36,6 @@ export function ServerAccordions(props: IProps): React.ReactElement { const [filter, setFilter] = useState(""); const [page, setPage] = useState(0); const [rowsPerPage, setRowsPerPage] = useState(Settings.ActiveScriptsServerPageSize); - const rerenderHook = useRerender(); - let scheduledRerender = false; - const rerender = () => { - if (scheduledRerender) return; - scheduledRerender = true; - requestAnimationFrame(rerenderHook); - }; const handleChangePage = (event: unknown, newPage: number): void => { setPage(newPage); @@ -92,8 +83,6 @@ export function ServerAccordions(props: IProps): React.ReactElement { return false; }); - useEffect(() => WorkerScriptStartStopEventEmitter.subscribe(rerender)); - return ( <> { - eventDelete = WorkerScriptStartStopEventEmitter.subscribe(() => { - for (const byPid of server.runningScriptMap.values()) { - for (const rs of byPid.values()) { - if (rs === runningScript) return; - } - } - resolve(null); - }); - }), - ]); + const pid = startWorkerScript(runningScript, server); + expect(pid).toBeGreaterThan(0); + // Manually attach an atExit to the now-created WorkerScript, so we can + // await script death. + const ws = workerScripts.get(pid); + expect(ws).toBeDefined(); + const result = await Promise.race([alerted, new Promise((resolve) => (ws.atExit = resolve))]); // If an error alert was thrown, we catch it here. - expect(result).toBeNull(); + expect(result).not.toBeDefined(); expect(runningScript.logs).toEqual(expectedLog); } finally { eventDelete();