wip: big refactor
This commit is contained in:
111
StreamManager.js
Normal file
111
StreamManager.js
Normal file
@@ -0,0 +1,111 @@
|
||||
import { bitsToInt } from "./converters";
|
||||
|
||||
const BITS = [];
|
||||
let BITS_PER_PACKET = 0;
|
||||
let SEGMENTS_PER_PACKET = 0;
|
||||
let BITS_PER_SEGMENT = 0;
|
||||
let STREAM_HEADERS = [];
|
||||
let SEGMENT_ENCODING = {
|
||||
encode: bits => bits,
|
||||
decode: bits => bits
|
||||
};
|
||||
let PACKET_ENCODING = {
|
||||
encode: bits => bits,
|
||||
decode: bits => bits
|
||||
}
|
||||
|
||||
export const changeConfiguration = ({
|
||||
segmentsPerPacket,
|
||||
bitsPerPacket,
|
||||
bitsPerSegment,
|
||||
streamHeaders
|
||||
}) => {
|
||||
BITS_PER_PACKET = bitsPerPacket;
|
||||
SEGMENTS_PER_PACKET = segmentsPerPacket;
|
||||
BITS_PER_SEGMENT = bitsPerSegment;
|
||||
STREAM_HEADERS = streamHeaders;
|
||||
}
|
||||
const noEncoding = bits => bits;
|
||||
export const setSegmentEncoding = ({ encode, decode } = {}) => {
|
||||
SEGMENT_ENCODING.encode = encode ?? noEncoding;
|
||||
SEGMENT_ENCODING.decode = decode ?? noEncoding;
|
||||
}
|
||||
export const setPacketEncoding = ({ encode, decode } = {}) => {
|
||||
PACKET_ENCODING.encode = encode ?? noEncoding;
|
||||
PACKET_ENCODING.decode = decode ?? noEncoding;
|
||||
}
|
||||
export const addBits = (
|
||||
packetIndex,
|
||||
segmentIndex,
|
||||
bits
|
||||
) => {
|
||||
if(BITS[packetIndex] === undefined) {
|
||||
BITS[packetIndex] = [];
|
||||
}
|
||||
BITS[packetIndex][segmentIndex] = bits;
|
||||
}
|
||||
export const getPacketReceivedCount = () => {
|
||||
if(BITS.length === 0) return 1;
|
||||
return BITS.length;
|
||||
}
|
||||
export const getStreamBits = () => {
|
||||
const bits = [];
|
||||
const packetCount = getPacketReceivedCount();
|
||||
for(let packetIndex = 0; packetIndex < packetCount; packetIndex++) {
|
||||
const packet = BITS[packetIndex] ?? [];
|
||||
for(let segmentIndex = 0; segmentIndex < SEGMENTS_PER_PACKET; segmentIndex++) {
|
||||
let segment = packet[segmentIndex] ?? [];
|
||||
for(let bitIndex = 0; bitIndex < BITS_PER_SEGMENT; bitIndex++) {
|
||||
const bit = segment[bitIndex];
|
||||
bits.push(bit ?? 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
return bits;
|
||||
}
|
||||
export const getPacketSegmentBits = (packetIndex, segmentIndex) => BITS[packetIndex]?.[segmentIndex];
|
||||
export const getAllPacketBits = () => {
|
||||
const packetCount = getPacketReceivedCount();
|
||||
const bits = [];
|
||||
for(let packetIndex = 0; packetIndex < packetCount; packetIndex++) {
|
||||
bits.push(...getPacketBits(packetIndex));
|
||||
}
|
||||
return bits;
|
||||
}
|
||||
export const getPacketBits = (packetIndex, defaultBit = 0) => {
|
||||
const bits = [];
|
||||
const packet = BITS[packetIndex] ?? [];
|
||||
for(let segmentIndex = 0; segmentIndex < SEGMENTS_PER_PACKET; segmentIndex++) {
|
||||
let segment = packet[segmentIndex] ?? [];
|
||||
segment = SEGMENT_ENCODING.decode(segment);
|
||||
for(let bitIndex = 0; bitIndex < BITS_PER_SEGMENT; bitIndex++) {
|
||||
const bit = segment[bitIndex];
|
||||
bits.push(bit ?? defaultBit);
|
||||
if(bits.length === BITS_PER_PACKET) return bits;
|
||||
}
|
||||
}
|
||||
while(bits.length < BITS_PER_PACKET) bits.push(defaultBit);
|
||||
return bits;
|
||||
}
|
||||
export const getPacketBitsDecoded = (packetIndex, defaultBit = 0) => {
|
||||
const bits = getPacketBits(packetIndex, defaultBit);
|
||||
return PACKET_ENCODING.decode(bits);
|
||||
}
|
||||
const getStreamHeaderBits = name => {
|
||||
const header = STREAM_HEADERS[name];
|
||||
if(!header) return [];
|
||||
const { index, length } = header;
|
||||
const packetCount = getPacketReceivedCount();
|
||||
const bits = [];
|
||||
for(let packetIndex = 0; packetIndex < packetCount; packetIndex++) {
|
||||
bits.push(...getPacketBitsDecoded(packetIndex, 1));
|
||||
if(bits.length >= index + length) break;
|
||||
}
|
||||
return bits.slice(index, index + length);
|
||||
}
|
||||
export const getTransferByteCount = () => {
|
||||
const name = 'transfer byte count';
|
||||
const length = STREAM_HEADERS[name].length;
|
||||
const bits = getStreamHeaderBits(name);
|
||||
return bitsToInt(bits, length);
|
||||
}
|
||||
Reference in New Issue
Block a user