1
Fork 0

typescript(multiplayer-backend): initial commit

Signed-off-by: prescientmoon <git@moonythm.dev>
This commit is contained in:
Matei Adriel 2019-05-19 21:37:39 +03:00 committed by prescientmoon
parent 1544ca69e2
commit 7f3b756378
Signed by: prescientmoon
SSH key fingerprint: SHA256:UUF9JT2s8Xfyv76b8ZuVL7XrmimH4o49p4b+iexbVH4
21 changed files with 807 additions and 80 deletions

View file

@ -1,5 +1,3 @@
//public config
//interfaces
export interface routeList {
[key: string]: string
@ -17,6 +15,12 @@ export const routes: routeList = {
}
//whitelist of urls
export const whiteList = [{
url: "http://localhost:4200"
export const whiteList: whiteListUrl[] = [{
url: "localhost:4200"
},{
url: "localhost:8000"
},{
url: "localhost:3000"
}]
export const staticRoutes:string[] = []

View file

@ -235,6 +235,12 @@
"integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=",
"optional": true
},
"@types/bcryptjs": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.2.tgz",
"integrity": "sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ==",
"dev": true
},
"@types/body-parser": {
"version": "1.17.0",
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz",
@ -245,12 +251,30 @@
"@types/node": "*"
}
},
"@types/bson": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.0.tgz",
"integrity": "sha512-pq/rqJwJWkbS10crsG5bgnrisL8pML79KlMKQMoQwLUjlPAkrUHMvHJ3oGwE7WHR61Lv/nadMwXVAD2b+fpD8Q==",
"dev": true,
"requires": {
"@types/node": "*"
}
},
"@types/caseless": {
"version": "0.12.2",
"resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz",
"integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==",
"optional": true
},
"@types/chalk": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-2.2.0.tgz",
"integrity": "sha512-1zzPV9FDe1I/WHhRkf9SNgqtRJWZqrBWgu7JGveuHmmyR9CnAPCie2N/x+iHrgnpYBIcCJWHBoMRv2TRWktsvw==",
"dev": true,
"requires": {
"chalk": "*"
}
},
"@types/connect": {
"version": "3.4.32",
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz",
@ -260,6 +284,18 @@
"@types/node": "*"
}
},
"@types/connect-mongo": {
"version": "0.0.41",
"resolved": "https://registry.npmjs.org/@types/connect-mongo/-/connect-mongo-0.0.41.tgz",
"integrity": "sha512-l2ork/LNrZftIaYQstJozRHwijmWz7QRbNMIo3UKVDcfsFeh5hyrHHwmurcqOEEstnw1kxaJF4Yr93AykfPsLg==",
"dev": true,
"requires": {
"@types/express": "*",
"@types/express-session": "*",
"@types/mongodb": "*",
"@types/mongoose": "*"
}
},
"@types/dotenv": {
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/@types/dotenv/-/dotenv-6.1.1.tgz",
@ -327,6 +363,12 @@
"@types/node": "*"
}
},
"@types/lodash": {
"version": "4.14.123",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.123.tgz",
"integrity": "sha512-pQvPkc4Nltyx7G1Ww45OjVqUsJP4UsZm+GWJpigXgkikZqJgRm4c48g027o6tdgubWHwFRF15iFd+Y4Pmqv6+Q==",
"dev": true
},
"@types/long": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.0.tgz",
@ -339,6 +381,35 @@
"integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==",
"dev": true
},
"@types/mongodb": {
"version": "3.1.26",
"resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.1.26.tgz",
"integrity": "sha512-i7+l95IbqnGLRW+AJ6F2nzqosLUgU022lDuoHhbQquMV7tgek0vNUg9RwC2Fn7ImBSQSFdCWeU394ciPEwSeaQ==",
"dev": true,
"requires": {
"@types/bson": "*",
"@types/node": "*"
}
},
"@types/mongoose": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/@types/mongoose/-/mongoose-5.5.0.tgz",
"integrity": "sha512-LIuVYQ/6y3ak5f+0C6J+t1ufZA/dM0bqkmEHOtbPO6pH/VB09Tn+BoTh2T2/UbkKH4SLdvupQQRBuCu3XXxynQ==",
"dev": true,
"requires": {
"@types/mongodb": "*",
"@types/node": "*"
}
},
"@types/morgan": {
"version": "1.7.35",
"resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.7.35.tgz",
"integrity": "sha512-E9qFi0seOkdlQnCTPv54brNfGWeFdRaEhI5tSue4pdx/V+xfxvMETsxXhOEcj1cYL+0n/jcTEmj/jD2gjzCwMg==",
"dev": true,
"requires": {
"@types/express": "*"
}
},
"@types/node": {
"version": "11.13.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-11.13.0.tgz",
@ -430,7 +501,6 @@
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"requires": {
"color-convert": "^1.9.0"
}
@ -601,6 +671,19 @@
"integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==",
"optional": true
},
"basic-auth": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
"integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
"requires": {
"safe-buffer": "5.1.2"
}
},
"bcryptjs": {
"version": "2.4.3",
"resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
"integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms="
},
"bignumber.js": {
"version": "7.2.1",
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz",
@ -613,6 +696,11 @@
"integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
"dev": true
},
"bluebird": {
"version": "3.5.1",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
"integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
},
"body-parser": {
"version": "1.18.3",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
@ -694,6 +782,11 @@
}
}
},
"bson": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/bson/-/bson-1.1.1.tgz",
"integrity": "sha512-jCGVYLoYMHDkOsbwJZBCqwMHyH4c+wzgI9hG7Z6SZJRXWr+x58pdIbm2i9a/jFGCkRJqRUr8eoI7lDWa0hTkxg=="
},
"buffer-equal-constant-time": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
@ -704,6 +797,11 @@
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
},
"buffer-shims": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz",
"integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E="
},
"bun": {
"version": "0.0.12",
"resolved": "https://registry.npmjs.org/bun/-/bun-0.0.12.tgz",
@ -794,7 +892,6 @@
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
@ -924,7 +1021,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"
}
@ -932,8 +1028,7 @@
"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="
},
"colour": {
"version": "0.7.1",
@ -1001,6 +1096,72 @@
"xdg-basedir": "^3.0.0"
}
},
"connect-mongo": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/connect-mongo/-/connect-mongo-2.0.3.tgz",
"integrity": "sha512-Vs+QZ/6X6gbCrP1Ls7Oh/wlyY6pgpbPSrUKF5yRT+zd+4GZPNbjNquxquZ+Clv2+03HBXE7T4lVM0PUcaBhihg==",
"requires": {
"mongodb": "^2.0.36"
},
"dependencies": {
"bson": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/bson/-/bson-1.0.9.tgz",
"integrity": "sha512-IQX9/h7WdMBIW/q/++tGd+emQr0XMdeZ6icnT/74Xk9fnabWn+gZgpE+9V+gujL3hhJOoNrnDVY7tWdzc7NUTg=="
},
"es6-promise": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz",
"integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q="
},
"mongodb": {
"version": "2.2.36",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.36.tgz",
"integrity": "sha512-P2SBLQ8Z0PVx71ngoXwo12+FiSfbNfGOClAao03/bant5DgLNkOPAck5IaJcEk4gKlQhDEURzfR3xuBG1/B+IA==",
"requires": {
"es6-promise": "3.2.1",
"mongodb-core": "2.1.20",
"readable-stream": "2.2.7"
}
},
"mongodb-core": {
"version": "2.1.20",
"resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.20.tgz",
"integrity": "sha512-IN57CX5/Q1bhDq6ShAR6gIv4koFsZP7L8WOK1S0lR0pVDQaScffSMV5jxubLsmZ7J+UdqmykKw4r9hG3XQEGgQ==",
"requires": {
"bson": "~1.0.4",
"require_optional": "~1.0.0"
}
},
"process-nextick-args": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
"integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M="
},
"readable-stream": {
"version": "2.2.7",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz",
"integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=",
"requires": {
"buffer-shims": "~1.0.0",
"core-util-is": "~1.0.0",
"inherits": "~2.0.1",
"isarray": "~1.0.0",
"process-nextick-args": "~1.0.6",
"string_decoder": "~1.0.0",
"util-deprecate": "~1.0.1"
}
},
"string_decoder": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
"integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
"requires": {
"safe-buffer": "~5.1.0"
}
}
}
},
"content-disposition": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
@ -1253,8 +1414,7 @@
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
},
"etag": {
"version": "1.8.1",
@ -1587,6 +1747,11 @@
}
}
},
"firestore-store": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/firestore-store/-/firestore-store-1.0.0.tgz",
"integrity": "sha512-brRdcWKHMxcGu065TjmTBAF6Dai2oS9IN/Z44B6vrGNdCph/dNea18MuylhRk/GjmSNIIylTYiEdF/v+z0IxHg=="
},
"for-in": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
@ -2928,8 +3093,7 @@
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
},
"has-value": {
"version": "1.0.0",
@ -3318,6 +3482,11 @@
"safe-buffer": "^5.0.1"
}
},
"kareem": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.0.tgz",
"integrity": "sha512-6hHxsp9e6zQU8nXsP+02HGWXwTkOEw6IROhF2ZA28cYbUk4eJ6QbtZvdqZOdD9YPKghG3apk5eOCvs+tLl3lRg=="
},
"kind-of": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
@ -3468,6 +3637,12 @@
"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",
@ -3553,6 +3728,115 @@
}
}
},
"mongodb": {
"version": "3.2.3",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.2.3.tgz",
"integrity": "sha512-jw8UyPsq4QleZ9z+t/pIVy3L++51vKdaJ2Q/XXeYxk/3cnKioAH8H6f5tkkDivrQL4PUgUOHe9uZzkpRFH1XtQ==",
"requires": {
"mongodb-core": "^3.2.3",
"safe-buffer": "^5.1.2"
}
},
"mongodb-core": {
"version": "3.2.3",
"resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.2.3.tgz",
"integrity": "sha512-UyI0rmvPPkjOJV8XGWa9VCTq7R4hBVipimhnAXeSXnuAPjuTqbyfA5Ec9RcYJ1Hhu+ISnc8bJ1KfGZd4ZkYARQ==",
"requires": {
"bson": "^1.1.1",
"require_optional": "^1.0.1",
"safe-buffer": "^5.1.2",
"saslprep": "^1.0.0"
}
},
"mongoose": {
"version": "5.5.7",
"resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.5.7.tgz",
"integrity": "sha512-Xs4SVuMGkMRdmKZ6ATGVvbp2pjI+KENCNhPZMnksjU3ZerkJHGhWKrUE1A6e/5iZ2lTu6Oz9AOPcfrDgp6BCUw==",
"requires": {
"async": "2.6.1",
"bson": "~1.1.1",
"kareem": "2.3.0",
"mongodb": "3.2.3",
"mongodb-core": "3.2.3",
"mongoose-legacy-pluralize": "1.0.2",
"mpath": "0.6.0",
"mquery": "3.2.0",
"ms": "2.1.1",
"regexp-clone": "0.0.1",
"safe-buffer": "5.1.2",
"sift": "7.0.1",
"sliced": "1.0.1"
},
"dependencies": {
"async": {
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
"integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
"requires": {
"lodash": "^4.17.10"
}
},
"ms": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
}
}
},
"mongoose-legacy-pluralize": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz",
"integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ=="
},
"morgan": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz",
"integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==",
"requires": {
"basic-auth": "~2.0.0",
"debug": "2.6.9",
"depd": "~1.1.2",
"on-finished": "~2.3.0",
"on-headers": "~1.0.1"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
}
}
}
},
"mpath": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.6.0.tgz",
"integrity": "sha512-i75qh79MJ5Xo/sbhxrDrPSEG0H/mr1kcZXJ8dH6URU5jD/knFxCVqVC/gVSW7GIXL/9hHWlT9haLbCXWOll3qw=="
},
"mquery": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.0.tgz",
"integrity": "sha512-qPJcdK/yqcbQiKoemAt62Y0BAc0fTEKo1IThodBD+O5meQRJT/2HSe5QpBNwaa4CjskoGrYWsEyjkqgiE0qjhg==",
"requires": {
"bluebird": "3.5.1",
"debug": "3.1.0",
"regexp-clone": "0.0.1",
"safe-buffer": "5.1.2",
"sliced": "1.0.1"
},
"dependencies": {
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"requires": {
"ms": "2.0.0"
}
}
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
@ -3957,6 +4241,11 @@
"safe-regex": "^1.1.0"
}
},
"regexp-clone": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-0.0.1.tgz",
"integrity": "sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk="
},
"registry-auth-token": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz",
@ -3994,6 +4283,20 @@
"integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
"dev": true
},
"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"
}
},
"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",
@ -4046,6 +4349,15 @@
"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"
}
},
"semver": {
"version": "5.7.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
@ -4144,11 +4456,21 @@
"integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
"dev": true
},
"sift": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz",
"integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g=="
},
"signal-exit": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
},
"sliced": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz",
"integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E="
},
"snakeize": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz",
@ -4312,6 +4634,15 @@
"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"
}
},
"split-array-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/split-array-stream/-/split-array-stream-2.0.0.tgz",
@ -4425,7 +4756,6 @@
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
}
@ -4516,6 +4846,11 @@
"nopt": "~1.0.10"
}
},
"ts-mongoose": {
"version": "0.0.14",
"resolved": "https://registry.npmjs.org/ts-mongoose/-/ts-mongoose-0.0.14.tgz",
"integrity": "sha512-CoVFdDYVrueUVn2P3rw74P7TomYEGhemnMm7EIiPltaROIyiKM1QyomCuakJMctp2kMaMQV1l9syauWc1ZKpnw=="
},
"ts-node": {
"version": "8.0.3",
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.0.3.tgz",

View file

@ -16,19 +16,33 @@
"author": "Matei Adriel",
"license": "ISC",
"devDependencies": {
"@types/bcryptjs": "^2.4.2",
"@types/chalk": "^2.2.0",
"@types/connect-mongo": "0.0.41",
"@types/dotenv": "^6.1.1",
"@types/express": "^4.16.1",
"@types/express-session": "^1.15.12",
"@types/express-validator": "^3.0.0",
"@types/lodash": "^4.14.123",
"@types/mongoose": "^5.5.0",
"@types/morgan": "^1.7.35",
"nodemon": "^1.18.10",
"ts-node": "^8.0.3"
},
"dependencies": {
"bcryptjs": "^2.4.3",
"chalk": "^2.4.2",
"connect-mongo": "^2.0.3",
"dotenv": "^7.0.0",
"express": "^4.16.4",
"express-session": "^1.16.1",
"express-validator": "^5.3.1",
"firebase-admin": "^7.2.0",
"firestore-store": "^1.0.0",
"lodash": "^4.17.11",
"mongoose": "^5.5.7",
"morgan": "^1.9.1",
"ts-mongoose": "0.0.14",
"typescript": "^3.4.1"
}
}

