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
+})