mirror of
https://github.com/jwetzell/rttrp-js.git
synced 2026-08-20 06:19:03 +00:00
initial commit
This commit is contained in:
@@ -0,0 +1,5 @@
|
||||
import RTTrPHeader from './rttrp';
|
||||
|
||||
export const Decoders = {
|
||||
RTTrPHeader,
|
||||
};
|
||||
@@ -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,
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,5 @@
|
||||
import RTTrPHeader from './rttrp';
|
||||
|
||||
export const Encoders = {
|
||||
RTTrPHeader,
|
||||
};
|
||||
@@ -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;
|
||||
};
|
||||
@@ -0,0 +1,3 @@
|
||||
export { Decoders } from './decoders';
|
||||
export { Encoders } from './encoders';
|
||||
export * from './models';
|
||||
@@ -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;
|
||||
};
|
||||
Reference in New Issue
Block a user