181 lines
6.3 KiB
JavaScript
181 lines
6.3 KiB
JavaScript
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))
|
|
}
|
|
}
|
|
} |