Compare commits

..

No commits in common. "5aa0bbe1bb090384e9612600baca209db7ced9ae" and "149ada4c9b9920975d32ba2ec680b77feadf5d63" have entirely different histories.

4 changed files with 66 additions and 60 deletions

View File

@ -1,37 +1,2 @@
# webAppServer # webAppServer
This server is used to get the appObjects and generalData for the webApp clients without the need for blockchain or supernode cloud This server is used to get the appObjects and generalData for the webApp clients without the need for blockchain or supernode cloud
## Instructions
### To run the server
1. Clone/download this repository
2. Add a strong `<server_password>` in `.config` file
3. Add the `<port>` in `.config` file for the server to run
4. open terminal in the directory and run `./start_webAppServer.sh`
### To use in client side
1. copy the floGlobals and webAppClient script tag to the webApp page
2. Add the server's `<website_url/ip_addr>:<port>` in floGlobals script tag
### Properties
#### requestGeneralData
webAppClient.requestGeneralData(type, vectorClock = '0')
Requests the generalData from webAppServer
* type: type of the message
* vectorClock: vectorClock after which the message should be requested (can be used with Date.now()) (default = '0')
* Returns an object (set of generalData)
#### requestObjectData
webAppClient.requestObjectData(keyPath)
Requests the objectData/appObjects from webAppServer
* path: (an Array) path of the required object (eg. \['Sample', Property1, property2..]
* Returns an Object/Array (requested path)
#### requestSubAdminList
webAppClient.requestSubAdminList()
Requests the subAdmin list of the application from webAppServer
* Returns an Array (of subAdmins)
### Architecture Diagram
![webAppServer-Architecture.png](util/webAppServer-Architecture.png)

View File

@ -14,11 +14,29 @@
<body> <body>
TEST_MODE (use console) TEST_MODE (use console)
<script id="webAppClient"> <script id="webappClient">
//Add this to the client script to request data from floWebappServer //Add this to the client script to request data from floWebappServer
const webAppClient = { const webappClient = {
util: { util: {
sendData(data) {
return new Promise((resolve, reject) => {
var websocket = new WebSocket("wss://" + floGlobals.webAppURL + "/ws");
websocket.onmessage = (evt => {
if (evt.data == '$+') {
websocket.send(data);
resolve(`Data sent to webApp`);
} else if (evt.data == '$-')
reject(`webApp not available`)
else
reject(evt.data)
websocket.close();
})
websocket.onerror = (evt) => {
reject(`webApp server not found`)
};
})
},
requestData(request = []) { requestData(request = []) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
var websocket = new WebSocket("wss://" + floGlobals.webAppURL + "/ws"); var websocket = new WebSocket("wss://" + floGlobals.webAppURL + "/ws");
@ -40,6 +58,24 @@
} }
}, },
sendGeneralData: function (message, type, options = {}) {
return new Promise((resolve, reject) => {
var data = {
senderID: myFloID,
receiverID: options.receiverID || floGlobals.adminID,
pubKey: myPubKey,
message: message,
sign: floCrypto.signData(JSON.stringify(message), myPrivKey),
application: options.application || floGlobals.application,
type: type,
comment: options.comment || ""
}
this.util.sendData(JSON.stringify(data), data.receiverID)
.then(result => resolve(result))
.catch(error => reject(error))
})
},
requestGeneralData: function (type, vectorClock = '0') { requestGeneralData: function (type, vectorClock = '0') {
if (typeof vectorClock !== 'string') if (typeof vectorClock !== 'string')
vectorClock.toString() vectorClock.toString()
@ -65,18 +101,6 @@
reject(result[1]) reject(result[1])
}).catch(error => reject(error)) }).catch(error => reject(error))
}) })
},
requestSubAdminList: function(){
return new Promise((resolve, reject) => {
this.util.requestData([floGlobals.application, 'subAdmins']).then(
result => {
if (result[0])
resolve(result[1])
else
reject(result[1])
}).catch(error => reject(error))
})
} }
} }
</script> </script>

View File

@ -4,7 +4,7 @@
<title>FLO webApp Server</title> <title>FLO webApp Server</title>
<script id="onLoadStartUp"> <script id="onLoadStartUp">
function onLoadStartUp() { function onLoadStartUp() {
const apps = ['TEDxKanke'] const apps = ['TEST_MODE']
webAppServer.setServeAppList(apps) webAppServer.setServeAppList(apps)
var consoleClear = setInterval(console.clear, 60 * 60000) // clear console every 1 hr var consoleClear = setInterval(console.clear, 60 * 60000) // clear console every 1 hr
webAppServer.initWebSocket() webAppServer.initWebSocket()
@ -81,6 +81,20 @@
}); });
}, },
writeData: function (obsName, data, key = false, dbName = this.dbName) {
return new Promise((resolve, reject) => {
this.openDB(dbName).then(db => {
var obs = db.transaction(obsName, "readwrite").objectStore(obsName);
let writeReq = (key ? obs.put(data, key) : obs.put(data));
writeReq.onsuccess = (evt) => resolve(`Write data Successful`);
writeReq.onerror = (evt) => reject(
`Write data unsuccessful [${evt.target.error.name}] ${evt.target.error.message}`
);
db.close();
}).catch(error => reject(error));
});
},
addData: function (obsName, data, key = false, dbName = this.dbName) { addData: function (obsName, data, key = false, dbName = this.dbName) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.openDB(dbName).then(db => { this.openDB(dbName).then(db => {
@ -180,11 +194,11 @@
return pos return pos
}, },
getNextGeneralData: function (generalData, vectorClock) { getNextGeneralData: function (generalData, filterStr, vectorClock) {
var filteredResult = [] var filteredResult = []
for (var i = 0; i < generalData.length; i++) for (var i = 0; i < generalData[filterStr].length; i++)
if (generalData[i].vectorClock > vectorClock) if (generalData[filter][i].vectorClock > vectorClock)
filteredResult.push(generalData[i]) filteredResult.push(generalData[filter][i])
return filteredResult return filteredResult
}, },
@ -235,23 +249,20 @@
if(request[1] == "appObjects"){ if(request[1] == "appObjects"){
compactIDB.readData(request[1], request[2], request[0]).then(result => { compactIDB.readData(request[1], request[2], request[0]).then(result => {
var response = [true, this.util.objectDataFetch(result, request.slice(3))] var response = [true, this.util.objectDataFetch(result, request.slice(2))]
console.log(request, response)
this.webSocket.send(`${requestor} ${JSON.stringify(response)}`) this.webSocket.send(`${requestor} ${JSON.stringify(response)}`)
}) })
} }
else if (request[1] == "generalData"){ else if (request[1] == "generalData"){
var filterStr = this.util.getFilterString(request[0], request[2]) var filterStr = this.util.getFilterString(request[0], request[2])
compactIDB.readData(request[1], filterStr, request[0]).then(result => { compactIDB.readData(request[1], filterStr, request[0]).then(result => {
var response = [true, this.util.getNextGeneralData(result, request[3])] var response = [true, this.util.getNextGeneralData(result, filterStr, request[3])]
console.log(request, response)
this.webSocket.send(`${requestor} ${JSON.stringify(response)}`) this.webSocket.send(`${requestor} ${JSON.stringify(response)}`)
}) })
} }
else if(request[1] == "subAdmins"){ else if(request[1] == "subAdmins"){
compactIDB.readAllData(request[1], request[0]).then(result => { compactIDB.readAllData(request[1], request[0]).then(result => {
var response = [true, Object.keys(result)] var response = [true, Object.keys(result)]
console.log(request, response)
this.webSocket.send(`${requestor} ${JSON.stringify(response)}`) this.webSocket.send(`${requestor} ${JSON.stringify(response)}`)
}) })
} }
@ -261,6 +272,12 @@
response = [false, error.message] response = [false, error.message]
this.webSocket.send(`${requestor} ${JSON.stringify(response)}`) this.webSocket.send(`${requestor} ${JSON.stringify(response)}`)
} }
} else {
var data = JSON.parse(evt.data)
if (this.serveAppList.includes(data.application))
floSupernode.sendData(JSON.stringify(data), data.receiverID)
.then(result => resolve(result))
.catch(error => reject(error))
} }
}; };
this.webSocket.onerror = (evt) => { this.webSocket.onerror = (evt) => {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB