diff --git a/Makefile b/Makefile index 63a0c0c292..698c35f746 100644 --- a/Makefile +++ b/Makefile @@ -16,9 +16,12 @@ WEBPACK_DEV_SERVER = ./node_modules/.bin/webpack-dev-server all: compile deploy clean -compile: +compile: compile-load-test $(WEBPACK) -p +compile-load-test: + ${NPM} install --prefix load-test && ${NPM} run build --prefix load-test + clean: rm -fr $(BUILD_DIR) diff --git a/debian/jitsi-meet-web.install b/debian/jitsi-meet-web.install index 91df2dd033..f3fa036d02 100644 --- a/debian/jitsi-meet-web.install +++ b/debian/jitsi-meet-web.install @@ -15,3 +15,5 @@ resources/robots.txt /usr/share/jitsi-meet/ resources/*.sh /usr/share/jitsi-meet/scripts/ pwa-worker.js /usr/share/jitsi-meet/ manifest.json /usr/share/jitsi-meet/ +load-test/*.html /usr/share/jitsi-meet/load-test/ +load-test/libs /usr/share/jitsi-meet/load-test/ diff --git a/doc/debian/jitsi-meet/jitsi-meet.example b/doc/debian/jitsi-meet/jitsi-meet.example index d93acd7f88..7a4abe3e84 100644 --- a/doc/debian/jitsi-meet/jitsi-meet.example +++ b/doc/debian/jitsi-meet/jitsi-meet.example @@ -100,6 +100,15 @@ server { tcp_nodelay on; } + # load test minimal client, uncomment when used + #location ~ ^/_load-test/([^/?&:'"]+)$ { + # rewrite ^/_load-test/(.*)$ /load-test/index.html break; + #} + #location ~ ^/_load-test/libs/(.*)$ { + # add_header 'Access-Control-Allow-Origin' '*'; + # alias /usr/share/jitsi-meet/load-test/libs/$1; + #} + location ~ ^/([^/?&:'"]+)$ { try_files $uri @root_path; } diff --git a/load-test/index.html b/load-test/index.html new file mode 100644 index 0000000000..2cae9b2936 --- /dev/null +++ b/load-test/index.html @@ -0,0 +1,13 @@ + + + + + + + + + + +
Number of participants: 1
+ + diff --git a/load-test/load-test-participant.js b/load-test/load-test-participant.js new file mode 100644 index 0000000000..2db67845cb --- /dev/null +++ b/load-test/load-test-participant.js @@ -0,0 +1,228 @@ +/* global $, config, JitsiMeetJS */ +import 'jquery'; +import { parseURLParams } from '../react/features/base/util/parseURLParams'; +import { parseURIString } from '../react/features/base/util/uri'; + +const params = parseURLParams(window.location, false, 'hash'); +const { isHuman = false } = params; +const { + localAudio = params['config.startWithAudioMuted'] !== true, + localVideo = params['config.startWithVideoMuted'] !== true, + remoteVideo = isHuman, + remoteAudio = isHuman +} = params; + +const { room: roomName } = parseURIString(window.location.toString()); + +let connection = null; + +let isJoined = false; + +let room = null; + +let numParticipants = 1; + +let localTracks = []; +const remoteTracks = {}; + +window.APP = { + conference: { + getStats() { + return room.connectionQuality.getStats(); + }, + getConnectionState() { + return room && room.getConnectionState(); + } + }, + + get room() { + return room; + }, + get connection() { + return connection; + }, + get numParticipants() { + return numParticipants; + }, + get localTracks() { + return localTracks; + }, + get remoteTracks() { + return remoteTracks; + }, + get params() { + return { + roomName, + localAudio, + localVideo, + remoteVideo, + remoteAudio + }; + } +}; + +/** + * + */ +function setNumberOfParticipants() { + $('#participants').text(numParticipants); +} + +/** + * Handles local tracks. + * @param tracks Array with JitsiTrack objects + */ +function onLocalTracks(tracks = []) { + localTracks = tracks; + for (let i = 0; i < localTracks.length; i++) { + if (localTracks[i].getType() === 'video') { + $('body').append(`