diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..269c43ac0 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +node_modules +npm-debug.log +.gitignore diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..e5a33472b --- /dev/null +++ b/Dockerfile @@ -0,0 +1,10 @@ +FROM node:14 +WORKDIR /usr/src/app +COPY . . +RUN npm install +RUN npm run build +RUN npm install -g concurrently +COPY . . + +EXPOSE 43594 +CMD [ "concurrently", "npm run start:game-server", "npm run start:login-server", "npm run start:update-server" ] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..e2fcfc4b8 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,15 @@ +version: '3.8' + +services: + nodejs: + build: + context: . + dockerfile: Dockerfile + image: nodejs + container_name: runejs + restart: unless-stopped + ports: + - "43594:43594" + volumes: + - .:/usr/app/ + - /usr/app/node_modules \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 5a02a5409..273b69ceb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1600,48 +1600,6 @@ "negotiator": "0.6.2" } }, - "ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", - "dev": true, - "requires": { - "string-width": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", @@ -1913,15 +1871,6 @@ "file-uri-to-path": "1.0.0" } }, - "bl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", - "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -1939,60 +1888,6 @@ "type-is": "~1.6.17" } }, - "boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", - "dev": true, - "requires": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2023,11 +1918,6 @@ "pkg-up": "^2.0.0" } }, - "bson": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz", - "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg==" - }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -2078,12 +1968,6 @@ "integrity": "sha512-2KaYheg0iOY+CMmDuAB3DHehrXhhb4OZU4KBVGDr/YKyYAcpudaiUQ9PJ9rxrPlKEoJ3ATasQ5AN48MqpwS43Q==", "dev": true }, - "capture-stack-trace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", - "dev": true - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -2153,12 +2037,6 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, - "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", - "dev": true - }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -2182,12 +2060,6 @@ } } }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", - "dev": true - }, "cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -2424,20 +2296,6 @@ } } }, - "configstore": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", - "dev": true, - "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -2513,32 +2371,6 @@ "printj": "~1.1.0" } }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "dev": true, - "requires": { - "capture-stack-trace": "^1.0.0" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", - "dev": true - }, "date-fns": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.9.0.tgz", @@ -2624,11 +2456,6 @@ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" }, - "denque": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", - "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==" - }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -2658,21 +2485,6 @@ "path-type": "^3.0.0" } }, - "dot-prop": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", - "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", - "dev": true, - "requires": { - "is-obj": "^1.0.0" - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -2730,21 +2542,6 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, "exit-on-epipe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", @@ -3241,12 +3038,6 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -3293,15 +3084,6 @@ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", "dev": true }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "dev": true, - "requires": { - "ini": "^1.3.4" - } - }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -3324,30 +3106,12 @@ "slash": "^2.0.0" } }, - "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "dev": true, - "requires": { - "create-error-class": "^3.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" - } - }, "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true + "dev": true, + "optional": true }, "graceful-readlink": { "version": "1.0.1", @@ -3462,12 +3226,6 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, - "ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", - "dev": true - }, "ignore-walk": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", @@ -3476,18 +3234,6 @@ "minimatch": "^3.0.4" } }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -3562,15 +3308,6 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", - "dev": true, - "requires": { - "ci-info": "^1.5.0" - } - }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -3636,43 +3373,12 @@ "is-extglob": "^2.1.1" } }, - "is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", - "dev": true, - "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" - } - }, - "is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", - "dev": true - }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "^1.0.1" - } - }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -3682,24 +3388,6 @@ "isobject": "^3.0.1" } }, - "is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", - "dev": true - }, - "is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -3711,12 +3399,6 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", @@ -3765,15 +3447,6 @@ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, - "latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", - "dev": true, - "requires": { - "package-json": "^4.0.0" - } - }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -3811,39 +3484,6 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, "make-error": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", @@ -3869,12 +3509,6 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, - "memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "optional": true - }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -4086,24 +3720,6 @@ "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" }, - "mongodb": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.2.tgz", - "integrity": "sha512-sSZOb04w3HcnrrXC82NEh/YGCmBuRgR+C1hZgmmv4L6dBz4BkRse6Y8/q/neXer9i95fKUBbFi4KgeceXmbsOA==", - "requires": { - "bl": "^2.2.1", - "bson": "^1.1.4", - "denque": "^1.4.1", - "require_optional": "^1.0.1", - "safe-buffer": "^5.1.2", - "saslprep": "^1.0.0" - } - }, - "mongodb-server": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mongodb-server/-/mongodb-server-1.0.0.tgz", - "integrity": "sha512-Lrqt4PRHMSPobXFd6sUHOFgBzo8KVUHcjRRYzngYkKfmHZfCi1sQhBoTpvoyGDcM65YNB15fZMQAcNzcpV7W2g==" - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -4220,50 +3836,6 @@ "integrity": "sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg==", "dev": true }, - "nodemon": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.2.tgz", - "integrity": "sha512-GWhYPMfde2+M0FsHnggIHXTqPDHXia32HRhh6H0d75Mt9FKUoCBvumNHr7LdrpPBTKxsWmIEOjoN+P4IU6Hcaw==", - "dev": true, - "requires": { - "chokidar": "^3.2.2", - "debug": "^3.2.6", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", - "pstree.remy": "^1.1.7", - "semver": "^5.7.1", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.2", - "update-notifier": "^2.5.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -4305,15 +3877,6 @@ "npm-normalize-package-bin": "^1.0.1" } }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", @@ -4437,12 +4000,6 @@ "os-tmpdir": "^1.0.0" } }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, "p-limit": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", @@ -4464,18 +4021,6 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, - "package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "dev": true, - "requires": { - "got": "^6.7.1", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.0" - } - }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -4513,18 +4058,6 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", @@ -4636,12 +4169,6 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, "printj": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", @@ -4667,18 +4194,6 @@ "ipaddr.js": "1.9.0" } }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "pstree.remy": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.7.tgz", - "integrity": "sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A==", - "dev": true - }, "qs": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", @@ -4813,25 +4328,6 @@ "unicode-match-property-value-ecmascript": "^1.2.0" } }, - "registry-auth-token": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", - "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", - "dev": true, - "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" - } - }, - "registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "dev": true, - "requires": { - "rc": "^1.0.1" - } - }, "regjsgen": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", @@ -4884,15 +4380,6 @@ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, - "require_optional": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", - "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", - "requires": { - "resolve-from": "^2.0.0", - "semver": "^5.1.0" - } - }, "reselect": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.0.0.tgz", @@ -4908,11 +4395,6 @@ "path-parse": "^1.0.6" } }, - "resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" - }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -4961,15 +4443,6 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "optional": true, - "requires": { - "sparse-bitfield": "^3.0.3" - } - }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -4988,15 +4461,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, - "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "dev": true, - "requires": { - "semver": "^5.0.3" - } - }, "send": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", @@ -5088,21 +4552,6 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -5260,15 +4709,6 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, - "sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", - "optional": true, - "requires": { - "memory-pager": "^1.0.2" - } - }, "spawn-command": { "version": "0.0.2-1", "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", @@ -5379,12 +4819,6 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -5428,21 +4862,6 @@ } } }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "dev": true, - "requires": { - "execa": "^0.7.0" - } - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", - "dev": true - }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -5495,15 +4914,6 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, - "touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "requires": { - "nopt": "~1.0.10" - } - }, "tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -5600,15 +5010,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.2.tgz", "integrity": "sha512-ml7V7JfiN2Xwvcer+XAf2csGO1bPBdRbFCkYBczNZggrBZ9c7G3riSUeJmqEU5uOtXNPMhE3n+R4FA/3YOAWOQ==" }, - "undefsafe": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.2.tgz", - "integrity": "sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY=", - "dev": true, - "requires": { - "debug": "^2.2.0" - } - }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -5649,15 +5050,6 @@ "set-value": "^2.0.1" } }, - "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "dev": true, - "requires": { - "crypto-random-string": "^1.0.0" - } - }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -5703,12 +5095,6 @@ } } }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", - "dev": true - }, "upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", @@ -5716,39 +5102,12 @@ "dev": true, "optional": true }, - "update-notifier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", - "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", - "dev": true, - "requires": { - "boxen": "^1.2.1", - "chalk": "^2.0.1", - "configstore": "^3.0.0", - "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", - "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, - "requires": { - "prepend-http": "^1.0.1" - } - }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -5785,15 +5144,6 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", @@ -5836,48 +5186,6 @@ } } }, - "widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", - "dev": true, - "requires": { - "string-width": "^2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -5893,34 +5201,11 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", - "dev": true - }, "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, "yargs": { "version": "15.3.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", diff --git a/package.json b/package.json index 8cc04d445..96d3c3b33 100644 --- a/package.json +++ b/package.json @@ -4,16 +4,17 @@ "description": "", "main": "src/game-server.ts", "scripts": { - "start": "npm run start:dev", - "start:dev": "rimraf dist && npm run build && concurrently \"npm run build:watch\" \"node --max-old-space-size=4096 dist/main.js\"", - "start:game-server": "rimraf dist && npm run build && node --max-old-space-size=4096 dist/main.js", - "start:login-server": "concurrently \"mongod --dbpath=/data/sessions\" \"rimraf dist && npm run build && node --max-old-space-size=2048 dist/login-server.js\"", - "start:update-server": "rimraf dist && npm run build && node --max-old-space-size=2048 dist/update-server.js", + "start": "npm run build && npm run start:all", + "start:dev": "npm run build && concurrently \"npm run build:watch\" \"node --max-old-space-size=4096 dist/main.js\"", + "start:game-server": "node --max-old-space-size=2048 dist/main.js", + "start:login-server": "node --max-old-space-size=1024 dist/login-server.js", + "start:update-server": "node --max-old-space-size=1024 dist/update-server.js", + "start:all": "concurrently \"npm run start:update-server\" \"npm run start:login-server\" \"npm run start:game-server\"", "lint": "tslint --project tsconfig.json", "fake-players": "concurrently \"npm run build:watch\" \"node --max-old-space-size=4096 dist/main.js -fakePlayers\"", "fake-players-tick": "concurrently \"npm run build:watch\" \"node --max-old-space-size=4096 dist/main.js -fakePlayers -tickTime\"", "build:watch": "tsc --project tsconfig.json && babel ./src --out-dir dist --extensions \".ts,.tsx,.js\" --source-maps --watch", - "build": "tsc --project tsconfig.json && babel ./src --out-dir dist --extensions \".ts,.tsx,.js\" --source-maps" + "build": "rimraf dist && tsc --project tsconfig.json && babel ./src --out-dir dist --extensions \".ts,.tsx,.js\" --source-maps" }, "repository": { "type": "git", @@ -37,8 +38,6 @@ "express": "^4.17.1", "js-yaml": "^3.13.1", "lodash": "^4.17.15", - "mongodb": "^3.6.2", - "mongodb-server": "^1.0.0", "quadtree-lib": "^1.0.9", "rxjs": "^6.5.4", "source-map-support": "^0.5.16", @@ -67,7 +66,6 @@ "chokidar": "^3.3.1", "concurrently": "^5.1.0", "mkdirp": "^1.0.4", - "nodemon": "^2.0.2", "rimraf": "^3.0.2", "tsconfig-paths": "^3.9.0", "tslint": "^6.1.0" diff --git a/src/net/client-connection.ts b/src/net/client-connection.ts deleted file mode 100644 index 0607ef995..000000000 --- a/src/net/client-connection.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { Socket } from 'net'; -import { Player } from '@server/world/actor/player/player'; -import { world } from '@server/game-server'; -import { LoginHandshakeParser } from './data-parser/login-handshake-parser'; -import { ClientLoginParser } from './data-parser/client-login-parser'; -import { InboundPacketDataParser } from './data-parser/inbound-packet-data-parser'; -import { DataParser } from './data-parser/data-parser'; -import { VersionHandshakeParser } from '@server/net/data-parser/version-handshake-parser'; -import { UpdateServerParser } from '@server/net/data-parser/update-server-parser'; -import { ByteBuffer } from '@runejs/byte-buffer'; - -enum ConnectionStage { - VERSION_HANDSHAKE = 'VERSION_HANDSHAKE', - UPDATE_SERVER = 'UPDATE_SERVER', - LOGIN_HANDSHAKE = 'LOGIN_HANDSHAKE', - LOGIN = 'LOGIN', - LOGGED_IN = 'LOGGED_IN' -} - -/** - * Handles a single client connection to the game server. - */ -export class ClientConnection { - - private _connectionStage: ConnectionStage = null; - private dataParser: DataParser; - private _serverKey: bigint; - private _clientKey1: bigint; - private _clientKey2: bigint; - private _player: Player; - - public constructor(public readonly socket: Socket) { - this.socket = socket; - this.dataParser = null; - socket.emit('name', {}); - } - - public parseIncomingData(buffer?: ByteBuffer): void { - try { - if(!this.connectionStage) { - const packetId = buffer.get('BYTE', 'UNSIGNED'); - - if(packetId === 15) { - this.connectionStage = ConnectionStage.VERSION_HANDSHAKE; - this.dataParser = new VersionHandshakeParser(this); - } else if(packetId === 14) { - this.connectionStage = ConnectionStage.LOGIN_HANDSHAKE; - this.dataParser = new LoginHandshakeParser(this); - } - - this.dataParser.parse(buffer, packetId); - } else { - this.dataParser.parse(buffer); - } - - if(this.connectionStage === ConnectionStage.VERSION_HANDSHAKE) { - this.connectionStage = ConnectionStage.UPDATE_SERVER; - this.dataParser = new UpdateServerParser(this); - } else if(this.connectionStage === ConnectionStage.LOGIN_HANDSHAKE) { - this.connectionStage = ConnectionStage.LOGIN; - this.dataParser = new ClientLoginParser(this); - } else if(this.connectionStage === ConnectionStage.LOGIN) { - this.connectionStage = ConnectionStage.LOGGED_IN; - this.dataParser = new InboundPacketDataParser(this); - } - } catch(err) { - console.error('Error decoding client data'); - console.error(err); - this.socket.destroy(); - } - } - - public connectionDestroyed(): void { - if(this.player) { - this.player.logout(); - world.deregisterPlayer(this.player); - } - } - - get connectionStage(): ConnectionStage { - return this._connectionStage; - } - - set connectionStage(value: ConnectionStage) { - this._connectionStage = value; - } - - get serverKey(): bigint { - return this._serverKey; - } - - set serverKey(value: bigint) { - this._serverKey = value; - } - - get clientKey1(): bigint { - return this._clientKey1; - } - - set clientKey1(value: bigint) { - this._clientKey1 = value; - } - - get clientKey2(): bigint { - return this._clientKey2; - } - - set clientKey2(value: bigint) { - this._clientKey2 = value; - } - - get player(): Player { - return this._player; - } - - set player(value: Player) { - this._player = value; - } -} diff --git a/src/net/data-parser/client-login-parser.ts b/src/net/data-parser/client-login-parser.ts deleted file mode 100644 index 318b5787a..000000000 --- a/src/net/data-parser/client-login-parser.ts +++ /dev/null @@ -1,214 +0,0 @@ -import BigInteger from 'bigi'; -import { Player } from '@server/world/actor/player/player'; -import { Isaac } from '@server/net/isaac'; -import { serverConfig, world } from '@server/game-server'; -import { DataParser } from './data-parser'; -import { logger } from '@runejs/logger'; -import { ByteBuffer } from '@runejs/byte-buffer'; -import * as bcrypt from 'bcrypt'; -import { loadPlayerSave } from '@server/world/actor/player/player-data'; - -const VALID_CHARS = ['_', 'a', 'b', 'c', 'd', - 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', - 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', - '4', '5', '6', '7', '8', '9', '!', '@', '#', '$', '%', '^', '&', - '*', '(', ')', '-', '+', '=', ':', ';', '.', '>', '<', ',', '"', - '[', ']', '|', '?', '/', '`']; - -function longToName(nameLong: BigInt): string { - let ac: string = ''; - while(nameLong !== BigInt(0)) { - const l1 = nameLong; - nameLong = BigInt(nameLong) / BigInt(37); - ac += VALID_CHARS[parseInt(l1.toString()) - parseInt(nameLong.toString()) * 37]; - } - - return ac.split('').reverse().join(''); -} - -/** - * Codes for user login attempts that are sent back to the game client - * to inform the user of the status of their login attempt. - */ -enum LoginResponseCode { - SUCCESS = 2, - INVALID_CREDENTIALS = 3, - ACCOUNT_DISABLED = 4, - ALREADY_LOGGED_IN = 5, - GAME_UPDATED = 6, - WORLD_FULL = 7, - LOGIN_SERVER_OFFLINE = 8, - LOGIN_LIMIT_EXCEEDED = 9, - BAD_SESSION_ID = 10, - // @TODO the rest -} - -/** - * Parses the login packet from the game client. - */ -export class ClientLoginParser extends DataParser { - - private readonly rsaModulus = BigInteger(serverConfig.rsaMod); - private readonly rsaExponent = BigInteger(serverConfig.rsaExp); - - public parse(buffer?: ByteBuffer): void { - if(!buffer) { - throw new Error('No data supplied for login'); - } - - const loginType = buffer.get('BYTE', 'UNSIGNED'); - - if(loginType !== 16 && loginType !== 18) { - throw new Error('Invalid login type ' + loginType); - } - - let loginEncryptedSize = buffer.get('BYTE', 'UNSIGNED') - (36 + 1 + 1 + 2); - - if(loginEncryptedSize <= 0) { - throw new Error('Invalid login packet length ' + loginEncryptedSize); - } - - const gameVersion = buffer.get('INT'); - - if(gameVersion !== 435) { - throw new Error('Invalid game version ' + gameVersion); - } - - const isLowDetail: boolean = buffer.get('BYTE') === 1; - - for(let i = 0; i < 13; i++) { - buffer.get('INT'); // Cache indices - } - - loginEncryptedSize--; - - const rsaBytes = buffer.get('BYTE', 'UNSIGNED'); - - const encryptedBytes: Buffer = Buffer.alloc(rsaBytes); - buffer.copy(encryptedBytes, 0, buffer.readerIndex); - const decrypted = new ByteBuffer(BigInteger.fromBuffer(encryptedBytes).modPow(this.rsaExponent, this.rsaModulus).toBuffer()); - - const blockId = decrypted.get('BYTE'); - - if(blockId !== 10) { - throw new Error('Invalid block id ' + blockId); - } - - const clientKey1 = decrypted.get('INT'); - const clientKey2 = decrypted.get('INT'); - const incomingServerKey = BigInt(decrypted.get('LONG')); - - if(this.clientConnection.serverKey !== incomingServerKey) { - throw new Error(`Server key mismatch - ${this.clientConnection.serverKey} != ${incomingServerKey}`); - } - - const gameClientId = decrypted.get('INT'); - const usernameLong = BigInt(decrypted.get('LONG')); - const username = longToName(usernameLong); - const password = decrypted.getString(); - - logger.info(`Login request: ${username}/${password}`); - - const credentialsResponseCode = this.checkCredentials(username, password); - if(credentialsResponseCode === -1) { - this.sendLogin([ clientKey1, clientKey2 ], gameClientId, username, password, isLowDetail); - } else { - logger.warn(`${username} attempted to login but received error code ${ credentialsResponseCode }.`); - this.sendLoginResponse(credentialsResponseCode); - } - } - - /** - * Logs a user in and notifies their game client of a successful login. - * @param clientKeys The user's client keys (sent by the client). - * @param gameClientId The user's game client ID (sent by the client). - * @param username The user's username. - * @param password The user's password. - * @param isLowDetail Whether or not the user selected the "Low Detail" option. - */ - private sendLogin(clientKeys: [ number, number ], gameClientId: number, username: string, password: string, isLowDetail: boolean): void { - const sessionKey: number[] = [ - Number(clientKeys[0]), Number(clientKeys[1]), Number(this.clientConnection.serverKey >> BigInt(32)), Number(this.clientConnection.serverKey) - ]; - - const inCipher = new Isaac(sessionKey); - - for(let i = 0; i < 4; i++) { - sessionKey[i] += 50; - } - - const outCipher = new Isaac(sessionKey); - const passwordHash = bcrypt.hashSync(password, bcrypt.genSaltSync()); - - const player = new Player(this.clientConnection.socket, inCipher, outCipher, gameClientId, username, passwordHash, isLowDetail); - - world.registerPlayer(player); - - const outputBuffer = new ByteBuffer(6); - outputBuffer.put(LoginResponseCode.SUCCESS, 'BYTE'); - outputBuffer.put(player.rights.valueOf(), 'BYTE'); - outputBuffer.put(0, 'BYTE'); // ??? - outputBuffer.put(player.worldIndex + 1, 'SHORT'); - outputBuffer.put(0, 'BYTE'); // ??? - this.clientConnection.socket.write(outputBuffer); - - player.init(); - - this.clientConnection.clientKey1 = BigInt(clientKeys[0]); - this.clientConnection.clientKey2 = BigInt(clientKeys[1]); - this.clientConnection.player = player; - } - - /** - * Validates an incoming user's credentials and returns an error code if a problem occurs. - * This also checks if the user is already online. - * @param username The incoming user's username input. - * @param password The incoming user's password input. - */ - private checkCredentials(username: string, password: string): number { - if(!serverConfig.checkCredentials) { - return -1; - } - - if(!username || !password) { - return LoginResponseCode.INVALID_CREDENTIALS; - } - - username = username.trim().toLowerCase(); - password = password.trim(); - - if(username === '' || password === '') { - return LoginResponseCode.INVALID_CREDENTIALS; - } - - const playerSave = loadPlayerSave(username); - if(playerSave) { - const playerPasswordHash = playerSave.passwordHash; - if(playerPasswordHash) { - if(!bcrypt.compareSync(password, playerPasswordHash)) { - return LoginResponseCode.INVALID_CREDENTIALS; - } - } else if(serverConfig.checkCredentials) { - logger.warn(`User ${ username } has no password hash saved - ` + - `their password will now be saved.`); - } - } - - if(world.playerOnline(username)) { - return LoginResponseCode.ALREADY_LOGGED_IN; - } - - return -1; - } - - /** - * Sends a login response code (by itself) to the game client. - * Used for error responses. - * @param responseCode The response code to send to the game client. - */ - private sendLoginResponse(responseCode: number): void { - const outputBuffer = new ByteBuffer(1); - outputBuffer.put(responseCode, 'BYTE'); - this.clientConnection.socket.write(outputBuffer); - } -} diff --git a/src/net/data-parser/data-parser.ts b/src/net/data-parser/data-parser.ts deleted file mode 100644 index b84128d6a..000000000 --- a/src/net/data-parser/data-parser.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { ClientConnection } from '@server/net/client-connection'; -import { ByteBuffer } from '@runejs/byte-buffer'; - -export abstract class DataParser { - - public constructor(protected readonly clientConnection: ClientConnection) { - } - - public abstract parse(buffer?: ByteBuffer, packetId?: number): void | boolean; - -} diff --git a/src/net/data-parser/inbound-packet-data-parser.ts b/src/net/data-parser/inbound-packet-data-parser.ts deleted file mode 100644 index d3300e294..000000000 --- a/src/net/data-parser/inbound-packet-data-parser.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { handlePacket, incomingPackets } from '../inbound-packets'; -import { DataParser } from './data-parser'; -import { ByteBuffer } from '@runejs/byte-buffer'; -import { logger } from '@runejs/logger'; - -/** - * Parses inbound packet data from the game client once the user is fully authenticated. - */ -export class InboundPacketDataParser extends DataParser { - - private activePacketId: number = null; - private activePacketSize: number = null; - private activeBuffer: ByteBuffer; - - public parse(buffer?: ByteBuffer): void { - if(!this.activeBuffer) { - this.activeBuffer = buffer; - } else if(buffer) { - const readable = this.activeBuffer.readable; - const newBuffer = new ByteBuffer(readable + buffer.length); - this.activeBuffer.copy(newBuffer, 0, this.activeBuffer.readerIndex); - buffer.copy(newBuffer, readable, 0); - this.activeBuffer = newBuffer; - } - - if(this.activePacketId === null) { - this.activePacketId = -1; - } - - if(this.activePacketSize === null) { - this.activePacketSize = -1; - } - - const inCipher = this.clientConnection.player.inCipher; - - if(this.activePacketId === -1) { - if(this.activeBuffer.readable < 1) { - return; - } - - this.activePacketId = this.activeBuffer.get('BYTE', 'UNSIGNED'); - this.activePacketId = (this.activePacketId - inCipher.rand()) & 0xff; - const incomingPacket = incomingPackets.get(this.activePacketId); - if(incomingPacket) { - this.activePacketSize = incomingPacket.size; - } else { - this.activePacketSize = -3; - } - } - - // Packet will provide the size - if(this.activePacketSize === -1) { - if(this.activeBuffer.readable < 1) { - return; - } - - this.activePacketSize = this.activeBuffer.get('BYTE', 'UNSIGNED'); - } - - // Packet has no set size - let clearBuffer = false; - if(this.activePacketSize === -3) { - if(this.activeBuffer.readable < 1) { - return; - } - - this.activePacketSize = this.activeBuffer.readable; - clearBuffer = true; - } - - if(this.activeBuffer.readable < this.activePacketSize) { - return; - } - - // read packet data - let packetData = null; - if(this.activePacketSize !== 0) { - packetData = new ByteBuffer(this.activePacketSize); - this.activeBuffer.copy(packetData, 0, this.activeBuffer.readerIndex, this.activeBuffer.readerIndex + this.activePacketSize); - this.activeBuffer.readerIndex += this.activePacketSize; - } - handlePacket(this.clientConnection.player, this.activePacketId, this.activePacketSize, packetData); - - if(clearBuffer) { - this.activeBuffer = null; - } - - this.activePacketId = null; - this.activePacketSize = null; - - if(this.activeBuffer !== null && this.activeBuffer.readable > 0) { - this.parse(); - } - } -} diff --git a/src/net/data-parser/login-handshake-parser.ts b/src/net/data-parser/login-handshake-parser.ts deleted file mode 100644 index 81c6154a7..000000000 --- a/src/net/data-parser/login-handshake-parser.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { DataParser } from './data-parser'; -import { ByteBuffer } from '@runejs/byte-buffer'; - -/** - * Controls the initial login handshake with the server. - */ -export class LoginHandshakeParser extends DataParser { - - public parse(buffer: ByteBuffer, packetId: number): void { - if(!buffer) { - throw new Error('No data supplied for login handshake'); - } - - if(packetId === 14) { - buffer.get('BYTE', 'UNSIGNED'); // Name hash - - const serverKey = BigInt(13371337); // TODO generate server_key - - const outputBuffer = new ByteBuffer(9); - outputBuffer.put(0, 'BYTE'); // Initial server login response -> 0 for OK - outputBuffer.put(serverKey, 'LONG'); - this.clientConnection.socket.write(outputBuffer); - - this.clientConnection.serverKey = serverKey; - } else { - throw new Error('Invalid login handshake packet id.'); - } - } -} diff --git a/src/net/data-parser/update-server-parser.ts b/src/net/data-parser/update-server-parser.ts deleted file mode 100644 index 932416f81..000000000 --- a/src/net/data-parser/update-server-parser.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { ByteBuffer } from '@runejs/byte-buffer'; -import { DataParser } from './data-parser'; - -const crcTable = null; - -/** - * Handles the cache update server. - */ -export class UpdateServerParser extends DataParser { - - private files: { file: number, index: number }[] = []; - - public parse(buffer?: ByteBuffer): void { - /*if(!buffer) { - return; - } - - while(buffer.readable >= 4) { - const type = buffer.get('BYTE', 'UNSIGNED'); - const index = buffer.get('BYTE', 'UNSIGNED'); - const file = buffer.get('SHORT', 'UNSIGNED'); - - switch(type) { - case 0: // queue - this.files.push({ index, file }); - break; - case 1: // immediate - this.clientConnection.socket.write(this.generateFile(index, file)); - break; - case 2: - case 3: // clear queue - this.files = []; - break; - case 4: // error - break; - } - - while(this.files.length > 0) { - const info = this.files.shift(); - this.clientConnection.socket.write(this.generateFile(info.index, info.file)); - } - }*/ - } - - private generateFile(index: number, file: number): void { - /*let cacheFile: ByteBuffer; - - if(index === 255 && file === 255) { - cacheFile = new ByteBuffer(crcTable.length); - crcTable.copy(cacheFile, 0, 0); - } else { - cacheFile = cache.getRawFile(index, file); - } - - if(!cacheFile || cacheFile.length === 0) { - throw new Error(`Cache file not found; file(${file}) with index(${index})`); - } - - const buffer = new ByteBuffer((cacheFile.length - 2) + ((cacheFile.length - 2) / 511) + 8); - buffer.put(index, 'BYTE'); - buffer.put(file, 'SHORT'); - - let length: number = ((cacheFile.at(1, 'UNSIGNED') << 24) + (cacheFile.at(2, 'UNSIGNED') << 16) + - (cacheFile.at(3, 'UNSIGNED') << 8) + cacheFile.at(4, 'UNSIGNED')) + 9; - if(cacheFile.at(0) === 0) { - length -= 4; - } - - let c = 3; - for(let i = 0; i < length; i++) { - if(c === 512) { - buffer.put(255, 'BYTE'); - c = 1; - } - - buffer.put(cacheFile.at(i), 'BYTE'); - c++; - } - - return Buffer.from(buffer.flipWriter());*/ - } -} diff --git a/src/net/data-parser/version-handshake-parser.ts b/src/net/data-parser/version-handshake-parser.ts deleted file mode 100644 index 39b0308cb..000000000 --- a/src/net/data-parser/version-handshake-parser.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { DataParser } from './data-parser'; -import { ByteBuffer } from '@runejs/byte-buffer'; - -/** - * Controls the version handshake with the server. - */ -export class VersionHandshakeParser extends DataParser { - - public parse(buffer: ByteBuffer, packetId: number): void { - if(!buffer) { - throw new Error('No data supplied for version handshake'); - } - - if(packetId === 15) { - const gameVersion = buffer.get('INT'); - - const outputBuffer = new ByteBuffer(1); - outputBuffer.put(gameVersion === 435 ? 0 : 6, 'BYTE'); - this.clientConnection.socket.write(outputBuffer); - } else { - throw new Error('Invalid version handshake packet id.'); - } - } -}