config.open_browser_at_start

Massimo Melina committed Jan 17, 2022 at 20:48 UTC 0dccb87baa59965ce57024f5e95d8899f870b1f0
5 files changed +120 -34
config.yaml
+1
@@ -4,6 +4,7 @@
4 #log:
5 #error_log:
6 #zip-calculate-size-for-seconds: 1
7 +#open_browser_at_start: false
8 mime:
9 "*.jpg|*.png|*.mp3|*.txt": auto
10 disable_plugins: [ 'theme-example', 'middleware-example', 'download-counter' ]
package-lock.json
+78
@@ -22,6 +22,7 @@
22 "limiter": "^2.1.0",
23 "lodash": "^4.17.21",
24 "minimist": "^1.2.5",
25 + "open": "^8.4.0",
26 "tssrp6a": "^3.0.0",
27 "yaml": "^2.0.0-10"
28 },
@@ -1428,6 +1429,14 @@
1429 "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
1430 "dev": true
1431 },
1432 + "node_modules/define-lazy-prop": {
1433 + "version": "2.0.0",
1434 + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
1435 + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
1436 + "engines": {
1437 + "node": ">=8"
1438 + }
1439 + },
1440 "node_modules/delegates": {
1441 "version": "1.0.0",
1442 "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
@@ -2063,6 +2072,20 @@
2072 "url": "https://github.com/sponsors/ljharb"
2073 }
2074 },
2075 + "node_modules/is-docker": {
2076 + "version": "2.2.1",
2077 + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
2078 + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
2079 + "bin": {
2080 + "is-docker": "cli.js"
2081 + },
2082 + "engines": {
2083 + "node": ">=8"
2084 + },
2085 + "funding": {
2086 + "url": "https://github.com/sponsors/sindresorhus"
2087 + }
2088 + },
2089 "node_modules/is-extglob": {
2090 "version": "2.1.1",
2091 "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -2196,6 +2219,17 @@
2219 "url": "https://github.com/sponsors/sindresorhus"
2220 }
2221 },
2222 + "node_modules/is-wsl": {
2223 + "version": "2.2.0",
2224 + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
2225 + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
2226 + "dependencies": {
2227 + "is-docker": "^2.0.0"
2228 + },
2229 + "engines": {
2230 + "node": ">=8"
2231 + }
2232 + },
2233 "node_modules/is-yarn-global": {
2234 "version": "0.3.0",
2235 "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
@@ -3127,6 +3161,22 @@
3161 "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz",
3162 "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q="
3163 },
3164 + "node_modules/open": {
3165 + "version": "8.4.0",
3166 + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz",
3167 + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
3168 + "dependencies": {
3169 + "define-lazy-prop": "^2.0.0",
3170 + "is-docker": "^2.1.1",
3171 + "is-wsl": "^2.2.0"
3172 + },
3173 + "engines": {
3174 + "node": ">=12"
3175 + },
3176 + "funding": {
3177 + "url": "https://github.com/sponsors/sindresorhus"
3178 + }
3179 + },
3180 "node_modules/p-cancelable": {
3181 "version": "1.1.0",
3182 "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
@@ -5269,6 +5319,11 @@
5319 "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
5320 "dev": true
5321 },
5322 + "define-lazy-prop": {
5323 + "version": "2.0.0",
5324 + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
5325 + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og=="
5326 + },
5327 "delegates": {
5328 "version": "1.0.0",
5329 "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
@@ -5739,6 +5794,11 @@
5794 "has": "^1.0.3"
5795 }
5796 },
5797 + "is-docker": {
5798 + "version": "2.2.1",
5799 + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
5800 + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="
5801 + },
5802 "is-extglob": {
5803 "version": "2.1.1",
5804 "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -5827,6 +5887,14 @@
5887 "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
5888 "dev": true
5889 },
5890 + "is-wsl": {
5891 + "version": "2.2.0",
5892 + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
5893 + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
5894 + "requires": {
5895 + "is-docker": "^2.0.0"
5896 + }
5897 + },
5898 "is-yarn-global": {
5899 "version": "0.3.0",
5900 "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
@@ -6533,6 +6601,16 @@
6601 "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz",
6602 "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q="
6603 },
6604 + "open": {
6605 + "version": "8.4.0",
6606 + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz",
6607 + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
6608 + "requires": {
6609 + "define-lazy-prop": "^2.0.0",
6610 + "is-docker": "^2.1.1",
6611 + "is-wsl": "^2.2.0"
6612 + }
6613 + },
6614 "p-cancelable": {
6615 "version": "1.1.0",
6616 "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
package.json
+1
@@ -42,6 +42,7 @@
42 "limiter": "^2.1.0",
43 "lodash": "^4.17.21",
44 "minimist": "^1.2.5",
45 + "open": "^8.4.0",
46 "tssrp6a": "^3.0.0",
47 "yaml": "^2.0.0-10"
48 },
src/index.ts
+3 -34
@@ -3,23 +3,21 @@ import mount from 'koa-mount'
3 import bodyParser from 'koa-bodyparser'
4 import { apiMiddleware } from './apis'
5 import { API_URI, DEV} from './const'
6 -import { Server } from 'http'
7 -import { subscribeConfig } from './config'
6 import { frontEndApis } from './frontEndApis'
7 import { log } from './log'
8 import { pluginsMiddleware } from './plugins'
9 import { throttler } from './throttler'
10 import { getAccount, getCurrentUsername } from './perm'
11 import { headRequests, gzipper, sessions, frontendAndSharedFiles } from './middlewares'
12 +import './listen'
13
14 export const BUILD_TIMESTAMP = "-"
16 -
15 export const SESSION_DURATION = 30*60_000
16
17 console.log('started', new Date().toLocaleString())
20 -console.log('build', BUILD_TIMESTAMP)
18 +console.log('build', BUILD_TIMESTAMP, DEV)
19 console.debug('cwd', process.cwd())
22 -const app = new Koa()
20 +export const app = new Koa()
21 app.keys = ['hfs-keys-test']
22 app.use(sessions(app))
23 app.use(async (ctx, next) => {
@@ -49,32 +47,3 @@ app.on('error', err => {
47 process.on('uncaughtException', err => {
48 console.error(err)
49 })
52 -
53 -let srv: Server
54 -subscribeConfig({ k:'port', defaultValue: 80 }, async (port: number) => {
55 - await new Promise(resolve => {
56 - if (!srv)
57 - return resolve(null)
58 - srv.close(err => {
59 - if (err && (err as any).code !== 'ERR_SERVER_NOT_RUNNING')
60 - console.debug('failed to stop server', String(err))
61 - resolve(err)
62 - })
63 - })
64 - await new Promise(resolve => {
65 - try {
66 - srv = app.listen(port, () => {
67 - console.log('running on port', port, DEV)
68 - resolve(null)
69 - }).on('error', e => {
70 - const { code } = e as any
71 - if (code === 'EADDRINUSE')
72 - console.error(`couldn't listen on busy port ${port}`)
73 - })
74 - }
75 - catch(e) {
76 - console.error("couldn't listen on port", port, String(e))
77 - }
78 -
79 - })
80 -})
src/listen.ts new
+37
@@ -0,0 +1,37 @@
1 +import { Server } from 'http'
2 +import { getConfig, subscribeConfig } from './config'
3 +import open from 'open'
4 +import { app } from './index'
5 +
6 +let srv: Server
7 +let firstTime = true
8 +subscribeConfig({ k:'port', defaultValue: 80 }, async (port: number) => {
9 + await new Promise(resolve => {
10 + if (!srv)
11 + return resolve(null)
12 + srv.close(err => {
13 + if (err && (err as any).code !== 'ERR_SERVER_NOT_RUNNING')
14 + console.debug('failed to stop server', String(err))
15 + resolve(err)
16 + })
17 + })
18 + await new Promise(resolve => {
19 + try {
20 + srv = app.listen(port, () => {
21 + console.log('running on port', port)
22 + if (firstTime && getConfig('open_browser_at_start') !== false)
23 + open('http://localhost:'+port)
24 + firstTime = false
25 + resolve(null)
26 + }).on('error', e => {
27 + const { code } = e as any
28 + if (code === 'EADDRINUSE')
29 + console.error(`couldn't listen on busy port ${port}`)
30 + })
31 + }
32 + catch(e) {
33 + console.error("couldn't listen on port", port, String(e))
34 + }
35 +
36 + })
37 +})