Create config file artillery websocket

This commit is contained in:
Gregoire Parant 2020-09-09 12:32:01 +02:00
parent 4226453364
commit d4fe59d154
5 changed files with 1389 additions and 18 deletions

View File

@ -41,6 +41,7 @@
"@types/jsonwebtoken": "^8.3.8", "@types/jsonwebtoken": "^8.3.8",
"@types/socket.io": "^2.1.4", "@types/socket.io": "^2.1.4",
"@types/uuidv4": "^5.0.0", "@types/uuidv4": "^5.0.0",
"artillery": "^1.6.1",
"body-parser": "^1.19.0", "body-parser": "^1.19.0",
"express": "^4.17.1", "express": "^4.17.1",
"generic-type-guard": "^3.2.0", "generic-type-guard": "^3.2.0",

View File

@ -0,0 +1,50 @@
config:
target: "http://api.workadventure.localhost/"
socketio:
transports: ["websocket"]
query:
token: "test"
phases:
- duration: 10
arrivalRate: 10
- duration: 10
arrivalRate: 10
processor: "./socketioLoadTest.js"
scenarios:
- name: "Connect and send a bunch of messages"
weight: 90
engine: "socketio"
flow:
#- loop:
#- emit:
# channel: "connection"
# data: "hello world!"
#- think: 5
- emit:
channel: "set-player-details"
data:
name: 'TEST'
characterLayers: ['male3']
- think: 1
- emit:
channel: "join-room"
data:
roomId: 'global__api.workadventure.localhost/map/files/Floor0/floor0'
position:
x: 783
y: 170
direction: 'down'
moving: false
- think: 1
- loop:
- function: "setYRandom"
- emit:
channel: "user-position"
data:
x: "{{ x }}"
y: "{{ y }}"
direction: 'down'
moving: false
- think: 1
count: 10
- think: 10

15
back/socketioLoadTest.js Normal file
View File

@ -0,0 +1,15 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
'use strict';
module.exports = {
setYRandom
};
function setYRandom(context, events, done) {
context.vars.x = (883 + Math.round(Math.random() * 300));
context.vars.y = (270 + Math.round(Math.random() * 300));
return done();
}

View File

