Skip to content

Commit

Permalink
clean up
Browse files Browse the repository at this point in the history
Nguyen Quoc Dinh committed Jun 15, 2014
1 parent 55c4658 commit af957a0
Showing 3 changed files with 73 additions and 62 deletions.
107 changes: 61 additions & 46 deletions lib/server.js
Original file line number Diff line number Diff line change
@@ -62,6 +62,8 @@ function CoAPServer(options, listener) {
}
})



if (listener)
this.on('request', listener)
}
@@ -169,18 +171,14 @@ CoAPServer.prototype._handle = function(packet, rsinfo) {

response._request = request

// if this kindof request answser is cached
// todo, how to make cache
if (cachedPayload) {
console.log('went to send directly')
response.end(cachedPayload);
}
// else, when this request got a buffered blockwise already
// dont bother uper layer
else {
console.log('get from uper layer')
this.emit('request', request, response)
}
// todo:
// should use mem cache to buffer responses
// dont alway bother uper layer, especially when the return is in blockwise (2)
// if (cachedPayload)
// response.end(cachedPayload);
// else
// this.emit('request', request, response)
this.emit('request', request, response)
}

function toKey(address, port, packet, appendToken) {
@@ -192,30 +190,25 @@ function toKey(address, port, packet, appendToken) {
return result
}

// new out message
// inherit from OutgoingMessage
// to handle cached answer and blockwise (2)
/*
new out message
inherit from OutgoingMessage
to handle cached answer and blockwise (2)
*/
function OutMessage() {
OutgoingMessage.apply(this, Array.prototype.slice.call(arguments));
}
util.inherits(OutMessage, OutgoingMessage)

var maxBlock2 = 1024 //16, 32, 64, must <= 2**(6+4)
var totalBlock
var isLastBlock

// todo: define a new cached buffer
var cachedPayload

OutMessage.prototype.end= function(payload) {
var that = this
var requestedBlockOption = _parseBlock2(that._request.options)

// todo: new cached buffer
cachedPayload = payload

// if payload is suitable for ONE message, shoot it out
if ((!requestedBlockOption) && (payload.length < maxBlock2))
if (!payload ||
((!requestedBlockOption) && (payload.length < maxBlock2)))
return OutgoingMessage.prototype.end.call(this, payload)

// for the first request, block2 option may be missed
@@ -225,39 +218,26 @@ OutMessage.prototype.end= function(payload) {
num: 0
}

// block2 size should not bigger maxBlock2
// block2 size should not bigger than maxBlock2
if (requestedBlockOption.size > maxBlock2)
requestedBlockOption.size = maxBlock2


// otherwise, utilize blockwise (block2)

// block number should have limit
totalBlock = Math.ceil(payload.length/requestedBlockOption.size)
// 0 base counter for totalBlock, hence use floor (vs ceil)
var totalBlock = Math.floor(payload.length/requestedBlockOption.size)
var isLastBlock
if (requestedBlockOption.num < totalBlock)
isLastBlock = false
else if (requestedBlockOption.num = totalBlock)
else if (requestedBlockOption.num == totalBlock)
isLastBlock = true
else
throw new Error("nono, release 400 msg")

console.log('--------------------------')
console.log('req block2 ', requestedBlockOption)
// console.log(requestedBlockOption)
return that._sendError(new Buffer('Out of range representation'), rsinfo)

var block2 = _createBlock(requestedBlockOption, isLastBlock)
console.log('return block2 = ', block2)
this._packet = _packetSetBlock2(this._packet, block2)
// that._packet.setOption('Block2', block2)
// that._packet.setOption('ETag', '123456')

// console.log('that _packet')
// console.log(that._packet)
// console.log('--------------this')
// console.log(that)
_packetSetOption(this._packet, 'Block2', block2)
_packetSetOption(this._packet, 'ETag', _toETag(payload))

OutgoingMessage.prototype.end.call(this, payload.slice((requestedBlockOption.num)*requestedBlockOption.size, (requestedBlockOption.num+1)*requestedBlockOption.size))
// OutgoingMessage.prototype.end.call(this, a, b);
};

function _parseBlock2(options) {
@@ -295,7 +275,6 @@ function _parseBlock2(options) {
function _createBlock(requestedBlock, isLastBlock) {
var byte
var szx = Math.log(requestedBlock.size)/Math.log(2) - 4
console.log(isLastBlock)
var m = ((isLastBlock==true)?0:1)
var num = requestedBlock.num
var extraNum
@@ -343,4 +322,40 @@ function _packetSetBlock2(packet, block2) {
return packet
}

function _packetSetOption(packet, name, value) {
var hasOpt = false;
for (i in packet.options) {
if (packet.options[i] && packet.options[i].name == name) {
packet.options[i].value = value
hasOpt = true;
}
}
if (!hasOpt) {
packet.options.push({
name: name,
value: value
})
}
return packet
}

/*
calculate id of a payload by xor each 2-byte-block from it
use to generate etag
payload an input buffer, represent payload need to generate id (hash)
id return var, is a buffer(2)
*/
function _toETag(payload) {
var id = 0
var i = 0
do {
id = payload.slice(i,i+2).readUInt16BE(0) ^ id
i += 2
} while (i<payload.length)

var idBuf = new Buffer(2)
idBuf.writeUInt16BE(id, 0)
return idBuf
}

module.exports = CoAPServer
8 changes: 2 additions & 6 deletions nqd/test-block2-2.js
Original file line number Diff line number Diff line change
@@ -11,11 +11,7 @@

const coap = require('./..')
, server = coap.createServer()
, payload = new Buffer(10)

var maxBlock2 = 1024 //16, 32, 64, must <= 2**(6+4)
var totalBlock
var isLastBlock
, payload = new Buffer(1000)

// server
// plays split up for blockwise
@@ -28,7 +24,7 @@ server.on('request', function(req, res) {
server.listen(function() {
var req = coap.request('coap://localhost/Matteo')
// test early negotiation
req.setOption('Block2', new Buffer([0x0])) // block size of 1024
// req.setOption('Block2', new Buffer([0x0])) // block size of 1024
// test later negotiation (?)
req.on('response', function(res) {
console.log('result: ', res.payload.toString() == payload.toString())
20 changes: 10 additions & 10 deletions test/server.js
Original file line number Diff line number Diff line change
@@ -181,16 +181,16 @@ describe('server', function() {
})
})

it('should have res emitting an error if the message is too big', function(done) {
send(generate())
server.on('request', function(req, res) {
res.on('error', function() {
done()
})

res.end(new Buffer(1280))
})
})
// it('should have res emitting an error if the message is too big', function(done) {
// send(generate())
// server.on('request', function(req, res) {
// res.on('error', function() {
// done()
// })

// res.end(new Buffer(1280))
// })
// })

it('should expose the options', function(done) {
var options = [{

0 comments on commit af957a0

Please sign in to comment.