From c692ba9c9b2befd35c2804f5c6d8f5c26a10f5b5 Mon Sep 17 00:00:00 2001
From: IsolatedSushi <simen.vanherpt@gmail.com>
Date: Wed, 30 Sep 2020 22:56:48 +0200
Subject: [PATCH] Had to limit to 10000 points a sec because it was sending
 2mil points a sec which crashed the app

---
 .../app/index.js                              | 40 ++++++---
 backend/package-lock.json                     |  5 ++
 backend/package.json                          |  3 +-
 backend/projector.proto                       | 71 ++++++++++++++++
 backend/server.js                             | 39 ++++++---
 backend/serverv2.js                           | 85 +++++++++++++++++++
 frontend/README.md                            |  7 +-
 frontend/src/App.vue                          |  4 +-
 frontend/src/components/gRPCclient.vue        |  1 -
 9 files changed, 226 insertions(+), 29 deletions(-)
 create mode 100644 backend/projector.proto
 create mode 100644 backend/serverv2.js

diff --git a/backend/microservices and load balancing/app/index.js b/backend/microservices and load balancing/app/index.js
index a650e17..ec74e89 100644
--- a/backend/microservices and load balancing/app/index.js	
+++ b/backend/microservices and load balancing/app/index.js	
@@ -1,13 +1,36 @@
 const app = require("express")();
 const http = require('http');
 
