[mirotalk] - add network stats, update dep

This commit is contained in:
Miroslav Pejic
2025-11-20 19:50:46 +01:00
parent c142ef2b41
commit b7113cbd56
8 changed files with 283 additions and 102 deletions
+1 -1
View File
@@ -45,7 +45,7 @@ dependencies: {
* @license For commercial use or closed source, contact us at license.mirotalk@gmail.com or purchase directly from CodeCanyon
* @license CodeCanyon: https://codecanyon.net/item/mirotalk-p2p-webrtc-realtime-video-conferences/38376661
* @author Miroslav Pejic - miroslav.pejic.85@gmail.com
* @version 1.6.38
* @version 1.6.39
*
*/
+84 -84
View File
@@ -1,17 +1,17 @@
{
"name": "mirotalk",
"version": "1.6.37",
"version": "1.6.39",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "mirotalk",
"version": "1.6.37",
"version": "1.6.39",
"license": "AGPL-3.0",
"dependencies": {
"@mattermost/client": "11.1.0",
"@ngrok/ngrok": "1.5.2",
"@sentry/node": "^10.25.0",
"@ngrok/ngrok": "1.6.0",
"@sentry/node": "^10.26.0",
"axios": "^1.13.2",
"chokidar": "^4.0.3",
"colors": "^1.4.0",
@@ -29,7 +29,7 @@
"jsdom": "^27.2.0",
"jsonwebtoken": "^9.0.2",
"nodemailer": "^7.0.10",
"openai": "^6.9.0",
"openai": "^6.9.1",
"qs": "^6.14.0",
"socket.io": "^4.8.1",
"swagger-ui-express": "^5.0.1",
@@ -336,33 +336,33 @@
}
},
"node_modules/@ngrok/ngrok": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok/-/ngrok-1.5.2.tgz",
"integrity": "sha512-gN7KKdLTKer+wBSk9s9eDx53MUFdcnXNHsXxiC5sJLLD5HY9JRMSn6UzcCqnk7IgeIgCgw5h1k6YDqhjx6lmtg==",
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok/-/ngrok-1.6.0.tgz",
"integrity": "sha512-TWC6nh4Kl16HjhG/bVhpYNP5UIyJc9oZetCrnO4r5+gq95eIxZKoLXzuAyC0gF/J+NEY3c1euFAET5Sn9wOWaw==",
"license": "(MIT OR Apache-2.0)",
"engines": {
"node": ">= 10"
},
"optionalDependencies": {
"@ngrok/ngrok-android-arm64": "1.5.2",
"@ngrok/ngrok-darwin-arm64": "1.5.2",
"@ngrok/ngrok-darwin-universal": "1.5.2",
"@ngrok/ngrok-darwin-x64": "1.5.2",
"@ngrok/ngrok-freebsd-x64": "1.5.2",
"@ngrok/ngrok-linux-arm-gnueabihf": "1.5.2",
"@ngrok/ngrok-linux-arm64-gnu": "1.5.2",
"@ngrok/ngrok-linux-arm64-musl": "1.5.2",
"@ngrok/ngrok-linux-x64-gnu": "1.5.2",
"@ngrok/ngrok-linux-x64-musl": "1.5.2",
"@ngrok/ngrok-win32-arm64-msvc": "1.5.2",
"@ngrok/ngrok-win32-ia32-msvc": "1.5.2",
"@ngrok/ngrok-win32-x64-msvc": "1.5.2"
"@ngrok/ngrok-android-arm64": "1.6.0",
"@ngrok/ngrok-darwin-arm64": "1.6.0",
"@ngrok/ngrok-darwin-universal": "1.6.0",
"@ngrok/ngrok-darwin-x64": "1.6.0",
"@ngrok/ngrok-freebsd-x64": "1.6.0",
"@ngrok/ngrok-linux-arm-gnueabihf": "1.6.0",
"@ngrok/ngrok-linux-arm64-gnu": "1.6.0",
"@ngrok/ngrok-linux-arm64-musl": "1.6.0",
"@ngrok/ngrok-linux-x64-gnu": "1.6.0",
"@ngrok/ngrok-linux-x64-musl": "1.6.0",
"@ngrok/ngrok-win32-arm64-msvc": "1.6.0",
"@ngrok/ngrok-win32-ia32-msvc": "1.6.0",
"@ngrok/ngrok-win32-x64-msvc": "1.6.0"
}
},
"node_modules/@ngrok/ngrok-android-arm64": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-android-arm64/-/ngrok-android-arm64-1.5.2.tgz",
"integrity": "sha512-v81VbxxAgg2W7jbjhEcn8K9R2aUf0h1AuTx+8tDlw3L4H1YEmbmllIpBAGgMjHRBxLZKOo5GBi0k7oS+VRM5TA==",
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-android-arm64/-/ngrok-android-arm64-1.6.0.tgz",
"integrity": "sha512-gOfVVjYq7ruPMgH108j99uaBUkwD1DxDpnk+RufQHzxRKL72MZad7QfaRwc1v8iRMyOh3EKYYvU2y8HSXDbSkA==",
"cpu": [
"arm64"
],
@@ -376,9 +376,9 @@
}
},
"node_modules/@ngrok/ngrok-darwin-arm64": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-darwin-arm64/-/ngrok-darwin-arm64-1.5.2.tgz",
"integrity": "sha512-8CVzS9AveYpNhWbydm7cJ6XqmVg29/VRKF15l4kJ2djlNoJxuGSibgM9A627dWRdnJyj5uhmU3VzsgeU8t+/3g==",
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-darwin-arm64/-/ngrok-darwin-arm64-1.6.0.tgz",
"integrity": "sha512-YdKlEkz0PHHnoy2UlEH2XMrupetmT6K6bLrF+MFWrKYKpIbOuGV4HcVioh1iu0NTmn7xJwrAbo/Mwx2E95/qdg==",
"cpu": [
"arm64"
],
@@ -392,9 +392,9 @@
}
},
"node_modules/@ngrok/ngrok-darwin-universal": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-darwin-universal/-/ngrok-darwin-universal-1.5.2.tgz",
"integrity": "sha512-mEMH1OxN6RxnqRSWb4xY9RqbtdlCpv+WlRKxq4lVy8JVsxEyFNnzVQ0jn+iuiy981jCXjokctzJeGMvECuSQBQ==",
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-darwin-universal/-/ngrok-darwin-universal-1.6.0.tgz",
"integrity": "sha512-yiUCkg10+vUKgvkD2rAZHlzvZmINUNF7mna7iL+ydh4pOx6jamSwDQ2QRseVAyxC9eZVy/rKFYLVnz2Ci+0D9w==",
"license": "MIT",
"optional": true,
"os": [
@@ -405,9 +405,9 @@
}
},
"node_modules/@ngrok/ngrok-darwin-x64": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-darwin-x64/-/ngrok-darwin-x64-1.5.2.tgz",
"integrity": "sha512-rGdcADw4NtMSU7SHUTly7uvMVYX6eMeMCppKyL5g3CSlEQntKf3AWs/89ah2TBWJA2WVl0UgGLkXp4xs1tg9eQ==",
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-darwin-x64/-/ngrok-darwin-x64-1.6.0.tgz",
"integrity": "sha512-a6LbwODDDCRpriILe+1lq+zuIjGbj+pR1A0KThTP8riVTQ538DMqR09kv5Oz7ZqcclS/IK+3ZLKkxHuPX9ob3g==",
"cpu": [
"x64"
],
@@ -421,9 +421,9 @@
}
},
"node_modules/@ngrok/ngrok-freebsd-x64": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-freebsd-x64/-/ngrok-freebsd-x64-1.5.2.tgz",
"integrity": "sha512-WgY54qUekaUGa5+lFvzYUMjlzf22IEXuZHhxnzJM2/gMqa7gjU8N5W4U8XNDjVW/oz6DekrzIjuoAEPO+2icDg==",
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-freebsd-x64/-/ngrok-freebsd-x64-1.6.0.tgz",
"integrity": "sha512-t77ayWr0zPrW75DstzvoE6Hwj7h1mpQSFKQ3I0B3iC9o7XZhcNkwFpX8QLbmQNkeHxz5UhlBtzOYPdzDJY+3uw==",
"cpu": [
"x64"
],
@@ -437,9 +437,9 @@
}
},
"node_modules/@ngrok/ngrok-linux-arm-gnueabihf": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-arm-gnueabihf/-/ngrok-linux-arm-gnueabihf-1.5.2.tgz",
"integrity": "sha512-azMxr/TGEeFU4JAUbSu5MO2aZEvdq+TzcxiLw6d+yhdEtNAjDW9TOyCczTrIZPOG5fP8G3lcCd8TP7mVIWdOnw==",
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-arm-gnueabihf/-/ngrok-linux-arm-gnueabihf-1.6.0.tgz",
"integrity": "sha512-NBCJnPAbl44Ua3dpO+kOkyz4cGGLu2FiDcEHBES7OARiSscoui+DyNPLe5auZFjag5/0B3ZNiDgCcdRBAi+KNQ==",
"cpu": [
"arm"
],
@@ -453,9 +453,9 @@
}
},
"node_modules/@ngrok/ngrok-linux-arm64-gnu": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-arm64-gnu/-/ngrok-linux-arm64-gnu-1.5.2.tgz",
"integrity": "sha512-79eFCxio4rM0ICRBXx/CVvbXDeWk1Jxr7szkezEYWtHaL+gXivrtS1QjtMnJpGY1GJlLTQL+49w2lGydqPOJQA==",
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-arm64-gnu/-/ngrok-linux-arm64-gnu-1.6.0.tgz",
"integrity": "sha512-i65WIaeImO2/oyTfwUAVW1j/poLMzX/PAYsDRLXOac6/1DV6kIQX1kmr+CEs6NtmKgD76QiApbqtksd9MDlncg==",
"cpu": [
"arm64"
],
@@ -469,9 +469,9 @@
}
},
"node_modules/@ngrok/ngrok-linux-arm64-musl": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-arm64-musl/-/ngrok-linux-arm64-musl-1.5.2.tgz",
"integrity": "sha512-ou9Z7iPQJIQ0RX5bdBhb3y7GwYRt+X0G9tenyRzKLXXvs0XfUUcg/23aBP61hmdRvBq7xpliV1PnvEVBgUIYMg==",
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-arm64-musl/-/ngrok-linux-arm64-musl-1.6.0.tgz",
"integrity": "sha512-7osqE43Pl6HiTeLZSEnSTtgbNQ1zqYovYjZ7lGgeKJHlgWXE6RvE7qhdjDw17ebUuT0IS8JPGZFnlyF6J0UKPQ==",
"cpu": [
"arm64"
],
@@ -485,9 +485,9 @@
}
},
"node_modules/@ngrok/ngrok-linux-x64-gnu": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-x64-gnu/-/ngrok-linux-x64-gnu-1.5.2.tgz",
"integrity": "sha512-VI1mmtl3Ie5uXTVAR9thPiMNMsCWeqkjBUbHAyk2vZ2OXR4Vs2DGjOPXK+wTl/hjF29FXoxunjhMy6caF9ht0Q==",
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-x64-gnu/-/ngrok-linux-x64-gnu-1.6.0.tgz",
"integrity": "sha512-jP3enLStnTGTKLBXqctVt3wIVvGLP/BkLKYuXwrU1EqchtvDcsAhpspeUeX23SAtLXUgbX9vN1B6IvsAxWcyxw==",
"cpu": [
"x64"
],
@@ -501,9 +501,9 @@
}
},
"node_modules/@ngrok/ngrok-linux-x64-musl": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-x64-musl/-/ngrok-linux-x64-musl-1.5.2.tgz",
"integrity": "sha512-F4j9EyC/0R3IgYSd+OER4bC8bxuBubvj33e24GvQnRF/IQaKhpybkvQbz54fnvsL7y0j2BB42NAIm2CFtk7tCw==",
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-x64-musl/-/ngrok-linux-x64-musl-1.6.0.tgz",
"integrity": "sha512-hrBrXCofgmY9pc36N0nfDS+bfomu5hOqt0N5IQkL4n0UaQcl48tKddIex2eR+mU3QBYh6p1XKxAwyAVjwplD2w==",
"cpu": [
"x64"
],
@@ -517,9 +517,9 @@
}
},
"node_modules/@ngrok/ngrok-win32-arm64-msvc": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-win32-arm64-msvc/-/ngrok-win32-arm64-msvc-1.5.2.tgz",
"integrity": "sha512-0OMXNjWElM1MQX7lMBnpRtafS9+3ybauqGD4m2dZcIm6hFvexsJFwNgx0mCa5aKxe2mQ4zNarEUd+SqG2Aa4/g==",
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-win32-arm64-msvc/-/ngrok-win32-arm64-msvc-1.6.0.tgz",
"integrity": "sha512-EXJXFaXh/cNRaTqs02EmysILtcSImFWwC98mjG6PU5MEG+gqNz8AddnqFytY0RRxkR9SxwnC+7QAV3qYOSU6kA==",
"cpu": [
"arm64"
],
@@ -533,9 +533,9 @@
}
},
"node_modules/@ngrok/ngrok-win32-ia32-msvc": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-win32-ia32-msvc/-/ngrok-win32-ia32-msvc-1.5.2.tgz",
"integrity": "sha512-hdvhnr7Br4XhUblpW67v5XP6FyoQwJ2xSbwas4KW4hZ3F4cw0m6sqXpssRfmqg3/5HJony1H5B2jLi0x4J7uOw==",
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-win32-ia32-msvc/-/ngrok-win32-ia32-msvc-1.6.0.tgz",
"integrity": "sha512-R+5WB6ONT4ynHFusxRw8kbXx2SBYftl6XUiNQNmwwCdwdNO7fPzdwhbmbzgfCEjQrYQrXD1vs5J+zJJeSaAicw==",
"cpu": [
"ia32"
],
@@ -549,9 +549,9 @@
}
},
"node_modules/@ngrok/ngrok-win32-x64-msvc": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-win32-x64-msvc/-/ngrok-win32-x64-msvc-1.5.2.tgz",
"integrity": "sha512-aHuMiRti9Taow9DlYLGVmu9CXtXD/v4CBQWpZlmt7VGuK1KsTWWLaGIBFVp6UXnyW87b0A+KC69Kn/Xjylw+sg==",
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@ngrok/ngrok-win32-x64-msvc/-/ngrok-win32-x64-msvc-1.6.0.tgz",
"integrity": "sha512-4QViW0GSPsjmghYPExO0Jt9DtIybK23MXPP0BltOuoFP0iyA15vb03QXAI4223zlSLWSWYnOx+qnCuzV1qT0lQ==",
"cpu": [
"x64"
],
@@ -1170,18 +1170,18 @@
"license": "Apache-2.0"
},
"node_modules/@sentry/core": {
"version": "10.25.0",
"resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.25.0.tgz",
"integrity": "sha512-mGi4BYIPwZjWdOXHrPoXz1AW4/cQbFoiuW/m+OOATmtSoGTDnWYwP+qZU7VLlL+v8ZEzxfPi2C1NPfJtPj7QWA==",
"version": "10.26.0",
"resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.26.0.tgz",
"integrity": "sha512-TjDe5QI37SLuV0q3nMOH8JcPZhv2e85FALaQMIhRILH9Ce6G7xW5GSjmH91NUVq8yc3XtiqYlz/EenEZActc4Q==",
"license": "MIT",
"engines": {
"node": ">=18"
}
},
"node_modules/@sentry/node": {
"version": "10.25.0",
"resolved": "https://registry.npmjs.org/@sentry/node/-/node-10.25.0.tgz",
"integrity": "sha512-++mugiYF8X7CLtpymGN3N4J40SvQVIsVa6K7pURhooT4eX1QXYOBJSaOqvOXk5GN4qed5wETHNBkZuXSO0RARQ==",
"version": "10.26.0",
"resolved": "https://registry.npmjs.org/@sentry/node/-/node-10.26.0.tgz",
"integrity": "sha512-VUwNoKYhRpnHQSj9lty1TgooO+1wcpS1V0K87HU8sZEas5gx3Ujiouk5ocPjlgbKreoYOApgOnEEIq5W/hfQcQ==",
"license": "MIT",
"dependencies": {
"@opentelemetry/api": "^1.9.0",
@@ -1214,9 +1214,9 @@
"@opentelemetry/sdk-trace-base": "^2.1.0",
"@opentelemetry/semantic-conventions": "^1.37.0",
"@prisma/instrumentation": "6.15.0",
"@sentry/core": "10.25.0",
"@sentry/node-core": "10.25.0",
"@sentry/opentelemetry": "10.25.0",
"@sentry/core": "10.26.0",
"@sentry/node-core": "10.26.0",
"@sentry/opentelemetry": "10.26.0",
"import-in-the-middle": "^1.14.2",
"minimatch": "^9.0.0"
},
@@ -1225,14 +1225,14 @@
}
},
"node_modules/@sentry/node-core": {
"version": "10.25.0",
"resolved": "https://registry.npmjs.org/@sentry/node-core/-/node-core-10.25.0.tgz",
"integrity": "sha512-Hk0s7r9pkotZ1yfUc9+XX0ALDQ/bjaYsWF23O2q8Yfc4m8NcQio54ztAmdI+Yf+YiHLpt0x9Hlgwpl3AaRvwIA==",
"version": "10.26.0",
"resolved": "https://registry.npmjs.org/@sentry/node-core/-/node-core-10.26.0.tgz",
"integrity": "sha512-7OrHVn8XAsq9mMVMlpL18XTKQEVcLOJSo0n2M7QGKfFk/OfVtSFMcUWGqN1qhYtT9aMTr2bjtR5+BI33djnNTQ==",
"license": "MIT",
"dependencies": {
"@apm-js-collab/tracing-hooks": "^0.3.1",
"@sentry/core": "10.25.0",
"@sentry/opentelemetry": "10.25.0",
"@sentry/core": "10.26.0",
"@sentry/opentelemetry": "10.26.0",
"import-in-the-middle": "^1.14.2"
},
"engines": {
@@ -1249,12 +1249,12 @@
}
},
"node_modules/@sentry/opentelemetry": {
"version": "10.25.0",
"resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-10.25.0.tgz",
"integrity": "sha512-AWCRzUIzvI+0RHXTmGvVx+MUtyyjwmC6F6d6XCnWhBKWGO52I+ucz1X8INIZxCrK05dpviFpeLZy+pzfgw892g==",
"version": "10.26.0",
"resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-10.26.0.tgz",
"integrity": "sha512-ASJdOwn6NwMH2ZeBrnGJI+l/xkJp1AOiQ5FWkvTqLc/vHX+r3PDMO7c+koecY+LiZxSzZF4IV8sALXfOh6UnwA==",
"license": "MIT",
"dependencies": {
"@sentry/core": "10.25.0"
"@sentry/core": "10.26.0"
},
"engines": {
"node": ">=18"
@@ -3056,9 +3056,9 @@
}
},
"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==",
"version": "10.5.0",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
"integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -4224,9 +4224,9 @@
}
},
"node_modules/openai": {
"version": "6.9.0",
"resolved": "https://registry.npmjs.org/openai/-/openai-6.9.0.tgz",
"integrity": "sha512-n2sJRYmM+xfJ0l3OfH8eNnIyv3nQY7L08gZQu3dw6wSdfPtKAk92L83M2NIP5SS8Cl/bsBBG3yKzEOjkx0O+7A==",
"version": "6.9.1",
"resolved": "https://registry.npmjs.org/openai/-/openai-6.9.1.tgz",
"integrity": "sha512-vQ5Rlt0ZgB3/BNmTa7bIijYFhz3YBceAA3Z4JuoMSBftBF9YqFHIEhZakSs+O/Ad7EaoEimZvHxD5ylRjN11Lg==",
"license": "Apache-2.0",
"bin": {
"openai": "bin/cli"
+4 -4
View File
@@ -1,6 +1,6 @@
{
"name": "mirotalk",
"version": "1.6.38",
"version": "1.6.39",
"description": "A free WebRTC browser-based video call",
"main": "server.js",
"scripts": {
@@ -42,8 +42,8 @@
"homepage": "https://github.com/miroslavpejic85/mirotalk",
"dependencies": {
"@mattermost/client": "11.1.0",
"@ngrok/ngrok": "1.5.2",
"@sentry/node": "^10.25.0",
"@ngrok/ngrok": "1.6.0",
"@sentry/node": "^10.26.0",
"axios": "^1.13.2",
"chokidar": "^4.0.3",
"colors": "^1.4.0",
@@ -61,7 +61,7 @@
"jsonwebtoken": "^9.0.2",
"js-yaml": "^4.1.1",
"nodemailer": "^7.0.10",
"openai": "^6.9.0",
"openai": "^6.9.1",
"qs": "^6.14.0",
"socket.io": "^4.8.1",
"swagger-ui-express": "^5.0.1",
+1 -1
View File
@@ -77,7 +77,7 @@ let brand = {
},
about: {
imageUrl: '../images/mirotalk-logo.gif',
title: 'WebRTC P2P v1.6.38',
title: 'WebRTC P2P v1.6.39',
html: `
<button
id="support-button"
+4 -10
View File
@@ -15,7 +15,7 @@
* @license For commercial use or closed source, contact us at license.mirotalk@gmail.com or purchase directly from CodeCanyon
* @license CodeCanyon: https://codecanyon.net/item/mirotalk-p2p-webrtc-realtime-video-conferences/38376661
* @author Miroslav Pejic - miroslav.pejic.85@gmail.com
* @version 1.6.38
* @version 1.6.39
*
*/
@@ -555,6 +555,8 @@ let chatDataChannels = {}; // keep track of our peer chat data channels
let fileDataChannels = {}; // keep track of our peer file sharing data channels
let allPeers = {}; // keep track of all peers in the room, indexed by peer_id == socket.io id
let lastStats = null;
// stream
let initStream; // initial webcam stream
let localVideoMediaStream; // my webcam
@@ -1213,14 +1215,6 @@ function initClientPeer() {
signalingSocket.on('peerAction', handlePeerAction);
signalingSocket.on('cmd', handleCmd);
signalingSocket.on('message', handleMessage);
signalingSocket.on('wbCanvasToJson', handleJsonToWbCanvas);
signalingSocket.on('whiteboardAction', handleWhiteboardAction);
signalingSocket.on('caption', handleCaptionActions);
signalingSocket.on('kickOut', handleKickedOut);
signalingSocket.on('fileInfo', handleFileInfo);
signalingSocket.on('fileAbort', handleFileAbort);
signalingSocket.on('fileReceiveAbort', handleAbortFileTransfer);
signalingSocket.on('videoPlayer', handleVideoPlayer);
signalingSocket.on('disconnect', handleDisconnect);
signalingSocket.on('removePeer', handleRemovePeer);
} // end [initClientPeer]
@@ -12328,7 +12322,7 @@ function showAbout() {
Swal.fire({
background: swBg,
position: 'center',
title: brand.about?.title && brand.about.title.trim() !== '' ? brand.about.title : 'WebRTC P2P v1.6.38',
title: brand.about?.title && brand.about.title.trim() !== '' ? brand.about.title : 'WebRTC P2P v1.6.39',
imageUrl: brand.about?.imageUrl && brand.about.imageUrl.trim() !== '' ? brand.about.imageUrl : images.about,
customClass: { image: 'img-about' },
html: `
+137
View File
@@ -0,0 +1,137 @@
'use strict';
/*
Fully correct WebRTC network stats collector.
- Supports audio + video
- Correct RTT (remote-inbound-rtp)
- Correct jitter (inbound-rtp)
- Multi-peer aggregation
*/
const networkSent = document.getElementById('networkSent');
const networkReceived = document.getElementById('networkReceived');
const networkJitter = document.getElementById('networkJitter');
const networkPacketLost = document.getElementById('networkPacketLost');
const networkRtt = document.getElementById('networkRtt');
const statsInterval = 3000; // every 3 seconds
/**
* Read network stats for a single RTCPeerConnection.
* Works for both audio and video.
*/
async function getNetworkStats(pc) {
let bytesSent = 0;
let bytesReceived = 0;
let packetsLost = 0;
let jitterSum = 0;
let jitterCount = 0;
let rttSum = 0;
let rttCount = 0;
if (!pc) {
return { bytesSent, bytesReceived, packetsLost, jitter: 0, rtt: 0 };
}
const stats = await pc.getStats();
stats.forEach((report) => {
// Outbound: Anything we send (audio/video)
if (report.type === 'outbound-rtp') {
bytesSent += report.bytesSent || 0;
}
// Inbound: Anything we receive (audio/video)
if (report.type === 'inbound-rtp') {
bytesReceived += report.bytesReceived || 0;
packetsLost += report.packetsLost || 0;
if (report.jitter !== undefined) {
jitterSum += report.jitter;
jitterCount++;
}
}
// RTT only exists in remote-inbound-rtp
if (report.type === 'remote-inbound-rtp') {
if (report.roundTripTime !== undefined) {
rttSum += report.roundTripTime;
rttCount++;
}
}
});
return {
bytesSent,
bytesReceived,
packetsLost,
jitter: jitterCount ? jitterSum / jitterCount : 0,
rtt: rttCount ? rttSum / rttCount : 0,
};
}
/** Convert bytes to readable string */
function bytesToSize(bytes) {
if (bytes === 0) return '0 b';
const i = Math.floor(Math.log(bytes) / Math.log(1024));
const sizes = ['b', 'Kb', 'Mb', 'Gb', 'Tb'];
return (bytes / Math.pow(1024, i)).toFixed(2) + ' ' + sizes[i];
}
/** Display into UI */
function showNetworkStats(stats) {
networkSent.innerText = stats.bytesSent;
networkReceived.innerText = stats.bytesReceived;
networkJitter.innerText = stats.jitter.toFixed(3) + ' s';
networkPacketLost.innerText = stats.packetsLost;
networkRtt.innerText = stats.rtt.toFixed(3) + ' s';
console.log('Network Stats:', stats);
}
/**
* Aggregate all peer connections
*/
setInterval(async () => {
let global = {
bytesSent: 0,
bytesReceived: 0,
packetsLost: 0,
jitter: 0,
rtt: 0,
};
let jitterCount = 0;
let rttCount = 0;
for (const pc of Object.values(peerConnections)) {
const s = await getNetworkStats(pc);
global.bytesSent += s.bytesSent;
global.bytesReceived += s.bytesReceived;
global.packetsLost += s.packetsLost;
if (s.jitter > 0) {
global.jitter += s.jitter;
jitterCount++;
}
if (s.rtt > 0) {
global.rtt += s.rtt;
rttCount++;
}
}
if (jitterCount > 0) global.jitter /= jitterCount;
if (rttCount > 0) global.rtt /= rttCount;
showNetworkStats({
bytesSent: bytesToSize(global.bytesSent),
bytesReceived: bytesToSize(global.bytesReceived),
packetsLost: global.packetsLost,
jitter: global.jitter,
rtt: global.rtt,
});
}, statsInterval);
+51 -1
View File
@@ -791,7 +791,56 @@ access to use this app.
<td><p id="networkTurn">🔴</p></td>
</tr>
</table>
<!-- <hr class="hr" /> -->
<hr class="hr" />
<table id="mySettingsTable">
<tr>
<td>
<div class="title">
<i class="fa-solid fa-upload"></i>
<p>Sent</p>
</div>
</td>
<td><p id="networkSent"></p></td>
</tr>
<tr>
<td>
<div class="title">
<i class="fa-solid fa-download"></i>
<p>Received</p>
</div>
</td>
<td><p id="networkReceived"></p></td>
</tr>
<tr>
<td>
<div class="title">
<i class="fa-solid fa-circle-exclamation"></i>
<p>Packet Lost</p>
</div>
</td>
<td><p id="networkPacketLost"></p></td>
</tr>
<tr>
<td>
<div class="title">
<i class="fa-solid fa-wave-square"></i>
<p>Jitter</p>
</div>
</td>
<td><p id="networkJitter"></p></td>
</tr>
<tr>
<td>
<div class="title">
<i class="fa-solid fa-clock-rotate-left"></i>
<p>RTT</p>
</div>
</td>
<td><p id="networkRtt"></p></td>
</tr>
</table>
</div>
<div id="tabStyling" class="tabcontent">
@@ -1055,6 +1104,7 @@ access to use this app.
<script defer src="../js/fixWebmDuration.js"></script>
<script defer src="../js/screenReader.js"></script>
<script defer src="../js/client.js"></script>
<script defer src="../js/networkStats.js"></script>
<script defer src="../js/speechRecognition.js"></script>
<script defer src="../js/nodeProcessor.js"></script>
+1 -1
View File
@@ -800,7 +800,7 @@
<div class="support-footer">
<p class="text-sm mb-0">
<strong>Other ways to help:</strong>
<span class="ml-8" title="Star on GitHub">
<span class="mlroomAction-8" title="Star on GitHub">
<i class="fab fa-github"></i> Star us
</span>
<span class="mx-8">|</span>