View file

@ -1,26 +1,56 @@
import * as express from "express"
import { baseUrl, routes } from "../config";
import { performance } from "perf_hooks"
import { shortLogger } from "./routes/logging/shortLog";
import * as sessions from "express-session"
import chalk from "chalk";
export interface serverSetupResults{
time:number;
app:express.Application
import { staticRoutes } from "../config";
import { routes } from "./routes"
import { urlencoded } from "body-parser";
import { database } from "./services/db/firestore"
import { morganChalk } from "./middleware/morgan";
import { sessionMiddleware } from "./middleware/sessions"
// @ts-ignore no declaration file
// import * as store from "firestore-store"
import * as store from "connect-mongo"
import { connection, connected } from "./services/db/mongo";
// const firestore = store(sessions)
export interface serverSetupResults {
app: express.Application
}
export const setupServer = ():serverSetupResults => {
export const setupServer = (): Promise<serverSetupResults> =>
new Promise(async (res, rej) => {
try {
let MongoStore = store(sessions)
const start = performance.now()
const app = express()
await connected
for (let i in routes) {
const route = require(`${process.cwd()}/${baseUrl}${routes[i]}`)
app.use(i, route.router)
}
//create express app
const app = express()
const time = performance.now() - start
const message = `Server created in: ${Math.floor(time)}ms`
shortLogger.log("Server created",message)
app.use(urlencoded({ extended: true }), sessions({
secret: process.env.SESSION_SECRET,
saveUninitialized: false,
resave: false,
store: new MongoStore({ mongooseConnection: connection })
}), morganChalk, sessionMiddleware)
return {app,time}
}
//load static routes
staticRoutes.forEach(route => {
app.use(express.static(`${route}`))
})
//Load normal routes
for (let i in routes) {
app.use(`/${i}`, routes[i])
}
console.log(chalk.bold.green("👏 Succesfully creatd server!"))
res({ app })
}
catch (err) {
rej(err)
}
})

View file

@ -1,11 +1,27 @@
import { config } from "dotenv"
import { setupServer } from "./createServer";
import { connected } from "./services/db/mongo"
import chalk from "chalk";
//extract env variables
//⚓ connect to mongodb
connected.then(val => {
console.log(chalk.bold.green("⚓ Succesfully connected to mongoDb!!!"))
}).catch(err => {
console.log(err)
console.log(chalk.bold.red("😭 Something went wrong when connecting to mongoDb!!!"))
process.exit(1)
})
//🗻 extract env variables
config()
//create the server
const {app} = setupServer()
const main = async () => {
//start listeing to requests
app.listen(process.env.PORT)
//create the server
const { app } = await setupServer()
//start listeing to requests
app.listen(process.env.PORT)
}
main()

View file

@ -1,5 +1,8 @@
import { Request, Response } from "express"
import { whiteList, whiteListUrl } from "../../config"
import { whiteList } from "../../config"
import { includes } from "lodash"
const urls = whiteList.map(urlObject => urlObject.url)
//TODO: remove from here
const defaultMethods = "GET, POST, OPTIONS, PUT, PATCH, DELETE"
@ -9,21 +12,17 @@ const defaultMethods = "GET, POST, OPTIONS, PUT, PATCH, DELETE"
* @param url the url to allow
* @param methods the methods to allow the url to do
*/
export const corsErrorFixer = ({url,methods}:whiteListUrl) => {
return (req: Request, res: Response, next: any) => {
res.setHeader('Access-Control-Allow-Origin', url) // Website you wish to allow to connect
res.setHeader('Access-Control-Allow-Methods', methods || defaultMethods) //// Request methods you wish to allow
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type') // Request headers you wish to allow
export const corsErrorFixer = (req: Request, res: Response, next: any) => {
const host = req.get("host")
const methods: any = whiteList.find(value => value.url == host) || { methods: undefined }
// Pass to next layer of middleware
next();
}
if (!includes(urls, host))
return next()
res.setHeader('Access-Control-Allow-Origin', host) // Website you wish to allow to connect
res.setHeader('Access-Control-Allow-Methods', methods.methods || defaultMethods) //// Request methods you wish to allow
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type') // Request headers you wish to allow
// Pass to next layer of middleware
next();
}
/**
* used to allow all urls on the whitelist
*/
export const allowWhitelist = () => {
return whiteList.map(value => corsErrorFixer(value))
}

View file

@ -0,0 +1,26 @@
import * as morgan from "morgan"
import chalk from "chalk"
const { floor } = Math
export const morganChalk = morgan(function (tokens, req, res) {
const status = Number(tokens.status(req,res))
const statusFirstDigit = floor(status / 100)
const emoji = (status === 200) ?
"👌" : (status === 203) ?
"🔎" : (status == 202) ?
"🚧" : (status === 302) ?
"🏹" : (statusFirstDigit === 2) ?
"🌝" : (statusFirstDigit === 4) ?
"😠" :
"❓"
return [
chalk.bold(`${emoji} `),
chalk.green.bold(tokens.method(req, res)),
chalk.red.bold(tokens.status(req, res)),
chalk.blue.italic(tokens.url(req, res)),
chalk.yellow(`${tokens['response-time'](req, res)} ms`),
].join(' ');
});

View file

@ -0,0 +1 @@
export * from "./sessions"

View file

@ -0,0 +1,24 @@
import { Response, Request } from "express";
const getToken = (req: Request) => {
if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') { // Authorization: Bearer g1jipjgi1ifjioj
// Handle token presented as a Bearer token in the Authorization header
return req.headers.authorization.split(' ')[1];
} else if (req.query && req.query.token) {
// Handle token presented as URI param
return req.query.token;
} else if (req.cookies && req.cookies.token) {
// Handle token presented as a cookie parameter
return req.cookies.token;
}
// If we return null, we couldn't find a token.
// In this case, the JWT middleware will return a 401 (unauthorized) to the client for this request
return null;
}
export const sessionMiddleware = (req: Request, res: Response, next: Function) => {
const token = getToken(req)
console.log(token)
next()
}

View file

@ -0,0 +1,9 @@
import { createSchema, Type, typedModel, ExtractDoc } from "ts-mongoose"
const PasswordSchema = createSchema({
uid: Type.string(),
password: Type.string()
})
export const Passsord = typedModel("Password", PasswordSchema)
export type PasswordDoc = ExtractDoc<typeof PasswordSchema>;

View file

@ -0,0 +1,13 @@
import { createSchema, Type, typedModel, ExtractDoc } from "ts-mongoose"
const UserSchema = createSchema({
name: Type.string(),
email: Type.string(),
photo: Type.string(),
friends: Type.array().of(Type.string()),
description: Type.optionalString(),
uid: Type.string()
})
export const User = typedModel("User", UserSchema)
export type UserDoc = ExtractDoc<typeof UserSchema>;

View file

@ -1,11 +1,49 @@
import { Router, Response, Request, urlencoded } from "express"
import { Router, Response, Request } from "express"
import { reddirect } from "../../middleware/reddirect";
import { allowWhitelist } from "../../middleware/corsErrorMiddleware";
import * as sessions from "express-session"
import * as validator from "express-validator"
import { generateUid, encodePassword } from "../../services/auth/signup";
import { savePassword } from "../../services/auth/signup";
import { corsErrorFixer } from "../../middleware/corsErrorMiddleware";
import { config } from "dotenv"
import { compare } from "bcryptjs";
import { User, UserDoc } from "../../models/User";
import { Passsord } from "../../models/Password";
//extract env variables
config()
const router = Router()
router.get("/test", (req, res) => {
res.send("just a test")
})
const loginHtml = (req: Request, res: Response) => {
res.send(`
<form action="/auth/login" method=post>
<div>
<label for=email>email</label>
<input type=text id=email name=email>
</div>
<div>
<label for=password>password</label>
<input type=password id=password name=password>
</div>
<div>
<label for=name>name</label>
<input type=name id=name name=name>
</div>
<button type=submit onclick="
alert('click')
fetch('/',{
headers: {
authorization: 'do u see this?'
}
})">Submit</button>
</form>
`)
}
const sayHello = (req: Request, res: Response) => {
res.send(`
<form action="/auth" method=post>
@ -13,34 +51,172 @@ const sayHello = (req: Request, res: Response) => {
<label for=email>email</label>
<input type=text id=email name=email>
</div>
<div>
<label for=password>password</label>
<input type=password id=password name=password>
</div>
<div>
<label for=name>name</label>
<input type=name id=name name=name>
</div>
<button type=submit>Submit</button>
</form>
`)
}
const auth = (req: Request, res: Response, next: any) => {
//validate
req.check("email", "email isnt valid").isEmail()
const errors = req.validationErrors()
const authHandler = async (req: Request, res: Response) => {
try {
//if already logged in return the uid
if (req.session.uid)
return res.redirect("auth/account")
//if we have erros mark it
if (errors)
req.session.errors = errors
//get data from body
const { password, email, name } = req.body
//reddirect to page
res.send(errors || "Succes!!!")
//check if the email isnt used
if (await User.findOne({ name }))
res.redirect("login")
//validate
req.check("email", "email isnt valid").isEmail()
const errors = req.validationErrors()
if (errors)
res.json({ error: `${req.body.email} is not a valid email` })
//generate an uid
const uid = await generateUid()
const user = new User({
email,
friends: [],
name,
photo: process.env.DEFAULTPROFILEPIC,
uid
} as UserDoc) //used for my editor to help me
encodePassword(password)
//save the password and the user in the db
await Promise.all([
encodePassword(password).then(result => savePassword(uid, result)),
user.save()
])
//save things in session
req.session.uid = uid
//save in the session
req.session.save(() => { })
//send uid back
res.json({
succes: true,
data: {
uid
}
}).status(200)
}
catch (errors) {
//send erros to clinet
res.json({ errors })
}
}
router.use(...allowWhitelist())
router.use("*", urlencoded({ extended: true }), validator(), sessions({
secret: process.env.SESSION_SECRET,
saveUninitialized: false,
resave: false
}))
const account = async (req: Request, res: Response) => {
try {
if (!req.session.uid)
res.json({
succes: false,
errors: ["uid doesnt exist"]
}).status(203)
router.get("/", sayHello)
router.post("/", auth)
res.json({
succes: true,
data: {
uid: req.session.uid
}
})
}
catch (errors) {
//send erros to clinet
res.json({ errors })
}
}
const login = async (req: Request, res: Response) => {
try {
//check if we have an email or an username, and if we are note already logged in
if (req.session.uid)
return res.redirect("account")
let type = "name"
if (req.body.email)
type = "email"
const { password } = req.body
const data = req.body[(type == "name") ? "name" : type]
const doc = await User.findOne({ [data]: req.body[data] })
const uid = doc.uid
//check if the password is good
const passwordHash = await Passsord.findOne({ uid })
const match = await compare(password, passwordHash.password)
//return result
if (!match)
return res.json({
succes: false,
errors: ["wrong password"],
data: {
uid,
hash: passwordHash.password,
password,
[data]: req.body[data]
}
}).status(400)
//update the session ond save it
req.session.uid = uid
req.session.save(() => { })
//send it to the clinet
return res.json({ uid })
}
catch (errors) {
return res.json({ errors })
}
}
const logout = async (req: Request, res: Response) => {
//clear the uid
req.session.uid = undefined
//save it to the db
req.session.save(() => { })
res.send({ succes: true })
}
router.use("*", validator(), corsErrorFixer)
router
.get("/", sayHello)
.post("/", authHandler)
.get("/login", loginHtml)
.post("/login", login)
.get("/account", account)
.get("/logout", logout)
.get("/uid", (req, res) => {
res.send(req.session.uid)
})
.get("/test/uid", async (req, res) => {
res.send(await generateUid())
})
router.use("/*", reddirect("/auth"))
export { router }
export const auth = router

View file

@ -0,0 +1 @@
export * from "./auth"

View file

@ -0,0 +1,8 @@
import { auth } from "./auth"
import { logs } from "./logging"
import { Router } from "express";
export const routes:{[key:string]:Router} = {
auth,
logs
}

View file

@ -0,0 +1 @@
export * from "./logs"

View file

@ -1,7 +1,6 @@
import { Router, Response, Request } from "express"
import { shortLogger } from "./shortLog";
import { reddirect } from "../../middleware/reddirect";
import { allowWhitelist } from "../../middleware/corsErrorMiddleware";
const router = Router()
@ -9,8 +8,7 @@ const getShortLogs = (req: Request, res: Response) => {
res.json(shortLogger.logs)
}
router.use(...allowWhitelist())
router.get("/", getShortLogs)
router.use("/*", reddirect("/logs"))
export { router }
export const logs = router

View file

@ -0,0 +1,45 @@
import * as bcrypt from "bcryptjs"
import { promisify } from "util";
import { randomBytes } from "crypto";
import { database } from "../db/firestore";
import { Passsord, PasswordDoc } from "../../models/Password";
import { User } from "../../models/User";
//promisify functions
const hash = promisify(bcrypt.hash)
export async function generateUid(): Promise<string> {
//generate uid
const uid = randomBytes(16).toString("hex")
//check if document exists
const doc = await User.findOne({ uid })
//if theres already an user with the same id, regenerate
if (doc)
return generateUid()
//then return the uid
return uid
}
export function encodePassword(password: string): Promise<string> {
return hash(password, 10)
}
export function savePassword(uid: string, password: string) {
const passwordInstance = new Passsord({
password, uid
} as PasswordDoc)
return passwordInstance.save()
}
export async function getPassword(uid: string) {
//get doc
const doc = await database.doc(`passwords/${uid}`).get()
//return result
return doc.data()
}

View file

@ -0,0 +1,8 @@
import * as admin from "firebase-admin"
export const firebase = admin.initializeApp({
credential: admin.credential.cert('firebase-admin.json'),
databaseURL: 'https://planets-io.firebaseio.com'
});
export const database = firebase.firestore()

View file

@ -0,0 +1 @@
export * from "./mongo"

View file

@ -0,0 +1,16 @@
import { config } from "dotenv"
import { connect, model, connection } from "mongoose"
config()
connect(process.env.DATABASE, { useNewUrlParser: true })
export const connected = new Promise((res, rej) => {
connection.on("open", (...args: any[]) => {
res(...args)
})
connection.on("error", (...args: any[]) => {
rej(...args)
})
})
export { connection }

View file

@ -19,13 +19,15 @@
"experimentalDecorators": true,
"downlevelIteration": true,
"target": "ESNext",
"resolveJsonModule": true
"resolveJsonModule": true,
"jsx": "preserve"
},
"include": [
"src"
],
"exclude": [
"node_modules",
"dist"
"dist",
"old_client"
]
}