History

fix: use 'close' event for seed process and deduplicate buildPerfServerEnv

- Change once(seedProcess, 'exit') to once(seedProcess, 'close') in appHarness.ts and open-perf-app.ts to ensure piped stdio buffers are fully drained before parsing stdout. - Extract buildPerfServerEnv into @t3tools/shared/perf/serverEnv to eliminate identical copies in serverPerfHarness.ts and web serverEnv.ts. Both consumers now import from the shared module.

Cursor Agent committed 7 months ago

Commit 82b82601 parent 0be82d36 files · +39 −54Browse files

Unified · Split

6 files
  1. apps/server/integration/perf/serverPerfHarness.ts +1 −25
  2. apps/web/test/perf/appHarness.ts +1 −1
  3. apps/web/test/perf/serverEnv.ts +5 −27
  4. packages/shared/package.json +4 −0
  5. packages/shared/src/perf/serverEnv.ts +27 −0
  6. scripts/open-perf-app.ts +1 −1
apps/server/integration/perf/serverPerfHarness.ts+1−25
@@ -33,13 +33,11 @@ import type { · 32 unmodified lines
3333 PerfProviderScenarioId,
3434 PerfSeedScenarioId,
3535 } from "@t3tools/shared/perf/scenarioCatalog";
36+import { buildPerfServerEnv } from "@t3tools/shared/perf/serverEnv";
3637 import { seedPerfState, type PerfSeededState } from "./seedPerfState.ts";
3738
3839 const repoRoot = fileURLToPath(new URL("../../../../", import.meta.url));
3940 const PERF_ARTIFACT_DIR_ENV = "T3CODE_PERF_ARTIFACT_DIR";
40−const PERF_PROVIDER_ENV = "T3CODE_PERF_PROVIDER";
41−const PERF_SCENARIO_ENV = "T3CODE_PERF_SCENARIO";
42−const AUTO_BOOTSTRAP_PROJECT_ENV = "T3CODE_AUTO_BOOTSTRAP_PROJECT_FROM_CWD";
4341
4442 const makeWsRpcClient = RpcClient.make(WsRpcGroup);
4543 type WsRpcClient =
@@ -184,28 +182,6 @@ async function writeServerLogs( · 138 unmodified lines
184182 ]);
185183 }
186184
187−function buildPerfServerEnv(
188− baseEnv: NodeJS.ProcessEnv,
189− providerScenarioId?: PerfProviderScenarioId,
190−): NodeJS.ProcessEnv {
191− const env: NodeJS.ProcessEnv = {
192− ...baseEnv,
193− [AUTO_BOOTSTRAP_PROJECT_ENV]: "false",
194− };
195−
196− if (!providerScenarioId) {
197− delete env[PERF_PROVIDER_ENV];
198− delete env[PERF_SCENARIO_ENV];
199− return env;
200− }
201−
202− return {
203− ...env,
204− [PERF_PROVIDER_ENV]: "1",
205− [PERF_SCENARIO_ENV]: providerScenarioId,
206− };
207−}
208−
209185 export class PerfWsRpcClient {
210186 private readonly runtime: ManagedRuntime.ManagedRuntime<RpcClient.Protocol, never>;
211187 private readonly clientScope: Scope.Closeable;
apps/web/test/perf/appHarness.ts+1−1
@@ -266,7 +266,7 @@ export async function startPerfAppHarness( · 265 unmodified lines
266266 seedProcess.stderr?.on("data", (chunk) => {
267267 stderr += chunk.toString();
268268 });
269− const [exitCode] = (await once(seedProcess, "exit")) as [number | null];
269+ const [exitCode] = (await once(seedProcess, "close")) as [number | null];
270270 if (exitCode !== 0) {
271271 throw new Error(`Perf seed command failed with code ${exitCode ?? "unknown"}.\n${stderr}`);
272272 }
apps/web/test/perf/serverEnv.ts+5−27
@@ -1,27 +1,5 @@
1−import type { PerfProviderScenarioId } from "@t3tools/shared/perf/scenarioCatalog";
2−
3−export const PERF_PROVIDER_ENV = "T3CODE_PERF_PROVIDER";
4−export const PERF_SCENARIO_ENV = "T3CODE_PERF_SCENARIO";
5−const AUTO_BOOTSTRAP_PROJECT_ENV = "T3CODE_AUTO_BOOTSTRAP_PROJECT_FROM_CWD";
6−
7−export function buildPerfServerEnv(
8− baseEnv: NodeJS.ProcessEnv,
9− providerScenarioId?: PerfProviderScenarioId,
10−): NodeJS.ProcessEnv {
11− const env: NodeJS.ProcessEnv = {
12− ...baseEnv,
13− [AUTO_BOOTSTRAP_PROJECT_ENV]: "false",
14− };
15−
16− if (!providerScenarioId) {
17− delete env[PERF_PROVIDER_ENV];
18− delete env[PERF_SCENARIO_ENV];
19− return env;
20− }
21−
22− return {
23− ...env,
24− [PERF_PROVIDER_ENV]: "1",
25− [PERF_SCENARIO_ENV]: providerScenarioId,
26− };
27−}
1+export {
2+ buildPerfServerEnv,
3+ PERF_PROVIDER_ENV,
4+ PERF_SCENARIO_ENV,
5+} from "@t3tools/shared/perf/serverEnv";
packages/shared/package.json+4−0
@@ -51,6 +51,10 @@ · 50 unmodified lines
5151 "./perf/artifact": {
5252 "types": "./src/perf/artifact.ts",
5353 "import": "./src/perf/artifact.ts"
54+ },
55+ "./perf/serverEnv": {
56+ "types": "./src/perf/serverEnv.ts",
57+ "import": "./src/perf/serverEnv.ts"
5458 }
5559 },
5660 "scripts": {
packages/shared/src/perf/serverEnv.ts+27−0
@@ -0,0 +1,27 @@
1+import type { PerfProviderScenarioId } from "./scenarioCatalog.ts";
2+
3+export const PERF_PROVIDER_ENV = "T3CODE_PERF_PROVIDER";
4+export const PERF_SCENARIO_ENV = "T3CODE_PERF_SCENARIO";
5+const AUTO_BOOTSTRAP_PROJECT_ENV = "T3CODE_AUTO_BOOTSTRAP_PROJECT_FROM_CWD";
6+
7+export function buildPerfServerEnv(
8+ baseEnv: NodeJS.ProcessEnv,
9+ providerScenarioId?: PerfProviderScenarioId,
10+): NodeJS.ProcessEnv {
11+ const env: NodeJS.ProcessEnv = {
12+ ...baseEnv,
13+ [AUTO_BOOTSTRAP_PROJECT_ENV]: "false",
14+ };
15+
16+ if (!providerScenarioId) {
17+ delete env[PERF_PROVIDER_ENV];
18+ delete env[PERF_SCENARIO_ENV];
19+ return env;
20+ }
21+
22+ return {
23+ ...env,
24+ [PERF_PROVIDER_ENV]: "1",
25+ [PERF_SCENARIO_ENV]: providerScenarioId,
26+ };
27+}
scripts/open-perf-app.ts+1−1
@@ -208,7 +208,7 @@ async function seedPerfState(scenarioId: PerfSeedScenarioId): Promise<PerfSeeded · 207 unmodified lines
208208 stderr += chunk.toString();
209209 });
210210
211− const [exitCode] = (await once(seedProcess, "exit")) as [number | null];
211+ const [exitCode] = (await once(seedProcess, "close")) as [number | null];
212212 if (exitCode !== 0) {
213213 throw new Error(`Perf seed command failed with code ${exitCode ?? "unknown"}.\n${stderr}`);
214214 }