Skip to content

Commit 3c7d75f

Browse files
committed
WIP: convert to local runner
1 parent 596a16a commit 3c7d75f

File tree

3 files changed

+145
-0
lines changed

3 files changed

+145
-0
lines changed

package-lock.json

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/runner-local/index.mjs

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
import { dirname } from 'node:path';
2+
import { execFile } from 'node:child_process';
3+
import { fileURLToPath } from 'node:url';
4+
5+
function runInstall (opts) {
6+
const { cwd, signal } = opts;
7+
return new Promise((resolve, reject) => {
8+
// TODO: apply overerides
9+
const cp = execFile(process.execPath, ['--run', 'setup'], {
10+
cwd
11+
});
12+
13+
signal?.addEventListener('abort', () => {
14+
cp.kill('SIGINT');
15+
reject(new Error('aborted'));
16+
});
17+
cp.on('error', reject);
18+
cp.on('close', resolve);
19+
cp.stdout.on('data', (d) => {
20+
process.stdout.write(d);
21+
});
22+
cp.stderr.on('data', (d) => {
23+
process.stderr.write(d);
24+
});
25+
});
26+
}
27+
28+
export function startServer (opts = {}) {
29+
return new Promise((resolve, reject) => {
30+
const test = fileURLToPath(import.meta.resolve(opts.test));
31+
const testDir = dirname(test);
32+
return runInstall({
33+
cwd: testDir,
34+
signal: opts.signal
35+
}).then(() => {
36+
const cp = execFile(process.execPath, [ test ], {
37+
cwd: opts.cwd
38+
});
39+
40+
const server = {
41+
metadata: {
42+
url: new URL('http://localhost:3000'),
43+
},
44+
status: 'starting',
45+
close: () => {
46+
return new Promise((closeResolve) => {
47+
cp.on('exit', () => {
48+
closeResolve();
49+
});
50+
cp.kill('SIGINT');
51+
});
52+
},
53+
result: async () => {
54+
return { };
55+
}
56+
};
57+
58+
opts?.signal.addEventListener('abort', () => {
59+
server.status = 'aborted';
60+
cp.kill('SIGINT');
61+
reject(new Error('aborted'));
62+
});
63+
cp.on('error', reject);
64+
cp.stdout.on('data', (d) => {
65+
process.stdout.write(d);
66+
if (server.status === 'starting' && d.toString('utf8').includes("Running")) {
67+
server.status = 'started';
68+
resolve(server);
69+
}
70+
});
71+
cp.stderr.on('data', (d) => {
72+
process.stderr.write(d);
73+
});
74+
}, reject);
75+
});
76+
}
77+
78+
export async function startClient (_opts = {}, server) {
79+
const opts = {
80+
..._opts
81+
};
82+
if (opts?.signal.aborted) {
83+
return;
84+
}
85+
86+
87+
return {
88+
metadata: {},
89+
close: async () => {
90+
91+
},
92+
results: () => {
93+
return {};
94+
}
95+
};
96+
}
97+
98+
export default async function runner (_opts = {}) {
99+
// Start up the server, then the client
100+
const opts = {
101+
..._opts
102+
};
103+
104+
console.warn('warning: many options ignored with local runner: repo, repoRef, node');
105+
106+
const server = await startServer(opts);
107+
// const client = await startClient(opts, server);
108+
109+
// Wait for the client to finish, then the server
110+
// const clientResults = await client.results();
111+
const serverResults = await server.results();
112+
113+
// await client.close();
114+
await server.close();
115+
116+
return {
117+
serverMetadata: server.metadata,
118+
// clientMetadata: client.metadata,
119+
serverResults,
120+
// clientResults
121+
};
122+
}

packages/runner-local/package.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"name": "@expressjs/perf-runner-local",
3+
"version": "1.0.0",
4+
"description": "",
5+
"main": "index.mjs",
6+
"devDependencies": {},
7+
"scripts": {
8+
"test": "echo \"Error: no test specified\" && exit 1"
9+
},
10+
"keywords": [],
11+
"author": "",
12+
"license": "ISC"
13+
}

0 commit comments

Comments
 (0)