From 44033decc6ccc17e7ecbef2ac52d6f08e43e6ca4 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Thu, 16 Sep 2021 17:02:44 +0200 Subject: [PATCH] Websockets Client Bug Fixed, that prevented concurrent messages. --- NetworkRoot.js | 2 +- .../Network/NT/Modules/WebSocketsInterface.js | 3 ++ .../Network/SA/Modules/WebSocketsClient.js | 30 ++++++++++++------- .../DK/modules/WebAppInterface.js | 7 ++++- .../DK/modules/WebSocketsInterface.js | 3 ++ .../NT/Modules/ClientInterface.js | 5 ++++ .../UI/modules/WebSocketsClient.js | 27 +++++++++++------ 7 files changed, 55 insertions(+), 22 deletions(-) diff --git a/NetworkRoot.js b/NetworkRoot.js index 226ab5bcc..075a6f6a7 100644 --- a/NetworkRoot.js +++ b/NetworkRoot.js @@ -40,7 +40,7 @@ exports.newNetworkRoot = function newNetworkRoot() { Setting up external dependencies. */ SA.nodeModules = { - fs: SA.nodeModules.fs, + fs: require('fs'), nodeFetch: require('node-fetch'), web3: require('web3'), ws: require('ws') diff --git a/Projects/Network/NT/Modules/WebSocketsInterface.js b/Projects/Network/NT/Modules/WebSocketsInterface.js index 6a48a8a8a..07bb3e0c3 100644 --- a/Projects/Network/NT/Modules/WebSocketsInterface.js +++ b/Projects/Network/NT/Modules/WebSocketsInterface.js @@ -100,6 +100,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock result: 'Error', message: 'Handshake Not Done Yet.' } + response.messageId = messageHeader.messageId caller.socket.send(JSON.stringify(response)) return } @@ -108,11 +109,13 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock switch (caller.role) { case 'Network Client': { response = await clientInterface.messageReceived(messageHeader.payload, caller.userProfile) + response.messageId = messageHeader.messageId caller.socket.send(JSON.stringify(response)) break } case 'Network Peer': { response = await peerInterface.messageReceived(messageHeader.payload) + response.messageId = messageHeader.messageId caller.socket.send(JSON.stringify(response)) break } diff --git a/Projects/Network/SA/Modules/WebSocketsClient.js b/Projects/Network/SA/Modules/WebSocketsClient.js index 15ac176a6..b78a9d58b 100644 --- a/Projects/Network/SA/Modules/WebSocketsClient.js +++ b/Projects/Network/SA/Modules/WebSocketsClient.js @@ -8,9 +8,10 @@ exports.newNetworkModulesWebSocketsClient = function newNetworkModulesWebSockets let socketClient - let web3 + let web3 let called = {} let selectedNetworkNode // This is a Network Node we pick to try to connect to. + let onMessageFunctionsMap = new Map() return thisObject @@ -22,6 +23,7 @@ exports.newNetworkModulesWebSocketsClient = function newNetworkModulesWebSockets web3 = undefined called = undefined + onMessageFunctionsMap = undefined } async function initialize() { @@ -192,6 +194,7 @@ exports.newNetworkModulesWebSocketsClient = function newNetworkModulesWebSockets Network Node and from now on, all response messages will be received at this following function. */ + socketClient.onmessage = socketMessage => { onMenssage(socketMessage) } resolve() } } @@ -222,29 +225,23 @@ exports.newNetworkModulesWebSocketsClient = function newNetworkModulesWebSockets } let socketMessage = { + messageId: SA.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId(), messageType: 'Request', payload: message } - socketClient.onmessage = socketMessage => { onMenssage(socketMessage) } + onMessageFunctionsMap.set(socketMessage.messageId, onMenssageFunction) socketClient.send( JSON.stringify(socketMessage) ) - function onMenssage(socketMessage) { + function onMenssageFunction(response) { try { - - let response = JSON.parse(socketMessage.data) - /* - Chack if we are waiting for the Handshake response. - */ - if (response.result === 'Ok') { resolve(response.data) } else { - console.log('[ERROR] Web Sockets Client -> onMenssage -> response.message = ' + response.message) + console.log('[ERROR] Web Sockets Client -> onMenssageFunction -> response.message = ' + response.message) reject(response.message) } - } catch (err) { callbackFunction = undefined console.log('[ERROR] Web Sockets Client -> err.stack = ' + err.stack) @@ -252,4 +249,15 @@ exports.newNetworkModulesWebSocketsClient = function newNetworkModulesWebSockets } } } + + function onMenssage(socketMessage) { + + let response = JSON.parse(socketMessage.data) + /* + We get the functioin that is going to resolve or reject the promise given. + */ + onMenssageFunction = onMessageFunctionsMap.get(response.messageId) + onMessageFunctionsMap.delete(response.messageId) + onMenssageFunction(response) + } } \ No newline at end of file diff --git a/Projects/Social-Trading/DK/modules/WebAppInterface.js b/Projects/Social-Trading/DK/modules/WebAppInterface.js index 5c43a13e4..135ae7dcf 100644 --- a/Projects/Social-Trading/DK/modules/WebAppInterface.js +++ b/Projects/Social-Trading/DK/modules/WebAppInterface.js @@ -47,11 +47,16 @@ exports.newSocialTradingModulesWebAppInterface = function newSocialTradingModule queryMessage.emitterUserProfileId = DK.TEST_NETWORK_CLIENT_USER_PROFILE_ID messageHeader.queryMessage = JSON.stringify(queryMessage) + console.log((new Date()).toISOString(), '- Web App Interface', '- Query Message Received', JSON.stringify(queryMessage)) + let response = { result: 'Ok', message: 'Web App Interface Query Processed.', data: await DK.running.webSocketsClient.sendMessage(JSON.stringify(messageHeader)) } + + console.log((new Date()).toISOString(), '- Web App Interface', '- Query Respose Sent', JSON.stringify(response)) + return response } case 'Event': { @@ -131,7 +136,7 @@ exports.newSocialTradingModulesWebAppInterface = function newSocialTradingModule const fileHash = hash.update(fileContent).digest('hex') const fileName = fileHash + ".json" - let filePath = './My-Social-Trading-Data/User-Posts/' + SA.projects.foundations.utilities.filesAndDirectories.pathFromDate(timestamp) + let filePath = './My-Social-Trading-Data/User-Posts/' + SA.projects.foundations.utilities.filesAndDirectories.pathFromDate(timestamp) SA.projects.foundations.utilities.filesAndDirectories.mkDirByPathSync(filePath + '/') SA.nodeModules.fs.writeFileSync(filePath + '/' + fileName, fileContent) diff --git a/Projects/Social-Trading/DK/modules/WebSocketsInterface.js b/Projects/Social-Trading/DK/modules/WebSocketsInterface.js index 22de639d2..beb00d6e4 100644 --- a/Projects/Social-Trading/DK/modules/WebSocketsInterface.js +++ b/Projects/Social-Trading/DK/modules/WebSocketsInterface.js @@ -57,6 +57,7 @@ exports.newDesktopModulesWebSocketsInterface = function newDesktopModulesWebSock messageHeader = JSON.parse(message) } catch (err) { let response = { + messageId: messageHeader.messageId, result: 'Error', message: 'messageHeader Not Coorrect JSON Format.' } @@ -69,12 +70,14 @@ exports.newDesktopModulesWebSocketsInterface = function newDesktopModulesWebSock .catch(onError) function sendResponseToWebApp(response) { + response.messageId = messageHeader.messageId webApp.socket.send(JSON.stringify(response)) } function onError(errorMessage) { console.log('[ERROR] Web Sockets Interface -> onMenssage -> errorMessage = ' + errorMessage) let response = { + messageId: messageHeader.messageId, result: 'Error', message: errorMessage } diff --git a/Projects/Social-Trading/NT/Modules/ClientInterface.js b/Projects/Social-Trading/NT/Modules/ClientInterface.js index f37d898a0..497d3a817 100644 --- a/Projects/Social-Trading/NT/Modules/ClientInterface.js +++ b/Projects/Social-Trading/NT/Modules/ClientInterface.js @@ -207,11 +207,16 @@ exports.newSocialTradingModulesClientInterface = function newSocialTradingModule let query = NT.projects.socialTrading.modules.query.newSocialTradingModulesQuery() query.initialize(queryReceived) + console.log((new Date()).toISOString(), '- Client Interface', '- Query Message Received', queryMessage) + let response = { result: 'Ok', message: 'Client Interface Query Processed.', data: query.execute() } + + console.log((new Date()).toISOString(), '- Client Interface', '- Query Respose Sent', JSON.stringify(response)) + return response } catch (err) { diff --git a/Projects/Social-Trading/UI/modules/WebSocketsClient.js b/Projects/Social-Trading/UI/modules/WebSocketsClient.js index aaeac8f9e..64d5a37d3 100644 --- a/Projects/Social-Trading/UI/modules/WebSocketsClient.js +++ b/Projects/Social-Trading/UI/modules/WebSocketsClient.js @@ -9,6 +9,7 @@ function newSocialTradingModulesWebSocketsClient() { let socketClient let called = {} + let onMessageFunctionsMap = new Map() return thisObject @@ -18,6 +19,7 @@ function newSocialTradingModulesWebSocketsClient() { clientInterface = undefined called = undefined + onMessageFunctionsMap = undefined } async function initialize() { @@ -38,6 +40,7 @@ function newSocialTradingModulesWebSocketsClient() { socketClient.onerror = err => { onError(err) } function onConnection() { + socketClient.onmessage = socketMessage => { onMenssage(socketMessage) } resolve() } @@ -65,22 +68,17 @@ function newSocialTradingModulesWebSocketsClient() { } let socketMessage = { + messageId: SA.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId(), messageType: 'Request', payload: message } - socketClient.onmessage = socketMessage => { onMenssage(socketMessage) } + onMessageFunctionsMap.set(socketMessage.messageId, onMenssageFunction) socketClient.send( JSON.stringify(socketMessage) - ) + ) - function onMenssage(socketMessage) { + function onMenssageFunction(response) { try { - - let response = JSON.parse(socketMessage.data) - /* - Chack if we are waiting for the Handshake response. - */ - if (response.result === 'Ok') { resolve(response.data) } else { @@ -95,4 +93,15 @@ function newSocialTradingModulesWebSocketsClient() { } } } + + function onMenssage(socketMessage) { + + let response = JSON.parse(socketMessage.data) + /* + We get the functioin that is going to resolve or reject the promise given. + */ + onMenssageFunction = onMessageFunctionsMap.get(response.messageId) + onMessageFunctionsMap.delete(response.messageId) + onMenssageFunction(response) + } } \ No newline at end of file