Merge branch 'master' of ssh://plrg.eecs.uci.edu/home/git/iotcloud
authorjoelbandi <joelvivekbandi@gmail.com>
Tue, 2 Aug 2016 22:47:35 +0000 (15:47 -0700)
committerjoelbandi <joelvivekbandi@gmail.com>
Tue, 2 Aug 2016 22:47:35 +0000 (15:47 -0700)
src/js/iotjs/README.md
src/js/iotjs/orig/compat.txt
src/js/iotjs/orig/lastmessage.js [new file with mode: 0644]
src/js/iotjs/orig/slotbuffer.js [new file with mode: 0644]
src/js/iotjs/orig/slotindexer.js [new file with mode: 0644]
src/js/iotjs/orig/tablestatus.js [new file with mode: 0644]
src/js/iotjs/src/lastmessage.js [new file with mode: 0644]
src/js/iotjs/src/slotbuffer.js [new file with mode: 0644]
src/js/iotjs/src/slotindexer.js [new file with mode: 0644]
src/js/iotjs/src/tablestatus.js [new file with mode: 0644]

index 2e6e0a14400327908aa5f202fb3478d6478fb20c..a384bd92012818e2490d353cbbe653541a1e2c7f 100644 (file)
@@ -7,8 +7,8 @@ Getting Started
 --------------------------------------
 
 - Install dependencies: `npm install`
-- Run `bower install` to install frontend dependencies
-- Run `gulp` to build your library
+- Run `npm test` to build your library
+- Final src file in build directory.
 
 Usage
 --------------------------------------
index af5aedfd1ff0aeeee1fda2fdd84548d365bc9e4e..a5d98b9e4f53babcda2138a49a84373de46548d9 100644 (file)
@@ -1,3 +1,4 @@
 1.Byte[] -> Uint8Array
 2.Static decode method in slot.js takes the table, uint8array and the secret key as the argument