@ -18,6 +18,7 @@ import {isJoinRoomMessageInterface} from "../Model/Websocket/JoinRoomMessage";
import {isPointInterface, PointInterface} from "../Model/Websocket/PointInterface"; import {isPointInterface, PointInterface} from "../Model/Websocket/PointInterface";
import {isWebRtcSignalMessageInterface} from "../Model/Websocket/WebRtcSignalMessage"; import {isWebRtcSignalMessageInterface} from "../Model/Websocket/WebRtcSignalMessage";
import {UserInGroupInterface} from "../Model/Websocket/UserInGroupInterface"; import {UserInGroupInterface} from "../Model/Websocket/UserInGroupInterface";
import {uuid} from 'uuidv4';
enum SockerIoEvent { enum SockerIoEvent {
CONNECTION = "connection", CONNECTION = "connection",
@ -60,10 +61,18 @@ export class IoSocketController {
// Authentication with token. it will be decoded and stored in the socket. // Authentication with token. it will be decoded and stored in the socket.
// Completely commented for now, as we do not use the "/login" route at all. // Completely commented for now, as we do not use the "/login" route at all.
this.Io.use((socket: Socket, next) => { this.Io.use((socket: Socket, next) => {
console.log(socket.handshake.query.token);
if (!socket.handshake.query || !socket.handshake.query.token) { if (!socket.handshake.query || !socket.handshake.query.token) {
console.error('An authentication error happened, a user tried to connect without a token.'); console.error('An authentication error happened, a user tried to connect without a token.');
return next(new Error('Authentication error')); return next(new Error('Authentication error'));
} }
if(socket.handshake.query.token === 'test'){
(socket as ExSocketInterface).token = socket.handshake.query.token;
(socket as ExSocketInterface).userId = uuid();
console.log((socket as ExSocketInterface).userId);
next();
return;
}
if(this.searchClientByToken(socket.handshake.query.token)){ if(this.searchClientByToken(socket.handshake.query.token)){
console.error('An authentication error happened, a user tried to connect while its token is already connected.'); console.error('An authentication error happened, a user tried to connect while its token is already connected.');
return next(new Error('Authentication error')); return next(new Error('Authentication error'));
@ -155,6 +164,7 @@ export class IoSocketController {
y: user y position on map y: user y position on map
*/ */
socket.on(SockerIoEvent.JOIN_ROOM, (message: unknown, answerFn): void => { socket.on(SockerIoEvent.JOIN_ROOM, (message: unknown, answerFn): void => {
console.log(SockerIoEvent.JOIN_ROOM, message);
try { try {
if (!isJoinRoomMessageInterface(message)) { if (!isJoinRoomMessageInterface(message)) {
socket.emit(SockerIoEvent.MESSAGE_ERROR, {message: 'Invalid JOIN_ROOM message.'}); socket.emit(SockerIoEvent.MESSAGE_ERROR, {message: 'Invalid JOIN_ROOM message.'});
@ -191,7 +201,7 @@ export class IoSocketController {
} }
return new MessageUserPosition(user.id, player.name, player.characterLayers, player.position); return new MessageUserPosition(user.id, player.name, player.characterLayers, player.position);
}).filter((item: MessageUserPosition|null) => item !== null); }).filter((item: MessageUserPosition|null) => item !== null);
answerFn(listOfUsers); //answerFn(listOfUsers);
} catch (e) { } catch (e) {
console.error('An error occurred on "join_room" event'); console.error('An error occurred on "join_room" event');
console.error(e); console.error(e);
@ -199,6 +209,7 @@ export class IoSocketController {
}); });
socket.on(SockerIoEvent.USER_POSITION, (position: unknown): void => { socket.on(SockerIoEvent.USER_POSITION, (position: unknown): void => {
console.log(SockerIoEvent.USER_POSITION, position);
try { try {
if (!isPointInterface(position)) { if (!isPointInterface(position)) {
socket.emit(SockerIoEvent.MESSAGE_ERROR, {message: 'Invalid USER_POSITION message.'}); socket.emit(SockerIoEvent.MESSAGE_ERROR, {message: 'Invalid USER_POSITION message.'});
@ -265,6 +276,7 @@ export class IoSocketController {
// Let's send the user id to the user // Let's send the user id to the user
socket.on(SockerIoEvent.SET_PLAYER_DETAILS, (playerDetails: unknown, answerFn) => { socket.on(SockerIoEvent.SET_PLAYER_DETAILS, (playerDetails: unknown, answerFn) => {
console.log(SockerIoEvent.SET_PLAYER_DETAILS, playerDetails);
if (!isSetPlayerDetailsMessage(playerDetails)) { if (!isSetPlayerDetailsMessage(playerDetails)) {
socket.emit(SockerIoEvent.MESSAGE_ERROR, {message: 'Invalid SET_PLAYER_DETAILS message.'}); socket.emit(SockerIoEvent.MESSAGE_ERROR, {message: 'Invalid SET_PLAYER_DETAILS message.'});
console.warn('Invalid SET_PLAYER_DETAILS message received: ', playerDetails); console.warn('Invalid SET_PLAYER_DETAILS message received: ', playerDetails);
@ -273,10 +285,11 @@ export class IoSocketController {
const Client = (socket as ExSocketInterface); const Client = (socket as ExSocketInterface);
Client.name = playerDetails.name; Client.name = playerDetails.name;
Client.characterLayers = playerDetails.characterLayers; Client.characterLayers = playerDetails.characterLayers;
answerFn(Client.userId); //answerFn(Client.userId);
}); });
socket.on(SockerIoEvent.SET_SILENT, (silent: unknown) => { socket.on(SockerIoEvent.SET_SILENT, (silent: unknown) => {
console.log(SockerIoEvent.SET_SILENT, silent);
if (typeof silent !== "boolean") { if (typeof silent !== "boolean") {
socket.emit(SockerIoEvent.MESSAGE_ERROR, {message: 'Invalid SET_SILENT message.'}); socket.emit(SockerIoEvent.MESSAGE_ERROR, {message: 'Invalid SET_SILENT message.'});
console.warn('Invalid SET_SILENT message received: ', silent); console.warn('Invalid SET_SILENT message received: ', silent);

File diff suppressed because it is too large Load Diff