log
Massimo Melina committed
Jan 2, 2022 at 14:59 UTC
18fa4d7abc54f1a256adb0b4513cb421ecb82f16
5 files changed
+63
-16
.gitignore
+2
-1
@@ -1,4 +1,5 @@
1
node_modules
2
build
3
.idea
4
-dist
\ No newline at end of file
4
+dist
5
+*.log
package-lock.json
+33
@@ -14,6 +14,7 @@
14
"buffer-crc32": "https://github.com/rejetto/buffer-crc32.git",
15
"fast-glob": "^3.2.7",
16
"koa": "^2.13.4",
17
+ "koa-accesslog": "^1.0.0",
18
"koa-better-http-proxy": "^0.2.9",
19
"koa-bodyparser": "^4.3.0",
20
"koa-compress": "^5.1.0",
@@ -2028,6 +2029,17 @@
2029
"node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4"
2030
}
2031
},
2032
+ "node_modules/koa-accesslog": {
2033
+ "version": "1.0.0",
2034
+ "resolved": "https://registry.npmjs.org/koa-accesslog/-/koa-accesslog-1.0.0.tgz",
2035
+ "integrity": "sha512-drpakus6DsxCW7mh05O8zmwTTUMGe63o1PMPrz4+6ytypt0UCLRjgpj4AapxxXPWV1nOpcz1YtNP57QbKLfY0w==",
2036
+ "dependencies": {
2037
+ "moment": "^2.26.0"
2038
+ },
2039
+ "engines": {
2040
+ "node": ">= 10"
2041
+ }
2042
+ },
2043
"node_modules/koa-better-http-proxy": {
2044
"version": "0.2.9",
2045
"resolved": "https://registry.npmjs.org/koa-better-http-proxy/-/koa-better-http-proxy-0.2.9.tgz",
@@ -2534,6 +2546,14 @@
2546
"node": ">=10"
2547
}
2548
},
2549
+ "node_modules/moment": {
2550
+ "version": "2.29.1",
2551
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
2552
+ "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==",
2553
+ "engines": {
2554
+ "node": "*"
2555
+ }
2556
+ },
2557
"node_modules/ms": {
2558
"version": "2.1.2",
2559
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -4962,6 +4982,14 @@
4982
"vary": "^1.1.2"
4983
}
4984
},
4985
+ "koa-accesslog": {
4986
+ "version": "1.0.0",
4987
+ "resolved": "https://registry.npmjs.org/koa-accesslog/-/koa-accesslog-1.0.0.tgz",
4988
+ "integrity": "sha512-drpakus6DsxCW7mh05O8zmwTTUMGe63o1PMPrz4+6ytypt0UCLRjgpj4AapxxXPWV1nOpcz1YtNP57QbKLfY0w==",
4989
+ "requires": {
4990
+ "moment": "^2.26.0"
4991
+ }
4992
+ },
4993
"koa-better-http-proxy": {
4994
"version": "0.2.9",
4995
"resolved": "https://registry.npmjs.org/koa-better-http-proxy/-/koa-better-http-proxy-0.2.9.tgz",
@@ -5330,6 +5358,11 @@
5358
}
5359
}
5360
},
5361
+ "moment": {
5362
+ "version": "2.29.1",
5363
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
5364
+ "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
5365
+ },
5366
"ms": {
5367
"version": "2.1.2",
5368
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
package.json
+1
@@ -33,6 +33,7 @@
33
"buffer-crc32": "https://github.com/rejetto/buffer-crc32.git",
34
"fast-glob": "^3.2.7",
35
"koa": "^2.13.4",
36
+ "koa-accesslog": "^1.0.0",
37
"koa-better-http-proxy": "^0.2.9",
38
"koa-bodyparser": "^4.3.0",
39
"koa-compress": "^5.1.0",
src/config.ts
+10
-1
@@ -1,4 +1,5 @@
1
import EventEmitter from 'events'
2
+import { argv } from './const'
3
import { watchLoad } from './misc'
4
5
const PATH = 'config.yaml'
@@ -21,8 +22,16 @@ watchLoad(PATH, data => {
22
}
23
})
24
24
-export function subscribe(k:string, cb:(v:any,was:any)=>void) {
25
+export function subscribe(k:string, cb:(v:any,was?:any)=>void, defaultValue?:any, caster?:(argV:string)=>any) {
26
+ if (!caster)
27
+ if (typeof defaultValue === 'number')
28
+ caster = Number
29
+ const a = argv[k]
30
+ if (a !== undefined)
31
+ return cb(caster ? caster(a) : a)
32
emitter.on('new.'+k, cb)
33
+ if (defaultValue !== undefined)
34
+ cb(defaultValue)
35
}
36
37
export function getConfig(k:string) {
src/index.ts
+17
-14
@@ -3,17 +3,21 @@ import mount from 'koa-mount'
3
import bodyParser from 'koa-bodyparser'
4
import { apiMiddleware } from './apis'
5
import { serveFrontend } from './serveFrontend'
6
-import { API_URI, argv, DEV, FRONTEND_URI } from './const'
6
+import { API_URI, DEV, FRONTEND_URI } from './const'
7
import { serveFile } from './serveFile'
8
import { vfs } from './vfs'
9
import { isDirectory } from './misc'
10
import proxy from 'koa-better-http-proxy'
11
import compress from 'koa-compress'
12
+// @ts-ignore
13
+import accesslog from 'koa-accesslog'
14
import { Server } from 'http'
15
import { subscribe } from './config'
16
import session from 'koa-session'
17
import { zipStreamFromFolder } from './zip'
18
import { frontEndApis } from './frontEndApis'
19
+import { createWriteStream } from 'fs'
20
+import { Writable } from 'stream'
21
22
const BUILD_TIMESTAMP = ""
23
@@ -26,11 +30,16 @@ app.use(session({
30
rolling: true,
31
maxAge: 30*60_000,
32
}, app))
29
-app.use(async (ctx, next) => {
30
- // log all requests
31
- console.debug(new Date().toLocaleTimeString(), ctx.request.method, ctx.url)
32
- await next()
33
-})
33
+
34
+let logMw: Koa.Middleware
35
+let logStream: Writable
36
+subscribe('log', path => {
37
+ console.debug('log file: '+(path || 'disabled'))
38
+ logStream?.end()
39
+ logStream = path && createWriteStream(path, { flags:'a' })
40
+ logMw = accesslog(logStream)
41
+}, 'access.log')
42
+app.use((ctx, next) => logMw?.(ctx,next)) // wrapping in a function will make it use current value
43
44
// serve apis
45
app.use(mount(API_URI, new Koa()
@@ -84,13 +93,7 @@ app.on('error', err => {
93
})
94
95
let srv: Server
87
-if (argv.port)
88
- listenOn(argv.port).then()
89
-else
90
- subscribe('port', port =>
91
- listenOn(port||80))
92
-
93
-async function listenOn(port: number) {
96
+subscribe('port', async (port: number) => {
97
await new Promise(resolve => {
98
if (!srv)
99
return resolve(null)
@@ -110,4 +113,4 @@ async function listenOn(port: number) {
113
console.error(`couldn't listen on busy port ${port}`)
114
})
115
})
113
-}
116
+}, 80)