Skip to content

Commit dc8be28

Browse files
authored
Merge pull request #17 from horgh/horgh/fds
Add option to pass in additional fds
2 parents ae67842 + 107232d commit dc8be28

File tree

3 files changed

+61
-1
lines changed

3 files changed

+61
-1
lines changed

lib/server-starter.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,21 @@ export default class ServerStarter extends EventEmitter {
4343
* @param {object} [options.env=process.env] - Environment key-value pairs.
4444
* @param {boolean} [options.stdout=false] - Forward server output from STDOUT to STDOUT.
4545
* @param {boolean} [options.stderr=true] - Forward server output from STDERR to STDERR.
46+
* @param {number[]} [options.fds=[]] - Additional fds to pass to the server process.
4647
*/
4748
launch(cmd, args, options = {}) {
4849
if (this._process !== undefined) throw new Error('Server already launched');
4950
const stdout = options.stdout ?? false;
5051
const stderr = options.stderr ?? true;
5152

52-
const spawnOptions = {stdio: ['pipe', 'pipe', 'pipe', this._fd]};
53+
const fds = ['pipe', 'pipe', 'pipe', this._fd];
54+
55+
if (options.fds !== undefined) {
56+
fds.push(...options.fds);
57+
}
58+
59+
const spawnOptions = {stdio: fds};
60+
5361
if (options.env !== undefined) spawnOptions.env = options.env;
5462

5563
const proc = (this._process = spawn(cmd, args, spawnOptions));

test/start_fd.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,3 +93,44 @@ t.test('Set env', async t => {
9393
await server.close();
9494
t.equal(server.pid, null);
9595
});
96+
97+
t.test('Use additional fd', async t => {
98+
const server = await ServerStarter.newServer();
99+
t.equal(server.pid, null);
100+
101+
const ln = await getListener();
102+
103+
await server.launch('node', ['test/support/server_fd.js', '-additional-fd'], {fds: [ln.fd]});
104+
t.equal(typeof server.pid, 'number');
105+
106+
await new Promise(resolve => ln.srv.close(resolve));
107+
108+
const ua = new UserAgent({baseURL: server.url()});
109+
const res = await ua.get('/');
110+
t.equal(res.isSuccess, true);
111+
t.equal(res.get('Content-Type'), 'text/plain');
112+
t.equal(await res.text(), 'Hello World!');
113+
114+
const ua2 = new UserAgent({baseURL: `http://127.0.0.1:${ln.port}`});
115+
const res2 = await ua2.get('/');
116+
t.equal(res2.isSuccess, true);
117+
t.equal(res2.get('Content-Type'), 'text/plain');
118+
t.equal(await res2.text(), 'Hello again World!');
119+
120+
await server.close();
121+
t.equal(server.pid, null);
122+
});
123+
124+
function getListener() {
125+
return new Promise((resolve, reject) => {
126+
const srv = net.createServer();
127+
srv.on('error', reject);
128+
srv.listen(0, () => {
129+
resolve({
130+
fd: srv._handle.fd,
131+
port: srv.address().port,
132+
srv: srv
133+
});
134+
});
135+
});
136+
}

test/support/server_fd.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,14 @@ const server = http.createServer((req, res) => {
88
res.end('Hello World!');
99
});
1010
server.listen({fd: 3});
11+
12+
if (process.argv.length > 2 && process.argv[2] === '-additional-fd') {
13+
const server2 = http.createServer((req, res) => {
14+
res.writeHead(200, {
15+
'Content-Type': 'text/plain',
16+
'X-Env': JSON.stringify(process.env)
17+
});
18+
res.end('Hello again World!');
19+
});
20+
server2.listen({fd: 4});
21+
}

0 commit comments

Comments
 (0)