From 3b6fa47bed9a074e3e1fe121a842eea4eddca5cd Mon Sep 17 00:00:00 2001 From: Kasper Date: Wed, 26 Aug 2020 18:09:39 +0200 Subject: [PATCH] Added logging and launch on startup option --- main.js | 16 ++-- package-lock.json | 231 ++++++++++++++++++++++++++++++++++++++++++---- package.json | 2 + src/logger.js | 18 ++++ src/menubar.js | 45 ++++++++- src/paths.js | 18 +++- src/server.js | 20 ++-- 7 files changed, 307 insertions(+), 43 deletions(-) create mode 100644 src/logger.js diff --git a/main.js b/main.js index 9801498..ddbe588 100644 --- a/main.js +++ b/main.js @@ -1,8 +1,12 @@ -const menubar = require('./src/menubar.js') +const logger = require('./src/logger.js') -console.log('Hello World') +try { + const menubar = require('./src/menubar.js') -menubar.init({ - openServerNow: true, - openBrowserNow: false, -}) + menubar.init({ + openServerNow: true, + openBrowserNow: false, + }) +} catch(err) { + logger.error(err) +} diff --git a/package-lock.json b/package-lock.json index cc9d620..4df455a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -97,6 +97,16 @@ "regenerator-runtime": "^0.13.4" } }, + "@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": "4.1.0", "resolved": "https://registry.npmjs.org/@hapi/address/-/address-4.1.0.tgz", @@ -230,6 +240,11 @@ "repeat-string": "^1.5.4" } }, + "applescript": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/applescript/-/applescript-1.0.0.tgz", + "integrity": "sha1-u4evVoytA0pOSMS9r2Bno6JwExc=" + }, "archiver": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.0.0.tgz", @@ -330,6 +345,18 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, + "auto-launch": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/auto-launch/-/auto-launch-5.0.5.tgz", + "integrity": "sha512-ppdF4mihhYzMYLuCcx9H/c5TUOCev8uM7en53zWVQhyYAJrurd2bFZx3qQVeJKF2jrc7rsPRNN5cD+i23l6PdA==", + "requires": { + "applescript": "^1.0.0", + "mkdirp": "^0.5.1", + "path-is-absolute": "^1.0.0", + "untildify": "^3.0.2", + "winreg": "1.2.4" + } + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -539,6 +566,30 @@ "supports-color": "^7.1.0" } }, + "color": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", + "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + }, + "dependencies": { + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + } + } + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -551,8 +602,30 @@ "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 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", + "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", + "requires": { + "color": "3.0.x", + "text-hex": "1.0.x" + } }, "combined-stream": { "version": "1.0.8", @@ -628,8 +701,7 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "crc": { "version": "3.8.0", @@ -790,6 +862,11 @@ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "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==" + }, "encode-utf8": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", @@ -1160,6 +1237,11 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" + }, "fastq": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", @@ -1169,6 +1251,11 @@ "reusify": "^1.0.4" } }, + "fecha": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.0.tgz", + "integrity": "sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg==" + }, "file-entry-cache": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", @@ -1242,6 +1329,11 @@ "imul": "^1.0.0" } }, + "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==" + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -1523,6 +1615,11 @@ "p-is-promise": "^3.0.0" } }, + "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==" + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1590,8 +1687,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", @@ -1697,6 +1793,11 @@ "verror": "1.10.0" } }, + "kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, "lazystream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", @@ -1752,6 +1853,18 @@ "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=", "dev": true }, + "logform": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", + "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", + "requires": { + "colors": "^1.2.1", + "fast-safe-stringify": "^2.0.4", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "triple-beam": "^1.3.0" + } + }, "macos-alias": { "version": "0.2.11", "resolved": "https://registry.npmjs.org/macos-alias/-/macos-alias-0.2.11.tgz", @@ -1812,14 +1925,12 @@ "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, "requires": { "minimist": "^1.2.5" } @@ -1919,6 +2030,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" + } + }, "opener": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", @@ -1996,8 +2115,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { "version": "3.1.1", @@ -2095,8 +2213,7 @@ "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "progress": { "version": "2.0.3", @@ -2181,7 +2298,6 @@ "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -2295,8 +2411,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safer-buffer": { "version": "2.1.2", @@ -2399,6 +2514,14 @@ "plist": "^3.0.1" } }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" + } + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -2472,6 +2595,11 @@ "tweetnacl": "~0.14.0" } }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -2524,7 +2652,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -2631,6 +2758,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", @@ -2676,6 +2808,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==" + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -2760,6 +2897,11 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, + "untildify": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz", + "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==" + }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -2772,8 +2914,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "utils-merge": { "version": "1.0.1", @@ -2812,6 +2953,58 @@ "isexe": "^2.0.0" } }, + "winreg": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/winreg/-/winreg-1.2.4.tgz", + "integrity": "sha1-ugZWKbepJRMOFXeRCM9UCZDpjRs=" + }, + "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.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, + "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", diff --git a/package.json b/package.json index 6620a76..8c1d98b 100644 --- a/package.json +++ b/package.json @@ -28,12 +28,14 @@ } }, "dependencies": { + "auto-launch": "^5.0.5", "body-parser": "^1.19.0", "connect": "^3.7.0", "node-fetch": "^2.6.0", "opener": "^1.5.1", "serve-static": "^1.14.1", "systray": "^1.0.5", + "winston": "^3.3.3", "ws": "^7.3.1" }, "devDependencies": { diff --git a/src/logger.js b/src/logger.js new file mode 100644 index 0000000..b784f12 --- /dev/null +++ b/src/logger.js @@ -0,0 +1,18 @@ +const winston = require('winston') + +const paths = require('./paths') + +module.exports = winston.createLogger({ + level: 'info', + format: winston.format.json(), + transports: [ + new winston.transports.File({ filename: paths.logfileErr, level: 'error' }), + new winston.transports.File({ filename: paths.logfile }), + ], +}) + +if (process.env.APP_ENV === 'dev') { + module.exports.add(new winston.transports.Console({ + format: winston.format.simple(), + })) +} diff --git a/src/menubar.js b/src/menubar.js index c1eb8dc..8f07a96 100644 --- a/src/menubar.js +++ b/src/menubar.js @@ -1,8 +1,10 @@ const SysTrayModule = require('systray') const SysTray = SysTrayModule.default const opener = require('opener') - +const AutoLaunch = require('auto-launch') const server = require('./server.js') +const paths = require('./paths.js') +const logger = require('./logger.js') module.exports.init = async function(options = {}) { @@ -11,6 +13,13 @@ module.exports.init = async function(options = {}) { if (options.openBrowserNow) opener('http://localhost:9199') } + const autoLauncher = process.env.APP_ENV === 'dev' + ? null + : new AutoLaunch({ + name: 'YouTube Email Notifier', + path: paths.appBundle, + }) + const items = [ { title: 'Settings', @@ -22,12 +31,42 @@ module.exports.init = async function(options = {}) { opener('http://localhost:9199') }, }, + { + title: 'Launch on Startup', + tooltip: null, + checked: autoLauncher ? await autoLauncher.isEnabled() : false, + enabled: autoLauncher ? true : false, + handler: async (action) => { + if (process.APP_ENV !== 'dev') { + logger.info('appbundle: '+paths.appBundle) + if (!action.item.checked) { + logger.info('launch on startup: enabling') + action.item.checked = true + if (autoLauncher) await autoLauncher.enable() + systray.sendAction({ + type: 'update-item', + item: action.item, + seq_id: action.seq_id, + }) + } else { + logger.info('launch on startup: disabling') + action.item.checked = false + if (autoLauncher) await autoLauncher.disable() + systray.sendAction({ + type: 'update-item', + item: action.item, + seq_id: action.seq_id, + }) + } + } + }, + }, { title: 'Exit', tooltip: null, checked: false, enabled: true, - handler: (systray) => { + handler: (action, systray) => { systray.kill() }, }, @@ -47,7 +86,7 @@ module.exports.init = async function(options = {}) { systray.onClick(action => { const index = action.seq_id const handler = items[index].handler - if (handler) handler(systray) + if (handler) handler(action, systray) }) } diff --git a/src/paths.js b/src/paths.js index 9b93a2d..bb291b9 100644 --- a/src/paths.js +++ b/src/paths.js @@ -1,15 +1,23 @@ const fs = require('fs') const path = require('path') +const os = require('os') const paths = {} module.exports = paths if (process.env.APP_ENV === 'dev') { - paths.dataDir = path.join(__dirname, '../appfiles/space.kasper.youtube-email-notifier') - paths.settings = path.join(__dirname, '../appfiles/space.kasper.youtube-email-notifier/settings.json') + paths.appDataDir = path.join(__dirname, '../appfiles/Application Support folder') + paths.settings = path.join(paths.appDataDir, 'settings.json') + paths.logfile = path.join(paths.appDataDir, 'all.log') + paths.logfileErr = path.join(paths.appDataDir, 'error.log') } else { - paths.dataDir = '~/Library/Application Support/space.kasper.youtube-email-notifier' - paths.settings = path.resolve(paths.dataDir, 'settings.json') + paths.homedir = os.homedir() + paths.appDataDir = path.join(paths.homedir, 'Library/Application Support/YouTube Email Notifier') + paths.settings = path.join(paths.appDataDir, 'settings.json') + paths.logfile = path.join(paths.appDataDir, 'all.log') + paths.logfileErr = path.join(paths.appDataDir, 'error.log') + paths.appBinary = process.execPath + paths.appBundle = path.join(paths.appBinary, '../../..') } -if (!fs.existsSync(paths.dataDir)) fs.mkdirSync(paths.dataDir, { recursive: true }) +if (!fs.existsSync(paths.appDataDir)) fs.mkdirSync(paths.appDataDir, { recursive: true }) diff --git a/src/server.js b/src/server.js index f31fa0e..0ffae6a 100644 --- a/src/server.js +++ b/src/server.js @@ -5,6 +5,7 @@ const serveStatic = require('serve-static') const WebSocket = require('ws') const fetch = require('node-fetch') const paths = require('./paths.js') +const logger = require('./logger.js') const app = connect() app.use(serveStatic('src/web')) @@ -84,14 +85,14 @@ wss.on('connection', async (ws) => { connection.close(1000, 'old connection') } connection = ws - console.log('WS Open') + logger.info('WS Open') send('newStore', store) ws.on('close', (code, reason) => { if (reason === 'old connection') { - console.log('WS Close old connection') + logger.info('WS Close old connection') } else { - console.log('WS Close') + logger.info('WS Close') setTimeout(() => { if (connection === null) { module.exports.close() @@ -103,7 +104,7 @@ wss.on('connection', async (ws) => { ws.on('message', async (msg) => { const { type, data } = JSON.parse(msg) - console.log(`WS "${type}" message received:`, data) + logger.info(`WS "${type}" message received:`, data) try { if (type === 'setApiKey') { @@ -148,8 +149,7 @@ wss.on('connection', async (ws) => { storeUpdate() } } catch(err) { - console.log(':::err:::') - console.log(err) + logger.error(err) send('error', err instanceof Error ? err.toString() : err) } }) @@ -163,8 +163,8 @@ const port = 9199 module.exports.open = async () => { if (isOpen) return server = http.createServer(app).listen(port, err => { - if (err) return console.log('ERROR OPENING SERVER') - console.log('Server listening on http://localhost:'+port) + if (err) return logger.error('ERROR OPENING SERVER') + logger.info('Server listening on http://localhost:'+port) isOpen = true }) server.on('upgrade', function upgrade(request, socket, head) { @@ -176,10 +176,10 @@ module.exports.open = async () => { module.exports.close = async () => { if (isOpen) { - console.log('Closing server') + logger.info('Closing server') server.close() isOpen = false } else { - console.log('Server close called, but is already closed') + logger.warn('Server close called, but is already closed') } } -- 2.51.2