rework header encode/decode

This commit is contained in:
2025-03-15 08:24:03 -05:00
parent ea2358a315
commit 0ff78d03a4
6 changed files with 75 additions and 78 deletions
+13 -15
View File
@@ -12,37 +12,35 @@ export default (bytes: Uint8Array): RTTrPHeader => {
let isLittleEndian = false; let isLittleEndian = false;
const intHeader = view.getUint16(dataOffset, isLittleEndian); const intHeader = view.getUint16(dataOffset, isLittleEndian);
dataOffset += 2; dataOffset += 2;
const fltHeader = view.getUint16(dataOffset, isLittleEndian); const floatHeader = view.getUint16(dataOffset, isLittleEndian);
dataOffset += 2; dataOffset += 2;
if (intHeader === 0x4154) {
isLittleEndian = false;
}
const version = view.getUint16(dataOffset, isLittleEndian); const version = view.getUint16(dataOffset, isLittleEndian);
dataOffset += 2; dataOffset += 2;
if (version !== 0x0002) { if (version !== 0x0002) {
throw new Error('Only version 2 of the RTTrP header is currently supported'); throw new Error('Only version 2 of the RTTrP header is currently supported');
} }
const pID = view.getUint32(dataOffset, isLittleEndian); if (intHeader === 0x5441) {
isLittleEndian = true;
}
const packetID = view.getUint32(dataOffset, isLittleEndian);
dataOffset += 4; dataOffset += 4;
const pForm = view.getUint8(dataOffset); const packetFormat = view.getUint8(dataOffset);
dataOffset += 1; dataOffset += 1;
const pktSize = view.getUint16(dataOffset, isLittleEndian); const size = view.getUint16(dataOffset, isLittleEndian);
dataOffset += 2; dataOffset += 2;
const context = view.getUint32(dataOffset, isLittleEndian); const context = view.getUint32(dataOffset, isLittleEndian);
dataOffset += 4; dataOffset += 4;
const numMods = view.getUint8(dataOffset); const subModuleCount = view.getUint8(dataOffset);
dataOffset += 1; dataOffset += 1;
const data = bytes.slice(dataOffset);
return { return {
intHeader, intHeader,
fltHeader, floatHeader,
version, version,
pID, packetID,
pForm, packetFormat,
pktSize, size,
context, context,
numMods, subModuleCount,
data,
}; };
}; };
+45
View File
@@ -0,0 +1,45 @@
const HEADER_SIZE = 18;
export default (
floatSignature: number,
version: number,
packetID: number,
packetFormat: number,
context: number,
subModules: Uint8Array[],
isLittleEndian: boolean = false
): Uint8Array => {
if (version !== 2) {
throw new Error('Only version 2 of the RTTrP header is currently supported');
}
const bytes = new Uint8Array(HEADER_SIZE);
let totalPacketSize = bytes.byteLength;
subModules.forEach((subModule) => {
totalPacketSize += subModule.length;
});
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
let dataOffset = 0;
view.setUint16(dataOffset, 0x4154, isLittleEndian);
dataOffset += 2;
view.setUint16(dataOffset, floatSignature, isLittleEndian);
dataOffset += 2;
view.setUint16(dataOffset, version);
dataOffset += 2;
view.setUint32(dataOffset, packetID, isLittleEndian);
dataOffset += 4;
view.setUint8(dataOffset, packetFormat);
dataOffset += 1;
view.setUint16(dataOffset, totalPacketSize, isLittleEndian);
dataOffset += 2;
view.setUint32(dataOffset, context, isLittleEndian);
dataOffset += 4;
view.setUint8(dataOffset, subModules.length);
dataOffset += 1;
return bytes;
};
-37
View File
@@ -1,37 +0,0 @@
import { RTTrPHeader } from '../models';
export default (header: RTTrPHeader): Uint8Array => {
if (header.version !== 2) {
throw new Error('Only version 2 of the RTTrP header is currently supported');
}
const bytes = new Uint8Array(18 + header.data.length);
bytes.set(header.data, 18);
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
let dataOffset = 0;
let isLittleEndian = false;
view.setUint16(dataOffset, header.intHeader, isLittleEndian);
dataOffset += 2;
view.setUint16(dataOffset, header.fltHeader, isLittleEndian);
dataOffset += 2;
if (header.intHeader === 0x4154) {
isLittleEndian = false;
}
view.setUint16(dataOffset, header.version, isLittleEndian);
dataOffset += 2;
view.setUint32(dataOffset, header.pID, isLittleEndian);
dataOffset += 4;
view.setUint8(dataOffset, header.pForm);
dataOffset += 1;
view.setUint16(dataOffset, header.pktSize, isLittleEndian);
dataOffset += 2;
view.setUint32(dataOffset, header.context, isLittleEndian);
dataOffset += 4;
view.setUint8(dataOffset, header.numMods);
dataOffset += 1;
return bytes;
};
+7 -7
View File
@@ -1,11 +1,11 @@
export type RTTrPHeader = { export type RTTrPHeader = {
intHeader: number; intHeader?: number;
fltHeader: number; floatHeader: number;
version: number; version: number;
pID: number; packetID: number;
pForm: number; packetFormat: number;
pktSize: number; size: number;
context: number; context: number;
numMods: number; subModuleCount: number;
data: Uint8Array; };
}; };
+5 -6
View File
@@ -9,14 +9,13 @@ const goodTests = [
]), ]),
expected: { expected: {
intHeader: 0x4154, intHeader: 0x4154,
fltHeader: 0x4334, floatHeader: 0x4334,
version: 2, version: 2,
pID: 305419896, packetID: 305419896,
pForm: 0, packetFormat: 0,
pktSize: 18, size: 18,
context: 305419896, context: 305419896,
numMods: 0, subModuleCount: 0,
data: new Uint8Array(),
}, },
decoder: Decoders.RTTrPHeader, decoder: Decoders.RTTrPHeader,
}, },
+5 -13
View File
@@ -8,25 +8,17 @@ const goodTests = [
expected: new Uint8Array([ expected: new Uint8Array([
0x41, 0x54, 0x43, 0x34, 0x00, 0x02, 0x12, 0x34, 0x56, 0x78, 0x00, 0x00, 0x12, 0x12, 0x34, 0x56, 0x78, 0x00, 0x41, 0x54, 0x43, 0x34, 0x00, 0x02, 0x12, 0x34, 0x56, 0x78, 0x00, 0x00, 0x12, 0x12, 0x34, 0x56, 0x78, 0x00,
]), ]),
message: { bytes: () => {
intHeader: 0x4154, return Encoders.RTTrPHeader(0x4334, 2, 0x12345678, 0, 0x12345678, [], false);
fltHeader: 0x4334,
version: 2,
pID: 305419896,
pForm: 0,
pktSize: 18,
context: 305419896,
numMods: 0,
data: new Uint8Array(),
}, },
encoder: Encoders.RTTrPHeader, },
}, },
]; ];
describe('RTTrP Message Encoding', () => { describe('RTTrP Message Encoding', () => {
goodTests.forEach((messageTest) => { goodTests.forEach((messageTest) => {
it(messageTest.description, () => { it(messageTest.description, () => {
const actual = messageTest.encoder(messageTest.message); const actual = messageTest.bytes();
deepEqual(actual, messageTest.expected); deepEqual(actual, messageTest.expected);
}); });
}); });
@@ -38,7 +30,7 @@ const badTests = [];
describe('RTTrP Message Encoding Throws', () => { describe('RTTrP Message Encoding Throws', () => {
badTests.forEach((messageTest) => { badTests.forEach((messageTest) => {
it(messageTest.description, () => { it(messageTest.description, () => {
messageTest.encoder(messageTest.packet); messageTest.bytes();
throws(() => {}, messageTest.throwsMessage); throws(() => {}, messageTest.throwsMessage);
}); });
}); });