Skip to content

Commit 439f094

Browse files
committed
added wait
1 parent f9c080e commit 439f094

File tree

8 files changed

+118
-47
lines changed

8 files changed

+118
-47
lines changed

README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,12 @@ const obj = srvd.serve({
3838

3939
// root directory to serve files from
4040
// default is the common working directory
41-
root: "/tmp/test"
41+
root: "/tmp/test",
42+
43+
// how long to wait for requests in seconds
44+
// before shutting down
45+
// defaults to 60 seconds
46+
wait: 30
4247
});
4348
```
4449
serve returns the following object:

bin/srvd.js

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ const finalhandler = require("finalhandler");
77

88
const DEFAULT_PORT = 8080;
99

10-
function serve ({ acceptRanges = true, debug = false, root, port } = { acceptRanges: true }) {
10+
const TRUES = ["TRUE", "True", "true", true];
11+
12+
function serve({ acceptRanges = true, debug = false, wait = 60, root, port } = { acceptRanges: true, wait: 60 }) {
1113
// console.log(arguments);
1214
if (!root) {
1315
root = process.cwd();
@@ -17,38 +19,63 @@ function serve ({ acceptRanges = true, debug = false, root, port } = { acceptRan
1719
if (!port) port = process.env.SRVD_DEFAULT_PORT ? process.env.SRVD_DEFAULT_PORT : DEFAULT_PORT;
1820
port = parseInt(port);
1921

20-
const serve = serveStatic(root, {
21-
acceptRanges
22-
});
22+
if (!wait) wait = 5;
23+
wait = parseInt(wait);
24+
if (debug) console.log(`[srvd] waiting ${wait} seconds for requests`);
25+
const wait_ms = wait * 1000;
2326

24-
const server = http.createServer(function onRequest(req, res) {
25-
serve(req, res, finalhandler(req, res));
26-
});
27+
const serve = serveStatic(root, { acceptRanges });
2728

28-
server.listen(port);
29-
if (debug) console.log("[srvd] serving on port " + port);
29+
let last = Date.now();
30+
let server;
31+
32+
let checkWaitTimeout, checkForCloseTimeout;
33+
34+
function clearTimeouts() {
35+
if (checkWaitTimeout) clearTimeout(checkWaitTimeout);
36+
if (checkForCloseTimeout) clearTimeout(checkForCloseTimeout);
37+
}
38+
39+
function checkWait() {
40+
if (Date.now() - last > wait_ms) {
41+
if (debug) console.log(`[srvd] we haven't received a request in ${wait} seconds, so closing the server`);
42+
clearTimeouts();
43+
server.close();
44+
}
45+
}
3046

3147
function checkForCloseRequest() {
32-
if (["TRUE","True","true"].includes(process.env.SRVD_PLZ_CLOSE)) {
48+
if (TRUES.includes(process.env.SRVD_PLZ_CLOSE)) {
49+
clearTimeouts();
3350
server.close();
34-
} else {
35-
setTimeout(() => checkForCloseRequest(), 500);
3651
}
3752
}
38-
setTimeout(() => checkForCloseRequest(), 500);
3953

40-
return { acceptRanges, debug, server, port, root };
41-
};
54+
server = http.createServer(function onRequest(req, res) {
55+
last = Date.now();
56+
serve(req, res, finalhandler(req, res));
57+
});
58+
59+
server.listen(port);
60+
if (debug) console.log("[srvd] serving on port " + port);
61+
62+
checkWaitTimeout = setInterval(checkWait, 500);
63+
checkForCloseTimeout = setInterval(checkForCloseRequest, 500);
64+
server.on("close", () => clearTimeouts());
65+
66+
return { acceptRanges, debug, server, port, root, wait };
67+
}
4268

4369
module.exports = { serve };
4470

