diff --git a/libs/network/esp8266/tests/projects/socket-test-multiple.js b/libs/network/esp8266/tests/projects/socket-test-multiple.js index 1862e9447..f628f88fe 100644 --- a/libs/network/esp8266/tests/projects/socket-test-multiple.js +++ b/libs/network/esp8266/tests/projects/socket-test-multiple.js @@ -2,7 +2,7 @@ // Test multiple concurrent connections -test_host = "h.voneicken.com"; // <======= confirgure for your local server running the test_http.rb sinatra server +test_host = "h.voneicken.com"; // <======= configure for your local server running the test_http.rb sinatra server test_port = 4567; var test_ip = 0; // will be resolved diff --git a/libs/network/socketserver.c b/libs/network/socketserver.c index f5c1d55fd..2d67c9ab4 100644 --- a/libs/network/socketserver.c +++ b/libs/network/socketserver.c @@ -273,6 +273,25 @@ void socketKill(JsNetwork *net) { #endif } +// Fire error events on up to two objects if there is an error, returns true if there is an error +// The error events have a code field and a message field. +static bool fireErrorEvent(int error, JsVar *obj1, JsVar *obj2) { + bool hadError = error < 0 && error != SOCKET_ERR_CLOSED; + JsVar *params[1]; + if (hadError) { + params[0] = jsvNewWithFlags(JSV_OBJECT); + jsvObjectSetChildAndUnLock(params[0], "code", jsvNewFromInteger(error)); + jsvObjectSetChildAndUnLock(params[0], "message", + jsvNewFromString(socketErrorString(error))); + if (obj1 != NULL) + jsiQueueObjectCallbacks(obj1, HTTP_NAME_ON_ERROR, params, 1); + if (obj2 != NULL) + jsiQueueObjectCallbacks(obj2, HTTP_NAME_ON_ERROR, params, 1); + jsvUnLock(params[0]); + } + return hadError; +} + // ----------------------------- bool socketServerConnectionsIdle(JsNetwork *net) { @@ -367,21 +386,11 @@ bool socketServerConnectionsIdle(JsNetwork *net) { } jsvUnLock(receiveData); - // fire the error listeners - bool hadError = error < 0 && error != SOCKET_ERR_CLOSED; - JsVar *params[1]; - if (hadError) { - params[0] = jsvNewWithFlags(JSV_OBJECT); - jsvObjectSetChildAndUnLock(params[0], "code", jsvNewFromInteger(error)); - jsvObjectSetChildAndUnLock(params[0], "message", - jsvNewFromString(socketErrorString(error))); - jsiQueueObjectCallbacks(connection, HTTP_NAME_ON_ERROR, params, 1); - jsiQueueObjectCallbacks(socket, HTTP_NAME_ON_ERROR, params, 1); - jsvUnLock(params[0]); - } + // fire error events + bool hadError = fireErrorEvent(error, connection, socket); // fire the close listeners - params[0] = jsvNewFromBool(hadError); + JsVar *params[1] = { jsvNewFromBool(hadError) }; jsiQueueObjectCallbacks(connection, HTTP_NAME_ON_CLOSE, params, 1); jsiQueueObjectCallbacks(socket, HTTP_NAME_ON_CLOSE, params, 1); jsvUnLock(params[0]); @@ -538,20 +547,11 @@ bool socketClientConnectionsIdle(JsNetwork *net) { jsvUnLock(connectionName); socketClosed = true; - // we have an error if the socket wasn't closed orderly - bool hadError = error < 0 && error != SOCKET_ERR_CLOSED; - JsVar *params[1]; - if (hadError) { - params[0] = jsvNewWithFlags(JSV_OBJECT); - jsvObjectSetChildAndUnLock(params[0], "code", jsvNewFromInteger(error)); - jsvObjectSetChildAndUnLock(params[0], "message", - jsvNewFromString(socketErrorString(error))); - jsiQueueObjectCallbacks(connection, HTTP_NAME_ON_ERROR, params, 1); - jsvUnLock(params[0]); - } + // fire error event, if ther eis an error + bool hadError = fireErrorEvent(error, connection, NULL); // close callback must happen after error callback - params[0] = jsvNewFromBool(hadError); + JsVar *params[1] = { jsvNewFromBool(hadError) }; jsiQueueObjectCallbacks(socket, HTTP_NAME_ON_CLOSE, params, 1); jsvUnLock(params[0]); }