-const appid = process.env.APPID || -1;
-const port = 8090;
+//Default at 8090 to enable easy development
+const appid = process.env.APPID || 8090;
+
+app.get("/generatePoint", (req,res) => {
+  console.log("Generating single point")
 
-const requestListener =  app.get("/generatePoint", (req,res) => {
   res.send({"appid": appid, "point": generatePoint()})
 })
 
+
+app.get("/generatePointStream",(req,res)=>{
+  console.log("Generating points")
+  var intervalId = setInterval(function(){    
+
+    for(var i = 0; i<100;i++){
+      var response = JSON.stringify({"appid": appid,"point":generatePoint()})
+      res.write(response + "\n");
+    }
+    setTimeout(function() {
+      clearInterval(intervalId)
+      res.end();
+
+    }, 10000);
+
+},10);
+
+})
+
+
+
 //Generate randomPoint
 function generatePoint(){
     console.log
@@ -18,13 +41,6 @@ function generatePoint(){
     return {id:appid, x:xVal,y:yVal};
   }
 
-
-  if(appid<0){
-    const server = http.createServer(requestListener);
-    server.listen(port);
-    console.log('Listening at port: ' + port);
-  }
-  else{
-    app.listen(appid, ()=>console.log(`${appid} is listening on ${appid}`))
-  }
+app.listen(appid, ()=>console.log(`${appid} is listening on ${appid}`))
+  
   
\ No newline at end of file
diff --git a/backend/package-lock.json b/backend/package-lock.json
index 4107566..456f773 100644
--- a/backend/package-lock.json
+++ b/backend/package-lock.json
@@ -1093,6 +1093,11 @@
       "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
       "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
     },
+    "streammagic": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/streammagic/-/streammagic-1.0.0.tgz",
+      "integrity": "sha1-vO5+93fgtV75N7h5A/HO9l0UUQ8="
+    },
     "string-width": {
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
diff --git a/backend/package.json b/backend/package.json
index af489a5..d99087d 100644
--- a/backend/package.json
+++ b/backend/package.json
@@ -10,7 +10,8 @@
     "google-protobuf": "^3.6.1",
     "grpc": "^1.24.3",
     "grpc-web": "^1.0.0",
-    "lodash": "4.17.20"
+    "lodash": "4.17.20",
+    "streammagic": "^1.0.0"
   },
   "eslintConfig": {
     "root": true,
diff --git a/backend/projector.proto b/backend/projector.proto
new file mode 100644
index 0000000..a2a1dab
--- /dev/null
+++ b/backend/projector.proto
@@ -0,0 +1,71 @@
+syntax = "proto3";
+
+package provee;
+
+import "google/protobuf/empty.proto";
+
+option java_multiple_files = true;
+option java_package = "nl.uuvig.provee";
+option java_outer_classname = "ProveProjectorGRCP";
+option objc_class_prefix = "PROVEE";
+
+
+// Interface exported by the server.
+service Projector {
+  // A simple RPC.
+  //
+  // Start the Projector calculation
+  rpc start(google.protobuf.Empty) returns (google.protobuf.Empty);
+
+  // Stop the Projector calculation
+  rpc stop(google.protobuf.Empty) returns (google.protobuf.Empty);
+
+  // A server-to-client streaming RPC.
+  //
+  // Obtains the Projection Points in 2D given the trainings values stored in a row format.  Results are
+  // streamed rather than returned at once (e.g. in a response message with a
+  // repeated field).
+  rpc getProjectionPoints(TrainingSet) returns (stream Point) {}
+
+  // A server-to-client streaming RPC.
+  //
+  // Obtains the Projection Points in 2D given the trainings values stored in a row format.  Results are
+  // streamed rather than returned at once (e.g. in a response message with a
+  // repeated field).
+  rpc getUpdates(google.protobuf.Empty) returns (stream Point) {}
+
+//   // A client-to-server streaming RPC.
+//   //
+//   // Accepts a stream of Points on a route being traversed, returning a
+//   // RouteSummary when traversal is completed.
+//   rpc RecordRoute(stream Point) returns (RouteSummary) {}
+
+//   // A Bidirectional streaming RPC.
+//   //
+//   // Accepts a stream of RouteNotes sent while a route is being traversed,
+//   // while receiving other RouteNotes (e.g. from other users).
+//   rpc RouteChat(stream RouteNote) returns (stream RouteNote) {}
+}
+
+// Points are represented as x-y pairs
+message Point {
+  int32 id = 1;
+  int32 x = 2;
+  int32 y = 3;
+}
+
+// Needs description
+message TrainingSet {
+  string modelid = 1;
+  repeated TrainingSetRow rows = 2;
+}
+
+// Needs documentation
+message TrainingSetRow {
+  // The id of the row, e.g., row index.
+  string id = 1;
+
+  // The hd vector of the item.
+  repeated double hdvector = 2 [packed=true];
+}
+
diff --git a/backend/server.js b/backend/server.js
index 81a527f..c8650de 100644
--- a/backend/server.js
+++ b/backend/server.js
@@ -6,6 +6,9 @@ const axios = require('axios');
 var _ = require('lodash');
 var grpc = require('@grpc/grpc-js');
 var protoLoader = require('@grpc/proto-loader');
+const http = require("http");
+const { hostname } = require('os');
+const { SSL_OP_SSLEAY_080_CLIENT_DH_BUG } = require('constants');
 var packageDefinition = protoLoader.loadSync(
     PROTO_PATH,
     {keepCase: true,
@@ -16,12 +19,9 @@ var packageDefinition = protoLoader.loadSync(
     });
 var protoDescriptor = grpc.loadPackageDefinition(packageDefinition);
 var pointPackage = protoDescriptor.pointPackage;
-/**
- * @param {!Object} call
- * @param {function():?} callback
- */
 
- var count = 0;
+
+var count = 0;
 
 
 
@@ -33,17 +33,32 @@ function sendPoint(call, callback) {
   })
 }
 
+function sendPointStream(call) {
+  http.get("http://localhost:8090/generatePointStream", res =>{
+
+    res.on("data", data =>{
+      sendDataStream(data,call)
+    })
+
+    res.on("end",function() {
+        call.end();
+    })
+  })  
+}
+
+function sendDataStream(data,call){
+  var list = data.toString().split("\n")
 
+  for(var i =1; i <list.length-2;i++){
+      var response = JSON.parse(list[i]);
+      call.write(response["point"]);
+  }
+}
 
 //Points stream
-function sendPointStream(call) {
+function sendPointStream2(call) {
   
-  function sender(point) {
-    return (callback) => {
-      call.write(point);
-      _.delay(callback, 1); // in ms
-    };
-  }
+ 
 
   var senders = [];
   var count = 10;
diff --git a/backend/serverv2.js b/backend/serverv2.js
new file mode 100644
index 0000000..0b696ce
--- /dev/null
+++ b/backend/serverv2.js
@@ -0,0 +1,85 @@
+//SETUP
+var PROTO_PATH = __dirname + '/point.proto';
+var assert = require('assert');
+var async = require('async');
+const axios = require('axios');
+var _ = require('lodash');
+var grpc = require('@grpc/grpc-js');
+var protoLoader = require('@grpc/proto-loader');
+var packageDefinition = protoLoader.loadSync(
+    PROTO_PATH,
+    {keepCase: true,
+     longs: String,
+     enums: String,
+     defaults: true,
+     oneofs: true
+    });
+var protoDescriptor = grpc.loadPackageDefinition(packageDefinition);
+var pointPackage = protoDescriptor.pointPackage;
+var count = 0;
+
+
+
+
+//SERVICE
+function sendPoint(call, callback) {
+  axios.get('http://localhost:8090/generatePoint').then(resp=>{
+    callback(null, resp["data"]["point"]);
+  })
+}
+
+
+
+//Points stream
+function sendPointStream(call) {
+  
+  function sender(point) {
+    return (callback) => {
+      call.write(point);
+      _.delay(callback, 1); // in ms
+    };
+  }
+
+  var senders = [];
+  var count = 10;
+  for (var i = 0; i < count; i++) {
+    senders[i] = sender(generatePoint());
+  }
+  async.series(senders, () => {
+    call.end();
+  });
+}
+
+
+
+//Generate randomPoint
+function generatePoint(){
+  var xVal = Math.floor(Math.random()*20);
+  var yVal = Math.floor(Math.random()*20);
+  count++;
+  //console.log("Generated point. ID: " + count + "  x: " + xVal + " y: " + yVal);
+  
+  return {id:count, x:xVal,y:yVal};
+}
+
+//Create server and route the grpc functions to js functions
+function getServer() {
+  var server = new grpc.Server();
+  server.addService(pointPackage.Point.service, {
+    readPoint: sendPoint,
+    readPointsStream: sendPointStream,
+  });
+  return server;
+}
+
+//Setup
+if (require.main === module) {
+  var server = getServer();
+  server.bindAsync(
+    '0.0.0.0:9090', grpc.ServerCredentials.createInsecure(), (err, port) => {
+      assert.ifError(err);
+      server.start();
+      console.log("connected");
+  });
+}
+exports.getServer = getServer;
diff --git a/frontend/README.md b/frontend/README.md
index 5dabc27..33f865c 100644
--- a/frontend/README.md
+++ b/frontend/README.md
@@ -12,4 +12,9 @@ For some reason with vue it cant get the dapr.HTTP environment variable (even th
 docker run -d -v envoy.yaml:/etc/envoy/envoy.yaml:ro -p 7050:7050 -p 50460:50460 envoyproxy/envoy:v1.15.0
 
 
-docker run -d -v C:\Users\simen\OneDrive\Documents\GitHub\dummy-vue-grpc\envoy.yaml:/etc/envoy/envoy.yaml:ro -p 7050:7050 -p 50460:50460 envoyproxy/envoy:v1.15.0
\ No newline at end of file
+docker run -d -v C:\Users\simen\OneDrive\Documents\GitHub\dummy-vue-grpc\envoy.yaml:/etc/envoy/envoy.yaml:ro -p 7050:7050 -p 50460:50460 envoyproxy/envoy:v1.15.0
+
+
+
+
+docker run -d -vC:\Users\simen\OneDrive\Documents\GitHub\dummy-vue-grpc\envoy.yaml:/etc/envoy/envoy.yaml:ro -p 8080:8080 -p 9090:9090 envoyproxy/envoy:v1.15.0
diff --git a/frontend/src/App.vue b/frontend/src/App.vue
index c108c52..8fa103a 100644
--- a/frontend/src/App.vue
+++ b/frontend/src/App.vue
@@ -61,8 +61,8 @@ export default {
 
       //Give the point to all components
 
-      var index = Math.floor(Math.random() * Math.floor(this.pointList.length));
-      this.$refs.scatter.addPointToPlot(this.pointList[index]);
+      //var index = Math.floor(Math.random() * Math.floor(this.pointList.length));
+      this.$refs.scatter.addPointToPlot(this.pointList[this.pointCount]);
       this.$refs.counter.setCounter(this.pointList.length)
 
       this.pointCount += 1;
diff --git a/frontend/src/components/gRPCclient.vue b/frontend/src/components/gRPCclient.vue
index 161f5a4..ea063ad 100644
--- a/frontend/src/components/gRPCclient.vue
+++ b/frontend/src/components/gRPCclient.vue
@@ -71,7 +71,6 @@ export default {
 
     //When data is received
     stream.on("data", (response) => {
-      console.log(this.pointToString(response));
       this.receivedPoint(response);
     });
 
-- 
GitLab