mirror of
https://github.com/jwetzell/rttrp-js.git
synced 2026-09-10 16:39:35 +00:00
rework header encode/decode
This commit is contained in:
+13
-15
@@ -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,
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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;
|
||||||
|
};
|
||||||
@@ -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
@@ -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;
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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
@@ -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);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user