From 06d0f3bf53f430c5a6cf1e6c849f5749b28964e9 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 31 Aug 2021 09:23:10 +0200 Subject: [PATCH 1/7] Websockets Handshake Procedure --- Client/client.js | 2 +- Client/webSocketsInterface.js | 2 +- Environment.js | 2 +- EnvironmentForDebug.js | 2 +- Network/NetwokNode.js | 3 +- Network/WebSocketsInterface.js | 181 +++++++++++++++++++++++ Projects/Network/NT/Globals/Memory.js | 11 +- Projects/Network/NT/Modules/Bootstrap.js | 5 +- 8 files changed, 196 insertions(+), 12 deletions(-) create mode 100644 Network/WebSocketsInterface.js diff --git a/Client/client.js b/Client/client.js index d44a7aa2b..07990149a 100644 --- a/Client/client.js +++ b/Client/client.js @@ -163,7 +163,7 @@ try { WEB_SOCKETS_INTERFACE = WEB_SOCKETS_INTERFACE.newWebSocketsInterface() WEB_SOCKETS_INTERFACE.initialize() WEB_SOCKETS_INTERFACE.run() - console.log('Web Sockets Interface ....................................... Listening at port ' + global.env.WEB_SOCKETS_INTERFACE_PORT) + console.log('Web Sockets Interface ....................................... Listening at port ' + global.env.CLIENT_WEB_SOCKETS_INTERFACE_PORT) HTTP_INTERFACE = HTTP_INTERFACE.newHttpInterface() HTTP_INTERFACE.initialize() diff --git a/Client/webSocketsInterface.js b/Client/webSocketsInterface.js index 84963a977..36dfd2aef 100644 --- a/Client/webSocketsInterface.js +++ b/Client/webSocketsInterface.js @@ -10,7 +10,7 @@ const WEB_SOCKET = require('ws') let socketServer - let port = global.env.WEB_SOCKETS_INTERFACE_PORT + let port = global.env.CLIENT_WEB_SOCKETS_INTERFACE_PORT return thisObject diff --git a/Environment.js b/Environment.js index aed0520ff..76276e22a 100644 --- a/Environment.js +++ b/Environment.js @@ -2,7 +2,7 @@ exports.newEnvironment = function () { let thisObject = { WEB_SERVER_URL: 'localhost', - WEB_SOCKETS_INTERFACE_PORT: 18041, + CLIENT_WEB_SOCKETS_INTERFACE_PORT: 18041, HTTP_INTERFACE_PORT: 34248, PATH_TO_TASK_SERVER: './TaskServer', PATH_TO_DATA_STORAGE: './Data-Storage', diff --git a/EnvironmentForDebug.js b/EnvironmentForDebug.js index 3d1094e83..cbb68d289 100644 --- a/EnvironmentForDebug.js +++ b/EnvironmentForDebug.js @@ -2,7 +2,7 @@ exports.newEnvironment = function () { let thisObject = { WEB_SERVER_URL: 'localhost', - WEB_SOCKETS_INTERFACE_PORT: 18041, + CLIENT_WEB_SOCKETS_INTERFACE_PORT: 18041, HTTP_INTERFACE_PORT: 34248, PATH_TO_TASK_SERVER: '../TaskServer', PATH_TO_DATA_STORAGE: '../Data-Storage', diff --git a/Network/NetwokNode.js b/Network/NetwokNode.js index 73520d046..f712800d4 100644 --- a/Network/NetwokNode.js +++ b/Network/NetwokNode.js @@ -42,7 +42,8 @@ Setting up external dependencies. SA.nodeModules = { fs: require('fs'), nodeFetch: require('node-fetch'), - web3: require('web3') + web3: require('web3'), + ws: require('ws') } start() diff --git a/Network/WebSocketsInterface.js b/Network/WebSocketsInterface.js new file mode 100644 index 000000000..1f80b7d04 --- /dev/null +++ b/Network/WebSocketsInterface.js @@ -0,0 +1,181 @@ +exports.newWebSocketsInterface = function newWebSocketsInterface() { + + let thisObject = { + initialize: initialize, + finalize: finalize, + run: run + } + + let socketServer + let port = global.env.Network_WEB_SOCKETS_INTERFACE_PORT + + return thisObject + + function finalize() { + + } + + function initialize() { + + } + + function run() { + setUpWebSocketServer() + } + + function setUpWebSocketServer() { + try { + socketServer = new SA.nodeModule.ws.Server({ port: port }) + socketServer.on('connection', onConnection) + + function onConnection(socket) { + let caller = {} + socket.on('message', onMenssage) + + + function onMenssage(message) { + try { + let messageHeader = JSON.parse(message) + /* + We will run some validations. + */ + if (messageHeader.messageType === undefined) { + let response = { + result: 'Error', + message: 'messageType Not Provided.' + } + socket.send(JSON.stringify(response)) + return + } + + switch (messageHeader.messageType) { + case "Handshake": { + handShakeProducedure(socket, caller, messageHeader) + break + + } + case "Request": { + break + } + + } + + + + + + + + + + + let origin = messageArray[0] + let nonce = messageArray[1] + let messageToEventServer = messageArray[2] + + if (origin === 'Web Browser') { + try { + JSON.parse(messageToEventServer) + } catch (err) { + console.log('[ERROR] Network -> Web Sockets Interface -> run -> setUpWebSocketServer -> Message received from the browser is not a valid JSON. message = ' + message.substring(0, 1000)) + console.log('[ERROR] Network -> Web Sockets Interface -> run -> setUpWebSocketServer -> Message received from the browser is not a valid JSON. messageToEventServer = ' + messageToEventServer) + return + } + + let acknowledgeMessage = { + action: 'Acknowledge', + nonce: nonce + } + + socket.send(JSON.stringify(acknowledgeMessage)) + } + + + CL.servers.EVENT_SERVER.onMessage(messageToEventServer, onResponse) + + function onResponse(message) { + socket.send(message) + } + } catch (err) { + console.log('[ERROR] Network -> Web Sockets Interface -> run -> setUpWebSocketServer -> Nonce received is less than Last Nonce. err = ' + err.stack) + } + } + } + + + function handShakeProducedure(socket, caller, messageHeader) { + /* + The caller needs to identify itself as either a Network Client or Peer. + */ + if (messageHeader.callerRole === undefined) { + let response = { + result: 'Error', + message: 'callerRole Not Provided.' + } + socket.send(JSON.stringify(response)) + return + } + + if (messageHeader.callerRole !== 'Network Client' && messageHeader.callerRole !== 'Network Peer') { + let response = { + result: 'Error', + message: 'callerRole Not Supported.' + } + socket.send(JSON.stringify(response)) + return + } + + caller.role = messageHeader.callerRole + /* + We will identify the caller by the signature at the message. + */ + if (messageHeader.signature === undefined) { + let response = { + result: 'Error', + message: 'signature Not Provided.' + } + socket.send(JSON.stringify(response)) + return + } + + let web3 = new SA.nodeModules.web3() + let blockchainAccount = web3.eth.accounts.recover(messageHeader.signature) + + if (caller.blockchainAccount === undefined) { + let response = { + result: 'Error', + message: 'Bad signature.' + } + socket.send(JSON.stringify(response)) + return + } + /* + The signature gives us the blockchain account, and the account the user profile. + */ + let userProfile = NT.projects.network.globals.memory.maps.USER_PROFILES_BY_BLOCHAIN_ACCOUNT.set(blockchainAccount) + + if (userProfile === undefined) { + let response = { + result: 'Error', + message: 'userProfile Not Found.' + } + socket.send(JSON.stringify(response)) + return + } + /* + We will remember the user profile behind this caller. + */ + caller.userProfile = userProfile + + let response = { + result: 'Ok', + message: 'Handshake Successful.' + } + socket.send(JSON.stringify(response)) + } + + } catch (err) { + console.log('[ERROR] Network -> Web Sockets Interface -> run -> setUpWebSocketServer -> err.message = ' + err.message.substring(0, 1000)) + } + } +} \ No newline at end of file diff --git a/Projects/Network/NT/Globals/Memory.js b/Projects/Network/NT/Globals/Memory.js index 3248bd2ca..1c5fbb70d 100644 --- a/Projects/Network/NT/Globals/Memory.js +++ b/Projects/Network/NT/Globals/Memory.js @@ -4,13 +4,14 @@ exports.newNetworkGlobalsMemory = function () { */ let thisObject = { maps: { - USER_PROFILES_BY_ID: new Map(), // Here we will store the user profiles by User Profile Id. - USER_PROFILES_BY_HANDLE: new Map(), // Here we will store the user profiles by User Profile Handle. - EVENTS: new Map(), // This is the registry of all events received that prevents processing them more than once. + USER_PROFILES_BY_ID: new Map(), // Here we will store the user profiles by User Profile Id. + USER_PROFILES_BY_HANDLE: new Map(), // Here we will store the user profiles by User Profile Handle. + USER_PROFILES_BY_BLOCHAIN_ACCOUNT: new Map(), // Here we will store the user profiles by Blockchain Account. + EVENTS: new Map(), // This is the registry of all events received that prevents processing them more than once. }, arrays: { - NETWORK_CLIENTS: [], // These are the Network Clients connected to this Network Node ordered by Ranking. - NETWORK_PEERS: [], // These are the Network Peers connected to this Network Node ordered by Ranking. + NETWORK_CLIENTS: [], // These are the Network Clients connected to this Network Node ordered by Ranking. + NETWORK_PEERS: [], // These are the Network Peers connected to this Network Node ordered by Ranking. } } diff --git a/Projects/Network/NT/Modules/Bootstrap.js b/Projects/Network/NT/Modules/Bootstrap.js index b840e3575..c98029769 100644 --- a/Projects/Network/NT/Modules/Bootstrap.js +++ b/Projects/Network/NT/Modules/Bootstrap.js @@ -36,7 +36,7 @@ exports.newBootstrap = function newBootstrap() { let config = JSON.parse(userProfilePlugin.config) let signatureObject = config.signature let web3 = new SA.nodeModules.web3() - let bloackchainAddress = web3.eth.accounts.recover(signatureObject) + let blockchainAccount = web3.eth.accounts.recover(signatureObject) let ranking = 0 // TODO: read the blockchain balance and transactions from the Treasury Account to calculate the profile ranking. let userProfileId = userProfilePlugin.id let userHandle = config.signature.message @@ -45,12 +45,13 @@ exports.newBootstrap = function newBootstrap() { userProfile.initialize( userProfileId, userHandle, - bloackchainAddress, + blockchainAccount, ranking ) NT.projects.network.globals.memory.maps.USER_PROFILES_BY_ID.set(userProfileId, userProfile) NT.projects.network.globals.memory.maps.USER_PROFILES_BY_HANDLE.set(userHandle, userProfile) + NT.projects.network.globals.memory.maps.USER_PROFILES_BY_BLOCHAIN_ACCOUNT.set(blockchainAccount, userProfile) } } From 6858abf5e260a4a82041db3d37d7b0a2f250f008 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 31 Aug 2021 10:53:34 +0200 Subject: [PATCH 2/7] eventReceived of Client Interface Implemented --- Network/NetwokNode.js | 5 + Network/clientsInterface.js | 87 --------- .../Network/NT/Modules/ClientInterface.js | 166 ++++++++++++++++++ .../Network/NT/Modules/PeerInterface.js | 2 +- .../NT/Modules}/WebSocketsInterface.js | 104 +++++------ Projects/ProjectsSchema.json | 18 ++ 6 files changed, 238 insertions(+), 144 deletions(-) delete mode 100644 Network/clientsInterface.js create mode 100644 Projects/Network/NT/Modules/ClientInterface.js rename Network/peerInterface.js => Projects/Network/NT/Modules/PeerInterface.js (73%) rename {Network => Projects/Network/NT/Modules}/WebSocketsInterface.js (62%) diff --git a/Network/NetwokNode.js b/Network/NetwokNode.js index f712800d4..b3eb4577f 100644 --- a/Network/NetwokNode.js +++ b/Network/NetwokNode.js @@ -45,6 +45,11 @@ SA.nodeModules = { web3: require('web3'), ws: require('ws') } +/* +Let's start the Network Interfaces +*/ +NT.webSocketsInterface = NT.projects.network.modules.webSocketsInterface.newNetworkModulesWebSocketsInterface() +NT.webSocketsInterface.initialize() start() diff --git a/Network/clientsInterface.js b/Network/clientsInterface.js deleted file mode 100644 index 2e48e99a4..000000000 --- a/Network/clientsInterface.js +++ /dev/null @@ -1,87 +0,0 @@ -exports.newClientInterface = function newClientInterface() { - /* - This module represents the Interface the Network Node have - with Network Clients connected to it. There are two things - Network Clients can do with this Network Node: - - * Send an Event that happened at the Network Client to the Network. - * Make a Query to the Network Node for info needed at the Network Client. - */ - let thisObject = { - eventReceived: eventReceived, - queryReceived: queryReceived, - initialize: initialize, - finalize: finalize - } - - return thisObject - - function finalize() { - - } - - function initialize() { - - } - - function eventReceived(eventMessage) { - /* - We expect here a JSON string with some or all of the following properties: - - { - "eventId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", - "eventType": 10, - "emitterUserProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", - "targetUserProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", - "emitterBotProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", - "targetBBotProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", - "emitterPostHash": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", - "targetPostHash": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", - "timestamp": 124234234234, - "botAsset": "BTC", - "botExchange": "Binance", - "botEnabled": true - } - */ - - let eventReceived = JSON.parse(eventMessage) - if (NT.projects.network.globals.memory.maps.EVENTS.get(eventReceived.eventId) !== undefined) { - throw ('Event Already Exists.') - } - - let event = NT.projects.network.modules.event.newNetworkModulesEvent() - event.initialize(eventReceived) - NT.projects.network.globals.memory.maps.EVENTS.set(eventReceived.eventId, event) - } - - function queryReceived(queryMessage) { - /* - We expect here a JSON string with some or all of the following properties: - - { - "equeryId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", - "queryType": 10, - "emitterUserProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", - "targetUserProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", - "emitterUserProfileHandle": "Luis-Fernando-Molina", - "targetUserProfileHandle": "Luis-Fernando-Molina", - "emitterBotProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", - "targetBBotProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", - "emitterPostHash": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", - "targetPostHash": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", - "timestamp": 124234234234, - "botAsset": "BTC", - "botExchange": "Binance", - "botEnabled": true, - "initialIndex": 35, - "amountRequested": 50, - "direction": "Past" - } - */ - - let queryReceived = JSON.parse(queryMessage) - let query = NT.projects.network.modules.queriesQuery.newNetworkModulesQuery() - query.initialize(queryReceived) - return query.execute() - } -} \ No newline at end of file diff --git a/Projects/Network/NT/Modules/ClientInterface.js b/Projects/Network/NT/Modules/ClientInterface.js new file mode 100644 index 000000000..f63dce04e --- /dev/null +++ b/Projects/Network/NT/Modules/ClientInterface.js @@ -0,0 +1,166 @@ +exports.newNetworkModulesClientInterface = function newNetworkModulesClientInterface() { + /* + This module represents the Interface the Network Node have + with Network Clients connected to it. There are two things + Network Clients can do with this Network Node: + + * Send an Event that happened at the Network Client to the Network. + * Make a Query to the Network Node for info needed at the Network Client. + */ + let thisObject = { + messageReceived: messageReceived, + initialize: initialize, + finalize: finalize + } + + return thisObject + + function finalize() { + + } + + function initialize() { + + } + + async function messageReceived(message, userProfile) { + let messageHeader + try { + messageHeader = JSON.parse(message) + } catch (err) { + let response = { + result: 'Error', + message: 'Client Interface message Not Coorrect JSON Format.' + } + return response + } + + if (messageHeader.messageType === undefined) { + let response = { + result: 'Error', + message: 'Client Interface messageType Not Provided.' + } + return response + } + + if (messageHeader.messageType !== 'Event' && messageHeader.messageType !== 'Query') { + let response = { + result: 'Error', + message: 'Client Interface messageType Not Supported.' + } + return response + } + + switch (messageHeader.messageType) { + case 'Event': { + return await eventReceived(messageHeader.eventMessage, userProfile) + } + case 'Query': { + return await queryReceived(messageHeader.queryMessage, userProfile) + } + } + } + + async function eventReceived(eventMessage, userProfile) { + /* + We expect here a JSON string with some or all of the following properties: + + { + "eventId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", + "eventType": 10, + "emitterUserProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", + "targetUserProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", + "emitterBotProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", + "targetBBotProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", + "emitterPostHash": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", + "targetPostHash": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", + "timestamp": 124234234234, + "botAsset": "BTC", + "botExchange": "Binance", + "botEnabled": true + } + */ + + let eventReceived + try { + eventReceived = JSON.parse(eventMessage) + } catch (err) { + let response = { + result: 'Error', + message: 'Client Interface eventMessage Not Coorrect JSON Format.' + } + return response + } + /* + At the Client Interface, events need to be emmitted by the same userProfile that is + connected at the Network Node. + */ + if (eventReceived.emitterUserProfileId !== userProfile.userProfileId) { + let response = { + result: 'Error', + message: 'Client Interface emitterUserProfileId !== userProfileId Connected to Network Node.' + } + return response + } + /* + We will not accept events that have already been processed. + */ + + if (NT.projects.network.globals.memory.maps.EVENTS.get(eventReceived.eventId) !== undefined) { + let response = { + result: 'Error', + message: 'Client Interface Event Already Exists.' + } + return response + } + /* + Here we will process the event and change the state of the Social Graph. + */ + try { + let event = NT.projects.network.modules.event.newNetworkModulesEvent() + event.initialize(eventReceived) + NT.projects.network.globals.memory.maps.EVENTS.set(eventReceived.eventId, event) + } catch (err) { + /* + Any exception that happens while trying to change the state of the Social Graph, + will be returned to the caller without doing anything else here. + */ + let response = { + result: 'Error', + message: 'Client Interface ' + err.message + } + return response + } + } + + async function queryReceived(queryMessage) { + /* + We expect here a JSON string with some or all of the following properties: + + { + "equeryId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", + "queryType": 10, + "emitterUserProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", + "targetUserProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", + "emitterUserProfileHandle": "Luis-Fernando-Molina", + "targetUserProfileHandle": "Luis-Fernando-Molina", + "emitterBotProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", + "targetBBotProfileId": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", + "emitterPostHash": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", + "targetPostHash": "a8de78f0-c3e4-4a2a-b7e8-f659073969db", + "timestamp": 124234234234, + "botAsset": "BTC", + "botExchange": "Binance", + "botEnabled": true, + "initialIndex": 35, + "amountRequested": 50, + "direction": "Past" + } + */ + + let queryReceived = JSON.parse(queryMessage) + let query = NT.projects.network.modules.queriesQuery.newNetworkModulesQuery() + query.initialize(queryReceived) + return query.execute() + } +} \ No newline at end of file diff --git a/Network/peerInterface.js b/Projects/Network/NT/Modules/PeerInterface.js similarity index 73% rename from Network/peerInterface.js rename to Projects/Network/NT/Modules/PeerInterface.js index 423579324..44c4412b0 100644 --- a/Network/peerInterface.js +++ b/Projects/Network/NT/Modules/PeerInterface.js @@ -1,4 +1,4 @@ -exports.newPeerInterface = function newPeerInterface() { +exports.newNetworkModulesPeerInterface = function newNetworkModulesPeerInterface() { let thisObject = { initialize: initialize, diff --git a/Network/WebSocketsInterface.js b/Projects/Network/NT/Modules/WebSocketsInterface.js similarity index 62% rename from Network/WebSocketsInterface.js rename to Projects/Network/NT/Modules/WebSocketsInterface.js index 1f80b7d04..740e6d244 100644 --- a/Network/WebSocketsInterface.js +++ b/Projects/Network/NT/Modules/WebSocketsInterface.js @@ -1,41 +1,51 @@ -exports.newWebSocketsInterface = function newWebSocketsInterface() { +exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSocketsInterface() { let thisObject = { initialize: initialize, - finalize: finalize, - run: run + finalize: finalize } let socketServer - let port = global.env.Network_WEB_SOCKETS_INTERFACE_PORT + let clientInterface + let peerInterface return thisObject function finalize() { - + socketServer = undefined + clientInterface = undefined + peerInterface = undefined } function initialize() { + socketServer = new SA.nodeModule.ws.Server({ port: global.env.Network_WEB_SOCKETS_INTERFACE_PORT }) + clientInterface = NT.projects.network.modules.clientInterface.newNetworkModulesClientInterface() + peerInterface = NT.projects.network.modules.peerInterface.newNetworkModulesPeerInterface() - } - - function run() { setUpWebSocketServer() } function setUpWebSocketServer() { try { - socketServer = new SA.nodeModule.ws.Server({ port: port }) socketServer.on('connection', onConnection) function onConnection(socket) { let caller = {} socket.on('message', onMenssage) - - function onMenssage(message) { + async function onMenssage(message) { try { - let messageHeader = JSON.parse(message) + let messageHeader + try { + messageHeader = JSON.parse(message) + } catch (err) { + let response = { + result: 'Error', + message: 'messageHeader Not Coorrect JSON Format.' + } + socket.send(JSON.stringify(response)) + return + } /* We will run some validations. */ @@ -50,60 +60,42 @@ exports.newWebSocketsInterface = function newWebSocketsInterface() { switch (messageHeader.messageType) { case "Handshake": { - handShakeProducedure(socket, caller, messageHeader) + handshakeProducedure(socket, caller, messageHeader) break - } case "Request": { + + if (caller.userProfile === undefined) { + let response = { + result: 'Error', + message: 'Handshake Not Done Yet.' + } + socket.send(JSON.stringify(response)) + return + } + + switch (caller.role) { + case 'Network Client': { + let response = await clientInterface.messageReceived(messageHeader.payload, caller.userProfile) + socket.send(JSON.stringify(response)) + break + } + case 'Network Peer': { + let response = await peerInterface.messageReceived(messageHeader.payload) + socket.send(JSON.stringify(response)) + break + } + } break } - - } - - - - - - - - - - - let origin = messageArray[0] - let nonce = messageArray[1] - let messageToEventServer = messageArray[2] - - if (origin === 'Web Browser') { - try { - JSON.parse(messageToEventServer) - } catch (err) { - console.log('[ERROR] Network -> Web Sockets Interface -> run -> setUpWebSocketServer -> Message received from the browser is not a valid JSON. message = ' + message.substring(0, 1000)) - console.log('[ERROR] Network -> Web Sockets Interface -> run -> setUpWebSocketServer -> Message received from the browser is not a valid JSON. messageToEventServer = ' + messageToEventServer) - return - } - - let acknowledgeMessage = { - action: 'Acknowledge', - nonce: nonce - } - - socket.send(JSON.stringify(acknowledgeMessage)) - } - - - CL.servers.EVENT_SERVER.onMessage(messageToEventServer, onResponse) - - function onResponse(message) { - socket.send(message) } } catch (err) { - console.log('[ERROR] Network -> Web Sockets Interface -> run -> setUpWebSocketServer -> Nonce received is less than Last Nonce. err = ' + err.stack) + console.log('[ERROR] Network -> Web Sockets Interface -> run -> setUpWebSocketServer -> err.stack = ' + err.stack) } } } - - function handShakeProducedure(socket, caller, messageHeader) { + function handshakeProducedure(socket, caller, messageHeader) { /* The caller needs to identify itself as either a Network Client or Peer. */ @@ -175,7 +167,7 @@ exports.newWebSocketsInterface = function newWebSocketsInterface() { } } catch (err) { - console.log('[ERROR] Network -> Web Sockets Interface -> run -> setUpWebSocketServer -> err.message = ' + err.message.substring(0, 1000)) + console.log('[ERROR] Network -> Web Sockets Interface -> run -> setUpWebSocketServer -> err.stack = ' + err.stack) } } } \ No newline at end of file diff --git a/Projects/ProjectsSchema.json b/Projects/ProjectsSchema.json index aaf9a7d65..7b9676298 100644 --- a/Projects/ProjectsSchema.json +++ b/Projects/ProjectsSchema.json @@ -1370,6 +1370,24 @@ "propertyName": "event", "functionName": "newNetworkModulesEvent", "fileName": "Event.js" + }, + { + "name": "Client Interface", + "propertyName": "clientInterface", + "functionName": "newNetworkModulesClientInterface", + "fileName": "ClientInterface.js" + }, + { + "name": "Peer Interface", + "propertyName": "peerInterface", + "functionName": "newNetworkModulesPeerInterface", + "fileName": "PeerInterface.js" + }, + { + "name": "Web Sockets Interface", + "propertyName": "webSocketsInterface", + "functionName": "newNetworkModulesWebSocketsInterface", + "fileName": "WebSocketsInterface.js" } ], "utilities": [ From b264900b87dccd77b71ca3225af1870a00f5f66b Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 31 Aug 2021 11:07:52 +0200 Subject: [PATCH 3/7] Update ClientInterface.js --- .../Network/NT/Modules/ClientInterface.js | 50 +++++++++++++++++-- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/Projects/Network/NT/Modules/ClientInterface.js b/Projects/Network/NT/Modules/ClientInterface.js index f63dce04e..2c04a96f0 100644 --- a/Projects/Network/NT/Modules/ClientInterface.js +++ b/Projects/Network/NT/Modules/ClientInterface.js @@ -120,6 +120,13 @@ exports.newNetworkModulesClientInterface = function newNetworkModulesClientInter let event = NT.projects.network.modules.event.newNetworkModulesEvent() event.initialize(eventReceived) NT.projects.network.globals.memory.maps.EVENTS.set(eventReceived.eventId, event) + + let response = { + result: 'Ok', + message: 'Client Interface Event Processed.' + } + return response + } catch (err) { /* Any exception that happens while trying to change the state of the Social Graph, @@ -158,9 +165,44 @@ exports.newNetworkModulesClientInterface = function newNetworkModulesClientInter } */ - let queryReceived = JSON.parse(queryMessage) - let query = NT.projects.network.modules.queriesQuery.newNetworkModulesQuery() - query.initialize(queryReceived) - return query.execute() + let queryReceived + try { + queryReceived = JSON.parse(queryMessage) + } catch (err) { + let response = { + result: 'Error', + message: 'Client Interface queryMessage Not Coorrect JSON Format.' + } + return response + } + /* + At the Client Interface, queries need to be emmitted by the same userProfile that is + connected at the Network Node. + */ + if (queryReceived.emitterUserProfileId !== userProfile.userProfileId) { + let response = { + result: 'Error', + message: 'Client Interface emitterUserProfileId !== userProfileId Connected to Network Node.' + } + return response + } + /* + Here we will process the query. This does not change the state of the Social Graph. + */ + try { + let query = NT.projects.network.modules.queriesQuery.newNetworkModulesQuery() + query.initialize(queryReceived) + return query.execute() + + } catch (err) { + /* + Any exception that happens while trying to execute the query. + */ + let response = { + result: 'Error', + message: 'Client Interface ' + err.message + } + return response + } } } \ No newline at end of file From a50a8b7c794458cd3383db5cf456e0d08d2b5252 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 31 Aug 2021 12:23:19 +0200 Subject: [PATCH 4/7] node modules --- package-lock.json => Network/package-lock.json | 0 package.json => Network/package.json | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename package-lock.json => Network/package-lock.json (100%) rename package.json => Network/package.json (100%) diff --git a/package-lock.json b/Network/package-lock.json similarity index 100% rename from package-lock.json rename to Network/package-lock.json diff --git a/package.json b/Network/package.json similarity index 100% rename from package.json rename to Network/package.json From 895c57aa0da05f49e4ee0f9c4aef17b4d251d5e3 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 31 Aug 2021 12:28:49 +0200 Subject: [PATCH 5/7] Node Modules --- Network/package-lock.json | 23 +++++++++++++++-------- Network/package.json | 3 ++- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/Network/package-lock.json b/Network/package-lock.json index 890365e86..11e53b3fd 100644 --- a/Network/package-lock.json +++ b/Network/package-lock.json @@ -977,6 +977,18 @@ "servify": "^0.1.12", "ws": "^3.0.0", "xhr-request-promise": "^0.1.2" + }, + "dependencies": { + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + } } }, "ethereum-bloom-filters": { @@ -2945,14 +2957,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.1.tgz", + "integrity": "sha512-XkgWpJU3sHU7gX8f13NqTn6KQ85bd1WU7noBHTT8fSohx7OS1TPY8k+cyRPCzFkia7C4mM229yeHr1qK9sM4JQ==" }, "xhr": { "version": "2.6.0", diff --git a/Network/package.json b/Network/package.json index fb7fc1957..98b8d8879 100644 --- a/Network/package.json +++ b/Network/package.json @@ -1,6 +1,7 @@ { "dependencies": { "node-fetch": "^2.6.1", - "web3": "^1.5.2" + "web3": "^1.5.2", + "ws": "^8.2.1" } } From 743885aff59e02dcc170e553e8a468ad0e270200 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 31 Aug 2021 13:26:55 +0200 Subject: [PATCH 6/7] runNetworkScript Debugged --- EnvironmentForDebug.js | 23 ++++--- Network/NetwokNode.js | 69 +++++-------------- .../Network/NT/Modules/WebSocketsInterface.js | 2 +- .../package-lock.json => package-lock.json | 0 Network/package.json => package.json | 0 runNetwork.js | 52 ++++++++++++++ 6 files changed, 82 insertions(+), 64 deletions(-) rename Network/package-lock.json => package-lock.json (100%) rename Network/package.json => package.json (100%) create mode 100644 runNetwork.js diff --git a/EnvironmentForDebug.js b/EnvironmentForDebug.js index cbb68d289..5e88fb9da 100644 --- a/EnvironmentForDebug.js +++ b/EnvironmentForDebug.js @@ -3,19 +3,20 @@ exports.newEnvironment = function () { let thisObject = { WEB_SERVER_URL: 'localhost', CLIENT_WEB_SOCKETS_INTERFACE_PORT: 18041, + NETWORK_WEB_SOCKETS_INTERFACE_PORT: 18042, HTTP_INTERFACE_PORT: 34248, - PATH_TO_TASK_SERVER: '../TaskServer', - PATH_TO_DATA_STORAGE: '../Data-Storage', - PATH_TO_PROJECTS: '../Projects', - PATH_TO_LOG_FILES: '../Log-Files', + PATH_TO_TASK_SERVER: './TaskServer', + PATH_TO_DATA_STORAGE: './Data-Storage', + PATH_TO_PROJECTS: './Projects', + PATH_TO_LOG_FILES: './Log-Files', PATH_TO_PROJECTS_REQUIRED: './Projects', - PATH_TO_PROJECT_SCHEMA: '../Projects/ProjectsSchema.json', - PATH_TO_UI: '../UI', - PATH_TO_DATA_FILES: '../UI/Data-Files/src', - PATH_TO_CLIENT: '../Client/', - PATH_TO_DEFAULT_WORKSPACE: '../Projects/Foundations/Plugins/Workspaces', - PATH_TO_MY_WORKSPACES: '../My-Workspaces', - PATH_TO_FONTS: '../Client/WebServer/Fonts' + PATH_TO_PROJECT_SCHEMA: './Projects/ProjectsSchema.json', + PATH_TO_UI: './UI', + PATH_TO_DATA_FILES: './UI/Data-Files/src', + PATH_TO_CLIENT: './Client/', + PATH_TO_DEFAULT_WORKSPACE: './Projects/Foundations/Plugins/Workspaces', + PATH_TO_MY_WORKSPACES: './My-Workspaces', + PATH_TO_FONTS: './Client/WebServer/Fonts' } return thisObject diff --git a/Network/NetwokNode.js b/Network/NetwokNode.js index b3eb4577f..8406c76df 100644 --- a/Network/NetwokNode.js +++ b/Network/NetwokNode.js @@ -1,59 +1,24 @@ -/* -The Superalgos Network offers 3 types of services: +exports.newNetworkNode = function newNetworkNode() { - * Social Graph Service - * Search Index Service - * Private Message Service - -Users can decide which services to run at their node. + let thisObject = { + run: run + } -This module is the starting point of the Network Node. + return thisObject -*/ + function run() { + /* + Let's start the Network Interfaces + */ + NT.webSocketsInterface = NT.projects.network.modules.webSocketsInterface.newNetworkModulesWebSocketsInterface() + NT.webSocketsInterface.initialize() -/* -The NT object is accesible everywhere at the Superalgos Network. -It provides access to all modules built for this Network. -*/ -global.NT = {} -/* -The SA object is accesible everywhere at the Superalgos Network. -It provides access to all modules built for Superalgos in general. -*/ -global.SA = {} -/* Load Environment Variables */ -let ENVIRONMENT = require('../EnvironmentForDebug.js'); -let ENVIRONMENT_MODULE = ENVIRONMENT.newEnvironment() -global.env = ENVIRONMENT_MODULE -/* -First thing is to load the project schema file. -*/ -global.PROJECTS_SCHEMA = require(global.env.PATH_TO_PROJECT_SCHEMA) -/* -Setting up the modules that will be available for the Servers Running inside this Client -*/ -let MULTI_PROJECT = require('../MultiProject.js'); -let MULTI_PROJECT_MODULE = MULTI_PROJECT.newMultiProject() -MULTI_PROJECT_MODULE.initialize(NT, 'NT') -MULTI_PROJECT_MODULE.initialize(SA, 'SA') -/* -Setting up external dependencies. -*/ -SA.nodeModules = { - fs: require('fs'), - nodeFetch: require('node-fetch'), - web3: require('web3'), - ws: require('ws') -} -/* -Let's start the Network Interfaces -*/ -NT.webSocketsInterface = NT.projects.network.modules.webSocketsInterface.newNetworkModulesWebSocketsInterface() -NT.webSocketsInterface.initialize() + start() -start() + async function start() { + let socialGraphService = NT.projects.network.modules.socialGraph.newSocialGraph() + await socialGraphService.initialize() + } -async function start() { - let socialGraphService = NT.projects.network.modules.socialGraph.newSocialGraph() - await socialGraphService.initialize() + } } diff --git a/Projects/Network/NT/Modules/WebSocketsInterface.js b/Projects/Network/NT/Modules/WebSocketsInterface.js index 740e6d244..912a66740 100644 --- a/Projects/Network/NT/Modules/WebSocketsInterface.js +++ b/Projects/Network/NT/Modules/WebSocketsInterface.js @@ -18,7 +18,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock } function initialize() { - socketServer = new SA.nodeModule.ws.Server({ port: global.env.Network_WEB_SOCKETS_INTERFACE_PORT }) + socketServer = new SA.nodeModules.ws.Server({ port: global.env.NETWORK_WEB_SOCKETS_INTERFACE_PORT }) clientInterface = NT.projects.network.modules.clientInterface.newNetworkModulesClientInterface() peerInterface = NT.projects.network.modules.peerInterface.newNetworkModulesPeerInterface() diff --git a/Network/package-lock.json b/package-lock.json similarity index 100% rename from Network/package-lock.json rename to package-lock.json diff --git a/Network/package.json b/package.json similarity index 100% rename from Network/package.json rename to package.json diff --git a/runNetwork.js b/runNetwork.js new file mode 100644 index 000000000..9aae83d5e --- /dev/null +++ b/runNetwork.js @@ -0,0 +1,52 @@ +/* +The Superalgos Network offers 3 types of services: + + * Social Graph Service + * Search Index Service + * Private Message Service + +Users can decide which services to run at their node.(TODO) + +This module is the starting point of the Network Node. + +*/ + +/* +The NT object is accesible everywhere at the Superalgos Network. +It provides access to all modules built for this Network. +*/ +global.NT = {} +/* +The SA object is accesible everywhere at the Superalgos Network. +It provides access to all modules built for Superalgos in general. +*/ +global.SA = {} +/* Load Environment Variables */ +let ENVIRONMENT = require('./EnvironmentForDebug.js'); +let ENVIRONMENT_MODULE = ENVIRONMENT.newEnvironment() +global.env = ENVIRONMENT_MODULE +/* +First thing is to load the project schema file. +*/ +global.PROJECTS_SCHEMA = require(global.env.PATH_TO_PROJECT_SCHEMA) +/* +Setting up the modules that will be available, defined at the Project Schema file. +*/ +let MULTI_PROJECT = require('./MultiProject.js'); +let MULTI_PROJECT_MODULE = MULTI_PROJECT.newMultiProject() +MULTI_PROJECT_MODULE.initialize(NT, 'NT') +MULTI_PROJECT_MODULE.initialize(SA, 'SA') +/* +Setting up external dependencies. +*/ +SA.nodeModules = { + fs: require('fs'), + nodeFetch: require('node-fetch'), + web3: require('web3'), + ws: require('ws') +} + +NT.app = require('./Network/NetwokNode.js').newNetworkNode() +NT.app.run() + +console.log('Superalgos Network is Running.') \ No newline at end of file From b262400441a5690ff6545fd1f2d6229cd8632afe Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 31 Aug 2021 13:30:29 +0200 Subject: [PATCH 7/7] Superalgos Network: DeepScan Bugs Fixed --- Projects/Network/NT/Modules/ClientInterface.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Projects/Network/NT/Modules/ClientInterface.js b/Projects/Network/NT/Modules/ClientInterface.js index 2c04a96f0..d96d5d419 100644 --- a/Projects/Network/NT/Modules/ClientInterface.js +++ b/Projects/Network/NT/Modules/ClientInterface.js @@ -140,7 +140,7 @@ exports.newNetworkModulesClientInterface = function newNetworkModulesClientInter } } - async function queryReceived(queryMessage) { + async function queryReceived(queryMessage, userProfile) { /* We expect here a JSON string with some or all of the following properties: