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
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>
TEST_MODE (use console)
<script id="webAppClient">
<script id="webappClient">
//Add this to the client script to request data from floWebappServer
const webAppClient = {
const webappClient = {
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 = []) {
return new Promise((resolve, reject) => {
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') {
if (typeof vectorClock !== 'string')
vectorClock.toString()
@ -65,18 +101,6 @@
reject(result[1])
}).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>

View File

@ -4,7 +4,7 @@
<title>FLO webApp Server</title>
<script id="onLoadStartUp">
function onLoadStartUp() {
const apps = ['TEDxKanke']
const apps = ['TEST_MODE']
webAppServer.setServeAppList(apps)
var consoleClear = setInterval(console.clear, 60 * 60000) // clear console every 1 hr
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) {
return new Promise((resolve, reject) => {
this.openDB(dbName).then(db => {
@ -180,11 +194,11 @@
return pos
},
getNextGeneralData: function (generalData, vectorClock) {
getNextGeneralData: function (generalData, filterStr, vectorClock) {
var filteredResult = []
for (var i = 0; i < generalData.length; i++)
if (generalData[i].vectorClock > vectorClock)
filteredResult.push(generalData[i])
for (var i = 0; i < generalData[filterStr].length; i++)
if (generalData[filter][i].vectorClock > vectorClock)
filteredResult.push(generalData[filter][i])
return filteredResult
},
@ -235,23 +249,20 @@
if(request[1] == "appObjects"){
compactIDB.readData(request[1], request[2], request[0]).then(result => {
var response = [true, this.util.objectDataFetch(result, request.slice(3))]
console.log(request, response)
var response = [true, this.util.objectDataFetch(result, request.slice(2))]
this.webSocket.send(`${requestor} ${JSON.stringify(response)}`)
})
}
else if (request[1] == "generalData"){
var filterStr = this.util.getFilterString(request[0], request[2])
compactIDB.readData(request[1], filterStr, request[0]).then(result => {
var response = [true, this.util.getNextGeneralData(result, request[3])]
console.log(request, response)
var response = [true, this.util.getNextGeneralData(result, filterStr, request[3])]
this.webSocket.send(`${requestor} ${JSON.stringify(response)}`)
})
}
else if(request[1] == "subAdmins"){
compactIDB.readAllData(request[1], request[0]).then(result => {
var response = [true, Object.keys(result)]
console.log(request, response)
this.webSocket.send(`${requestor} ${JSON.stringify(response)}`)
})
}
@ -261,6 +272,12 @@
response = [false, error.message]
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) => {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB