From 925fd75e7ffb3f3bfb6d7dfa2f32633d7f73f4e5 Mon Sep 17 00:00:00 2001 From: Dermot Date: Mon, 25 Oct 2021 21:53:07 +0100 Subject: [PATCH 1/6] Install socket.io and aws-sdk --- package-lock.json | 428 +++++++++++++++++++++++++++++++++++++--------- package.json | 2 + 2 files changed, 346 insertions(+), 84 deletions(-) diff --git a/package-lock.json b/package-lock.json index a5837f6..ef67b63 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "2.0.0", "license": "MIT", "dependencies": { + "aws-sdk": "^2.1013.0", "axios": "^0.21.2", "bcryptjs": "^2.4.3", "body-parser": "^1.19.0", @@ -24,11 +25,11 @@ "mysql": "^2.18.1", "npm": "^7.20.1", "reflect-metadata": "^0.1.13", + "socket.io": "^4.3.1", "spotify-web-api-node": "^5.0.2", "typeorm": "^0.2.34", "uuid": "^8.3.2", "winston": "^3.3.3", - "winston-aws-cloudwatch": "^3.0.0", "winston-cloudwatch": "^3.1.0" }, "devDependencies": { @@ -134,6 +135,11 @@ "@types/node": "*" } }, + "node_modules/@types/component-emitter": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", + "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==" + }, "node_modules/@types/connect": { "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", @@ -143,11 +149,15 @@ "@types/node": "*" } }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, "node_modules/@types/cors": { "version": "2.8.12", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", - "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", - "dev": true + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==" }, "node_modules/@types/express": { "version": "4.17.13", @@ -190,8 +200,7 @@ "node_modules/@types/node": { "version": "16.6.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.6.2.tgz", - "integrity": "sha512-LSw8TZt12ZudbpHc6EkIyDM3nHVWKYrAvGy6EAJfNfjusbwnThqjqxUKKRwuV3iWYeW/LYMzNgaq3MaLffQ2xA==", - "dev": true + "integrity": "sha512-LSw8TZt12ZudbpHc6EkIyDM3nHVWKYrAvGy6EAJfNfjusbwnThqjqxUKKRwuV3iWYeW/LYMzNgaq3MaLffQ2xA==" }, "node_modules/@types/qs": { "version": "6.9.7", @@ -394,9 +403,9 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "node_modules/aws-sdk": { - "version": "2.1009.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1009.0.tgz", - "integrity": "sha512-qKbmt+vzQ7ZSnfEvA+u6d7CkV09AcAGnxZAiNgOAEn8GFFEtERy6C39VoAuWfON/B2avJDYvtRocjVmAxWpgjQ==", + "version": "2.1013.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1013.0.tgz", + "integrity": "sha512-TXxkp/meAdofpC15goFpNuur7fvh/mcMRfHJoP1jYzTtD0wcoB4FK16GLcny0uDYgkQgZuiO9QYv3Rq5bhGCqQ==", "hasInstallScript": true, "dependencies": { "buffer": "4.9.2", @@ -472,6 +481,14 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/base64-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.1.tgz", + "integrity": "sha512-vFIUq7FdLtjZMhATwDul5RZWv2jpXQ09Pd6jcVEOvIsqCWTRFD/ONHNfyOS8dA/Ippi5dsIgpyKWKZaAKZltbA==", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -491,6 +508,14 @@ } ] }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, "node_modules/basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", @@ -572,11 +597,6 @@ "node": ">= 0.6" } }, - "node_modules/bottleneck": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-1.16.0.tgz", - "integrity": "sha1-1s4TgIUnr8gLaQkvFWBmVeWyHxo=" - }, "node_modules/boxen": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", @@ -1117,6 +1137,18 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -1299,6 +1331,66 @@ "once": "^1.4.0" } }, + "node_modules/engine.io": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.0.0.tgz", + "integrity": "sha512-Ui7yl3JajEIaACg8MOUwWvuuwU7jepZqX3BKs1ho7NQRuP4LhN4XIykXhp8bEy+x/DhA0LBZZXYSCkZDqrwMMg==", + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.0", + "ws": "~8.2.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.1.tgz", + "integrity": "sha512-j4p3WwJrG2k92VISM0op7wiq60vO92MlF3CRGxhKHy9ywG1/Dkc72g0dXeDQ+//hrcDn8gqQzoEkdO9FN0d9AA==", + "dependencies": { + "base64-arraybuffer": "~1.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -5977,6 +6069,82 @@ "npm": ">= 3.0.0" } }, + "node_modules/socket.io": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.3.1.tgz", + "integrity": "sha512-HC5w5Olv2XZ0XJ4gOLGzzHEuOCfj3G0SmoW3jLHYYh34EVsIr3EkW9h6kgfW+K3TFEcmYy8JcPWe//KUkBp5jA==", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.0.0", + "socket.io-adapter": "~2.3.2", + "socket.io-parser": "~4.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.2.tgz", + "integrity": "sha512-PBZpxUPYjmoogY0aoaTmo1643JelsaS1CiAwNjRVdrI0X9Seuc19Y2Wife8k88avW6haG8cznvwbubAZwH4Mtg==" + }, + "node_modules/socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "dependencies": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/socks": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.1.tgz", @@ -6937,38 +7105,6 @@ "node": ">= 6.4.0" } }, - "node_modules/winston-aws-cloudwatch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/winston-aws-cloudwatch/-/winston-aws-cloudwatch-3.0.0.tgz", - "integrity": "sha512-QpvP74HjVFGVW5Gap+QwBtg2PYPZToo1tfBTy6I9VIwVFp8KCGxQtqNLeDhpIwG3pg8mrOynrf6Ie/ILTbKkbA==", - "dependencies": { - "aws-sdk": "^2.293.0", - "bottleneck": "^1.16.0", - "debug": "^3.1.0", - "lodash.isempty": "^4.2.1", - "winston-transport": "^4.2.0" - }, - "engines": { - "node": ">=8", - "yarn": ">=1.6.0" - }, - "peerDependencies": { - "winston": "^3.0.0" - } - }, - "node_modules/winston-aws-cloudwatch/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/winston-aws-cloudwatch/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, "node_modules/winston-cloudwatch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/winston-cloudwatch/-/winston-cloudwatch-3.1.0.tgz", @@ -7147,6 +7283,26 @@ "typedarray-to-buffer": "^3.1.5" } }, + "node_modules/ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/xdg-basedir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", @@ -7387,6 +7543,11 @@ "@types/node": "*" } }, + "@types/component-emitter": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", + "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==" + }, "@types/connect": { "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", @@ -7396,11 +7557,15 @@ "@types/node": "*" } }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, "@types/cors": { "version": "2.8.12", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", - "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", - "dev": true + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==" }, "@types/express": { "version": "4.17.13", @@ -7443,8 +7608,7 @@ "@types/node": { "version": "16.6.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.6.2.tgz", - "integrity": "sha512-LSw8TZt12ZudbpHc6EkIyDM3nHVWKYrAvGy6EAJfNfjusbwnThqjqxUKKRwuV3iWYeW/LYMzNgaq3MaLffQ2xA==", - "dev": true + "integrity": "sha512-LSw8TZt12ZudbpHc6EkIyDM3nHVWKYrAvGy6EAJfNfjusbwnThqjqxUKKRwuV3iWYeW/LYMzNgaq3MaLffQ2xA==" }, "@types/qs": { "version": "6.9.7", @@ -7621,9 +7785,9 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "aws-sdk": { - "version": "2.1009.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1009.0.tgz", - "integrity": "sha512-qKbmt+vzQ7ZSnfEvA+u6d7CkV09AcAGnxZAiNgOAEn8GFFEtERy6C39VoAuWfON/B2avJDYvtRocjVmAxWpgjQ==", + "version": "2.1013.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1013.0.tgz", + "integrity": "sha512-TXxkp/meAdofpC15goFpNuur7fvh/mcMRfHJoP1jYzTtD0wcoB4FK16GLcny0uDYgkQgZuiO9QYv3Rq5bhGCqQ==", "requires": { "buffer": "4.9.2", "events": "1.1.1", @@ -7690,11 +7854,21 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "base64-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.1.tgz", + "integrity": "sha512-vFIUq7FdLtjZMhATwDul5RZWv2jpXQ09Pd6jcVEOvIsqCWTRFD/ONHNfyOS8dA/Ippi5dsIgpyKWKZaAKZltbA==" + }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + }, "basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", @@ -7760,11 +7934,6 @@ } } }, - "bottleneck": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-1.16.0.tgz", - "integrity": "sha1-1s4TgIUnr8gLaQkvFWBmVeWyHxo=" - }, "boxen": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", @@ -8180,6 +8349,15 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, "create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -8329,6 +8507,51 @@ "once": "^1.4.0" } }, + "engine.io": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.0.0.tgz", + "integrity": "sha512-Ui7yl3JajEIaACg8MOUwWvuuwU7jepZqX3BKs1ho7NQRuP4LhN4XIykXhp8bEy+x/DhA0LBZZXYSCkZDqrwMMg==", + "requires": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.0", + "ws": "~8.2.3" + }, + "dependencies": { + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "engine.io-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.1.tgz", + "integrity": "sha512-j4p3WwJrG2k92VISM0op7wiq60vO92MlF3CRGxhKHy9ywG1/Dkc72g0dXeDQ+//hrcDn8gqQzoEkdO9FN0d9AA==", + "requires": { + "base64-arraybuffer": "~1.0.1" + } + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -11745,6 +11968,64 @@ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" }, + "socket.io": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.3.1.tgz", + "integrity": "sha512-HC5w5Olv2XZ0XJ4gOLGzzHEuOCfj3G0SmoW3jLHYYh34EVsIr3EkW9h6kgfW+K3TFEcmYy8JcPWe//KUkBp5jA==", + "requires": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.0.0", + "socket.io-adapter": "~2.3.2", + "socket.io-parser": "~4.0.4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "socket.io-adapter": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.2.tgz", + "integrity": "sha512-PBZpxUPYjmoogY0aoaTmo1643JelsaS1CiAwNjRVdrI0X9Seuc19Y2Wife8k88avW6haG8cznvwbubAZwH4Mtg==" + }, + "socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "requires": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "socks": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.1.tgz", @@ -12411,33 +12692,6 @@ } } }, - "winston-aws-cloudwatch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/winston-aws-cloudwatch/-/winston-aws-cloudwatch-3.0.0.tgz", - "integrity": "sha512-QpvP74HjVFGVW5Gap+QwBtg2PYPZToo1tfBTy6I9VIwVFp8KCGxQtqNLeDhpIwG3pg8mrOynrf6Ie/ILTbKkbA==", - "requires": { - "aws-sdk": "^2.293.0", - "bottleneck": "^1.16.0", - "debug": "^3.1.0", - "lodash.isempty": "^4.2.1", - "winston-transport": "^4.2.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, "winston-cloudwatch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/winston-cloudwatch/-/winston-cloudwatch-3.1.0.tgz", @@ -12562,6 +12816,12 @@ "typedarray-to-buffer": "^3.1.5" } }, + "ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "requires": {} + }, "xdg-basedir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", diff --git a/package.json b/package.json index 1fa3d8b..6caf7e2 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ }, "homepage": "https://github.com/mangledbottles/fonz-api", "dependencies": { + "aws-sdk": "^2.1013.0", "axios": "^0.21.2", "bcryptjs": "^2.4.3", "body-parser": "^1.19.0", @@ -39,6 +40,7 @@ "mysql": "^2.18.1", "npm": "^7.20.1", "reflect-metadata": "^0.1.13", + "socket.io": "^4.3.1", "spotify-web-api-node": "^5.0.2", "typeorm": "^0.2.34", "uuid": "^8.3.2", From ef6c4da88c97c00124d8eea3241f01d65a3b4625 Mon Sep 17 00:00:00 2001 From: Dermot Date: Mon, 25 Oct 2021 21:53:41 +0100 Subject: [PATCH 2/6] Initialise Socket Server --- src/App.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/App.ts b/src/App.ts index d8f6564..2a9910e 100644 --- a/src/App.ts +++ b/src/App.ts @@ -1,6 +1,9 @@ /** Initialise API Application and Port */ import express, { Application, NextFunction, Request, Response, Router } from "express"; const app: Application = express(); +const server = require('http').createServer(app); +const { Server } = require("socket.io"); +const io = new Server(server); const port: string = process.env.PORT || '8080'; const NAMESPACE = 'App'; @@ -76,8 +79,18 @@ app.use((req: Request, res: Response) => { }); }); +/** Socket IO Requests */ +io.on('connection', (socket) => { + console.log('a user connected'); + socket.on("disconnect", () => { + console.log("a user disconnected") + }) + +}); + + try { - app.listen(port, (): void => { + server.listen(port, (): void => { Logger.log('info', "[STARTUP] Starting Fonz API Server", {tags: 'startup'}) console.log(`Fonz API is active at localhost:${port}`); }); From 63246d2ad8f45da43e0d6f09a0cbe5fdbf30995b Mon Sep 17 00:00:00 2001 From: Dermot Date: Mon, 25 Oct 2021 21:53:56 +0100 Subject: [PATCH 3/6] Socket - send message --- src/App.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/App.ts b/src/App.ts index 2a9910e..8650be0 100644 --- a/src/App.ts +++ b/src/App.ts @@ -82,6 +82,10 @@ app.use((req: Request, res: Response) => { /** Socket IO Requests */ io.on('connection', (socket) => { console.log('a user connected'); + socket.on('message', (message) => { + console.log(message); + io.emit('message', `User ${globalThis.userId} said ${message}`) + }) socket.on("disconnect", () => { console.log("a user disconnected") }) From cd1bfe4821d9710ea2d1248f9481b535f8a67ac1 Mon Sep 17 00:00:00 2001 From: Dermot Date: Mon, 25 Oct 2021 21:54:06 +0100 Subject: [PATCH 4/6] Socket - Join Session --- src/App.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/App.ts b/src/App.ts index 8650be0..80ed6b1 100644 --- a/src/App.ts +++ b/src/App.ts @@ -86,6 +86,21 @@ io.on('connection', (socket) => { console.log(message); io.emit('message', `User ${globalThis.userId} said ${message}`) }) + + socket.on("session:join", (sessionId, callback) => { + // socket.join(`session:${sessionId}`); // join user to sessionId + // io.to(`session:${sessionId}`).emit(`User joined session ${sessionId}`) // send message to all listeners + // socket.to(socket.id).emit("You have joined the session") + // io.emit(`session:${sessionId}`, sessionId, socket.id, message); + try { + if(!callback) throw("Acknowledgement not set, cannot return session data") + callback({ message: "you have joined the session"}); + console.log({ type: 'join session', sessionId, callback }) + } catch(error) { + new Error(error) + } + }); + socket.on("disconnect", () => { console.log("a user disconnected") }) From b8aca843f299b0edaf77a51ecddff5168bd45d65 Mon Sep 17 00:00:00 2001 From: Dermot Date: Mon, 25 Oct 2021 21:54:53 +0100 Subject: [PATCH 5/6] Socket - Session Queue Song setup --- src/App.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/App.ts b/src/App.ts index 80ed6b1..69c2414 100644 --- a/src/App.ts +++ b/src/App.ts @@ -101,6 +101,10 @@ io.on('connection', (socket) => { } }); + socket.on("session:queue", (sessionId, songUri) => { + + }) + socket.on("disconnect", () => { console.log("a user disconnected") }) From 81c4940af58f70f5d3ec8c93088a2b085c7c2ca1 Mon Sep 17 00:00:00 2001 From: Dermot Date: Mon, 25 Oct 2021 21:56:05 +0100 Subject: [PATCH 6/6] Authentication Middleware for REST and Socket Streamlined JWT verification for both REST and Socket API Streamlined with Middleware extractJWT --- src/App.ts | 9 +++++-- src/middlewares/extractJWT.ts | 49 +++++++++++++++++++++++------------ src/middlewares/index.ts | 2 +- 3 files changed, 41 insertions(+), 19 deletions(-) diff --git a/src/App.ts b/src/App.ts index 69c2414..95c0c34 100644 --- a/src/App.ts +++ b/src/App.ts @@ -14,7 +14,7 @@ const Logger = require('./config/Logger'); globalThis.Logger = Logger; /** Import Authentication Checker */ -import { extractJWT } from './middlewares'; +import { restJWTVerify, socketJWTVerify } from './middlewares'; /** Import dependecies */ var cookieParser = require('cookie-parser'); @@ -62,7 +62,7 @@ app.use('/auth', AuthenticationRoute); app.use('/callback', CallbackRouter); /** All requests after this require authentication */ -app.use(extractJWT); +app.use(restJWTVerify); app.use('/providers', MusicProviders); app.use('/user', UserRoute); app.use('/host', HostRoute); @@ -82,6 +82,10 @@ app.use((req: Request, res: Response) => { /** Socket IO Requests */ io.on('connection', (socket) => { console.log('a user connected'); + + /** Ensure user is properly authenticated */ + io.use(socketJWTVerify); + socket.on('message', (message) => { console.log(message); io.emit('message', `User ${globalThis.userId} said ${message}`) @@ -112,6 +116,7 @@ io.on('connection', (socket) => { }); + try { server.listen(port, (): void => { Logger.log('info', "[STARTUP] Starting Fonz API Server", {tags: 'startup'}) diff --git a/src/middlewares/extractJWT.ts b/src/middlewares/extractJWT.ts index 35bd6ee..a049f1a 100644 --- a/src/middlewares/extractJWT.ts +++ b/src/middlewares/extractJWT.ts @@ -1,15 +1,36 @@ import { Request, Response, NextFunction } from 'express'; +import { Socket } from 'socket.io'; import jwt from 'jsonwebtoken'; const NAMESPACE = 'AuthVerify'; -export const extractJWT = (req: Request, res: Response, next: NextFunction) => { - if (req.headers.authorization) { +export const restJWTVerify = async (req: Request, res: Response, next: NextFunction) => { + try { + if (!req.headers.authorization) throw ({ status: 401, message: 'Unauthorised' }) let token = req.headers.authorization.split(' ')[1]; + await verifyJWT(token); + next(); + } catch (error) { + res.status(error.status || 500).json(error); + } +}; + +export const socketJWTVerify = async (socket: Socket, next: NextFunction) => { + try { + if (!socket.handshake.headers.authorisation) throw ({ status: 401, message: 'Unauthorised' }) + let token = socket.handshake.headers.authorisation; + await verifyJWT(token); + next(); + } catch (error) { + next(new Error("unauthorized")) + } +} +function verifyJWT(token) { + return new Promise(async (resolve, reject) => { jwt.verify(token, process.env.JWT_PRIVATE_KEY, (error, decoded) => { - if(error) { - let resp = { message: "Authentication could not be completed."} - switch(error.message) { + if (error) { + let resp = { message: "Authentication could not be completed." } + switch (error.message) { case 'invalid signature': resp = { message: "Authentication not valid, invalid signature." } break; @@ -17,25 +38,21 @@ export const extractJWT = (req: Request, res: Response, next: NextFunction) => { resp = { message: "Authentication token expired." } break; } - res.status(401).send(resp); + return reject({ status: 401, ...resp }) } const { userId, admin } = decoded; - if(admin) { + if (admin) { globalThis.isAdmin = true; - return next(); + return resolve({}) } /** Add userId to LoggingParams */ globalThis.LoggingParams = { ...globalThis.LoggingParams, userId } globalThis.Logger.log('info', `[${NAMESPACE}] User Authenticated `, { ...globalThis.LoggingParams }) globalThis.userId = userId; - res.locals.userId = userId; - next(); + // res.locals.userId = userId; + return resolve({}) }); - } else { - res.status(401).json({ - message: 'Unauthorized' - }); - } -}; + }) +} \ No newline at end of file diff --git a/src/middlewares/index.ts b/src/middlewares/index.ts index 5f9b149..63e1ad6 100644 --- a/src/middlewares/index.ts +++ b/src/middlewares/index.ts @@ -1 +1 @@ -export { extractJWT } from './extractJWT'; \ No newline at end of file +export { restJWTVerify, socketJWTVerify } from './extractJWT'; \ No newline at end of file