initial commit

This commit is contained in:
2025-03-11 19:42:33 -05:00
commit ea2358a315
27 changed files with 432 additions and 0 deletions
+5
View File
@@ -0,0 +1,5 @@
import RTTrPHeader from './rttrp';
export const Decoders = {
RTTrPHeader,
};
+48
View File
@@ -0,0 +1,48 @@
import { RTTrPHeader } from '../models';
export default (bytes: Uint8Array): RTTrPHeader => {
if (bytes.length < 18) {
throw new Error('RTTrP Header must be at least 18 bytes long');
}
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
let dataOffset = 0;
let isLittleEndian = false;
const intHeader = view.getUint16(dataOffset, isLittleEndian);
dataOffset += 2;
const fltHeader = view.getUint16(dataOffset, isLittleEndian);
dataOffset += 2;
if (intHeader === 0x4154) {
isLittleEndian = false;
}
const version = view.getUint16(dataOffset, isLittleEndian);
dataOffset += 2;
if (version !== 0x0002) {
throw new Error('Only version 2 of the RTTrP header is currently supported');
}
const pID = view.getUint32(dataOffset, isLittleEndian);
dataOffset += 4;
const pForm = view.getUint8(dataOffset);
dataOffset += 1;
const pktSize = view.getUint16(dataOffset, isLittleEndian);
dataOffset += 2;
const context = view.getUint32(dataOffset, isLittleEndian);
dataOffset += 4;
const numMods = view.getUint8(dataOffset);
dataOffset += 1;
const data = bytes.slice(dataOffset);
return {
intHeader,
fltHeader,
version,
pID,
pForm,
pktSize,
context,
numMods,
data,
};
};
+5
View File
@@ -0,0 +1,5 @@
import RTTrPHeader from './rttrp';
export const Encoders = {
RTTrPHeader,
};
+37
View File
@@ -0,0 +1,37 @@
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;
};
+3
View File
@@ -0,0 +1,3 @@
export { Decoders } from './decoders';
export { Encoders } from './encoders';
export * from './models';
+11
View File
@@ -0,0 +1,11 @@
export type RTTrPHeader = {
intHeader: number;
fltHeader: number;
version: number;
pID: number;
pForm: number;
pktSize: number;
context: number;
numMods: number;
data: Uint8Array;
};