More thorough testing, with ws.terminate
This commit is contained in:
parent
adc5324360
commit
c66e3836ad
@ -21,6 +21,19 @@ struct WebSocketWrapper {
|
|||||||
args.Holder()->SetAlignedPointerInInternalField(0, nullptr);
|
args.Holder()->SetAlignedPointerInInternalField(0, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* It would make sense to call terminate "close" and call close "end" to line up with HTTP */
|
||||||
|
/* That also makes sense seince close takes message and code -> you can end with a string message */
|
||||||
|
|
||||||
|
/* Takes nothing returns nothing */
|
||||||
|
template <bool SSL>
|
||||||
|
static void uWS_WebSocket_terminate(const FunctionCallbackInfo<Value> &args) {
|
||||||
|
auto *ws = getWebSocket<SSL>(args);
|
||||||
|
if (ws) {
|
||||||
|
invalidateWsObject(args);
|
||||||
|
ws->terminate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Takes code, message, returns undefined */
|
/* Takes code, message, returns undefined */
|
||||||
template <bool SSL>
|
template <bool SSL>
|
||||||
static void uWS_WebSocket_close(const FunctionCallbackInfo<Value> &args) {
|
static void uWS_WebSocket_close(const FunctionCallbackInfo<Value> &args) {
|
||||||
@ -80,6 +93,7 @@ struct WebSocketWrapper {
|
|||||||
/* Register our functions */
|
/* Register our functions */
|
||||||
wsTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "send"), FunctionTemplate::New(isolate, uWS_WebSocket_send<SSL>));
|
wsTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "send"), FunctionTemplate::New(isolate, uWS_WebSocket_send<SSL>));
|
||||||
wsTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "close"), FunctionTemplate::New(isolate, uWS_WebSocket_close<SSL>));
|
wsTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "close"), FunctionTemplate::New(isolate, uWS_WebSocket_close<SSL>));
|
||||||
|
wsTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "terminate"), FunctionTemplate::New(isolate, uWS_WebSocket_terminate<SSL>));
|
||||||
wsTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "getBufferedAmount"), FunctionTemplate::New(isolate, uWS_WebSocket_getBufferedAmount<SSL>));
|
wsTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "getBufferedAmount"), FunctionTemplate::New(isolate, uWS_WebSocket_getBufferedAmount<SSL>));
|
||||||
|
|
||||||
/* Create the template */
|
/* Create the template */
|
||||||
|
@ -15,29 +15,41 @@ const port = 9001;
|
|||||||
let openedClientConnections = 0;
|
let openedClientConnections = 0;
|
||||||
let closedClientConnections = 0;
|
let closedClientConnections = 0;
|
||||||
|
|
||||||
|
let listenSocket;
|
||||||
|
|
||||||
|
const maxBackpressure = 50 * 1024 * 1024;
|
||||||
|
const maxPayloadSize = 5 * 1024 * 1024;
|
||||||
|
const largeBuffer = new ArrayBuffer(maxPayloadSize);
|
||||||
|
|
||||||
function printStatistics() {
|
function printStatistics() {
|
||||||
console.log('Opened clients ' + openedClientConnections);
|
console.log('Opened clients ' + openedClientConnections);
|
||||||
console.log('Closed clients ' + closedClientConnections + '\n');
|
console.log('Closed clients ' + closedClientConnections + '\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
let listenSocket;
|
|
||||||
|
|
||||||
/* 0 to 1-less than max */
|
/* 0 to 1-less than max */
|
||||||
function getRandomInt(max) {
|
function getRandomInt(max) {
|
||||||
return Math.floor(Math.random() * Math.floor(max));
|
return Math.floor(Math.random() * Math.floor(max));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This gets called every time we either open a new connection,
|
||||||
|
* or it immediately land in websockets/ws error handler */
|
||||||
|
function accountForConnection() {
|
||||||
|
/* Open more connections */
|
||||||
|
if (++openedClientConnections < /*100*/ 1000) {
|
||||||
|
establishNewConnection();
|
||||||
|
} else {
|
||||||
|
/* Stop listening */
|
||||||
|
uWS.us_listen_socket_close(listenSocket);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function establishNewConnection() {
|
function establishNewConnection() {
|
||||||
const ws = new WebSocket('ws://localhost:' + port);
|
const ws = new WebSocket('ws://localhost:' + port);
|
||||||
|
|
||||||
ws.on('open', () => {
|
ws.on('open', () => {
|
||||||
/* Open more connections */
|
/* Mark this socket as opened */
|
||||||
if (++openedClientConnections < 100) {
|
ws._opened = true;
|
||||||
establishNewConnection();
|
accountForConnection();
|
||||||
} else {
|
|
||||||
/* Stop listening */
|
|
||||||
uWS.us_listen_socket_close(listenSocket);
|
|
||||||
}
|
|
||||||
|
|
||||||
printStatistics();
|
printStatistics();
|
||||||
performRandomClientAction(ws);
|
performRandomClientAction(ws);
|
||||||
@ -48,21 +60,30 @@ function establishNewConnection() {
|
|||||||
performRandomClientAction(ws);
|
performRandomClientAction(ws);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/* Close can be called more times than open, websockets/ws is really messy! */
|
||||||
ws.on('close', () => {
|
ws.on('close', () => {
|
||||||
|
/* Check if this websocket really was opened first */
|
||||||
|
if (!ws._opened) {
|
||||||
|
accountForConnection();
|
||||||
|
}
|
||||||
|
|
||||||
closedClientConnections++;
|
closedClientConnections++;
|
||||||
printStatistics();
|
printStatistics();
|
||||||
|
/* I guess there is no need for us to call anything
|
||||||
|
* here, websockets/ws will not send anything to us anyways */
|
||||||
//performRandomClientAction(ws);
|
//performRandomClientAction(ws);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
ws.on('error', () => {
|
||||||
|
/* We simply ignore errors. websockets/ws will call our close handler
|
||||||
|
* on errors, potentially before even calling the open handler */
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const maxBackpressure = 50 * 1024 * 1024;
|
|
||||||
const maxPayloadSize = 5 * 1024 * 1024;
|
|
||||||
const largeBuffer = new ArrayBuffer(maxPayloadSize);
|
|
||||||
|
|
||||||
/* Perform random websockets/ws action */
|
/* Perform random websockets/ws action */
|
||||||
function performRandomClientAction(ws) {
|
function performRandomClientAction(ws) {
|
||||||
/* 0, 1 but never 2 */
|
/* 0, 1, 2 but never 3 */
|
||||||
let action = getRandomInt(2);
|
let action = getRandomInt(3);
|
||||||
|
|
||||||
/* Sending a message should have higher probability */
|
/* Sending a message should have higher probability */
|
||||||
if (getRandomInt(100) < 80) {
|
if (getRandomInt(100) < 80) {
|
||||||
@ -85,7 +106,6 @@ function performRandomClientAction(ws) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 2: {
|
case 2: {
|
||||||
/* This should correspond to hard us_socket_close */
|
|
||||||
ws.terminate();
|
ws.terminate();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -94,7 +114,8 @@ function performRandomClientAction(ws) {
|
|||||||
|
|
||||||
/* Perform random uWebSockets.js action */
|
/* Perform random uWebSockets.js action */
|
||||||
function performRandomServerAction(ws, uniform) {
|
function performRandomServerAction(ws, uniform) {
|
||||||
let action = getRandomInt(2);
|
/* 0, 1, 2 but never 3 */
|
||||||
|
let action = getRandomInt(3);
|
||||||
|
|
||||||
/* Sending a message should have higher probability,
|
/* Sending a message should have higher probability,
|
||||||
* except for when we are draining. */
|
* except for when we are draining. */
|
||||||
@ -104,7 +125,6 @@ function performRandomServerAction(ws, uniform) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 0, 1 but never 2 */
|
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case 0: {
|
case 0: {
|
||||||
ws.close();
|
ws.close();
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit 80322a5af73ed97b739315327e2cc5af65bc2f1e
|
Subproject commit ba10536f50bb5060cdaa0ce8725d506faa8ac1ce
|
Loading…
Reference in New Issue
Block a user