From 3d1e78ada694c8bea76ed3c4916421a7ecfe6e50 Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Wed, 19 Jan 2022 21:52:31 +0100 Subject: [PATCH 01/10] feat(api): check live sessions through WS feat(utilities): socket.io support --- api/.env.default | 3 +- utilities/package-lock.json | 322 +++++++++++++++++++++++++++++ utilities/package.json | 1 + utilities/server.js | 4 +- utilities/servers/peerjs-server.js | 3 +- utilities/servers/websocket.js | 106 ++++++++++ 6 files changed, 436 insertions(+), 3 deletions(-) create mode 100644 utilities/servers/websocket.js diff --git a/api/.env.default b/api/.env.default index 8f4ddc01c..a987eef14 100644 --- a/api/.env.default +++ b/api/.env.default @@ -28,7 +28,8 @@ jwt_algorithm=HS512 jwt_exp_delta_seconds=2592000 jwt_issuer=openreplay-default-foss jwt_secret="SET A RANDOM STRING HERE" -peers=http://utilities-openreplay.app.svc.cluster.local:9000/assist/%s/peers +Opeers=http://utilities-openreplay.app.svc.cluster.local:9000/assist/%s/peers +peers=http://utilities-openreplay.app.svc.cluster.local:9000/assist/%s/sockets pg_dbname=postgres pg_host=postgresql.db.svc.cluster.local pg_password=asayerPostgres diff --git a/utilities/package-lock.json b/utilities/package-lock.json index d92362918..94d17e9e1 100644 --- a/utilities/package-lock.json +++ b/utilities/package-lock.json @@ -12,9 +12,18 @@ "aws-sdk": "^2.992.0", "express": "^4.17.1", "peer": "^0.6.1", + "socket.io": "^4.4.1", "source-map": "^0.7.3" } }, + "node_modules/@socket.io/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", @@ -24,6 +33,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", @@ -32,6 +46,11 @@ "@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", @@ -172,6 +191,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/body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -244,6 +271,11 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, "node_modules/content-disposition": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", @@ -335,6 +367,86 @@ "node": ">= 0.8" } }, + "node_modules/engine.io": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.2.tgz", + "integrity": "sha512-v/7eGHxPvO2AWsksyx2PUsQvBafuvqs0jJJQ0FdmJG1b9qIvgSbqDRGwNhfk2XHaTTbTXiC4quRE8Q9nRjsrQQ==", + "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.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", + "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", + "dependencies": { + "@socket.io/base64-arraybuffer": "~1.0.2" + }, + "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.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "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/engine.io/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/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -829,6 +941,82 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, + "node_modules/socket.io": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz", + "integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.1.0", + "socket.io-adapter": "~2.3.3", + "socket.io-parser": "~4.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz", + "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==" + }, + "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.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "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.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "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/source-map": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", @@ -1026,6 +1214,11 @@ } }, "dependencies": { + "@socket.io/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==" + }, "@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", @@ -1035,6 +1228,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", @@ -1043,6 +1241,11 @@ "@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", @@ -1154,6 +1357,11 @@ "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==" + }, "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -1214,6 +1422,11 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, "content-disposition": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", @@ -1284,6 +1497,57 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, + "engine.io": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.2.tgz", + "integrity": "sha512-v/7eGHxPvO2AWsksyx2PUsQvBafuvqs0jJJQ0FdmJG1b9qIvgSbqDRGwNhfk2XHaTTbTXiC4quRE8Q9nRjsrQQ==", + "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.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "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==" + }, + "ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "requires": {} + } + } + }, + "engine.io-parser": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", + "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", + "requires": { + "@socket.io/base64-arraybuffer": "~1.0.2" + } + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -1660,6 +1924,64 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, + "socket.io": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz", + "integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==", + "requires": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.1.0", + "socket.io-adapter": "~2.3.3", + "socket.io-parser": "~4.0.4" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "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.3", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz", + "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==" + }, + "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.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "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==" + } + } + }, "source-map": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", diff --git a/utilities/package.json b/utilities/package.json index da4c927d9..d623a1bd2 100644 --- a/utilities/package.json +++ b/utilities/package.json @@ -21,6 +21,7 @@ "aws-sdk": "^2.992.0", "express": "^4.17.1", "peer": "^0.6.1", + "socket.io": "^4.4.1", "source-map": "^0.7.3" } } diff --git a/utilities/server.js b/utilities/server.js index 980521c1a..8a8dc5cdc 100644 --- a/utilities/server.js +++ b/utilities/server.js @@ -2,11 +2,11 @@ var sourcemapsReaderServer = require('./servers/sourcemaps-server'); var {peerRouter, peerConnection, peerDisconnect, peerError} = require('./servers/peerjs-server'); var express = require('express'); const {ExpressPeerServer} = require('peer'); +const socket = require("./servers/websocket"); const HOST = '0.0.0.0'; const PORT = 9000; - var app = express(); app.use((req, res, next) => { console.log(new Date().toTimeString(), req.method, req.originalUrl); @@ -15,6 +15,7 @@ app.use((req, res, next) => { app.use('/sourcemaps', sourcemapsReaderServer); app.use('/assist', peerRouter); +app.use('/assist', socket.wsRouter); const server = app.listen(PORT, HOST, () => { console.log(`App listening on http://${HOST}:${PORT}`); @@ -31,4 +32,5 @@ peerServer.on('disconnect', peerDisconnect); peerServer.on('error', peerError); app.use('/', peerServer); app.enable('trust proxy'); +socket.start(server); module.exports = server; diff --git a/utilities/servers/peerjs-server.js b/utilities/servers/peerjs-server.js index a103764c3..b139e0104 100644 --- a/utilities/servers/peerjs-server.js +++ b/utilities/servers/peerjs-server.js @@ -66,5 +66,6 @@ module.exports = { peerRouter, peerConnection, peerDisconnect, - peerError + peerError, + extractPeerId }; \ No newline at end of file diff --git a/utilities/servers/websocket.js b/utilities/servers/websocket.js new file mode 100644 index 000000000..47105466c --- /dev/null +++ b/utilities/servers/websocket.js @@ -0,0 +1,106 @@ +const _io = require('socket.io'); +var express = require('express'); +var {extractPeerId} = require('./peerjs-server'); +var wsRouter = express.Router(); +const IDENTITIES = {assist: 'assist', session: 'session'}; +const NEW_ASSIST_MESSAGE = "NEW_ASSISTANT"; +const NO_ASSISTS = "NO_ASSISTANT"; +const NO_SESSIONS = "NO_SESSIONS"; +const wsReconnectionTimeout = process.env.wsReconnectionTimeout | 10 * 1000; + +let connectedSessions = {}; + + +wsRouter.get(`/${process.env.S3_KEY}/sockets`, function (req, res) { + console.log("[WS]looking for all available sessions"); + res.statusCode = 200; + res.setHeader('Content-Type', 'application/json'); + res.end(JSON.stringify({"data": connectedSessions})); +}); +wsRouter.get(`/${process.env.S3_KEY}/sockets/:projectKey`, function (req, res) { + console.log(`[WS]looking for available sessions for ${req.params.projectKey}`); + res.statusCode = 200; + res.setHeader('Content-Type', 'application/json'); + res.end(JSON.stringify({"data": connectedSessions[req.params.projectKey] || []})); +}); + +const removeSession = (projectKey, sessionId) => { + const i = (connectedSessions[projectKey] || []).indexOf(sessionId); + if (i !== -1) { + connectedSessions[projectKey].splice(i, 1); + } +} + +module.exports = { + wsRouter, + start: (server) => { + const io = _io(server, { + cors: { + origin: "*", + methods: ["GET", "POST", "PUT"] + }, + path: '/assist/socket.io' + }); + + io.on('connection', (socket) => { + console.log(`WS started:${socket.id}, Query:${JSON.stringify(socket.handshake.query)}`); + socket.peerId = socket.handshake.query.peerId; + socket.identity = socket.handshake.query.identity; + const {projectKey, sessionId} = extractPeerId(socket.peerId); + socket.sessionId = sessionId; + socket.projectKey = projectKey; + socket.lastMessageReceivedAt = Date.now(); + if (socket.identity === IDENTITIES.session) { + connectedSessions[socket.projectKey] = connectedSessions[socket.projectKey] || []; + if (!connectedSessions[socket.projectKey].includes(socket.sessionId)) { + connectedSessions[socket.projectKey].push(socket.sessionId); + } + } + socket.join(socket.peerId); + if (io.sockets.adapter.rooms.get(socket.peerId)) { + console.log(`${socket.id} joined room:${socket.peerId}, as:${socket.identity}, size:${io.sockets.adapter.rooms.get(socket.peerId).size}`); + } + + socket.on('disconnect', () => { + console.log(`${socket.id} disconnected from ${socket.peerId}, waiting ${wsReconnectionTimeout / 1000}s before checking remaining`); + // wait a little bit before notifying everyone + setTimeout(async () => { + console.log("wait ended, checking for number of connected assistants and sessions"); + if (io.sockets.adapter.rooms.get(socket.peerId)) { + const connected_sockets = await io.in(socket.peerId).fetchSockets(); + let c_sessions = 0, c_assistants = 0; + for (let item of connected_sockets) { + if (item.handshake.query.identity === IDENTITIES.session) { + c_sessions++; + } else { + c_assistants++; + } + } + if (c_sessions === 0) { + console.log(`notifying everyone in ${socket.peerId} about no SESSIONS`); + socket.to(socket.peerId).emit(NO_SESSIONS); + removeSession(socket.projectKey, socket.sessionId); + } + if (c_assistants === 0) { + console.log(`notifying everyone in ${socket.peerId} about no ASSISNTANT`); + socket.to(socket.peerId).emit(NO_ASSISTS); + } + } else { + console.log(`room not found: ${socket.peerId}`); + removeSession(socket.projectKey, socket.sessionId); + } + }, wsReconnectionTimeout); + }); + + socket.onAny((eventName, ...args) => { + socket.lastMessageReceivedAt = Date.now(); + console.log("received event:" + eventName + ", from:" + socket.identity + ", sending message to room:" + socket.peerId + ", size:" + io.sockets.adapter.rooms.get(socket.peerId).size); + socket.to(socket.peerId).emit(eventName, args[0]); + }); + + if (socket.identity === IDENTITIES.assist) { + socket.to(socket.peerId).emit(NEW_ASSIST_MESSAGE); + } + }); + } +}; \ No newline at end of file From 3c3e5ee01c44be3d4641fc0bd8846baca6613a7a Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Thu, 20 Jan 2022 11:28:18 +0100 Subject: [PATCH 02/10] feat(nginx): X-Forwarded-For for assist --- .../openreplay/charts/nginx-ingress/templates/configMap.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/helmcharts/openreplay/charts/nginx-ingress/templates/configMap.yaml b/scripts/helmcharts/openreplay/charts/nginx-ingress/templates/configMap.yaml index f635b270c..3c6f2b3e8 100644 --- a/scripts/helmcharts/openreplay/charts/nginx-ingress/templates/configMap.yaml +++ b/scripts/helmcharts/openreplay/charts/nginx-ingress/templates/configMap.yaml @@ -71,6 +71,7 @@ data: proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://utilities-openreplay.app.svc.cluster.local:9000; } location /assets/ { From 2e25fe909d6444f7927b2433d9373040699eaef2 Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Thu, 20 Jan 2022 11:55:12 +0100 Subject: [PATCH 03/10] feat(utilities): changes websocket feat(chalice): changed live-sessions endpoint --- api/.env.default | 2 +- ee/api/.env.default | 3 +- utilities/servers/websocket.js | 73 ++++++++++++++++++---------------- 3 files changed, 42 insertions(+), 36 deletions(-) diff --git a/api/.env.default b/api/.env.default index a987eef14..efc9dc038 100644 --- a/api/.env.default +++ b/api/.env.default @@ -29,7 +29,7 @@ jwt_exp_delta_seconds=2592000 jwt_issuer=openreplay-default-foss jwt_secret="SET A RANDOM STRING HERE" Opeers=http://utilities-openreplay.app.svc.cluster.local:9000/assist/%s/peers -peers=http://utilities-openreplay.app.svc.cluster.local:9000/assist/%s/sockets +peers=http://utilities-openreplay.app.svc.cluster.local:9000/assist/%s/sockets-list pg_dbname=postgres pg_host=postgresql.db.svc.cluster.local pg_password=asayerPostgres diff --git a/ee/api/.env.default b/ee/api/.env.default index cec7e59a4..8c22230be 100644 --- a/ee/api/.env.default +++ b/ee/api/.env.default @@ -37,7 +37,8 @@ jwt_algorithm=HS512 jwt_exp_delta_seconds=2592000 jwt_issuer=openreplay-default-ee jwt_secret="SET A RANDOM STRING HERE" -peers=http://utilities-openreplay.app.svc.cluster.local:9000/assist/%s/peers +Opeers=http://utilities-openreplay.app.svc.cluster.local:9000/assist/%s/peers +peers=http://utilities-openreplay.app.svc.cluster.local:9000/assist/%s/sockets-list pg_dbname=postgres pg_host=postgresql.db.svc.cluster.local pg_password=asayerPostgres diff --git a/utilities/servers/websocket.js b/utilities/servers/websocket.js index 47105466c..96350245f 100644 --- a/utilities/servers/websocket.js +++ b/utilities/servers/websocket.js @@ -2,22 +2,22 @@ const _io = require('socket.io'); var express = require('express'); var {extractPeerId} = require('./peerjs-server'); var wsRouter = express.Router(); -const IDENTITIES = {assist: 'assist', session: 'session'}; -const NEW_ASSIST_MESSAGE = "NEW_ASSISTANT"; -const NO_ASSISTS = "NO_ASSISTANT"; -const NO_SESSIONS = "NO_SESSIONS"; +const IDENTITIES = {assist: 'agent', session: 'session'}; +const NEW_ASSIST_MESSAGE = "NEW_AGENT"; +const NO_ASSISTS = "NO_AGENT"; +const NO_SESSIONS = "SESSION_DISCONNECTED"; const wsReconnectionTimeout = process.env.wsReconnectionTimeout | 10 * 1000; let connectedSessions = {}; -wsRouter.get(`/${process.env.S3_KEY}/sockets`, function (req, res) { +wsRouter.get(`/${process.env.S3_KEY}/sockets-list`, function (req, res) { console.log("[WS]looking for all available sessions"); res.statusCode = 200; res.setHeader('Content-Type', 'application/json'); res.end(JSON.stringify({"data": connectedSessions})); }); -wsRouter.get(`/${process.env.S3_KEY}/sockets/:projectKey`, function (req, res) { +wsRouter.get(`/${process.env.S3_KEY}/sockets-list/:projectKey`, function (req, res) { console.log(`[WS]looking for available sessions for ${req.params.projectKey}`); res.statusCode = 200; res.setHeader('Content-Type', 'application/json'); @@ -37,9 +37,9 @@ module.exports = { const io = _io(server, { cors: { origin: "*", - methods: ["GET", "POST", "PUT"] + // methods: ["GET", "POST", "PUT"] }, - path: '/assist/socket.io' + path: '/assist/socket' }); io.on('connection', (socket) => { @@ -61,41 +61,46 @@ module.exports = { console.log(`${socket.id} joined room:${socket.peerId}, as:${socket.identity}, size:${io.sockets.adapter.rooms.get(socket.peerId).size}`); } - socket.on('disconnect', () => { - console.log(`${socket.id} disconnected from ${socket.peerId}, waiting ${wsReconnectionTimeout / 1000}s before checking remaining`); + socket.on('disconnect', async () => { + // console.log(`${socket.id} disconnected from ${socket.peerId}, waiting ${wsReconnectionTimeout / 1000}s before checking remaining`); + console.log(`${socket.id} disconnected from ${socket.peerId}`); // wait a little bit before notifying everyone - setTimeout(async () => { - console.log("wait ended, checking for number of connected assistants and sessions"); - if (io.sockets.adapter.rooms.get(socket.peerId)) { - const connected_sockets = await io.in(socket.peerId).fetchSockets(); - let c_sessions = 0, c_assistants = 0; - for (let item of connected_sockets) { - if (item.handshake.query.identity === IDENTITIES.session) { - c_sessions++; - } else { - c_assistants++; - } + // setTimeout(async () => { + console.log("wait ended, checking for number of connected assistants and sessions"); + if (io.sockets.adapter.rooms.get(socket.peerId)) { + const connected_sockets = await io.in(socket.peerId).fetchSockets(); + let c_sessions = 0, c_assistants = 0; + for (let item of connected_sockets) { + if (item.handshake.query.identity === IDENTITIES.session) { + c_sessions++; + } else { + c_assistants++; } - if (c_sessions === 0) { - console.log(`notifying everyone in ${socket.peerId} about no SESSIONS`); - socket.to(socket.peerId).emit(NO_SESSIONS); - removeSession(socket.projectKey, socket.sessionId); - } - if (c_assistants === 0) { - console.log(`notifying everyone in ${socket.peerId} about no ASSISNTANT`); - socket.to(socket.peerId).emit(NO_ASSISTS); - } - } else { - console.log(`room not found: ${socket.peerId}`); + } + if (c_sessions === 0) { + console.log(`notifying everyone in ${socket.peerId} about no SESSIONS`); + socket.to(socket.peerId).emit(NO_SESSIONS); removeSession(socket.projectKey, socket.sessionId); } - }, wsReconnectionTimeout); + if (c_assistants === 0) { + console.log(`notifying everyone in ${socket.peerId} about no ASSISNTANT`); + socket.to(socket.peerId).emit(NO_ASSISTS); + } + } else { + console.log(`room not found: ${socket.peerId}`); + removeSession(socket.projectKey, socket.sessionId); + } + // }, wsReconnectionTimeout); }); socket.onAny((eventName, ...args) => { socket.lastMessageReceivedAt = Date.now(); console.log("received event:" + eventName + ", from:" + socket.identity + ", sending message to room:" + socket.peerId + ", size:" + io.sockets.adapter.rooms.get(socket.peerId).size); - socket.to(socket.peerId).emit(eventName, args[0]); + if(socket.identity===IDENTITIES.session){ + socket.to(socket.peerId).emit(eventName, args[0]); + }else{ + + } }); if (socket.identity === IDENTITIES.assist) { From e7385e97cb451d6fbb00d48f33b4ed5c71895212 Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Thu, 20 Jan 2022 14:09:56 +0100 Subject: [PATCH 04/10] feat(utilities): changes --- utilities/server.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/utilities/server.js b/utilities/server.js index 8a8dc5cdc..cde36efe2 100644 --- a/utilities/server.js +++ b/utilities/server.js @@ -9,13 +9,17 @@ const PORT = 9000; var app = express(); app.use((req, res, next) => { - console.log(new Date().toTimeString(), req.method, req.originalUrl); + console.log(new Date().toTimeString(), 'REQUEST', req.method, req.originalUrl); + res.on('finish', function () { + console.log(new Date().toTimeString(), 'RESPONSE', req.method, req.originalUrl, this.statusCode); + }) + next(); }); app.use('/sourcemaps', sourcemapsReaderServer); -app.use('/assist', peerRouter); -app.use('/assist', socket.wsRouter); +// app.use('/assist', peerRouter); +// app.use('/assist/', socket.wsRouter); const server = app.listen(PORT, HOST, () => { console.log(`App listening on http://${HOST}:${PORT}`); From 71da892d778870110d13bda0679207a462b5e879 Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Thu, 20 Jan 2022 14:27:16 +0100 Subject: [PATCH 05/10] feat(utilities): changes socketio --- utilities/servers/websocket.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utilities/servers/websocket.js b/utilities/servers/websocket.js index 96350245f..5057d5d9f 100644 --- a/utilities/servers/websocket.js +++ b/utilities/servers/websocket.js @@ -37,9 +37,9 @@ module.exports = { const io = _io(server, { cors: { origin: "*", - // methods: ["GET", "POST", "PUT"] + methods: ["GET", "POST", "PUT"] }, - path: '/assist/socket' + path: '/socket' }); io.on('connection', (socket) => { From fc77eb8af91622fea62553a7f80d7e0b00f2aa5b Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Thu, 20 Jan 2022 16:12:38 +0100 Subject: [PATCH 06/10] feat(utilities): 2 servers for peerjs and socketio feat(nginx): new route for socketio feat(helm): expose an extra port for utilities --- .../nginx-ingress/templates/configMap.yaml | 9 +++++++++ .../openreplay/charts/utilities/values.yaml | 4 +++- utilities/server.js | 20 +++++++++++++------ utilities/servers/websocket.js | 2 +- 4 files changed, 27 insertions(+), 8 deletions(-) diff --git a/scripts/helmcharts/openreplay/charts/nginx-ingress/templates/configMap.yaml b/scripts/helmcharts/openreplay/charts/nginx-ingress/templates/configMap.yaml index 3c6f2b3e8..81a48e433 100644 --- a/scripts/helmcharts/openreplay/charts/nginx-ingress/templates/configMap.yaml +++ b/scripts/helmcharts/openreplay/charts/nginx-ingress/templates/configMap.yaml @@ -74,6 +74,15 @@ data: proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://utilities-openreplay.app.svc.cluster.local:9000; } + location /ws-assist/ { + rewrite ^/ws-assist/(.*) /$1 break; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_pass http://utilities-openreplay.app.svc.cluster.local:9001; + } location /assets/ { rewrite ^/assets/(.*) /sessions-assets/$1 break; proxy_http_version 1.1; diff --git a/scripts/helmcharts/openreplay/charts/utilities/values.yaml b/scripts/helmcharts/openreplay/charts/utilities/values.yaml index 6c3e0056f..9894c6aca 100644 --- a/scripts/helmcharts/openreplay/charts/utilities/values.yaml +++ b/scripts/helmcharts/openreplay/charts/utilities/values.yaml @@ -38,7 +38,9 @@ securityContext: {} service: type: ClusterIP - port: 9000 + ports: + - port: 9000 + - port: 9001 ingress: enabled: false diff --git a/utilities/server.js b/utilities/server.js index cde36efe2..7e0460dd2 100644 --- a/utilities/server.js +++ b/utilities/server.js @@ -8,23 +8,30 @@ const HOST = '0.0.0.0'; const PORT = 9000; var app = express(); -app.use((req, res, next) => { +var wsapp = express(); +const request_logger = (req, res, next) => { console.log(new Date().toTimeString(), 'REQUEST', req.method, req.originalUrl); res.on('finish', function () { console.log(new Date().toTimeString(), 'RESPONSE', req.method, req.originalUrl, this.statusCode); }) next(); -}); +}; +app.use(request_logger); +wsapp.use(request_logger); app.use('/sourcemaps', sourcemapsReaderServer); -// app.use('/assist', peerRouter); -// app.use('/assist/', socket.wsRouter); +app.use('/assist', peerRouter); +wsapp.use('/assist', socket.wsRouter); const server = app.listen(PORT, HOST, () => { console.log(`App listening on http://${HOST}:${PORT}`); console.log('Press Ctrl+C to quit.'); }); +const wsserver = app.listen(PORT + 1, HOST, () => { + console.log(`WS App listening on http://${HOST}:${PORT + 1}`); + console.log('Press Ctrl+C to quit.'); +}); const peerServer = ExpressPeerServer(server, { debug: true, path: '/', @@ -36,5 +43,6 @@ peerServer.on('disconnect', peerDisconnect); peerServer.on('error', peerError); app.use('/', peerServer); app.enable('trust proxy'); -socket.start(server); -module.exports = server; +wsapp.enable('trust proxy'); +socket.start(wsserver); +module.exports = {wsserver, server}; diff --git a/utilities/servers/websocket.js b/utilities/servers/websocket.js index 5057d5d9f..ffe28efaa 100644 --- a/utilities/servers/websocket.js +++ b/utilities/servers/websocket.js @@ -39,7 +39,7 @@ module.exports = { origin: "*", methods: ["GET", "POST", "PUT"] }, - path: '/socket' + // path: '/socket' }); io.on('connection', (socket) => { From 01a51515a953c5d7ff2900a2ef5a3281c930f05f Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Thu, 20 Jan 2022 18:22:28 +0100 Subject: [PATCH 07/10] feat(utilities): fixed socketio port feat(utilities): set socketio path to /socket feat(helm): expose an 2 ports for utilities --- .../utilities/templates/deployment.yaml | 6 ++++-- .../charts/utilities/templates/service.yaml | 8 +++++--- .../openreplay/charts/utilities/values.yaml | 8 ++++++-- utilities/server.js | 20 ++++++++++--------- utilities/servers/websocket.js | 2 +- 5 files changed, 27 insertions(+), 17 deletions(-) diff --git a/scripts/helmcharts/openreplay/charts/utilities/templates/deployment.yaml b/scripts/helmcharts/openreplay/charts/utilities/templates/deployment.yaml index 628cda58d..60d903e42 100644 --- a/scripts/helmcharts/openreplay/charts/utilities/templates/deployment.yaml +++ b/scripts/helmcharts/openreplay/charts/utilities/templates/deployment.yaml @@ -55,9 +55,11 @@ spec: value: '{{ $val }}' {{- end}} ports: - - name: http - containerPort: {{ .Values.service.port }} + {{- range $key, $val := .Values.service.ports }} + - name: {{ $key }} + containerPort: {{ $val }} protocol: TCP + {{- end }} resources: {{- toYaml .Values.resources | nindent 12 }} {{- with .Values.nodeSelector }} diff --git a/scripts/helmcharts/openreplay/charts/utilities/templates/service.yaml b/scripts/helmcharts/openreplay/charts/utilities/templates/service.yaml index c9afad7d5..9ec9f18cf 100644 --- a/scripts/helmcharts/openreplay/charts/utilities/templates/service.yaml +++ b/scripts/helmcharts/openreplay/charts/utilities/templates/service.yaml @@ -7,9 +7,11 @@ metadata: spec: type: {{ .Values.service.type }} ports: - - port: {{ .Values.service.port }} - targetPort: http + {{- range $key, $val := .Values.service.ports }} + - port: {{ $val }} + targetPort: {{ $key }} protocol: TCP - name: http + name: {{ $key }} + {{- end}} selector: {{- include "utilities.selectorLabels" . | nindent 4 }} diff --git a/scripts/helmcharts/openreplay/charts/utilities/values.yaml b/scripts/helmcharts/openreplay/charts/utilities/values.yaml index 9894c6aca..36759f6cb 100644 --- a/scripts/helmcharts/openreplay/charts/utilities/values.yaml +++ b/scripts/helmcharts/openreplay/charts/utilities/values.yaml @@ -36,11 +36,15 @@ securityContext: {} # runAsNonRoot: true # runAsUser: 1000 +#service: +# type: ClusterIP +# port: 9000 + service: type: ClusterIP ports: - - port: 9000 - - port: 9001 + peerjs: 9000 + socketio: 9001 ingress: enabled: false diff --git a/utilities/server.js b/utilities/server.js index 7e0460dd2..89d67d5a3 100644 --- a/utilities/server.js +++ b/utilities/server.js @@ -9,16 +9,18 @@ const PORT = 9000; var app = express(); var wsapp = express(); -const request_logger = (req, res, next) => { - console.log(new Date().toTimeString(), 'REQUEST', req.method, req.originalUrl); - res.on('finish', function () { - console.log(new Date().toTimeString(), 'RESPONSE', req.method, req.originalUrl, this.statusCode); - }) +const request_logger = (identity) => { + return (req, res, next) => { + console.log(identity,new Date().toTimeString(), 'REQUEST', req.method, req.originalUrl); + res.on('finish', function () { + console.log(new Date().toTimeString(), 'RESPONSE', req.method, req.originalUrl, this.statusCode); + }) - next(); + next(); + } }; -app.use(request_logger); -wsapp.use(request_logger); +app.use(request_logger("[app]")); +wsapp.use(request_logger("[wsapp]")); app.use('/sourcemaps', sourcemapsReaderServer); app.use('/assist', peerRouter); @@ -28,7 +30,7 @@ const server = app.listen(PORT, HOST, () => { console.log(`App listening on http://${HOST}:${PORT}`); console.log('Press Ctrl+C to quit.'); }); -const wsserver = app.listen(PORT + 1, HOST, () => { +const wsserver = wsapp.listen(PORT + 1, HOST, () => { console.log(`WS App listening on http://${HOST}:${PORT + 1}`); console.log('Press Ctrl+C to quit.'); }); diff --git a/utilities/servers/websocket.js b/utilities/servers/websocket.js index ffe28efaa..5057d5d9f 100644 --- a/utilities/servers/websocket.js +++ b/utilities/servers/websocket.js @@ -39,7 +39,7 @@ module.exports = { origin: "*", methods: ["GET", "POST", "PUT"] }, - // path: '/socket' + path: '/socket' }); io.on('connection', (socket) => { From be0bb9ec03e699ee8344d81cb24eb6f68466fab7 Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Thu, 20 Jan 2022 19:37:15 +0100 Subject: [PATCH 08/10] feat(utilities): enhanced socketio --- utilities/servers/websocket.js | 61 ++++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 18 deletions(-) diff --git a/utilities/servers/websocket.js b/utilities/servers/websocket.js index 5057d5d9f..262392d25 100644 --- a/utilities/servers/websocket.js +++ b/utilities/servers/websocket.js @@ -2,10 +2,11 @@ const _io = require('socket.io'); var express = require('express'); var {extractPeerId} = require('./peerjs-server'); var wsRouter = express.Router(); -const IDENTITIES = {assist: 'agent', session: 'session'}; -const NEW_ASSIST_MESSAGE = "NEW_AGENT"; -const NO_ASSISTS = "NO_AGENT"; +const IDENTITIES = {agent: 'agent', session: 'session'}; +const NEW_AGENT_MESSAGE = "NEW_AGENT"; +const NO_AGENTS = "NO_AGENT"; const NO_SESSIONS = "SESSION_DISCONNECTED"; +const SESSION_ALREADY_CONNECTED = "SESSION_ALREADY_CONNECTED"; const wsReconnectionTimeout = process.env.wsReconnectionTimeout | 10 * 1000; let connectedSessions = {}; @@ -29,7 +30,17 @@ const removeSession = (projectKey, sessionId) => { if (i !== -1) { connectedSessions[projectKey].splice(i, 1); } -} +}; + +const findSessionSocketId = async (io, peerId) => { + const connected_sockets = await io.in(peerId).fetchSockets(); + for (let item of connected_sockets) { + if (item.handshake.query.identity === IDENTITIES.session) { + return item.id; + } + } + return null; +}; module.exports = { wsRouter, @@ -42,7 +53,7 @@ module.exports = { path: '/socket' }); - io.on('connection', (socket) => { + io.on('connection', async (socket) => { console.log(`WS started:${socket.id}, Query:${JSON.stringify(socket.handshake.query)}`); socket.peerId = socket.handshake.query.peerId; socket.identity = socket.handshake.query.identity; @@ -55,6 +66,12 @@ module.exports = { if (!connectedSessions[socket.projectKey].includes(socket.sessionId)) { connectedSessions[socket.projectKey].push(socket.sessionId); } + let sessionSocketId = await findSessionSocketId(io, socket.peerId); + if (sessionSocketId !== null) { + console.log(`session already connected, refusing new connexion`); + io.to(socket.id).emit(SESSION_ALREADY_CONNECTED); + return socket.disconnect(); + } } socket.join(socket.peerId); if (io.sockets.adapter.rooms.get(socket.peerId)) { @@ -66,15 +83,15 @@ module.exports = { console.log(`${socket.id} disconnected from ${socket.peerId}`); // wait a little bit before notifying everyone // setTimeout(async () => { - console.log("wait ended, checking for number of connected assistants and sessions"); + console.log("wait ended, checking for number of connected agentants and sessions"); if (io.sockets.adapter.rooms.get(socket.peerId)) { const connected_sockets = await io.in(socket.peerId).fetchSockets(); - let c_sessions = 0, c_assistants = 0; + let c_sessions = 0, c_agentants = 0; for (let item of connected_sockets) { if (item.handshake.query.identity === IDENTITIES.session) { c_sessions++; } else { - c_assistants++; + c_agentants++; } } if (c_sessions === 0) { @@ -82,9 +99,9 @@ module.exports = { socket.to(socket.peerId).emit(NO_SESSIONS); removeSession(socket.projectKey, socket.sessionId); } - if (c_assistants === 0) { - console.log(`notifying everyone in ${socket.peerId} about no ASSISNTANT`); - socket.to(socket.peerId).emit(NO_ASSISTS); + if (c_agentants === 0) { + console.log(`notifying everyone in ${socket.peerId} about no AGENTS`); + socket.to(socket.peerId).emit(NO_AGENTS); } } else { console.log(`room not found: ${socket.peerId}`); @@ -93,18 +110,26 @@ module.exports = { // }, wsReconnectionTimeout); }); - socket.onAny((eventName, ...args) => { + socket.onAny(async (eventName, ...args) => { socket.lastMessageReceivedAt = Date.now(); - console.log("received event:" + eventName + ", from:" + socket.identity + ", sending message to room:" + socket.peerId + ", size:" + io.sockets.adapter.rooms.get(socket.peerId).size); - if(socket.identity===IDENTITIES.session){ + if (socket.identity === IDENTITIES.session) { + console.log(`received event:${eventName}, from:${socket.identity}, sending message to room:${socket.peerId}, size: ${io.sockets.adapter.rooms.get(socket.peerId).size}`); socket.to(socket.peerId).emit(eventName, args[0]); - }else{ - + } else { + console.log(`received event:${eventName}, from:${socket.identity}, sending message to session of room:${socket.peerId}, size:${io.sockets.adapter.rooms.get(socket.peerId).size}`); + let socketId = await findSessionSocketId(io, socket.peerId); + if (socketId === null) { + console.log(`session not found for:${socket.peerId}`); + io.to(socket.id).emit(NO_SESSIONS); + } else { + console.log("message sent"); + io.to(socketId).emit(eventName, args[0]); + } } }); - if (socket.identity === IDENTITIES.assist) { - socket.to(socket.peerId).emit(NEW_ASSIST_MESSAGE); + if (socket.identity === IDENTITIES.agent) { + socket.to(socket.peerId).emit(NEW_AGENT_MESSAGE); } }); } From 653f87b5703f6ae92be2ec4955a0244b3e91c77b Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Fri, 21 Jan 2022 14:36:11 +0100 Subject: [PATCH 09/10] feat(utilities): augmented socketio message size --- utilities/servers/websocket.js | 1 + 1 file changed, 1 insertion(+) diff --git a/utilities/servers/websocket.js b/utilities/servers/websocket.js index 262392d25..7c35b2800 100644 --- a/utilities/servers/websocket.js +++ b/utilities/servers/websocket.js @@ -46,6 +46,7 @@ module.exports = { wsRouter, start: (server) => { const io = _io(server, { + maxHttpBufferSize: 7e6, cors: { origin: "*", methods: ["GET", "POST", "PUT"] From 92ac69accf5177ecc80e1e7084527b0c9c5efffe Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Mon, 31 Jan 2022 16:34:21 +0100 Subject: [PATCH 10/10] feat(utilities): notify agent about no-session when connected feat(utilities): notify session about existing agents when connected --- utilities/servers/websocket.js | 68 ++++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 24 deletions(-) diff --git a/utilities/servers/websocket.js b/utilities/servers/websocket.js index 7c35b2800..8f64575e2 100644 --- a/utilities/servers/websocket.js +++ b/utilities/servers/websocket.js @@ -7,7 +7,7 @@ const NEW_AGENT_MESSAGE = "NEW_AGENT"; const NO_AGENTS = "NO_AGENT"; const NO_SESSIONS = "SESSION_DISCONNECTED"; const SESSION_ALREADY_CONNECTED = "SESSION_ALREADY_CONNECTED"; -const wsReconnectionTimeout = process.env.wsReconnectionTimeout | 10 * 1000; +// const wsReconnectionTimeout = process.env.wsReconnectionTimeout | 10 * 1000; let connectedSessions = {}; @@ -42,6 +42,25 @@ const findSessionSocketId = async (io, peerId) => { return null; }; +async function sessions_agents_count(io, socket) { + let c_sessions = 0, c_agents = 0; + if (io.sockets.adapter.rooms.get(socket.peerId)) { + const connected_sockets = await io.in(socket.peerId).fetchSockets(); + + for (let item of connected_sockets) { + if (item.handshake.query.identity === IDENTITIES.session) { + c_sessions++; + } else { + c_agents++; + } + } + } else { + c_agents = -1; + c_sessions = -1; + } + return {c_sessions, c_agents}; +} + module.exports = { wsRouter, start: (server) => { @@ -62,17 +81,25 @@ module.exports = { socket.sessionId = sessionId; socket.projectKey = projectKey; socket.lastMessageReceivedAt = Date.now(); + let {c_sessions, c_agents} = await sessions_agents_count(io, socket); if (socket.identity === IDENTITIES.session) { connectedSessions[socket.projectKey] = connectedSessions[socket.projectKey] || []; if (!connectedSessions[socket.projectKey].includes(socket.sessionId)) { connectedSessions[socket.projectKey].push(socket.sessionId); } - let sessionSocketId = await findSessionSocketId(io, socket.peerId); - if (sessionSocketId !== null) { + if (c_sessions > 0) { console.log(`session already connected, refusing new connexion`); io.to(socket.id).emit(SESSION_ALREADY_CONNECTED); return socket.disconnect(); } + if (c_agents > 0) { + console.log(`notifying new session about agent-existance`); + io.to(socket.id).emit(NEW_AGENT_MESSAGE); + } + + } else if (c_sessions <= 0) { + console.log(`notifying new agent about no SESSIONS`); + io.to(socket.id).emit(NO_SESSIONS); } socket.join(socket.peerId); if (io.sockets.adapter.rooms.get(socket.peerId)) { @@ -84,30 +111,23 @@ module.exports = { console.log(`${socket.id} disconnected from ${socket.peerId}`); // wait a little bit before notifying everyone // setTimeout(async () => { - console.log("wait ended, checking for number of connected agentants and sessions"); - if (io.sockets.adapter.rooms.get(socket.peerId)) { - const connected_sockets = await io.in(socket.peerId).fetchSockets(); - let c_sessions = 0, c_agentants = 0; - for (let item of connected_sockets) { - if (item.handshake.query.identity === IDENTITIES.session) { - c_sessions++; - } else { - c_agentants++; - } - } - if (c_sessions === 0) { - console.log(`notifying everyone in ${socket.peerId} about no SESSIONS`); - socket.to(socket.peerId).emit(NO_SESSIONS); - removeSession(socket.projectKey, socket.sessionId); - } - if (c_agentants === 0) { - console.log(`notifying everyone in ${socket.peerId} about no AGENTS`); - socket.to(socket.peerId).emit(NO_AGENTS); - } - } else { + console.log("checking for number of connected agents and sessions"); + let {c_sessions, c_agents} = await sessions_agents_count(io, socket); + if (c_sessions === -1 && c_agents === -1) { console.log(`room not found: ${socket.peerId}`); + return removeSession(socket.projectKey, socket.sessionId); + } + if (c_sessions === 0) { + console.log(`notifying everyone in ${socket.peerId} about no SESSIONS`); + socket.to(socket.peerId).emit(NO_SESSIONS); removeSession(socket.projectKey, socket.sessionId); } + if (c_agents === 0) { + console.log(`notifying everyone in ${socket.peerId} about no AGENTS`); + socket.to(socket.peerId).emit(NO_AGENTS); + } + + // }, wsReconnectionTimeout); });