Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | 1x 1x 1x 9x 2x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 1x 8x 8x 1x 1x 1x 1x 1x 2x 1x 2x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 3x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x | 'use strict'
/*
* Copyright (c) 2013-2021 node-coap contributors.
*
* node-coap is licensed under an MIT +no-false-attribs license.
* All rights not explicitly granted in the MIT license are reserved.
* See the included LICENSE file for more details.
*/
var generate = require('coap-packet').generate
, generateBlockOption = require('./block').generateBlockOption
, exponentToByteSize = require('./block').exponentToByteSize
function SegmentedTransmission(blockSize, req, packet) {
if(blockSize < 0 || blockSize > 6) {
throw new Error("invalid block size " + blockSize)
}
this.blockState = {
sequenceNumber: 0,
moreBlocks: false,
blockSize: 0
}
this.setBlockSizeExp(blockSize)
this.totalLength = packet.payload.length
this.currentByte = 0
this.lastByte = 0
this.req = req
this.payload = packet.payload
this.packet = packet
this.packet.payload = null
this.resendCount = 0
}
SegmentedTransmission.prototype.setBlockSizeExp = function setBlockSizeExp(blockSizeExp) {
this.blockState.blockSize = blockSizeExp
this.byteSize = exponentToByteSize(blockSizeExp)
}
SegmentedTransmission.prototype.updateBlockState = function updateBlockState() {
this.blockState.sequenceNumber = this.currentByte / this.byteSize
this.blockState.moreBlocks = ((this.currentByte + this.byteSize) < this.totalLength)?1:0
this.req.setOption("Block1", generateBlockOption(this.blockState))
}
SegmentedTransmission.prototype.isCorrectACK = function isCorrectACK(packet, retBlockState) {
return retBlockState.sequenceNumber == this.blockState.sequenceNumber// && packet.code == "2.31"
}
SegmentedTransmission.prototype.resendPreviousPacket = function resendPreviousPacket() {
if(this.resendCount < 5) {
this.currentByte = this.lastByte
Iif(this.remaining() > 0) {
this.sendNext()
}
this.resendCount++
} else {
throw new Error("Too many block re-transfers")
}
}
/**
*
* @param {Packet} packet The packet received which contained the ack
* @param {Object} retBlockState The received block state from the other end
* @returns {Boolean} Returns true if the ACK was for the correct block.
*/
SegmentedTransmission.prototype.receiveACK = function receiveACK(packet, retBlockState) {
Iif(this.blockState.blockSize !== retBlockState.blockSize) {
this.setBlockSizeExp(retBlockState.blockSize)
}
Eif(this.remaining() > 0) {
this.sendNext()
}
this.resendCount = 0
}
SegmentedTransmission.prototype.remaining = function remaining() {
return this.totalLength - this.currentByte
}
SegmentedTransmission.prototype.sendNext = function sendNext() {
var blockLength = Math.min(this.totalLength - this.currentByte, this.byteSize)
var subBuffer = this.payload.slice(this.currentByte, this.currentByte + blockLength)
this.updateBlockState()
this.packet.ack = false
this.packet.reset = false
this.packet.confirmable = true
this.packet.payload = subBuffer
this.lastByte = this.currentByte
this.currentByte += blockLength
var buf
try {
buf = generate(this.packet)
} catch(err) {
this.req.sender.reset()
return this.req.emit('error', err)
}
this.req.sender.send(buf, !this.packet.confirmable)
}
module.exports.SegmentedTransmission = SegmentedTransmission
|