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)