diff --git a/config/default.json b/config/default.json index 0ca6299..745e3c3 100644 --- a/config/default.json +++ b/config/default.json @@ -4,6 +4,7 @@ "sessionFileStorePath": "sessions", "sampleUploadPath": "samples", "sessionSecret": "cats", + "logFilePath": "log/noisedash.log", "tls": false, "tlsKey": "certs/key.pem", "tlsCert": "certs/cert.pem" diff --git a/package-lock.json b/package-lock.json index 44ecc06..c0f2b21 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1190,6 +1190,16 @@ "to-fast-properties": "^2.0.0" } }, + "@dabh/diagnostics": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", + "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", + "requires": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, "@hapi/address": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", @@ -1846,44 +1856,6 @@ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "optional": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "optional": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "optional": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "optional": true - }, "debug": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", @@ -1904,25 +1876,6 @@ "universalify": "^0.1.0" } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "optional": true - }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "optional": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, "minipass": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", @@ -1947,28 +1900,6 @@ "minipass": "^3.1.1" } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "optional": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "vue-loader-v16": { - "version": "npm:vue-loader@16.5.0", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.5.0.tgz", - "integrity": "sha512-WXh+7AgFxGTgb5QAkQtFeUcHNIEq3PGVQ8WskY5ZiFbWBkOwcCPRs4w/2tVyTbh2q6TVRlO3xfvIukUtjsu62A==", - "dev": true, - "optional": true, - "requires": { - "chalk": "^4.1.0", - "hash-sum": "^2.0.0", - "loader-utils": "^2.0.0" - } - }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -3661,7 +3592,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "dev": true, "requires": { "color-convert": "^1.9.3", "color-string": "^1.6.0" @@ -3671,7 +3601,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -3679,14 +3608,12 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "color-string": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", - "dev": true, "requires": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -3698,6 +3625,20 @@ "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", "dev": true }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" + }, + "colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "requires": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -4960,6 +4901,11 @@ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true }, + "enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -5989,6 +5935,11 @@ "websocket-driver": ">=0.5.1" } }, + "fecha": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz", + "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==" + }, "figgy-pudding": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", @@ -6138,6 +6089,11 @@ "readable-stream": "^2.3.6" } }, + "fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, "follow-redirects": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", @@ -7678,6 +7634,11 @@ "asn1.js": "^5.4.1" } }, + "kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, "launch-editor": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.2.1.tgz", @@ -7888,6 +7849,25 @@ "chalk": "^2.0.1" } }, + "logform": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.3.0.tgz", + "integrity": "sha512-graeoWUH2knKbGthMtuG1EfaSPMZFZBIrhuJHhkS5ZseFBrc7DupCzihOQAzsK/qIKPQaPJ/lFQFctILUY5ARQ==", + "requires": { + "colors": "^1.2.1", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^1.1.0", + "triple-beam": "^1.3.0" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, "loglevel": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", @@ -8744,6 +8724,14 @@ "wrappy": "1" } }, + "one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "requires": { + "fn.name": "1.x.x" + } + }, "onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", @@ -10553,6 +10541,11 @@ "ret": "~0.1.10" } }, + "safe-stable-stringify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz", + "integrity": "sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==" + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -10860,7 +10853,6 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, "requires": { "is-arrayish": "^0.3.1" }, @@ -10868,8 +10860,7 @@ "is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" } } }, @@ -11279,6 +11270,11 @@ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", "dev": true }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + }, "stackframe": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", @@ -11700,6 +11696,11 @@ } } }, + "text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -11864,6 +11865,11 @@ "punycode": "^2.1.1" } }, + "triple-beam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" + }, "tryer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", @@ -12399,6 +12405,87 @@ } } }, + "vue-loader-v16": { + "version": "npm:vue-loader@16.8.3", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz", + "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==", + "dev": true, + "optional": true, + "requires": { + "chalk": "^4.1.0", + "hash-sum": "^2.0.0", + "loader-utils": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "optional": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "optional": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "optional": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "optional": true + }, + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "optional": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "optional": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "vue-router": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.2.tgz", @@ -13183,6 +13270,53 @@ "string-width": "^1.0.2 || 2" } }, + "winston": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz", + "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==", + "requires": { + "@dabh/diagnostics": "^2.0.2", + "async": "^3.1.0", + "is-stream": "^2.0.0", + "logform": "^2.2.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.4.0" + }, + "dependencies": { + "async": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", + "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==" + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "winston-transport": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", + "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", + "requires": { + "readable-stream": "^2.3.7", + "triple-beam": "^1.2.0" + } + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -13334,7 +13468,8 @@ "dependencies": { "ansi-regex": { "version": "5.0.0", - "resolved": "", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "cliui": { diff --git a/package.json b/package.json index 4d75bb9..3e360d2 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,8 @@ "tone": "^14.7.77", "vue": "^2.6.11", "vue-router": "^3.2.0", - "vuetify": "^2.4.0" + "vuetify": "^2.4.0", + "winston": "^3.3.3" }, "devDependencies": { "@vue/cli-plugin-babel": "~4.5.0", diff --git a/server/bin/www.js b/server/bin/www.js index 0221621..dbea03e 100644 --- a/server/bin/www.js +++ b/server/bin/www.js @@ -1,11 +1,11 @@ #!/usr/bin/env node const app = require('../app') -const debug = require('debug')('example:server') const fs = require('fs') const config = require('config') const tls = config.get('Server.tls') const http = require(tls ? 'https' : 'http') +const logger = require('../logger') const port = normalizePort(config.get('Server.listeningPort')) app.set('port', port) @@ -52,10 +52,10 @@ function onError (error) { // handle specific listen errors with friendly messages switch (error.code) { case 'EACCES': - console.error(bind + ' requires elevated privileges') + logger.error(new Error(bind + ' requires elevated privileges')) process.exit(1) case 'EADDRINUSE': - console.error(bind + ' is already in use') + logger.error(new Error(bind + ' is already in use')) process.exit(1) default: throw error @@ -67,5 +67,5 @@ function onListening () { const bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port - debug('Listening on ' + bind) + logger.log('info', 'Listening on %s', bind) } diff --git a/server/logger.js b/server/logger.js new file mode 100644 index 0000000..5535e90 --- /dev/null +++ b/server/logger.js @@ -0,0 +1,24 @@ +const winston = require('winston') +const config = require('config') + +const logger = winston.createLogger({ + level: 'info', + format: winston.format.combine( + winston.format.timestamp({ + format: 'YYYY-MM-DD HH:mm:ss' + }), + winston.format.errors({ stack: true }), + winston.format.splat(), + winston.format.json() + ), + defaultMeta: { service: 'noisedash' }, + transports: [ + // + // - Write to all logs with level `info` and below to `quick-start-combined.log`. + // - Write all logs error (and below) to `quick-start-error.log`. + // + new winston.transports.File({ filename: config.get('Server.logFilePath') }) + ] +}) + +module.exports = logger diff --git a/server/routes/auth.js b/server/routes/auth.js index 05e202f..a86fca6 100644 --- a/server/routes/auth.js +++ b/server/routes/auth.js @@ -2,6 +2,7 @@ const express = require('express') const passport = require('passport') const db = require('../db') const router = express.Router() +const logger = require('../logger') router.post('/login/password', passport.authenticate('local'), (req, res, next) => { return res.send('Authenticated and logged in') @@ -22,6 +23,7 @@ router.get('/admin', (req, res) => { db.get('SELECT is_admin FROM users WHERE id = ?', [req.user.id], (err, row) => { if (err) { + logger.error(err) return res.sendStatus(500) } diff --git a/server/routes/profiles.js b/server/routes/profiles.js index 3c8d99f..2b1a2fc 100644 --- a/server/routes/profiles.js +++ b/server/routes/profiles.js @@ -1,6 +1,7 @@ const express = require('express') const db = require('../db') const router = express.Router() +const logger = require('../logger') router.post('/profiles', (req, res) => { if (!req.user) { @@ -47,6 +48,7 @@ router.post('/profiles', (req, res) => { ], function (err) { if (err) { + logger.error(err) if (err.code === 'SQLITE_CONSTRAINT') { return res.sendStatus(409) } else { @@ -64,6 +66,7 @@ router.post('/profiles', (req, res) => { ], (err) => { if (err) { + logger.error(err) return res.sendStatus(500) } }) @@ -82,6 +85,7 @@ router.put('/profiles/:profileId', (req, res) => { db.serialize(() => { db.get('SELECT user FROM profiles WHERE id = ?', [req.params.profileId], (err, row) => { if (err) { + logger.error(err) return res.sendStatus(500) } @@ -124,7 +128,7 @@ router.put('/profiles/:profileId', (req, res) => { ], (err) => { if (err) { - console.log(err) + logger.error(err) return res.sendStatus(500) } @@ -134,6 +138,7 @@ router.put('/profiles/:profileId', (req, res) => { ], (err) => { if (err) { + logger.error(err) return res.sendStatus(500) } }) @@ -146,6 +151,7 @@ router.put('/profiles/:profileId', (req, res) => { ], (err) => { if (err) { + logger.error(err) return res.sendStatus(500) } }) @@ -185,7 +191,7 @@ router.post('/profiles/default', (req, res) => { ], function (err) { if (err) { - console.log('ERROR: ', err) + logger.error(err) return res.sendStatus(500) } else { return res.json({ id: this.lastID }) @@ -201,6 +207,7 @@ router.get('/profiles', (req, res) => { db.all('SELECT id, name FROM profiles WHERE user = ?', [req.user.id], (err, rows) => { if (err) { + logger.error(err) return res.sendStatus(500) } @@ -244,7 +251,7 @@ router.get('/profiles/:profileId', (req, res) => { tremolo_depth as tremoloDepth FROM profiles WHERE id = ?`, [req.params.profileId], (err, row) => { if (err) { - console.log(err) + logger.error(err) return res.sendStatus(500) } @@ -272,7 +279,7 @@ router.get('/profiles/:profileId', (req, res) => { db.all('SELECT sample FROM profiles_samples WHERE profile = ?', [req.params.profileId], (err, rows) => { if (err) { - console.log(err) + logger.error(err) return res.sendStatus(500) } @@ -292,7 +299,7 @@ router.get('/profiles/:profileId', (req, res) => { WHERE samples.id IN ( ` + sampleQueryArgs.map(() => { return '?' }).join(',') + ' )', sampleQueryArgs, (err, rows) => { if (err) { - console.log(err) + logger.error(err) return res.sendStatus(500) } @@ -325,6 +332,7 @@ router.delete('/profiles/:profileId', (req, res) => { db.serialize(() => { db.get('SELECT user FROM profiles WHERE id = ?', [req.params.profileId], (err, row) => { if (err) { + logger.error(err) return res.sendStatus(500) } @@ -335,12 +343,14 @@ router.delete('/profiles/:profileId', (req, res) => { db.run('DELETE FROM profiles WHERE id = ?', [req.params.profileId], (err) => { if (err) { + logger.error(err) return res.sendStatus(500) } }) db.run('DELETE FROM profiles_samples WHERE profile = ?', [req.params.profileId], (err) => { if (err) { + logger.error(err) return res.sendStatus(500) } else { return res.sendStatus(200) diff --git a/server/routes/samples.js b/server/routes/samples.js index d090675..9e27ab1 100644 --- a/server/routes/samples.js +++ b/server/routes/samples.js @@ -10,6 +10,7 @@ const storage = multer.diskStorage({ const upload = multer({ storage: storage }) const db = require('../db') const router = express.Router() +const logger = require('../logger') router.post('/samples', upload.single('sample'), (req, res, next) => { if (!req.user) { @@ -19,6 +20,7 @@ router.post('/samples', upload.single('sample'), (req, res, next) => { db.serialize(() => { db.get('SELECT can_upload FROM users WHERE id = ?', [req.user.id], (err, row) => { if (err) { + logger.error(err) return res.sendStatus(500) } @@ -33,7 +35,7 @@ router.post('/samples', upload.single('sample'), (req, res, next) => { ], (err) => { if (err) { - console.log(err) + logger.error(err) if (err.code === 'SQLITE_CONSTRAINT') { return res.sendStatus(409) } else { @@ -55,7 +57,7 @@ router.get('/samples', (req, res) => { db.all('SELECT id, name FROM samples WHERE user = ?', [req.user.id], (err, rows) => { if (err) { - console.log(err) + logger.error(err) return res.sendStatus(500) } diff --git a/server/routes/users.js b/server/routes/users.js index 9ef5287..0f124ad 100644 --- a/server/routes/users.js +++ b/server/routes/users.js @@ -2,6 +2,7 @@ const express = require('express') const crypto = require('crypto') const db = require('../db') const router = express.Router() +const logger = require('../logger') router.get('/users/current', (req, res) => { if (!req.user) { @@ -10,6 +11,7 @@ router.get('/users/current', (req, res) => { db.get('SELECT is_admin as isAdmin, dark_mode as darkMode, can_upload as canUpload, * FROM users WHERE id = ?', [req.user.id], (err, row) => { if (err) { + logger.error(err) return res.sendStatus(500) } @@ -33,6 +35,7 @@ router.get('/users', (req, res) => { db.all('SELECT id, username, name, is_admin as isAdmin, can_upload as canUpload FROM users', (err, rows) => { if (err) { + logger.error(err) return res.sendStatus(500) } @@ -56,6 +59,7 @@ router.post('/users', (req, res) => { db.serialize(() => { db.get('SELECT COUNT(*) as count FROM users', (err, row) => { if (err) { + logger.error(err) return res.sendStatus(500) } @@ -66,6 +70,7 @@ router.post('/users', (req, res) => { db.get('SELECT is_admin as isAdmin FROM users WHERE id = ?', [req.user.id], (err, row) => { if (err) { + logger.error(err) return res.sendStatus(500) } @@ -76,6 +81,7 @@ router.post('/users', (req, res) => { const salt = crypto.randomBytes(16) crypto.pbkdf2(req.body.password, salt, 10000, 32, 'sha256', (err, hashedPassword) => { if (err) { + logger.error(err) return res.sendStatus(500) } @@ -90,6 +96,7 @@ router.post('/users', (req, res) => { req.body.canUpload ], (err) => { if (err) { + logger.error(err) if (err.code === 'SQLITE_CONSTRAINT') { return res.sendStatus(409) } else { @@ -105,6 +112,7 @@ router.post('/users', (req, res) => { const salt = crypto.randomBytes(16) crypto.pbkdf2(req.body.password, salt, 10000, 32, 'sha256', (err, hashedPassword) => { if (err) { + logger.error(err) return res.sendStatus(500) } @@ -119,6 +127,7 @@ router.post('/users', (req, res) => { req.body.canUpload ], function (err) { if (err) { + logger.error(err) if (err.code === 'SQLITE_CONSTRAINT') { return res.sendStatus(409) } else { @@ -133,6 +142,7 @@ router.post('/users', (req, res) => { } req.login(user, (err) => { if (err) { + logger.error(err) return res.sendStatus(500) } else { return res.sendStatus(200) @@ -153,6 +163,7 @@ router.patch('/users/admin/:userId', (req, res) => { db.serialize(() => { db.get('SELECT is_admin FROM users WHERE id = ?', [req.user.id], (err, row) => { if (err) { + logger.error(err) return res.sendStatus(500) } @@ -163,6 +174,7 @@ router.patch('/users/admin/:userId', (req, res) => { db.run('UPDATE users SET is_admin = ? WHERE id = ?', [req.body.isAdmin ? 1 : 0, req.params.userId], (err) => { if (err) { + logger.error(err) return res.sendStatus(500) } else { return res.sendStatus(200) @@ -179,6 +191,7 @@ router.patch('/users/upload/:userId', (req, res) => { db.serialize(() => { db.get('SELECT is_admin FROM users WHERE id = ?', [req.user.id], (err, row) => { if (err) { + logger.error(err) return res.sendStatus(500) } @@ -189,6 +202,7 @@ router.patch('/users/upload/:userId', (req, res) => { db.run('UPDATE users SET can_upload = ? WHERE id = ?', [req.body.canUpload ? 1 : 0, req.params.userId], (err) => { if (err) { + logger.error(err) return res.sendStatus(500) } else { return res.sendStatus(200) @@ -205,6 +219,7 @@ router.patch('/users/dark-mode', (req, res) => { db.serialize(() => { db.run('UPDATE users SET dark_mode = ? WHERE id = ?', [req.body.darkMode ? 1 : 0, req.user.id], (err) => { if (err) { + logger.error(err) return res.sendStatus(500) } else { return res.sendStatus(200) @@ -221,6 +236,7 @@ router.delete('/users/:userId', (req, res) => { db.serialize(() => { db.get('SELECT is_admin FROM users WHERE id = ?', [req.user.id], (err, row) => { if (err) { + logger.error(err) return res.sendStatus(500) } @@ -231,6 +247,7 @@ router.delete('/users/:userId', (req, res) => { db.run('DELETE FROM users WHERE id = ?', [req.params.userId], (err) => { if (err) { + logger.error(err) return res.sendStatus(500) } else { return res.sendStatus(200)