From: tkwa Date: Wed, 3 Aug 2016 00:04:49 +0000 (-0700) Subject: Merge branch 'master' of ssh://plrg.eecs.uci.edu/home/git/iotcloud X-Git-Url: http://plrg.eecs.uci.edu/git/?p=iotcloud.git;a=commitdiff_plain;h=57bef37be560162b6782927457d7bfbf34836ca8;hp=f40df7bf3734c9d10f9e102193a7818f526aeca0 Merge branch 'master' of ssh://plrg.eecs.uci.edu/home/git/iotcloud --- diff --git a/src/js/iotjs/README.md b/src/js/iotjs/README.md index 2e6e0a1..a384bd9 100644 --- a/src/js/iotjs/README.md +++ b/src/js/iotjs/README.md @@ -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 -------------------------------------- diff --git a/src/js/iotjs/orig/compat.txt b/src/js/iotjs/orig/compat.txt index af5aedf..a5d98b9 100644 --- a/src/js/iotjs/orig/compat.txt +++ b/src/js/iotjs/orig/compat.txt @@ -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 = array of entries [] \ No newline at end of file +3.Vector = 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 index 0000000..c1f3de0 --- /dev/null +++ b/src/js/iotjs/orig/lastmessage.js @@ -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 index 0000000..1e76971 --- /dev/null +++ b/src/js/iotjs/orig/slotbuffer.js @@ -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= 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 index 0000000..da738ff --- /dev/null +++ b/src/js/iotjs/orig/slotindexer.js @@ -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 index 0000000..06f8f25 --- /dev/null +++ b/src/js/iotjs/orig/tablestatus.js @@ -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 index 0000000..8ccb06b --- /dev/null +++ b/src/js/iotjs/src/lastmessage.js @@ -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 index 0000000..9704852 --- /dev/null +++ b/src/js/iotjs/src/slotbuffer.js @@ -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 index 0000000..66f4b4d --- /dev/null +++ b/src/js/iotjs/src/slotindexer.js @@ -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 index 0000000..64c14fc --- /dev/null +++ b/src/js/iotjs/src/tablestatus.js @@ -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