From 55bbc0904a4d753ce022a97c8bf4fe33c03263a0 Mon Sep 17 00:00:00 2001 From: Yash Hegde Date: Fri, 13 Dec 2024 19:11:44 +0530 Subject: [PATCH 01/10] bug --- src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/index.ts b/src/index.ts index 94ebeee..33cdd64 100644 --- a/src/index.ts +++ b/src/index.ts @@ -39,6 +39,7 @@ wss.on('connection', function connection(ws) { //proximity check here //TODO: We are calculating proximity at every move => results in too many computations => what's a better way to do it ? //TODO: Will this approach result in a lag? =>probably yes + //TODO: BUG: When >2 users => proximity message stops working properly=>doesnt clear away + doesnt showup on some client let nearbyUsers = checkProximity(connectedUsers) if (nearbyUsers) { Object.entries(nearbyUsers).forEach(([userId, nearbyUserIds]) => { From a423c38ab67b11e60570ee43ae8d2ae5bdc475a6 Mon Sep 17 00:00:00 2001 From: Yash Hegde Date: Fri, 13 Dec 2024 21:42:59 +0530 Subject: [PATCH 02/10] socket io install and multiplexing for chat route --- package-lock.json | 911 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 + src/index.ts | 2 +- 3 files changed, 914 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index faec34b..0847e68 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,9 @@ "@types/express": "^5.0.0", "@types/ws": "^8.5.13", "express": "^4.21.1", + "mediasoup": "^3.15.2", "nodemon": "^3.1.7", + "socket.io": "^4.8.1", "ts-node": "^10.9.2", "typescript": "^5.7.2", "ws": "^8.18.0" @@ -30,6 +32,35 @@ "node": ">=12" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -55,6 +86,22 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "license": "MIT" + }, "node_modules/@tsconfig/node10": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", @@ -98,6 +145,30 @@ "@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==", + "license": "MIT" + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/express": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.0.tgz", @@ -128,12 +199,24 @@ "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", "license": "MIT" }, + "node_modules/@types/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@types/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-MIyNUZipBTbyUNnhvuXJTY7B6qNI78meck9Jbv3wk0OgNwRyOOVEKDutAkOs1snB/tx0FafyR6/SN4Ps0hZPeg==", + "license": "MIT" + }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "license": "MIT" }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "license": "MIT" + }, "node_modules/@types/node": { "version": "22.10.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.0.tgz", @@ -222,6 +305,30 @@ "node": ">=0.4.0" } }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -253,6 +360,15 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, + "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==", + "license": "MIT", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -378,6 +494,33 @@ "fsevents": "~2.3.2" } }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -420,12 +563,48 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "license": "MIT" }, + "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==", + "license": "MIT", + "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", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "license": "MIT" }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/debug": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", @@ -488,12 +667,24 @@ "node": ">=0.3.1" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -503,6 +694,66 @@ "node": ">= 0.8" } }, + "node_modules/engine.io": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.2.tgz", + "integrity": "sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==", + "license": "MIT", + "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.7.2", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "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/es-define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", @@ -596,6 +847,29 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -641,6 +915,40 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, + "node_modules/flatbuffers": { + "version": "24.3.25", + "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-24.3.25.tgz", + "integrity": "sha512-3HDgPbgiwWMI9zVB7VYBHaMrbOO7Gm0v+yD2FV/sCKj+9NDeVL7BOBYUuhWAQGKWOzBo8S9WdMvV0eixO233XQ==", + "license": "Apache-2.0" + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -701,6 +1009,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -713,6 +1041,30 @@ "node": ">= 6" } }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -725,6 +1077,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/h264-profile-level-id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/h264-profile-level-id/-/h264-profile-level-id-2.0.0.tgz", + "integrity": "sha512-X4CLryVbVA0CtjTExS4G5U1gb2Z4wa32AF8ukVmFuLdw2JRq2aHisor7SY5SYTUUrUSqq0KdPIO18sql6IWIQw==", + "license": "ISC", + "dependencies": { + "@types/debug": "^4.1.12", + "debug": "^4.3.4" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mediasoup" + } + }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -822,6 +1191,15 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, + "node_modules/ini": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", + "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -852,6 +1230,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -873,6 +1260,33 @@ "node": ">=0.12.0" } }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -888,6 +1302,42 @@ "node": ">= 0.6" } }, + "node_modules/mediasoup": { + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/mediasoup/-/mediasoup-3.15.2.tgz", + "integrity": "sha512-H9jEo7WcW97FQpylNo+xTW/DxTtN/pqYdjT644yJ7DiLx5ww1u/3V0InSTSpMfYkWM0u6XzqJ1+pU+oO/Oxh8w==", + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "@types/ini": "^4.1.1", + "debug": "^4.3.7", + "flatbuffers": "^24.3.25", + "h264-profile-level-id": "^2.0.0", + "ini": "^5.0.0", + "node-fetch": "^3.3.2", + "supports-color": "^9.4.0", + "tar": "^7.4.3" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mediasoup" + } + }, + "node_modules/mediasoup/node_modules/supports-color": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", + "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/merge-descriptors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", @@ -951,6 +1401,43 @@ "node": "*" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", + "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", + "license": "MIT", + "dependencies": { + "minipass": "^7.0.4", + "rimraf": "^5.0.5" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -966,6 +1453,43 @@ "node": ">= 0.6" } }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, "node_modules/nodemon": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.7.tgz", @@ -1003,6 +1527,15 @@ "node": ">=0.10.0" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.13.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", @@ -1027,6 +1560,12 @@ "node": ">= 0.8" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -1036,6 +1575,31 @@ "node": ">= 0.8" } }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/path-to-regexp": { "version": "0.1.10", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", @@ -1124,6 +1688,21 @@ "node": ">=8.10.0" } }, + "node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -1248,6 +1827,27 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/side-channel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", @@ -1266,6 +1866,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/simple-update-notifier": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", @@ -1278,6 +1890,68 @@ "node": ">=10" } }, + "node_modules/socket.io": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", + "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.6.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "license": "MIT", + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.17.1" + } + }, + "node_modules/socket.io-adapter/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "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/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -1287,6 +1961,102 @@ "node": ">= 0.8" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -1299,6 +2069,23 @@ "node": ">=4" } }, + "node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -1443,6 +2230,121 @@ "node": ">= 0.8" } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ws": { "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", @@ -1464,6 +2366,15 @@ } } }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/package.json b/package.json index 137e97d..97b1a4d 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,9 @@ "@types/express": "^5.0.0", "@types/ws": "^8.5.13", "express": "^4.21.1", + "mediasoup": "^3.15.2", "nodemon": "^3.1.7", + "socket.io": "^4.8.1", "ts-node": "^10.9.2", "typescript": "^5.7.2", "ws": "^8.18.0" diff --git a/src/index.ts b/src/index.ts index 33cdd64..84d4386 100644 --- a/src/index.ts +++ b/src/index.ts @@ -10,7 +10,7 @@ const httpServer = app.listen(8080, () => { console.log("websocket server started on port 8080") }) -const wss = new WebSocketServer({ server: httpServer }); +const wss = new WebSocketServer({ server: httpServer,path:'/chat' }); let connectedUsers: Map = new Map(); From 4db73334a77c3b736117554580675f7cb13a3309 Mon Sep 17 00:00:00 2001 From: Yash Hegde Date: Sat, 14 Dec 2024 21:28:08 +0530 Subject: [PATCH 03/10] attempt1 --- package-lock.json | 10 +++ package.json | 1 + src/Video/config.ts | 38 +++++++++ src/index.ts | 197 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 246 insertions(+) create mode 100644 src/Video/config.ts diff --git a/package-lock.json b/package-lock.json index 0847e68..e3f90c9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "license": "ISC", "dependencies": { "@types/express": "^5.0.0", + "@types/socket.io": "^3.0.1", "@types/ws": "^8.5.13", "express": "^4.21.1", "mediasoup": "^3.15.2", @@ -259,6 +260,15 @@ "@types/send": "*" } }, + "node_modules/@types/socket.io": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/socket.io/-/socket.io-3.0.1.tgz", + "integrity": "sha512-XSma2FhVD78ymvoxYV4xGXrIH/0EKQ93rR+YR0Y+Kw1xbPzLDCip/UWSejZ08FpxYeYNci/PZPQS9anrvJRqMA==", + "license": "MIT", + "dependencies": { + "socket.io": "*" + } + }, "node_modules/@types/ws": { "version": "8.5.13", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", diff --git a/package.json b/package.json index 97b1a4d..473bb6b 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "license": "ISC", "dependencies": { "@types/express": "^5.0.0", + "@types/socket.io": "^3.0.1", "@types/ws": "^8.5.13", "express": "^4.21.1", "mediasoup": "^3.15.2", diff --git a/src/Video/config.ts b/src/Video/config.ts new file mode 100644 index 0000000..efe3b6c --- /dev/null +++ b/src/Video/config.ts @@ -0,0 +1,38 @@ +export const config = { + listenIp: '0.0.0.0', + listenPort: 8080, +// sslCrt: './certs/cert.pem', +// sslKey: './certs/key.pem', + mediasoup: { + worker: { + rtcMinPort: 10000, + rtcMaxPort: 10100, + logLevel: 'warn', + }, + router: { + mediaCodecs: [ + { + kind: 'audio', + mimeType: 'audio/opus', + clockRate: 48000, + channels: 2, + }, + { + kind: 'video', + mimeType: 'video/VP8', + clockRate: 90000, + parameters: { + 'x-google-start-bitrate': 1000, + }, + }, + ], + }, + webRtcTransport: { + listenIps: [ + { ip: '127.0.0.1', announcedIp: null }, + ], + maxIncomingBitrate: 1500000, + initialAvailableOutgoingBitrate: 1000000, + }, + }, +}; diff --git a/src/index.ts b/src/index.ts index 84d4386..42b715e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,6 +4,23 @@ import { User } from './types/Usertypes' import { broadcastChatMessage, broadcastUserList, broadcastUserMove } from './helperfns/Sockets' import { CreateNewUser } from './helperfns/UserRelated/CreateNewUser' import checkProximity from './helperfns/ProximityCheck/checkProximity' +import http from 'http'; +import { config } from './Video/config' +import { Socket } from 'socket.io' +//import { Socket } from 'socket.io' +const socketIO = require('socket.io'); +const mediasoup = require('mediasoup'); +//const socketIo = new Socket(); + +let worker :any; +let videoServer:any; +let socketServer; +let expressApp; +let producer:any; +let consumer:any; +let producerTransport:any; +let consumerTransport:any; +let mediasoupRouter:any; const app = express() const httpServer = app.listen(8080, () => { @@ -85,3 +102,183 @@ wss.on('connection', function connection(ws) { broadcastUserList(connectedUsers,wss); }); }); + + +async function runWebServer() { + videoServer = http.createServer(app); + videoServer.on('error', (err:any) => { + console.error('starting videoServer failed:', err.message); + }); + + await new Promise((resolve) => { + const { listenIp, listenPort } = config; + videoServer.listen(listenPort, listenIp, () => { + const listenIps = config.mediasoup.webRtcTransport.listenIps[0]; + const ip = listenIps.announcedIp || listenIps.ip; + console.log('server is running'); + console.log(`open https://${ip}:${listenPort} in your web browser`); + resolve(); + }); + }); +} + +async function runSocketServer() { + socketServer = socketIO(videoServer, { + serveClient: false, + path: '/server', + log: false, + }); + + socketServer.on('connection', (socket:any) => { + console.log('client connected'); + + // inform the client about existence of producer + if (producer) { + socket.emit('newProducer'); + } + + socket.on('disconnect', () => { + console.log('client disconnected'); + }); + + socket.on('connect_error', (err: any) => { + console.error('client connection error', err); + }); + + socket.on('getRouterRtpCapabilities', (data:any, callback:any) => { + callback(mediasoupRouter.rtpCapabilities); + }); + + socket.on('createProducerTransport', async (data:any, callback:any) => { + try { + const { transport, params } = await createWebRtcTransport(); + producerTransport = transport; + callback(params); + } catch (err:any) { + console.error(err); + callback({ error: err.message }); + } + }); + + socket.on('createConsumerTransport', async (data:any, callback:any) => { + try { + const { transport, params } = await createWebRtcTransport(); + consumerTransport = transport; + callback(params); + } catch (err:any) { + console.error(err); + callback({ error: err.message }); + } + }); + + socket.on('connectProducerTransport', async (data:any, callback:any) => { + await producerTransport.connect({ dtlsParameters: data.dtlsParameters }); + callback(); + }); + + socket.on('connectConsumerTransport', async (data:any, callback:any) => { + await consumerTransport.connect({ dtlsParameters: data.dtlsParameters }); + callback(); + }); + + socket.on('produce', async (data:any, callback:any) => { + const {kind, rtpParameters} = data; + producer = await producerTransport.produce({ kind, rtpParameters }); + callback({ id: producer.id }); + + // inform clients about new producer + socket.broadcast.emit('newProducer'); + }); + + socket.on('consume', async (data:any, callback:any) => { + callback(await createConsumer(producer, data.rtpCapabilities)); + }); + + socket.on('resume', async (data:any, callback:any) => { + await consumer.resume(); + callback(); + }); + }); +} + +async function runMediasoupWorker() { + worker = await mediasoup.createWorker({ + logLevel: config.mediasoup.worker.logLevel, + //logTags: config.mediasoup.worker.logTags, + rtcMinPort: config.mediasoup.worker.rtcMinPort, + rtcMaxPort: config.mediasoup.worker.rtcMaxPort, + }); + + worker.on('died', () => { + console.error('mediasoup worker died, exiting in 2 seconds... [pid:%d]', worker.pid); + setTimeout(() => process.exit(1), 2000); + }); + + const mediaCodecs = config.mediasoup.router.mediaCodecs; + mediasoupRouter = await worker.createRouter({ mediaCodecs }); +} + +async function createWebRtcTransport() { + const { + maxIncomingBitrate, + initialAvailableOutgoingBitrate + } = config.mediasoup.webRtcTransport; + + const transport = await mediasoupRouter.createWebRtcTransport({ + listenIps: config.mediasoup.webRtcTransport.listenIps, + enableUdp: true, + enableTcp: true, + preferUdp: true, + initialAvailableOutgoingBitrate, + }); + if (maxIncomingBitrate) { + try { + await transport.setMaxIncomingBitrate(maxIncomingBitrate); + } catch (error) { + } + } + return { + transport, + params: { + id: transport.id, + iceParameters: transport.iceParameters, + iceCandidates: transport.iceCandidates, + dtlsParameters: transport.dtlsParameters + }, + }; +} + +async function createConsumer(producer:any, rtpCapabilities:any) { + if (!mediasoupRouter.canConsume( + { + producerId: producer.id, + rtpCapabilities, + }) + ) { + console.error('can not consume'); + return; + } + try { + consumer = await consumerTransport.consume({ + producerId: producer.id, + rtpCapabilities, + paused: producer.kind === 'video', + }); + } catch (error) { + console.error('consume failed', error); + return; + } + + if (consumer.type === 'simulcast') { + await consumer.setPreferredLayers({ spatialLayer: 2, temporalLayer: 2 }); + } + + return { + producerId: producer.id, + id: consumer.id, + kind: consumer.kind, + rtpParameters: consumer.rtpParameters, + type: consumer.type, + producerPaused: consumer.producerPaused + }; +} \ No newline at end of file From 404c739a10f8e069dad6035cae660cb2b3ac09d5 Mon Sep 17 00:00:00 2001 From: Yash Hegde Date: Wed, 18 Dec 2024 20:45:15 +0530 Subject: [PATCH 04/10] atleast socket io is working (prolly) --- package-lock.json | 17 ++ package.json | 3 + src/Video/config.ts | 4 +- src/index.ts | 409 +++++++++++++++++++------------------ src/ssl/cert.pem | 26 +++ src/ssl/key.pem | 28 +++ src/types/httpolyglot.d.ts | 15 ++ tsconfig.json | 8 +- 8 files changed, 308 insertions(+), 202 deletions(-) create mode 100644 src/ssl/cert.pem create mode 100644 src/ssl/key.pem create mode 100644 src/types/httpolyglot.d.ts diff --git a/package-lock.json b/package-lock.json index e3f90c9..377be23 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,10 @@ "@types/express": "^5.0.0", "@types/socket.io": "^3.0.1", "@types/ws": "^8.5.13", + "cors": "^2.8.5", "express": "^4.21.1", + "fs": "^0.0.1-security", + "httpolyglot": "^0.1.2", "mediasoup": "^3.15.2", "nodemon": "^3.1.7", "socket.io": "^4.8.1", @@ -977,6 +980,12 @@ "node": ">= 0.6" } }, + "node_modules/fs": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==", + "license": "ISC" + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -1177,6 +1186,14 @@ "node": ">= 0.8" } }, + "node_modules/httpolyglot": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/httpolyglot/-/httpolyglot-0.1.2.tgz", + "integrity": "sha512-ouHI1AaQMLgn4L224527S5+vq6hgvqPteurVfbm7ChViM3He2Wa8KP1Ny7pTYd7QKnDSPKcN8JYfC8r/lmsE3A==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", diff --git a/package.json b/package.json index 473bb6b..1a9c819 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,10 @@ "@types/express": "^5.0.0", "@types/socket.io": "^3.0.1", "@types/ws": "^8.5.13", + "cors": "^2.8.5", "express": "^4.21.1", + "fs": "^0.0.1-security", + "httpolyglot": "^0.1.2", "mediasoup": "^3.15.2", "nodemon": "^3.1.7", "socket.io": "^4.8.1", diff --git a/src/Video/config.ts b/src/Video/config.ts index efe3b6c..a43d6ae 100644 --- a/src/Video/config.ts +++ b/src/Video/config.ts @@ -1,3 +1,5 @@ +import { WorkerLogLevel } from "mediasoup/node/lib/types"; + export const config = { listenIp: '0.0.0.0', listenPort: 8080, @@ -7,7 +9,7 @@ export const config = { worker: { rtcMinPort: 10000, rtcMaxPort: 10100, - logLevel: 'warn', + logLevel: 'warn'as WorkerLogLevel, }, router: { mediaCodecs: [ diff --git a/src/index.ts b/src/index.ts index 42b715e..4936f83 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,33 +4,70 @@ import { User } from './types/Usertypes' import { broadcastChatMessage, broadcastUserList, broadcastUserMove } from './helperfns/Sockets' import { CreateNewUser } from './helperfns/UserRelated/CreateNewUser' import checkProximity from './helperfns/ProximityCheck/checkProximity' -import http from 'http'; -import { config } from './Video/config' -import { Socket } from 'socket.io' -//import { Socket } from 'socket.io' -const socketIO = require('socket.io'); -const mediasoup = require('mediasoup'); -//const socketIo = new Socket(); - -let worker :any; -let videoServer:any; -let socketServer; -let expressApp; -let producer:any; -let consumer:any; -let producerTransport:any; -let consumerTransport:any; -let mediasoupRouter:any; - -const app = express() -const httpServer = app.listen(8080, () => { - console.log("websocket server started on port 8080") +//import http from 'http'; +import https from 'httpolyglot'; +import { createServer } from 'http' +import { config } from './Video/config'; +import { Server } from 'socket.io'; +import * as mediasoup from 'mediasoup'; +import cors from 'cors'; +import fs from 'fs' + + +// Mediasoup-related variables +// let worker: any; +// let producer: any; +// let consumer: any; +// let producerTransport: any; +// let consumerTransport: any; +// let mediasoupRouter: any; + +// const options = { +// key:fs.readFileSync('./src/ssl/key.pem','utf-8'), +// cert:fs.readFileSync('./src/ssl/cert.pem','utf-8') +// } + + +const app = express(); +app.use(cors()); + +app.get('/', (req,res) => { + res.send('hello from lithouse Backend') }) +//const httpsServer = https.createServer(options, app); +const httpsServer = createServer(app); + +const wss = new WebSocketServer({ server: httpsServer, path: '/chat' }); +const io = new Server(httpsServer, { + cors: { + origin: "http://localhost:5173", + methods: ["GET", "POST"], + credentials:true + }, + //transports: ['websocket', 'polling'] + +}); +//const peers = io.of('/mediasoup') -const wss = new WebSocketServer({ server: httpServer,path:'/chat' }); +io.on('connection', (socket) => { + console.log("user connected with id " + socket.id); + socket.on('connect_error', (error) => { + console.log('Connection error:', error); + }); + + socket.emit('connection-success', { + socketId:socket.id + }) + socket.emit("hello","welcome to server") + socket.on('disconnect', () => { + console.log('A user disconnected with userid '+socket.id); + }); +}) let connectedUsers: Map = new Map(); +io.listen(4000); + wss.on('connection', function connection(ws) { const userId = CreateNewUser(connectedUsers,ws) @@ -102,183 +139,157 @@ wss.on('connection', function connection(ws) { broadcastUserList(connectedUsers,wss); }); }); - - -async function runWebServer() { - videoServer = http.createServer(app); - videoServer.on('error', (err:any) => { - console.error('starting videoServer failed:', err.message); - }); - - await new Promise((resolve) => { - const { listenIp, listenPort } = config; - videoServer.listen(listenPort, listenIp, () => { - const listenIps = config.mediasoup.webRtcTransport.listenIps[0]; - const ip = listenIps.announcedIp || listenIps.ip; - console.log('server is running'); - console.log(`open https://${ip}:${listenPort} in your web browser`); - resolve(); - }); - }); -} - -async function runSocketServer() { - socketServer = socketIO(videoServer, { - serveClient: false, - path: '/server', - log: false, - }); - - socketServer.on('connection', (socket:any) => { - console.log('client connected'); - // inform the client about existence of producer - if (producer) { - socket.emit('newProducer'); - } - - socket.on('disconnect', () => { - console.log('client disconnected'); - }); - - socket.on('connect_error', (err: any) => { - console.error('client connection error', err); - }); - - socket.on('getRouterRtpCapabilities', (data:any, callback:any) => { - callback(mediasoupRouter.rtpCapabilities); - }); - - socket.on('createProducerTransport', async (data:any, callback:any) => { - try { - const { transport, params } = await createWebRtcTransport(); - producerTransport = transport; - callback(params); - } catch (err:any) { - console.error(err); - callback({ error: err.message }); - } - }); - - socket.on('createConsumerTransport', async (data:any, callback:any) => { - try { - const { transport, params } = await createWebRtcTransport(); - consumerTransport = transport; - callback(params); - } catch (err:any) { - console.error(err); - callback({ error: err.message }); - } - }); - - socket.on('connectProducerTransport', async (data:any, callback:any) => { - await producerTransport.connect({ dtlsParameters: data.dtlsParameters }); - callback(); - }); - - socket.on('connectConsumerTransport', async (data:any, callback:any) => { - await consumerTransport.connect({ dtlsParameters: data.dtlsParameters }); - callback(); - }); - - socket.on('produce', async (data:any, callback:any) => { - const {kind, rtpParameters} = data; - producer = await producerTransport.produce({ kind, rtpParameters }); - callback({ id: producer.id }); - - // inform clients about new producer - socket.broadcast.emit('newProducer'); - }); - - socket.on('consume', async (data:any, callback:any) => { - callback(await createConsumer(producer, data.rtpCapabilities)); - }); - - socket.on('resume', async (data:any, callback:any) => { - await consumer.resume(); - callback(); - }); - }); -} - -async function runMediasoupWorker() { - worker = await mediasoup.createWorker({ - logLevel: config.mediasoup.worker.logLevel, - //logTags: config.mediasoup.worker.logTags, - rtcMinPort: config.mediasoup.worker.rtcMinPort, - rtcMaxPort: config.mediasoup.worker.rtcMaxPort, - }); +httpsServer.listen(8080, () => { + console.log('Server is running on http://localhost:8080'); +}); - worker.on('died', () => { - console.error('mediasoup worker died, exiting in 2 seconds... [pid:%d]', worker.pid); - setTimeout(() => process.exit(1), 2000); - }); - const mediaCodecs = config.mediasoup.router.mediaCodecs; - mediasoupRouter = await worker.createRouter({ mediaCodecs }); -} - -async function createWebRtcTransport() { - const { - maxIncomingBitrate, - initialAvailableOutgoingBitrate - } = config.mediasoup.webRtcTransport; - - const transport = await mediasoupRouter.createWebRtcTransport({ - listenIps: config.mediasoup.webRtcTransport.listenIps, - enableUdp: true, - enableTcp: true, - preferUdp: true, - initialAvailableOutgoingBitrate, - }); - if (maxIncomingBitrate) { - try { - await transport.setMaxIncomingBitrate(maxIncomingBitrate); - } catch (error) { - } - } - return { - transport, - params: { - id: transport.id, - iceParameters: transport.iceParameters, - iceCandidates: transport.iceCandidates, - dtlsParameters: transport.dtlsParameters - }, - }; -} - -async function createConsumer(producer:any, rtpCapabilities:any) { - if (!mediasoupRouter.canConsume( - { - producerId: producer.id, - rtpCapabilities, - }) - ) { - console.error('can not consume'); - return; - } - try { - consumer = await consumerTransport.consume({ - producerId: producer.id, - rtpCapabilities, - paused: producer.kind === 'video', - }); - } catch (error) { - console.error('consume failed', error); - return; - } - - if (consumer.type === 'simulcast') { - await consumer.setPreferredLayers({ spatialLayer: 2, temporalLayer: 2 }); - } - - return { - producerId: producer.id, - id: consumer.id, - kind: consumer.kind, - rtpParameters: consumer.rtpParameters, - type: consumer.type, - producerPaused: consumer.producerPaused - }; -} \ No newline at end of file +//why worker is needed? +// async function runMediasoupWorker() { +// try { +// console.log('Attempting to create Mediasoup worker'); +// worker = await mediasoup.createWorker({ +// logLevel: config.mediasoup.worker.logLevel as mediasoup.types.WorkerLogLevel, +// rtcMinPort: config.mediasoup.worker.rtcMinPort, +// rtcMaxPort: config.mediasoup.worker.rtcMaxPort, +// }); + +// console.log('Mediasoup worker created successfully'); + +// worker.on('died', () => { +// console.error('Mediasoup worker died, exiting...'); +// process.exit(1); +// }); + +// mediasoupRouter = await worker.createRouter({ +// mediaCodecs: config.mediasoup.router.mediaCodecs, +// }); +// } catch (error) { +// console.error('Error creating Mediasoup worker:', error); +// throw error; +// } +// } + +// async function createWebRtcTransport() { +// const { maxIncomingBitrate, initialAvailableOutgoingBitrate } = config.mediasoup.webRtcTransport; +// const transport = await mediasoupRouter.createWebRtcTransport({ +// listenIps: config.mediasoup.webRtcTransport.listenIps, +// enableUdp: true, +// enableTcp: true, +// preferUdp: true, +// initialAvailableOutgoingBitrate, +// }); + +// if (maxIncomingBitrate) { +// await transport.setMaxIncomingBitrate(maxIncomingBitrate); +// } + +// return { +// transport, +// params: { +// id: transport.id, +// iceParameters: transport.iceParameters, +// iceCandidates: transport.iceCandidates, +// dtlsParameters: transport.dtlsParameters, +// }, +// }; +// } + + +// io.on('connection', (socket) => { +// console.log('Video client connected'); + +// if (producer) { +// socket.emit('newProducer'); +// } + +// socket.on('disconnect', () => { +// console.log('Video client disconnected'); +// }); + +// socket.on('getRouterRtpCapabilities', (data, callback) => { +// callback(mediasoupRouter.rtpCapabilities); +// }); + +// socket.on('createProducerTransport', async (_, callback) => { +// try { +// const { transport, params } = await createWebRtcTransport(); +// producerTransport = transport; +// callback(params); +// } catch (err:any) { +// console.error(err); +// callback({ error: err.message }); +// } +// }); + +// socket.on('createConsumerTransport', async (_, callback) => { +// try { +// const { transport, params } = await createWebRtcTransport(); +// consumerTransport = transport; +// callback(params); +// } catch (err:any) { +// console.error(err); +// callback({ error: err.message }); +// } +// }); + +// socket.on('connectProducerTransport', async (data, callback) => { +// await producerTransport.connect({ dtlsParameters: data.dtlsParameters }); +// callback(); +// }); + +// socket.on('connectConsumerTransport', async (data, callback) => { +// await consumerTransport.connect({ dtlsParameters: data.dtlsParameters }); +// callback(); +// }); + +// socket.on('produce', async (data, callback) => { +// const { kind, rtpParameters } = data; +// producer = await producerTransport.produce({ kind, rtpParameters }); +// callback({ id: producer.id }); + +// socket.broadcast.emit('newProducer'); +// }); + +// socket.on('consume', async (data, callback) => { +// try { +// if (!producer) { +// callback({ error: 'No active producer' }); +// return; +// } +// if (!mediasoupRouter.canConsume({ producerId: producer.id, rtpCapabilities: data.rtpCapabilities })) { +// callback({ error: 'Cannot consume' }); +// return; +// } +// consumer = await consumerTransport.consume({ +// producerId: producer.id, +// rtpCapabilities: data.rtpCapabilities, +// paused: producer.kind === 'video', +// }); + +// callback({ +// producerId: producer.id, +// id: consumer.id, +// kind: consumer.kind, +// rtpParameters: consumer.rtpParameters, +// type: consumer.type, +// }); + +// } catch (error:any) { +// console.error('Consume error:', error); +// callback({ error: error.message }); +// } +// }); + +// socket.on('resume', async (_, callback) => { +// await consumer.resume(); +// callback(); +// }); +// }); + + +// // Start the application +// (async () => { +// await runMediasoupWorker(); +// })(); diff --git a/src/ssl/cert.pem b/src/ssl/cert.pem new file mode 100644 index 0000000..f83ee79 --- /dev/null +++ b/src/ssl/cert.pem @@ -0,0 +1,26 @@ +-----BEGIN CERTIFICATE----- +MIIEdjCCAt6gAwIBAgIQH4SWhdkuOqPRAGDzY6G+wjANBgkqhkiG9w0BAQsFADCB +lTEeMBwGA1UEChMVbWtjZXJ0IGRldmVsb3BtZW50IENBMTUwMwYDVQQLDCxMQVBU +T1AtRk4xSUhFS1RcWWFzaCBVIEhlZ2RlQExBUFRPUC1GTjFJSEVLVDE8MDoGA1UE +AwwzbWtjZXJ0IExBUFRPUC1GTjFJSEVLVFxZYXNoIFUgSGVnZGVATEFQVE9QLUZO +MUlIRUtUMB4XDTI0MTIxODEyMTI1NFoXDTI3MDMxODEyMTI1NFowYDEnMCUGA1UE +ChMebWtjZXJ0IGRldmVsb3BtZW50IGNlcnRpZmljYXRlMTUwMwYDVQQLDCxMQVBU +T1AtRk4xSUhFS1RcWWFzaCBVIEhlZ2RlQExBUFRPUC1GTjFJSEVLVDCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMoLdbpclXuM6sVqJyxXvVhQt8kSqe57 +HXYnTFCXnjnPWOJD2b/GS9tq+Ce0P5ePWzGSSRXrcaZ6EqrDeXtoR7SljIfYwDTR +WPwoX9dQI4F7jIj4jGwY97LEuk58AfBkUfJiFfW4AXFUkHaj7VuQJIhhfT1fjLZj +TS3EbLPjNRArWgwewDzciGEVj1XByF0OWWTtjH9QIUXUpkDje91YvfqabAZrdXXg +cqYWAO59VzUh2hv86zifNvXQQQSv5WCQY2R61oKHULDKKISpKV217ljyUHflUoNF +GHBOtXfbMlL0yN4dGUmfY4rBazBMv5NybnKn+Qj9Y4jIeoIp1T3ZjHMCAwEAAaN2 +MHQwDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMB8GA1UdIwQY +MBaAFMxG5SjEHJi98DlH4uwAgHWqKCSfMCwGA1UdEQQlMCOCCWxvY2FsaG9zdIcE +fwAAAYcQAAAAAAAAAAAAAAAAAAAAATANBgkqhkiG9w0BAQsFAAOCAYEAzyevnC/i +td5alnjaHdqEHVnStR7OX4qIHd6pEBAHA81bxmgmBK5eFIRIPQiT6IT6xWB7sgfp +P+qxxTcDYQHrTfwPnG2ZwFu3f2Cs7iqrRl0ZWvKf9dqj2DDmR+4ldFGhFEtqtMv+ +zkU6uile18swRXYQFjfOOwavoC5qYn8rwtIiDfKlz+ZNysaf+MmG/VtfufL12oFx +HVBYLJLh8MgpSWnlHBwOHuvXKmKGTytC7quGxdeAsarTPLbJ9p8q7F37hZ7Pudea +ZSvCC0VGQc7C+EawxLRV+eaB/AK/2Jk6RGKCMqM6r4o9TgXR63wvzF6TOPYLUpNu +Um7Pm4RBQJQOKrQ05F6Uc6IcGg6w0ttuacxTC0RrGX/iQalgFuRbMFKSdU74UQqL +aLDFU9gknz9jYF3hWOsszFxBfz7bfwAEzKPM0OZL7DnRj5CvzUSuiCzykYGWxLAp +Epy4fRfJ85HmIm4IRsrnuk9i28uXSqSlv+eeFb92BntlAuWOlL2tNBdh +-----END CERTIFICATE----- diff --git a/src/ssl/key.pem b/src/ssl/key.pem new file mode 100644 index 0000000..b247f69 --- /dev/null +++ b/src/ssl/key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDKC3W6XJV7jOrF +aicsV71YULfJEqnuex12J0xQl545z1jiQ9m/xkvbavgntD+Xj1sxkkkV63GmehKq +w3l7aEe0pYyH2MA00Vj8KF/XUCOBe4yI+IxsGPeyxLpOfAHwZFHyYhX1uAFxVJB2 +o+1bkCSIYX09X4y2Y00txGyz4zUQK1oMHsA83IhhFY9VwchdDllk7Yx/UCFF1KZA +43vdWL36mmwGa3V14HKmFgDufVc1Idob/Os4nzb10EEEr+VgkGNketaCh1CwyiiE +qSldte5Y8lB35VKDRRhwTrV32zJS9MjeHRlJn2OKwWswTL+Tcm5yp/kI/WOIyHqC +KdU92YxzAgMBAAECggEBAJDY9mXMyj3xIL63A65+mHggJiI5Byq5iL2UHtoIWJ8J +T6enDQy3lNqRLacJSi3V0IMRZOQaDzhSe9+AlC8s63tO1BjwA5vaGfls2Ij8IvhJ +Is9voPw+ShYXg5mQvbMhuL4UI7otWJtvDMKBc0EZbZd4jNjbD34SYtpU37l3Qit8 +ItG/kgj6oaoV2q/TpG9He84r3AA7OxTtRSGamLiU86NxPl904wD4xvYnwM32wF0F +ZI2NeC2devWNKkW8Phc0j51i82rUKD2RU4fQRwhVzwFjX8l/PA+AWQCUyEgfNiU9 +jgbTHyhRSiUGiYy//H896woGCCsxiyhQCdoqD4MFp0ECgYEA4sPexiEP9uxH/7Me +WPJI35rJ/rt16GuVvla4Oq7GouvYW2/atCz9jph2lS+G4zS6mW01kN9zQL9TXmm5 +nV49YMwvwS5wNceXk3zi7ojzg6F6H5HszU5nPWWcP81Fupjn+dc/9k5u6SwQQQsT +gZZDCz9oAooBg/E+2MKwy8jvOc0CgYEA5Be41Ft1KD/jX5GlzzXgT1itgIkC1EqH +pS+FYneCIQb4+jkXm1+ps7fu482nm/PReKKmXkEqsc4A6wu8VItEdS45/e7g0diJ +thCaKtSaMAGaGNqklKTd+9DdvTaYcPI3a9ZXuIRzHNYffza89lUXcc2M16v1bmFh +3dh4xCpknz8CgYEA04bcbrr2lmHPw5CFFXlkStir5edd1CFPPI7OKUdRWTZgyuJr +AzkYiIRl0UHVNGnCSk4Z8nrNmq8eCGrczxPSc1HklfJIj5IQLW8IjHPJm5bsQTiw +yM6C9T2sY8OKcMYjVeXY71w4j18gBlxbpLzS61IJJp0vTrGh6zapDl7v8F0CgYEA +qKwiMmevq6QTMIk0ZJci2YpqQ7MONI8o4C7UJIzb3jCZzfCKVIvZot1R+4QJfno/ +XUZqYSkvuWztoON80chrR3x3xiDwgD3xGIIOf73Yh8enfNmy+3kv7xf14gaNlHiK +I2TOWdUYiyqNADYqZr9mJvIqRRMU3BuHk9aQ9/+hiWECgYAaO+t7l+tRy3KV5Pu4 +zIa0bAZfDxniH+Os8FaEOoiqJ41eMC/M8uFozVVchfy0lb5L0w8ELtZiuzCNKNCe +r7jPk50UwcNRsOMXAAkYlmcMyWkEhJIM3CiEbRpLBS6mAnmFW8Q+sD7P4c7e4Pw5 +ohYq+j1Iriy/9mbo7rYZAzRLbg== +-----END PRIVATE KEY----- diff --git a/src/types/httpolyglot.d.ts b/src/types/httpolyglot.d.ts new file mode 100644 index 0000000..994da51 --- /dev/null +++ b/src/types/httpolyglot.d.ts @@ -0,0 +1,15 @@ +declare module 'httpolyglot' { + import { Server, ServerOptions } from 'https'; + import { Application } from 'express'; + + interface HttpPolygloOptions extends ServerOptions { + key: string | Buffer; + cert: string | Buffer; + } + + function createServer(options: HttpPolygloOptions, app: Application): Server; + + export = { + createServer: createServer + }; +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 0b957ca..7d19fd0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -28,7 +28,11 @@ // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ - // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + "typeRoots": [ + "./node_modules/@types", + "./src/types", + "./types" + ], /* Specify multiple folders that act like './node_modules/@types'. */ // "types": [], /* Specify type package names to be included without being referenced in a source file. */ // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ @@ -71,7 +75,7 @@ // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ // "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */ - // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ From 6e64f73084987a36a4e4919a1ce292b5ce05fb3c Mon Sep 17 00:00:00 2001 From: Yash Hegde Date: Wed, 18 Dec 2024 20:50:23 +0530 Subject: [PATCH 05/10] broadcast new user --- src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/index.ts b/src/index.ts index 4936f83..774b177 100644 --- a/src/index.ts +++ b/src/index.ts @@ -51,6 +51,7 @@ const io = new Server(httpsServer, { io.on('connection', (socket) => { console.log("user connected with id " + socket.id); + socket.broadcast.emit("new-user","new user joined with id "+socket.id) socket.on('connect_error', (error) => { console.log('Connection error:', error); }); From d8742d8e8cd8dc64f699538b8d1dc06dc964084e Mon Sep 17 00:00:00 2001 From: Yash Hegde Date: Thu, 19 Dec 2024 13:30:15 +0530 Subject: [PATCH 06/10] get rtp capabilities --- src/index.ts | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index 774b177..a2e9509 100644 --- a/src/index.ts +++ b/src/index.ts @@ -49,7 +49,47 @@ const io = new Server(httpsServer, { }); //const peers = io.of('/mediasoup') -io.on('connection', (socket) => { + +let worker:any; +let router:any; + + +async function createWorker() { + worker = await mediasoup.createWorker({ + rtcMinPort: 2000, + rtcMaxPort:2020 + }) + console.log(`worker pid: ${worker.pid}`); + + worker.on('died', (err: any) => { + console.log('mediasoup worker died') + setTimeout(()=>process.exit(1),2000) + }) + + return worker; +} + +worker = createWorker(); + +const mediaCodecs = [ + { + kind: 'audio', + mimeType: 'audio/opus', + clockRate: 48000, + channels:2 + }, + { + kind: 'video', + mimeType: 'video/VP8', + clockRate: 90000, + parameters: { + 'x-google-start-bitrate':1000, + } + } +] + + +io.on('connection', async (socket) => { console.log("user connected with id " + socket.id); socket.broadcast.emit("new-user","new user joined with id "+socket.id) socket.on('connect_error', (error) => { @@ -63,11 +103,21 @@ io.on('connection', (socket) => { socket.on('disconnect', () => { console.log('A user disconnected with userid '+socket.id); }); + + router = await worker.createRouter({ mediaCodecs }); + + socket.on('getRtpCapabilities', (callback) => { + const rtpCapabilities = router.rtpCapabilities; + console.log('rtpCapabilities: ', rtpCapabilities); + callback({ rtpCapabilities }); + }) }) + + let connectedUsers: Map = new Map(); -io.listen(4000); +//io.listen(4000); wss.on('connection', function connection(ws) { From bb3a7e32c666dee080c72d0fdc93b0fdbc70a144 Mon Sep 17 00:00:00 2001 From: Yash Hegde Date: Thu, 19 Dec 2024 17:12:46 +0530 Subject: [PATCH 07/10] small bug pending --- src/index.ts | 281 +++++++++++++++++++++++++-------------------------- 1 file changed, 135 insertions(+), 146 deletions(-) diff --git a/src/index.ts b/src/index.ts index a2e9509..b8db1e5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -51,7 +51,11 @@ const io = new Server(httpsServer, { let worker:any; -let router:any; +let router: any; +let producerTransport: any; +let consumerTransport: any; +let producer: any; +let consumer: any; async function createWorker() { @@ -110,7 +114,90 @@ io.on('connection', async (socket) => { const rtpCapabilities = router.rtpCapabilities; console.log('rtpCapabilities: ', rtpCapabilities); callback({ rtpCapabilities }); + }); + + socket.on('createWebRtcTransport', async ({ sender },callback) => { + console.log(`sender request? ${sender}`); + if (sender) { + producerTransport = await createWebRtcTransport(callback) + } else { + consumerTransport = await createWebRtcTransport(callback) + } + }) + + socket.on('transport-connect', async ({dtlsParameters }: any) => { + console.log(`dtls params ${dtlsParameters}`); + await producerTransport.connect({dtlsParameters}) + }) + + socket.on('transport-produce', async ({kind, rtpParameters,appData }: any,callback) => { + producer = await producerTransport.produce({ kind, rtpParameters }); + + console.log('producer id: ',producer.id,producer.kind) + + producer.on('transportclose', () => { + console.log('transport for this producer is closed') + producer.close(); + }) + + callback({ + id:producer.id + }) + }) + + socket.on('transport-recv-connect', async ({ dtlsParameters }: any, callback) => { + console.log(`dtls params ${dtlsParameters}`); + await consumerTransport.connect({dtlsParameters}) + // callback({ + // id:producer.id + // }) + }) + + socket.on('consume', async ({ rtpCapabilities },callback) => { + try { + if (router.canConsume({ + producerId: producer.id, + rtpCapabilities + })) { + consumer = await consumerTransport.consume({ + producerId: producer.id, + rtpCapabilities, + paused:true + }) + consumer.on('transportclose', () => { + console.log('transport closed from consumer') + //consumer.close(); + }); + consumer.on('producerclose', () => { + console.log('producer of consumer closed') + //consumer.close(); + }) + + const params = { + id: consumer.id, + producerId: producer.id, + kind: consumer.kind, + rtpParameters: consumer.rtpParameters, + } + + callback({params}) + } + + } catch (error) { + console.log('error consuming:', error); + callback({ + params: { + error:error + } + }) + } + }) + + socket.on('consumer-resume', async () => { + console.log('consumer resume') + await consumer.resume(); }) + }) @@ -196,151 +283,53 @@ httpsServer.listen(8080, () => { }); -//why worker is needed? -// async function runMediasoupWorker() { -// try { -// console.log('Attempting to create Mediasoup worker'); -// worker = await mediasoup.createWorker({ -// logLevel: config.mediasoup.worker.logLevel as mediasoup.types.WorkerLogLevel, -// rtcMinPort: config.mediasoup.worker.rtcMinPort, -// rtcMaxPort: config.mediasoup.worker.rtcMaxPort, -// }); - -// console.log('Mediasoup worker created successfully'); - -// worker.on('died', () => { -// console.error('Mediasoup worker died, exiting...'); -// process.exit(1); -// }); - -// mediasoupRouter = await worker.createRouter({ -// mediaCodecs: config.mediasoup.router.mediaCodecs, -// }); -// } catch (error) { -// console.error('Error creating Mediasoup worker:', error); -// throw error; -// } -// } +const createWebRtcTransport = async (callback:any) => { + try { -// async function createWebRtcTransport() { -// const { maxIncomingBitrate, initialAvailableOutgoingBitrate } = config.mediasoup.webRtcTransport; -// const transport = await mediasoupRouter.createWebRtcTransport({ -// listenIps: config.mediasoup.webRtcTransport.listenIps, -// enableUdp: true, -// enableTcp: true, -// preferUdp: true, -// initialAvailableOutgoingBitrate, -// }); - -// if (maxIncomingBitrate) { -// await transport.setMaxIncomingBitrate(maxIncomingBitrate); -// } - -// return { -// transport, -// params: { -// id: transport.id, -// iceParameters: transport.iceParameters, -// iceCandidates: transport.iceCandidates, -// dtlsParameters: transport.dtlsParameters, -// }, -// }; -// } + const webRtcTransport_options = { + listenIps: [ + { + ip: '0.0.0.0', + announcedIp:'127.0.0.1' + } + ], + enableUdp: true, + enableTcp: true, + preferUdp:true + } + let transport = await router.createWebRtcTransport(webRtcTransport_options); + console.log(`transport id: ${transport.id}`) + + transport.on('dtlsstatechange', (dtlsState:any) => { + if (dtlsState === 'closed') { + transport.close() + } + }) + + transport.on('close', () => { + console.log('tranport closed') + }) + + callback({ + params: { + id: transport.id, + iceParameters: transport.iceParameters, + iceCandidates: transport.iceCandidates, + dtlsParameters: transport.dtlsParameters, + + } + }) + + return transport; + + } catch (error) { + console.log('error creating createWebRtcTransport:', error); + callback({ + params: { + error:error + } + }) + } +} -// io.on('connection', (socket) => { -// console.log('Video client connected'); - -// if (producer) { -// socket.emit('newProducer'); -// } - -// socket.on('disconnect', () => { -// console.log('Video client disconnected'); -// }); - -// socket.on('getRouterRtpCapabilities', (data, callback) => { -// callback(mediasoupRouter.rtpCapabilities); -// }); - -// socket.on('createProducerTransport', async (_, callback) => { -// try { -// const { transport, params } = await createWebRtcTransport(); -// producerTransport = transport; -// callback(params); -// } catch (err:any) { -// console.error(err); -// callback({ error: err.message }); -// } -// }); - -// socket.on('createConsumerTransport', async (_, callback) => { -// try { -// const { transport, params } = await createWebRtcTransport(); -// consumerTransport = transport; -// callback(params); -// } catch (err:any) { -// console.error(err); -// callback({ error: err.message }); -// } -// }); - -// socket.on('connectProducerTransport', async (data, callback) => { -// await producerTransport.connect({ dtlsParameters: data.dtlsParameters }); -// callback(); -// }); - -// socket.on('connectConsumerTransport', async (data, callback) => { -// await consumerTransport.connect({ dtlsParameters: data.dtlsParameters }); -// callback(); -// }); - -// socket.on('produce', async (data, callback) => { -// const { kind, rtpParameters } = data; -// producer = await producerTransport.produce({ kind, rtpParameters }); -// callback({ id: producer.id }); - -// socket.broadcast.emit('newProducer'); -// }); - -// socket.on('consume', async (data, callback) => { -// try { -// if (!producer) { -// callback({ error: 'No active producer' }); -// return; -// } -// if (!mediasoupRouter.canConsume({ producerId: producer.id, rtpCapabilities: data.rtpCapabilities })) { -// callback({ error: 'Cannot consume' }); -// return; -// } -// consumer = await consumerTransport.consume({ -// producerId: producer.id, -// rtpCapabilities: data.rtpCapabilities, -// paused: producer.kind === 'video', -// }); - -// callback({ -// producerId: producer.id, -// id: consumer.id, -// kind: consumer.kind, -// rtpParameters: consumer.rtpParameters, -// type: consumer.type, -// }); - -// } catch (error:any) { -// console.error('Consume error:', error); -// callback({ error: error.message }); -// } -// }); - -// socket.on('resume', async (_, callback) => { -// await consumer.resume(); -// callback(); -// }); -// }); - - -// // Start the application -// (async () => { -// await runMediasoupWorker(); -// })(); From 9f4db525998a0991e7744212ca3329b3f6ce5703 Mon Sep 17 00:00:00 2001 From: Yash Hegde Date: Fri, 20 Dec 2024 15:37:27 +0530 Subject: [PATCH 08/10] send and receive is working on the same browser --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index b8db1e5..c69d8b9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -133,7 +133,7 @@ io.on('connection', async (socket) => { socket.on('transport-produce', async ({kind, rtpParameters,appData }: any,callback) => { producer = await producerTransport.produce({ kind, rtpParameters }); - console.log('producer id: ',producer.id,producer.kind) + console.log('Producer created:', producer.id, producer.kind); producer.on('transportclose', () => { console.log('transport for this producer is closed') From 324d6eb1a755a6ea7186216a1e37f86a6658aaf4 Mon Sep 17 00:00:00 2001 From: Yash Hegde Date: Fri, 20 Dec 2024 20:14:16 +0530 Subject: [PATCH 09/10] bug solving attempts --- .gitignore | 3 ++- README.md | 10 +++++++++- src/index.ts | 37 ++++++++++++++++------------------ src/ssl/cert.pem | 46 ++++++++++++++++++++---------------------- src/ssl/key.pem | 52 ++++++++++++++++++++++++------------------------ 5 files changed, 76 insertions(+), 72 deletions(-) diff --git a/.gitignore b/.gitignore index d83d789..0456b68 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .env .history -node_modules \ No newline at end of file +node_modules +*.pem \ No newline at end of file diff --git a/README.md b/README.md index d3da769..8628bb6 100644 --- a/README.md +++ b/README.md @@ -6,4 +6,12 @@ npm run dev on hoppscotch: connect on : -ws://localhost:8080 \ No newline at end of file +ws://localhost:8080 + +make a folder in src named as ssl and +run these commands in src/ssl: + +mkcert -install +mkcert localhost + +these create the ssl files needed \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index c69d8b9..51afbc6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,21 +12,12 @@ import { Server } from 'socket.io'; import * as mediasoup from 'mediasoup'; import cors from 'cors'; import fs from 'fs' +import path from 'path'; - -// Mediasoup-related variables -// let worker: any; -// let producer: any; -// let consumer: any; -// let producerTransport: any; -// let consumerTransport: any; -// let mediasoupRouter: any; - -// const options = { -// key:fs.readFileSync('./src/ssl/key.pem','utf-8'), -// cert:fs.readFileSync('./src/ssl/cert.pem','utf-8') -// } - +const options = { + key: fs.readFileSync(path.join(__dirname, 'ssl/localhost-key.pem'), 'utf-8'), + cert: fs.readFileSync(path.join(__dirname, 'ssl/localhost.pem'), 'utf-8'), +}; const app = express(); app.use(cors()); @@ -34,8 +25,8 @@ app.use(cors()); app.get('/', (req,res) => { res.send('hello from lithouse Backend') }) -//const httpsServer = https.createServer(options, app); -const httpsServer = createServer(app); +const httpsServer = https.createServer(options, app); +//const httpsServer = createServer(app); const wss = new WebSocketServer({ server: httpsServer, path: '/chat' }); const io = new Server(httpsServer, { @@ -124,9 +115,8 @@ io.on('connection', async (socket) => { consumerTransport = await createWebRtcTransport(callback) } }) - socket.on('transport-connect', async ({dtlsParameters }: any) => { - console.log(`dtls params ${dtlsParameters}`); + console.log(`dtls params for producer ${dtlsParameters}`); await producerTransport.connect({dtlsParameters}) }) @@ -145,12 +135,19 @@ io.on('connection', async (socket) => { }) }) + //some error here because dtls params for consumer is not getting logged,this event is not being triggered at all socket.on('transport-recv-connect', async ({ dtlsParameters }: any, callback) => { - console.log(`dtls params ${dtlsParameters}`); - await consumerTransport.connect({dtlsParameters}) + console.log("transport-recv-connect called") + try { + console.log(`dtls params for consumer ${dtlsParameters}`); + await consumerTransport.connect({dtlsParameters}) // callback({ // id:producer.id // }) + } catch (error: any) { + console.log('error in transport-recv-connect: ',error) + } + }) socket.on('consume', async ({ rtpCapabilities },callback) => { diff --git a/src/ssl/cert.pem b/src/ssl/cert.pem index f83ee79..65d5de9 100644 --- a/src/ssl/cert.pem +++ b/src/ssl/cert.pem @@ -1,26 +1,24 @@ -----BEGIN CERTIFICATE----- -MIIEdjCCAt6gAwIBAgIQH4SWhdkuOqPRAGDzY6G+wjANBgkqhkiG9w0BAQsFADCB -lTEeMBwGA1UEChMVbWtjZXJ0IGRldmVsb3BtZW50IENBMTUwMwYDVQQLDCxMQVBU -T1AtRk4xSUhFS1RcWWFzaCBVIEhlZ2RlQExBUFRPUC1GTjFJSEVLVDE8MDoGA1UE -AwwzbWtjZXJ0IExBUFRPUC1GTjFJSEVLVFxZYXNoIFUgSGVnZGVATEFQVE9QLUZO -MUlIRUtUMB4XDTI0MTIxODEyMTI1NFoXDTI3MDMxODEyMTI1NFowYDEnMCUGA1UE -ChMebWtjZXJ0IGRldmVsb3BtZW50IGNlcnRpZmljYXRlMTUwMwYDVQQLDCxMQVBU -T1AtRk4xSUhFS1RcWWFzaCBVIEhlZ2RlQExBUFRPUC1GTjFJSEVLVDCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMoLdbpclXuM6sVqJyxXvVhQt8kSqe57 -HXYnTFCXnjnPWOJD2b/GS9tq+Ce0P5ePWzGSSRXrcaZ6EqrDeXtoR7SljIfYwDTR -WPwoX9dQI4F7jIj4jGwY97LEuk58AfBkUfJiFfW4AXFUkHaj7VuQJIhhfT1fjLZj -TS3EbLPjNRArWgwewDzciGEVj1XByF0OWWTtjH9QIUXUpkDje91YvfqabAZrdXXg -cqYWAO59VzUh2hv86zifNvXQQQSv5WCQY2R61oKHULDKKISpKV217ljyUHflUoNF -GHBOtXfbMlL0yN4dGUmfY4rBazBMv5NybnKn+Qj9Y4jIeoIp1T3ZjHMCAwEAAaN2 -MHQwDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMB8GA1UdIwQY -MBaAFMxG5SjEHJi98DlH4uwAgHWqKCSfMCwGA1UdEQQlMCOCCWxvY2FsaG9zdIcE -fwAAAYcQAAAAAAAAAAAAAAAAAAAAATANBgkqhkiG9w0BAQsFAAOCAYEAzyevnC/i -td5alnjaHdqEHVnStR7OX4qIHd6pEBAHA81bxmgmBK5eFIRIPQiT6IT6xWB7sgfp -P+qxxTcDYQHrTfwPnG2ZwFu3f2Cs7iqrRl0ZWvKf9dqj2DDmR+4ldFGhFEtqtMv+ -zkU6uile18swRXYQFjfOOwavoC5qYn8rwtIiDfKlz+ZNysaf+MmG/VtfufL12oFx -HVBYLJLh8MgpSWnlHBwOHuvXKmKGTytC7quGxdeAsarTPLbJ9p8q7F37hZ7Pudea -ZSvCC0VGQc7C+EawxLRV+eaB/AK/2Jk6RGKCMqM6r4o9TgXR63wvzF6TOPYLUpNu -Um7Pm4RBQJQOKrQ05F6Uc6IcGg6w0ttuacxTC0RrGX/iQalgFuRbMFKSdU74UQqL -aLDFU9gknz9jYF3hWOsszFxBfz7bfwAEzKPM0OZL7DnRj5CvzUSuiCzykYGWxLAp -Epy4fRfJ85HmIm4IRsrnuk9i28uXSqSlv+eeFb92BntlAuWOlL2tNBdh +MIIEAzCCAuugAwIBAgIUQu30gqikYDHk1VJWkNmFoJOA3c0wDQYJKoZIhvcNAQEL +BQAwgZAxCzAJBgNVBAYTAklOMRQwEgYDVQQIDAtNYWhhcmFzaHRyYTEPMA0GA1UE +BwwGTXVtYmFpMREwDwYDVQQKDAhsaXRob3VzZTERMA8GA1UECwwIbGl0aG91c2Ux +DTALBgNVBAMMBHlhc2gxJTAjBgkqhkiG9w0BCQEWFnlhc2hoZWdkZTAxMEBnbWFp +bC5jb20wHhcNMjQxMjIwMTMyODMzWhcNMjUxMjIwMTMyODMzWjCBkDELMAkGA1UE +BhMCSU4xFDASBgNVBAgMC01haGFyYXNodHJhMQ8wDQYDVQQHDAZNdW1iYWkxETAP +BgNVBAoMCGxpdGhvdXNlMREwDwYDVQQLDAhsaXRob3VzZTENMAsGA1UEAwwEeWFz +aDElMCMGCSqGSIb3DQEJARYWeWFzaGhlZ2RlMDEwQGdtYWlsLmNvbTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBAKN/6KPs/XezPoU69HMd5PQ70heD5v2E +63S/23yN97Xl34yyhmYpe0QjfRHJQ492wyPebRLv3cXUzKCnqAocRPbcs3U2l/kz +WcwyEKUpCiC0pd9AD8SNv9M8aVfzu1dNwgKby750vYX41KYuQGmQO7P8aqrXVmad +r50vv9UJLduK/zgLRJg0ywusf7P4OCJ/HcO9wUKxA8HW6xI5iBJlA0Sb6zbjf3iS +QuRFXbUZFFlzofZyfv90iyp6CVmcleFMPuI8gCSlDEJXZfYZjJo9JB2pCMvZjQXT +orteGWtNi5Rawoh4PQH6lTFUd8ovfHYPquE8sPOFQOensfZqW8IM6MsCAwEAAaNT +MFEwHQYDVR0OBBYEFJY65l85kcDAHL6/k0uZ6gzqDTzjMB8GA1UdIwQYMBaAFJY6 +5l85kcDAHL6/k0uZ6gzqDTzjMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBAI4y+m8A5F9MBt1KvdeWqALgHRCgM+HnnEqsrPIDgtSxd/puh8fhHn5E +R/kgmgk8HUZ140MztWRL6c67VyUipGZXj1GDOSID+1m/zF4EBuU6lG4w3n1XLf4s +x07qrXEo12gOLz/ngwL6QENE4y+YpP7GpqJlbGUp2ILQ83d8rRHPnNuY2rTnjoIT +H7DTMpPr88NnoKsYBCGnA5tNEGcU28/04IxtVg8scqVZFLDfp3TFPdF9FuiNYYRl +AxTRTwVif5qVCz4BJ8xJMp5+NZJ6G032MhvqVkcZvqbSiXl28nCZCNaHXqe9/I5t +eNVpy0loQ33qahAS4FbG1vnQTKHG/k4= -----END CERTIFICATE----- diff --git a/src/ssl/key.pem b/src/ssl/key.pem index b247f69..3a73e44 100644 --- a/src/ssl/key.pem +++ b/src/ssl/key.pem @@ -1,28 +1,28 @@ -----BEGIN PRIVATE KEY----- -MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDKC3W6XJV7jOrF -aicsV71YULfJEqnuex12J0xQl545z1jiQ9m/xkvbavgntD+Xj1sxkkkV63GmehKq -w3l7aEe0pYyH2MA00Vj8KF/XUCOBe4yI+IxsGPeyxLpOfAHwZFHyYhX1uAFxVJB2 -o+1bkCSIYX09X4y2Y00txGyz4zUQK1oMHsA83IhhFY9VwchdDllk7Yx/UCFF1KZA -43vdWL36mmwGa3V14HKmFgDufVc1Idob/Os4nzb10EEEr+VgkGNketaCh1CwyiiE -qSldte5Y8lB35VKDRRhwTrV32zJS9MjeHRlJn2OKwWswTL+Tcm5yp/kI/WOIyHqC -KdU92YxzAgMBAAECggEBAJDY9mXMyj3xIL63A65+mHggJiI5Byq5iL2UHtoIWJ8J -T6enDQy3lNqRLacJSi3V0IMRZOQaDzhSe9+AlC8s63tO1BjwA5vaGfls2Ij8IvhJ -Is9voPw+ShYXg5mQvbMhuL4UI7otWJtvDMKBc0EZbZd4jNjbD34SYtpU37l3Qit8 -ItG/kgj6oaoV2q/TpG9He84r3AA7OxTtRSGamLiU86NxPl904wD4xvYnwM32wF0F -ZI2NeC2devWNKkW8Phc0j51i82rUKD2RU4fQRwhVzwFjX8l/PA+AWQCUyEgfNiU9 -jgbTHyhRSiUGiYy//H896woGCCsxiyhQCdoqD4MFp0ECgYEA4sPexiEP9uxH/7Me -WPJI35rJ/rt16GuVvla4Oq7GouvYW2/atCz9jph2lS+G4zS6mW01kN9zQL9TXmm5 -nV49YMwvwS5wNceXk3zi7ojzg6F6H5HszU5nPWWcP81Fupjn+dc/9k5u6SwQQQsT -gZZDCz9oAooBg/E+2MKwy8jvOc0CgYEA5Be41Ft1KD/jX5GlzzXgT1itgIkC1EqH -pS+FYneCIQb4+jkXm1+ps7fu482nm/PReKKmXkEqsc4A6wu8VItEdS45/e7g0diJ -thCaKtSaMAGaGNqklKTd+9DdvTaYcPI3a9ZXuIRzHNYffza89lUXcc2M16v1bmFh -3dh4xCpknz8CgYEA04bcbrr2lmHPw5CFFXlkStir5edd1CFPPI7OKUdRWTZgyuJr -AzkYiIRl0UHVNGnCSk4Z8nrNmq8eCGrczxPSc1HklfJIj5IQLW8IjHPJm5bsQTiw -yM6C9T2sY8OKcMYjVeXY71w4j18gBlxbpLzS61IJJp0vTrGh6zapDl7v8F0CgYEA -qKwiMmevq6QTMIk0ZJci2YpqQ7MONI8o4C7UJIzb3jCZzfCKVIvZot1R+4QJfno/ -XUZqYSkvuWztoON80chrR3x3xiDwgD3xGIIOf73Yh8enfNmy+3kv7xf14gaNlHiK -I2TOWdUYiyqNADYqZr9mJvIqRRMU3BuHk9aQ9/+hiWECgYAaO+t7l+tRy3KV5Pu4 -zIa0bAZfDxniH+Os8FaEOoiqJ41eMC/M8uFozVVchfy0lb5L0w8ELtZiuzCNKNCe -r7jPk50UwcNRsOMXAAkYlmcMyWkEhJIM3CiEbRpLBS6mAnmFW8Q+sD7P4c7e4Pw5 -ohYq+j1Iriy/9mbo7rYZAzRLbg== +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCjf+ij7P13sz6F +OvRzHeT0O9IXg+b9hOt0v9t8jfe15d+MsoZmKXtEI30RyUOPdsMj3m0S793F1Myg +p6gKHET23LN1Npf5M1nMMhClKQogtKXfQA/Ejb/TPGlX87tXTcICm8u+dL2F+NSm +LkBpkDuz/Gqq11Zmna+dL7/VCS3biv84C0SYNMsLrH+z+Dgifx3DvcFCsQPB1usS +OYgSZQNEm+s24394kkLkRV21GRRZc6H2cn7/dIsqeglZnJXhTD7iPIAkpQxCV2X2 +GYyaPSQdqQjL2Y0F06K7XhlrTYuUWsKIeD0B+pUxVHfKL3x2D6rhPLDzhUDnp7H2 +alvCDOjLAgMBAAECggEAQ9mn9Kc7xLn43xdJLKCiTAyrMiEF8f2ALPIVpsnPm4fq +zpujlK/wPKWxmHj6dYXmk3MRtsMeOKQHyz/oR1HV+NA8FQ9z3/HEeS3ppHC0iEAP +eec+4+WjTokKenpmK2PUeHqpAb+2iutpbBFTn7tAW4AL0BwO+gTERSn0pPbrNej9 +xvxgCONz0rK6Mx+ExR3fmWwBSruAhIBefHlOtLnmogImv3UAdXw1dPZjgUonG5ts +8iRF4INO3mPvyIAKX07+tOh/Sb79WqbbtNWTQBN0zvcSUFAf8mJgYtTnNE4rzPH5 +ueS/ZAibc/qS87wW9XewRz3unFbuJWM+DTJGKqQlQQKBgQDZOJe8zT5RsfL+Ut1v +zhsA8NLG5IuBZJ1q2ZcvooaYVY0cDS0gFKQaMrEZp6CjVQihTGkIDoq5NCimk/WE +tihuKaPpGrZicwIIlBf1d81fnthh8eMBGqZBO4lxPbMxb79ifs7lo7F88v4xnJxD +V84Vsh8ebTCL6qQHyNohn2x2oQKBgQDAsCWhQIFabZIwZwJUPrd8Ba9ShWjFUUCq +A/sbQ0sh2CFa0KHJoMmGXkb94hl40p6F6BC2WQRoYbEL6BiAf/bxwGNPyn8tWQgG +m+4RQm7384G2n6fyfDTpy3W4FXSf5nJngNnyQg56Aj7T1npgTs+MjZvReZmE+Hus +ghsqgsQj6wKBgCOqyDeHF+mAJ58c6iE2nXZ9FI717fY0GCj4S3vV2vXebkoh27v9 +x6hJlIza2mSXTNB3ZHOfN6YLa3VWrCS7aE4WZkSbT0FBEx9nebujjURbJ7qFZjnD +L3NcnEfM0sSWTb2VhtFsHHOgzp5E0d+45iznz3ZGhYcj4wUoNLD6pWuhAoGBAI6U +SOPvBUhSd7AVKOYJml/NHRQk34fSPdUQKQjdXITolpXKd0zpCvXAYSuP2GVNBDv1 +ohgr+lT6pLU4wpijF6l/QH1US5LUpFmvnBNtYwtaRgtKTE3jlovBH5RdW/TN4q2v +7JWUR34El1TNCbSl3HIWfswb/HsmGu1lQJDOPjCNAoGAVgWiLISoATwnW22DJHfx +WZuUCQ9gzQIJb4dFS3meOp9URQ4iJW/ZBAV9NCAyeH0Ywn0kTqPMkaETNpeA+Plf +92lmFmEzYwC6VxKlguO/SMkaGzuof1T2rZ9qYSivKw0IaoIcQ285LQn+qonV0ekG +AE6S2QNlO74hzxlO6M/naDA= -----END PRIVATE KEY----- From a3d602002cb5a5d0b50a6dc82bfb719d22cc8ca4 Mon Sep 17 00:00:00 2001 From: Yash Hegde Date: Sun, 22 Dec 2024 11:12:14 +0530 Subject: [PATCH 10/10] attempt to create 1-1 communication --- src/index.ts | 47 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/src/index.ts b/src/index.ts index 51afbc6..e1cfc93 100644 --- a/src/index.ts +++ b/src/index.ts @@ -26,6 +26,11 @@ app.get('/', (req,res) => { res.send('hello from lithouse Backend') }) const httpsServer = https.createServer(options, app); +httpsServer.listen(8080, () => { + console.log('Server is running on https://localhost:8080'); +}); + + //const httpsServer = createServer(app); const wss = new WebSocketServer({ server: httpsServer, path: '/chat' }); @@ -61,9 +66,21 @@ async function createWorker() { setTimeout(()=>process.exit(1),2000) }) + //router = await worker.createRouter({ mediaCodecs }); + return worker; } +// async function initializeMediasoup() { +// try { +// await createWorker(); +// console.log('Mediasoup worker and router initialized successfully'); +// } catch (error) { +// console.error('Failed to initialize mediasoup:', error); +// process.exit(1); +// } +// } + worker = createWorker(); const mediaCodecs = [ @@ -92,20 +109,34 @@ io.on('connection', async (socket) => { }); socket.emit('connection-success', { - socketId:socket.id + socketId: socket.id, + existsProducer:producer ? true: false }) socket.emit("hello","welcome to server") socket.on('disconnect', () => { console.log('A user disconnected with userid '+socket.id); }); - router = await worker.createRouter({ mediaCodecs }); + socket.on('createRoom', async (callback)=> { + if (router === undefined) { + router = await worker.createRouter({ mediaCodecs }); + console.log('router id: ',router.id) + } + getRtpCapabilities(callback) + }) - socket.on('getRtpCapabilities', (callback) => { + const getRtpCapabilities= (callback:any) => { const rtpCapabilities = router.rtpCapabilities; - console.log('rtpCapabilities: ', rtpCapabilities); - callback({ rtpCapabilities }); - }); + callback({rtpCapabilities}) + } + +// router = await worker.createRouter({ mediaCodecs }); + + // socket.on('getRtpCapabilities', (callback) => { + // const rtpCapabilities = router.rtpCapabilities; + // console.log('rtpCapabilities: ', rtpCapabilities); + // callback({ rtpCapabilities }); + // }); socket.on('createWebRtcTransport', async ({ sender },callback) => { console.log(`sender request? ${sender}`); @@ -275,10 +306,6 @@ wss.on('connection', function connection(ws) { }); }); -httpsServer.listen(8080, () => { - console.log('Server is running on http://localhost:8080'); -}); - const createWebRtcTransport = async (callback:any) => { try {