fix crc check not being available
This commit is contained in:
@@ -11,7 +11,8 @@ const dispatcher = new Dispatcher('StreamManager', [
|
|||||||
'change',
|
'change',
|
||||||
'packetReceived',
|
'packetReceived',
|
||||||
'packetFailed',
|
'packetFailed',
|
||||||
'sizeReceived'
|
'sizeReceived',
|
||||||
|
'crcAvailable'
|
||||||
]);
|
]);
|
||||||
let DATA = new Uint8ClampedArray();
|
let DATA = new Uint8ClampedArray();
|
||||||
let FAILED_SEQUENCES = [];
|
let FAILED_SEQUENCES = [];
|
||||||
@@ -85,8 +86,8 @@ export const applyPacket = ({
|
|||||||
size
|
size
|
||||||
}) => {
|
}) => {
|
||||||
let trustedSize = isSizeTrusted();
|
let trustedSize = isSizeTrusted();
|
||||||
|
let crcAvailable = getCrcAvailable();
|
||||||
if(!isPacketInRange(sequence)) return;
|
if(!isPacketInRange(sequence)) return;
|
||||||
|
|
||||||
const dataSize = PacketUtils.getPacketDataByteCount();
|
const dataSize = PacketUtils.getPacketDataByteCount();
|
||||||
const offset = sequence * dataSize;
|
const offset = sequence * dataSize;
|
||||||
const length = offset + dataSize;
|
const length = offset + dataSize;
|
||||||
@@ -102,14 +103,27 @@ export const applyPacket = ({
|
|||||||
copy.set(DATA.subarray(0, DATA.length), 0);
|
copy.set(DATA.subarray(0, DATA.length), 0);
|
||||||
DATA = copy;
|
DATA = copy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NOTE: overwrites prior successful packets
|
||||||
DATA.set(bytes, offset);
|
DATA.set(bytes, offset);
|
||||||
|
|
||||||
if(!trustedSize && isSizeTrusted()) {
|
if(!trustedSize && isSizeTrusted()) {
|
||||||
|
const dataSize = getSize();
|
||||||
|
const headerSize = getStreamHeaderByteCount();
|
||||||
|
const totalLength = dataSize + headerSize;
|
||||||
// We may now have a trusted size. update prior failures.
|
// We may now have a trusted size. update prior failures.
|
||||||
FAILED_SEQUENCES = FAILED_SEQUENCES.filter(isPacketInRange);
|
FAILED_SEQUENCES = FAILED_SEQUENCES.filter(isPacketInRange);
|
||||||
|
// Prior failed packets may have made our array to big
|
||||||
|
if(DATA.length > totalLength) {
|
||||||
|
const copy = new Uint8ClampedArray(totalLength);
|
||||||
|
copy.set(DATA.subarray(0, totalLength), 0);
|
||||||
|
DATA = copy;
|
||||||
|
}
|
||||||
dispatcher.emit('sizeReceived');
|
dispatcher.emit('sizeReceived');
|
||||||
}
|
}
|
||||||
|
if(!crcAvailable && getCrcAvailable()) {
|
||||||
|
dispatcher.emit('crcAvailable');
|
||||||
|
}
|
||||||
dispatcher.emit('packetReceived');
|
dispatcher.emit('packetReceived');
|
||||||
} else {
|
} else {
|
||||||
// do nothing if previously successful
|
// do nothing if previously successful
|
||||||
@@ -130,7 +144,7 @@ export const getNeededPacketIndeces = () => {
|
|||||||
let packetCount;
|
let packetCount;
|
||||||
let sizeTrusted = isSizeTrusted();
|
let sizeTrusted = isSizeTrusted();
|
||||||
if(!sizeTrusted) {
|
if(!sizeTrusted) {
|
||||||
packetCount = getFailedPacketIndeces().reduce((max, i) => Math.max(max, i));
|
packetCount = getFailedPacketIndeces().reduce((max, i) => Math.max(max, i), 0);
|
||||||
} else {
|
} else {
|
||||||
packetCount = countExpectedPackets();
|
packetCount = countExpectedPackets();
|
||||||
}
|
}
|
||||||
@@ -169,10 +183,10 @@ export const setPacketsExpected = packetCount => {
|
|||||||
|
|
||||||
const hasPackets = (start, end) => {
|
const hasPackets = (start, end) => {
|
||||||
for(let packetIndex = start; packetIndex <= end; packetIndex++) {
|
for(let packetIndex = start; packetIndex <= end; packetIndex++) {
|
||||||
// We need this packet, but it failed to transfer
|
|
||||||
if(FAILED_SEQUENCES.includes(packetIndex)) return false;
|
|
||||||
// We need this packet, but it hasn't come through yet
|
// We need this packet, but it hasn't come through yet
|
||||||
if(!SUCCESS_SEQUENCES.includes(packetIndex)) return false;
|
if(!SUCCESS_SEQUENCES.includes(packetIndex)) return false;
|
||||||
|
// We need this packet, but it failed to transfer
|
||||||
|
if(FAILED_SEQUENCES.includes(packetIndex)) return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -180,7 +194,7 @@ const hasBytes = (index, length) => {
|
|||||||
if(DATA.length < index + length) return false;
|
if(DATA.length < index + length) return false;
|
||||||
const packetSize = PacketUtils.getPacketDataByteCount();
|
const packetSize = PacketUtils.getPacketDataByteCount();
|
||||||
const start = Math.floor(index / packetSize);
|
const start = Math.floor(index / packetSize);
|
||||||
const end = Math.floor(index + length / packetSize);
|
const end = Math.floor((index + --length) / packetSize);
|
||||||
return hasPackets(start, end);
|
return hasPackets(start, end);
|
||||||
}
|
}
|
||||||
export const getSizeAvailable = () => {
|
export const getSizeAvailable = () => {
|
||||||
@@ -228,13 +242,12 @@ export const getSizeCrc = () => {
|
|||||||
|
|
||||||
let startBitIndex = DATA_SIZE_BIT_COUNT;
|
let startBitIndex = DATA_SIZE_BIT_COUNT;
|
||||||
let endBitIndex = startBitIndex + DATA_SIZE_CRC_BIT_COUNT;
|
let endBitIndex = startBitIndex + DATA_SIZE_CRC_BIT_COUNT;
|
||||||
|
|
||||||
let startByte = Math.floor(startBitIndex / 8);
|
let startByte = Math.floor(startBitIndex / 8);
|
||||||
let endByte = Math.ceil(endBitIndex / 8);
|
let endByte = Math.ceil(endBitIndex / 8);
|
||||||
if(DATA.length < endByte) return CRC.INVALID;
|
if(DATA.length < endByte) return CRC.INVALID;
|
||||||
|
|
||||||
let bits = bytesToBits(DATA.subarray(startByte, endByte));
|
let bits = bytesToBits(DATA.subarray(startByte, endByte));
|
||||||
if(startBitIndex % 8 !== 0) bits.splice(0, startBitIndex);
|
if(startBitIndex % 8 !== 0) bits.splice(0, startBitIndex % 8);
|
||||||
bits.length = DATA_SIZE_CRC_BIT_COUNT;
|
bits.length = DATA_SIZE_CRC_BIT_COUNT;
|
||||||
return bitsToInt(bits, DATA_SIZE_CRC_BIT_COUNT);
|
return bitsToInt(bits, DATA_SIZE_CRC_BIT_COUNT);
|
||||||
}
|
}
|
||||||
@@ -249,7 +262,7 @@ export const getCrc = () => {
|
|||||||
if(DATA.length < endByte) return CRC.INVALID;
|
if(DATA.length < endByte) return CRC.INVALID;
|
||||||
|
|
||||||
let bits = bytesToBits(DATA.subarray(startByte, endByte));
|
let bits = bytesToBits(DATA.subarray(startByte, endByte));
|
||||||
if(startBitIndex % 8 !== 0) bits.splice(0, startBitIndex);
|
if(startBitIndex % 8 !== 0) bits.splice(0, startBitIndex % 8);
|
||||||
bits.length = DATA_CRC_BIT_COUNT;
|
bits.length = DATA_CRC_BIT_COUNT;
|
||||||
return bitsToInt(bits, DATA_CRC_BIT_COUNT);
|
return bitsToInt(bits, DATA_CRC_BIT_COUNT);
|
||||||
}
|
}
|
||||||
@@ -272,7 +285,7 @@ export const getCrcAvailable = () => {
|
|||||||
const headerByteCount = headerBitCount / 8;
|
const headerByteCount = headerBitCount / 8;
|
||||||
byteCount += headerByteCount;
|
byteCount += headerByteCount;
|
||||||
|
|
||||||
return hasBytes(0, byteCount);
|
return hasBytes(0, byteCount); // 487 + 5 = 492
|
||||||
}
|
}
|
||||||
export const getSizeCrcPassed = () => {
|
export const getSizeCrcPassed = () => {
|
||||||
if(!getSizeCrcAvailable()) return false;
|
if(!getSizeCrcAvailable()) return false;
|
||||||
|
|||||||
@@ -1,8 +1,13 @@
|
|||||||
export const numberToBytes = (number, bitLength) => {
|
export const numberToBytes = (number, bitLength) => {
|
||||||
const byteCount = Math.ceil(bitLength/8);
|
|
||||||
const bytes = [];
|
const bytes = [];
|
||||||
for(let i = 0; i < byteCount; i++) {
|
let byte = 0;
|
||||||
bytes.push((number >> (8 * (byteCount - 1 - i))) & 0xFF);
|
for(let i = 0; i < bitLength; i++) {
|
||||||
|
let bit = (number >> (bitLength - 1 - i)) & 1;
|
||||||
|
byte = (byte << 1) | bit;
|
||||||
|
if((i + 1) % 8 === 0 || i === bitLength - 1) {
|
||||||
|
bytes.push(byte);
|
||||||
|
byte = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return bytes;
|
return bytes;
|
||||||
}
|
}
|
||||||
|
|||||||
3
index.js
3
index.js
@@ -223,6 +223,9 @@ function handleWindowLoad() {
|
|||||||
StreamManager.addEventListener('sizeReceived', () => {
|
StreamManager.addEventListener('sizeReceived', () => {
|
||||||
receivePanel.setExpectedPacketCount(StreamManager.countExpectedPackets());
|
receivePanel.setExpectedPacketCount(StreamManager.countExpectedPackets());
|
||||||
});
|
});
|
||||||
|
StreamManager.addEventListener('crcAvailable', () => {
|
||||||
|
packetErrorPanel.setCrcPassed(StreamManager.getCrcPassed());
|
||||||
|
});
|
||||||
StreamManager.addEventListener('packetFailed', () => {
|
StreamManager.addEventListener('packetFailed', () => {
|
||||||
receivePanel.setFailedPacketCount(StreamManager.countFailedPackets());
|
receivePanel.setFailedPacketCount(StreamManager.countFailedPackets());
|
||||||
packetErrorPanel.setFailedPacketIndeces(StreamManager.getFailedPacketIndeces());
|
packetErrorPanel.setFailedPacketIndeces(StreamManager.getFailedPacketIndeces());
|
||||||
|
|||||||
Reference in New Issue
Block a user