4571
if (require.main === module) {
4672
const args = Array.from(process.argv);
47-
const str = args.join(" ");
73+
const str = args.join(" ");
4874

4975
serve({
5076
debug: !!str.match(/-?-debug((=|== )(true|True|TRUE))?/),
5177
port: Array.prototype.slice.call(str.match(/-?-port(?:=|== )(\d+)/) || [], 1)[0],
52-
root: Array.prototype.slice.call(str.match(/-?-root(?:=|== )([^ ]+)/) || [], 1)[0]
78+
root: Array.prototype.slice.call(str.match(/-?-root(?:=|== )([^ ]+)/) || [], 1)[0],
79+
wait: Array.prototype.slice.call(str.match(/-?-wait(?:=|== )(\d+)/) || [], 1)[0]
5380
});
5481
}

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
],
1313
"scripts": {
1414
"build": "mkdir -p bin && echo \"#!/usr/bin/env node\n\" > ./bin/srvd.js && cat srvd.js >> ./bin/srvd.js",
15-
"format": "npx prettier --arrow-parens=avoid --print-width=120 --trailing-comma=none --write srvd.js test.js",
16-
"test": "node test.js"
15+
"format": "npx prettier --arrow-parens=avoid --print-width=120 --trailing-comma=none --write srvd.js *.js test/*.js",
16+
"test": "node test/test.cb.js && node test/test.env.js && node test/test.wait.js"
1717
},
1818
"repository": {
1919
"type": "git",

srvd.js

Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ const finalhandler = require("finalhandler");
55

66
const DEFAULT_PORT = 8080;
77

8-
function serve({ acceptRanges = true, debug = false, root, port } = { acceptRanges: true }) {
8+
const TRUES = ["TRUE", "True", "true", true];
9+
10+
function serve({ acceptRanges = true, debug = false, wait = 60, root, port } = { acceptRanges: true, wait: 60 }) {
911
// console.log(arguments);
1012
if (!root) {
1113
root = process.cwd();
@@ -15,27 +17,51 @@ function serve({ acceptRanges = true, debug = false, root, port } = { acceptRang
1517
if (!port) port = process.env.SRVD_DEFAULT_PORT ? process.env.SRVD_DEFAULT_PORT : DEFAULT_PORT;
1618
port = parseInt(port);
1719

18-
const serve = serveStatic(root, {
19-
acceptRanges
20-
});
20+
if (!wait) wait = 5;
21+
wait = parseInt(wait);
22+
if (debug) console.log(`[srvd] waiting ${wait} seconds for requests`);
23+
const wait_ms = wait * 1000;
2124

22-
const server = http.createServer(function onRequest(req, res) {
23-
serve(req, res, finalhandler(req, res));
24-
});
25+
const serve = serveStatic(root, { acceptRanges });
2526

26-
server.listen(port);
27-
if (debug) console.log("[srvd] serving on port " + port);
27+
let last = Date.now();
28+
let server;
29+
30+
let checkWaitTimeout, checkForCloseTimeout;
31+
32+
function clearTimeouts() {
33+
if (checkWaitTimeout) clearTimeout(checkWaitTimeout);
34+
if (checkForCloseTimeout) clearTimeout(checkForCloseTimeout);
35+
}
36+
37+
function checkWait() {
38+
if (Date.now() - last > wait_ms) {
39+
if (debug) console.log(`[srvd] we haven't received a request in ${wait} seconds, so closing the server`);
40+
clearTimeouts();
41+
server.close();
42+
}
43+
}
2844

2945
function checkForCloseRequest() {
30-
if (["TRUE", "True", "true"].includes(process.env.SRVD_PLZ_CLOSE)) {
46+
if (TRUES.includes(process.env.SRVD_PLZ_CLOSE)) {
47+
clearTimeouts();
3148
server.close();
32-
} else {
33-
setTimeout(() => checkForCloseRequest(), 500);
3449
}
3550
}
36-
setTimeout(() => checkForCloseRequest(), 500);
3751

38-
return { acceptRanges, debug, server, port, root };
52+
server = http.createServer(function onRequest(req, res) {
53+
last = Date.now();
54+
serve(req, res, finalhandler(req, res));
55+
});
56+
57+
server.listen(port);
58+
if (debug) console.log("[srvd] serving on port " + port);
59+
60+
checkWaitTimeout = setInterval(checkWait, 500);
61+
checkForCloseTimeout = setInterval(checkForCloseRequest, 500);
62+
server.on("close", () => clearTimeouts());
63+
64+
return { acceptRanges, debug, server, port, root, wait };
3965
}
4066

4167
module.exports = { serve };
@@ -47,6 +73,7 @@ if (require.main === module) {
4773
serve({
4874
debug: !!str.match(/-?-debug((=|== )(true|True|TRUE))?/),
4975
port: Array.prototype.slice.call(str.match(/-?-port(?:=|== )(\d+)/) || [], 1)[0],
50-
root: Array.prototype.slice.call(str.match(/-?-root(?:=|== )([^ ]+)/) || [], 1)[0]
76+
root: Array.prototype.slice.call(str.match(/-?-root(?:=|== )([^ ]+)/) || [], 1)[0],
77+
wait: Array.prototype.slice.call(str.match(/-?-wait(?:=|== )(\d+)/) || [], 1)[0]
5178
});
5279
}

test.js

Lines changed: 0 additions & 12 deletions
This file was deleted.

test/test.cb.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
const test = require("flug");
2+
const srvd = require("../srvd");
3+
4+
test("shutting down via callback", ({ eq }) => {
5+
const { server } = srvd.serve({ debug: true });
6+
server.close();
7+
});

test/test.env.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
const test = require("flug");
2+
const srvd = require("../srvd");
3+
4+
test("shutting down via env", ({ eq }) => {
5+
srvd.serve();
6+
process.env.SRVD_PLZ_CLOSE = true;
7+
});

test/test.wait.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
const test = require("flug");
2+
const srvd = require("../srvd");
3+
4+
test("shutting down after 5 seconds", ({ eq }) => {
5+
srvd.serve({
6+
debug: true,
7+
port: 8082,
8+
wait: 5
9+
});
10+
});

0 commit comments

Comments
 (0)