-3.Vector<Entries> = array of entries []
\ No newline at end of file
+3.Vector<Entries> = array of entries []
+4.A Byte in a 'number' in javascript
\ No newline at end of file
diff --git a/src/js/iotjs/orig/lastmessage.js b/src/js/iotjs/orig/lastmessage.js
new file mode 100644 (file)
index 0000000..c1f3de0
--- /dev/null
@@ -0,0 +1,39 @@
+class LastMessage extends Entry{
+       constructor(slot,_machineid,_seqnum){
+               super(slot);
+               this.machineid = _machineid;
+               this.seqnum = _seqnum;
+       }
+       getMachineID(){
+               return this.machineid;
+       }
+       getSequenceNumber() {
+               return this.seqnum;
+       }
+       decode(slot,bb){
+               //slot and bb are instancesof Slot and ByteBuffer
+               if(!(slot instanceof Slot && bb instanceof ByteBuffer)){
+                       throw new Error('Problem with the Arguments');
+               }
+               var machineid = bb.readByte();
+               var seqnum = bb.readByte();
+               return new LastMessage(slot,machineid,seqnum);
+       }
+       encode(bb){
+               bb.writeByte(Entry.TypeLastMessage);
+               bb.writeByte(this.machineid);
+               bb.writeByte(this.seqnum);
+       }
+       getSize(){
+               return 2*(1+1);
+       }
+       getType(){
+               return Entry.TypeLastMessage;
+       }
+       getCopy(s){
+               if(!(s instanceof Slot)){
+                       throw new Error('Argument must be a slot object');
+               }
+               return new LastMessage(s,this.machineid,this.seqnum);
+       }
+}
\ No newline at end of file
diff --git a/src/js/iotjs/orig/slotbuffer.js b/src/js/iotjs/orig/slotbuffer.js
new file mode 100644 (file)
index 0000000..1e76971
--- /dev/null
@@ -0,0 +1,89 @@
+class SlotBuffer{
+       constructor(){
+               this.DEFAULT_SIZE = 128;
+               this.array = [];
+               this.head=0;
+               this.tail=0;
+               this.oldestseqn = 0;
+       }
+       size(){
+               if(this.head>=this.tail){
+                       return this.head-this.tail;
+               }
+               return (this.array.length + this.head - this.tail);
+       }
+       capacity(){
+               return this.array.length-1;
+       }
+       resize(newsize){
+               if(newsize === (this.array.length-1)){
+                       return;
+               }
+               var newarray = [];
+               var currsize = this.size();
+               var index = this.tail;
+               for(let i = 0 ; i<currsize ; i++){
+                       newarray[i]=this.array[index];
+                       if((++index) === this.array.length){
+                               index = 0;
+                       }
+                       this.array = newarray;
+                       this.tail=0;
+                       this.head=currsize; 
+               }
+       }
+       incrementHead(){
+               this.head++;
+               if(this.head >= this.array.length){
+                       this.head=0;
+               }
+       }
+       incrementTail(){
+               this.tail++;
+               if(this.tail >= this.array.length){
+                       this.tail=0;
+               }
+       }
+       putSlot(s){
+               if(!(s instanceof Slot)){
+                       throw new Error("Error with arguments. Argument should be a slot object");
+               }
+               this.array[this.head]=s;
+               this.incrementHead();
+
+               if(this.oldestseqn ===0){
+                       this.oldestseqn = s.getSequenceNumber();
+               }
+
+               if(this.head === this.tail){
+                       this.incrementTail();
+                       this.oldestseqn++;
+               }
+       }
+       getSlot(seqnum){
+               var diff = (seqnum - this.oldestseqn);
+               var index = diff + this.tail;
+               if(index >= this.array.length){
+                       if(this.head >= this.tail){
+                               return null;
+                       }
+                       index = index - this.array.length; 
+               }
+               if(index >= this.array.length){
+                       return null;
+               }
+
+               if(this.head >= this.tail && index >= this.head){
+                       return null;
+               }
+
+               return this.array[index];
+       }
+
+       getOldestSeqNum(){
+               return this.oldestseqn;
+       }
+       getNewestSeqNum(){
+               return this.oldestseqn + this.size() -1
+       }
+}
\ No newline at end of file
diff --git a/src/js/iotjs/orig/slotindexer.js b/src/js/iotjs/orig/slotindexer.js
new file mode 100644 (file)
index 0000000..da738ff
--- /dev/null
@@ -0,0 +1,27 @@
+class SlotIndexer{
+       constructor(_updates,_buffer){
+               // updates is an array of slot objects
+               // buffer is an instanceof slotbuffer constructor object in slotbuffer.js
+               this.updates = _updates;
+               if(_buffer && _buffer instanceof SlotBuffer){
+                       this.buffer = _buffer;
+               }else{
+                       throw new Error("Argument error Buffer should be an instance of SlotBuffer");
+               }
+               this.firstslotseqnum = this.updates[0].getSequenceNumber();     
+       }
+
+       getSlot(seqnum){
+               if(seqnum >= this.firstslotseqnum){
+                       var offset = seqnum - this.firstslotseqnum;
+                       if(offset >= this.updates.length){
+                               throw new Error('Invalid Slot Sequence Number Reference');
+                       }else{
+                               return this.updates[offset];
+                       }
+               }else{
+                       return this.buffer.getSlot(seqnum);
+               }
+       }
+
+}
\ No newline at end of file
diff --git a/src/js/iotjs/orig/tablestatus.js b/src/js/iotjs/orig/tablestatus.js
new file mode 100644 (file)
index 0000000..06f8f25
--- /dev/null
@@ -0,0 +1,34 @@
+class TableStatus extends Entry{
+       constructor(slot,_maxslots){
+               super(slot);
+               this.maxslots = _maxslots;
+       }
+       getMaxSlots(){
+               return this.maxslots;
+       }
+       static decode(slot,bb){
+               //bb is an object of the type bytebuffer See main.js file and its require section 
+               //for more details
+               if(!(bb instanceof ByteBuffer && slot instanceof Slot)){
+                       throw new Error('Argument Error: bb is not an instanceof Bytebuffer');
+               }
+               this.maxslots = bb.readByte();
+               return new TableStatus(slot,this.maxslots);
+       }
+       encode(bb){
+               bb.writeByte(Entry.TypeTableStatus);
+               bb.writeInt8(this.maxslots);
+       }
+       getSize(){
+               return 4+1;
+       }
+       getType(){
+               return Entry.TypeTableStatus;
+       }
+       getcopy(s){
+               if(!(s instanceof Slot)){
+                       throw new Error('Argument Error: s is not an instanceof Slot');
+               }
+               return new TableStatus(s,this.maxslots);
+       }
+}
\ No newline at end of file
diff --git a/src/js/iotjs/src/lastmessage.js b/src/js/iotjs/src/lastmessage.js
new file mode 100644 (file)
index 0000000..8ccb06b
--- /dev/null
@@ -0,0 +1,73 @@
+'use strict';
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var LastMessage = function (_Entry) {
+       _inherits(LastMessage, _Entry);
+
+       function LastMessage(slot, _machineid, _seqnum) {
+               _classCallCheck(this, LastMessage);
+
+               var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(LastMessage).call(this, slot));
+
+               _this.machineid = _machineid;
+               _this.seqnum = _seqnum;
+               return _this;
+       }
+
+       _createClass(LastMessage, [{
+               key: 'getMachineID',
+               value: function getMachineID() {
+                       return this.machineid;
+               }
+       }, {
+               key: 'getSequenceNumber',
+               value: function getSequenceNumber() {
+                       return this.seqnum;
+               }
+       }, {
+               key: 'decode',
+               value: function decode(slot, bb) {
+                       //slot and bb are instancesof Slot and ByteBuffer
+                       if (!(slot instanceof Slot && bb instanceof ByteBuffer)) {
+                               throw new Error('Problem with the Arguments');
+                       }
+                       var machineid = bb.readByte();
+                       var seqnum = bb.readByte();
+                       return new LastMessage(slot, machineid, seqnum);
+               }
+       }, {
+               key: 'encode',
+               value: function encode(bb) {
+                       bb.writeByte(Entry.TypeLastMessage);
+                       bb.writeByte(this.machineid);
+                       bb.writeByte(this.seqnum);
+               }
+       }, {
+               key: 'getSize',
+               value: function getSize() {
+                       return 2 * (1 + 1);
+               }
+       }, {
+               key: 'getType',
+               value: function getType() {
+                       return Entry.TypeLastMessage;
+               }
+       }, {
+               key: 'getCopy',
+               value: function getCopy(s) {
+                       if (!(s instanceof Slot)) {
+                               throw new Error('Argument must be a slot object');
+                       }
+                       return new LastMessage(s, this.machineid, this.seqnum);
+               }
+       }]);
+
+       return LastMessage;
+}(Entry);
\ No newline at end of file
diff --git a/src/js/iotjs/src/slotbuffer.js b/src/js/iotjs/src/slotbuffer.js
new file mode 100644 (file)
index 0000000..9704852
--- /dev/null
@@ -0,0 +1,118 @@
+"use strict";
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var SlotBuffer = function () {
+       function SlotBuffer() {
+               _classCallCheck(this, SlotBuffer);
+
+               this.DEFAULT_SIZE = 128;
+               this.array = [];
+               this.head = 0;
+               this.tail = 0;
+               this.oldestseqn = 0;
+       }
+
+       _createClass(SlotBuffer, [{
+               key: "size",
+               value: function size() {
+                       if (this.head >= this.tail) {
+                               return this.head - this.tail;
+                       }
+                       return this.array.length + this.head - this.tail;
+               }
+       }, {
+               key: "capacity",
+               value: function capacity() {
+                       return this.array.length - 1;
+               }
+       }, {
+               key: "resize",
+               value: function resize(newsize) {
+                       if (newsize === this.array.length - 1) {
+                               return;
+                       }
+                       var newarray = [];
+                       var currsize = this.size();
+                       var index = this.tail;
+                       for (var i = 0; i < currsize; i++) {
+                               newarray[i] = this.array[index];
+                               if (++index === this.array.length) {
+                                       index = 0;
+                               }
+                               this.array = newarray;
+                               this.tail = 0;
+                               this.head = currsize;
+                       }
+               }
+       }, {
+               key: "incrementHead",
+               value: function incrementHead() {
+                       this.head++;
+                       if (this.head >= this.array.length) {
+                               this.head = 0;
+                       }
+               }
+       }, {
+               key: "incrementTail",
+               value: function incrementTail() {
+                       this.tail++;
+                       if (this.tail >= this.array.length) {
+                               this.tail = 0;
+                       }
+               }
+       }, {
+               key: "putSlot",
+               value: function putSlot(s) {
+                       if (!(s instanceof Slot)) {
+                               throw new Error("Error with arguments. Argument should be a slot object");
+                       }
+                       this.array[this.head] = s;
+                       this.incrementHead();
+
+                       if (this.oldestseqn === 0) {
+                               this.oldestseqn = s.getSequenceNumber();
+                       }
+
+                       if (this.head === this.tail) {
+                               this.incrementTail();
+                               this.oldestseqn++;
+                       }
+               }
+       }, {
+               key: "getSlot",
+               value: function getSlot(seqnum) {
+                       var diff = seqnum - this.oldestseqn;
+                       var index = diff + this.tail;
+                       if (index >= this.array.length) {
+                               if (this.head >= this.tail) {
+                                       return null;
+                               }
+                               index = index - this.array.length;
+                       }
+                       if (index >= this.array.length) {
+                               return null;
+                       }
+
+                       if (this.head >= this.tail && index >= this.head) {
+                               return null;
+                       }
+
+                       return this.array[index];
+               }
+       }, {
+               key: "getOldestSeqNum",
+               value: function getOldestSeqNum() {
+                       return this.oldestseqn;
+               }
+       }, {
+               key: "getNewestSeqNum",
+               value: function getNewestSeqNum() {
+                       return this.oldestseqn + this.size() - 1;
+               }
+       }]);
+
+       return SlotBuffer;
+}();
\ No newline at end of file
diff --git a/src/js/iotjs/src/slotindexer.js b/src/js/iotjs/src/slotindexer.js
new file mode 100644 (file)
index 0000000..66f4b4d
--- /dev/null
@@ -0,0 +1,39 @@
+"use strict";
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var SlotIndexer = function () {
+       function SlotIndexer(_updates, _buffer) {
+               _classCallCheck(this, SlotIndexer);
+
+               // updates is an array of slot objects
+               // buffer is an instanceof slotbuffer constructor object in slotbuffer.js
+               this.updates = _updates;
+               if (_buffer && _buffer instanceof SlotBuffer) {
+                       this.buffer = _buffer;
+               } else {
+                       throw new Error("Argument error Buffer should be an instance of SlotBuffer");
+               }
+               this.firstslotseqnum = this.updates[0].getSequenceNumber();
+       }
+
+       _createClass(SlotIndexer, [{
+               key: "getSlot",
+               value: function getSlot(seqnum) {
+                       if (seqnum >= this.firstslotseqnum) {
+                               var offset = seqnum - this.firstslotseqnum;
+                               if (offset >= this.updates.length) {
+                                       throw new Error('Invalid Slot Sequence Number Reference');
+                               } else {
+                                       return this.updates[offset];
+                               }
+                       } else {
+                               return this.buffer.getSlot(seqnum);
+                       }
+               }
+       }]);
+
+       return SlotIndexer;
+}();
\ No newline at end of file
diff --git a/src/js/iotjs/src/tablestatus.js b/src/js/iotjs/src/tablestatus.js
new file mode 100644 (file)
index 0000000..64c14fc
--- /dev/null
@@ -0,0 +1,66 @@
+'use strict';
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var TableStatus = function (_Entry) {
+       _inherits(TableStatus, _Entry);
+
+       function TableStatus(slot, _maxslots) {
+               _classCallCheck(this, TableStatus);
+
+               var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(TableStatus).call(this, slot));
+
+               _this.maxslots = _maxslots;
+               return _this;
+       }
+
+       _createClass(TableStatus, [{
+               key: 'getMaxSlots',
+               value: function getMaxSlots() {
+                       return this.maxslots;
+               }
+       }, {
+               key: 'encode',
+               value: function encode(bb) {
+                       bb.writeByte(Entry.TypeTableStatus);
+                       bb.writeInt8(this.maxslots);
+               }
+       }, {
+               key: 'getSize',
+               value: function getSize() {
+                       return 4 + 1;
+               }
+       }, {
+               key: 'getType',
+               value: function getType() {
+                       return Entry.TypeTableStatus;
+               }
+       }, {
+               key: 'getcopy',
+               value: function getcopy(s) {
+                       if (!(s instanceof Slot)) {
+                               throw new Error('Argument Error: s is not an instanceof Slot');
+                       }
+                       return new TableStatus(s, this.maxslots);
+               }
+       }], [{
+               key: 'decode',
+               value: function decode(slot, bb) {
+                       //bb is an object of the type bytebuffer See main.js file and its require section 
+                       //for more details
+                       if (!(bb instanceof ByteBuffer && slot instanceof Slot)) {
+                               throw new Error('Argument Error: bb is not an instanceof Bytebuffer');
+                       }
+                       this.maxslots = bb.readByte();
+                       return new TableStatus(slot, this.maxslots);
+               }
+       }]);
+
+       return TableStatus;
+}(Entry);
\ No newline at end of file