diff --git a/.vscode/extensions.json b/.vscode/extensions.json index c83e263..64dbfec 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,3 +1,3 @@ { - "recommendations": ["esbenp.prettier-vscode"] + "recommendations": ["esbenp.prettier-vscode"] } diff --git a/.vscode/settings.json b/.vscode/settings.json index d4e8010..7d91539 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,8 +1,8 @@ { - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.formatOnSave": true, - "editor.codeActionsOnSave": { - "source.fixAll": "explicit", - "source.organizeImports": "explicit" - } + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.fixAll": "explicit", + "source.organizeImports": "explicit" + } } diff --git a/benchmark.js b/benchmark.js index 5276f5d..bfdb534 100644 --- a/benchmark.js +++ b/benchmark.js @@ -6,70 +6,70 @@ const encoder = new Encoder('test encoder', 2, 3); const decoder = new Decoder(); function getNTrackers(n) { - const trackers = []; - for (let index = 0; index < n; index += 1) { - const tracker = new Tracker(index, `Tracker ${index}`); - tracker.setPos(0, 0, 0); - tracker.setSpeed(0, 0, 0); - tracker.setOri(0, 0, 0); - tracker.setAccel(0, 0, 0); - tracker.setTrgtPos(0, 0, 0); - tracker.setStatus(1.0); - tracker.setTimestamp(Date.now()); - trackers.push(tracker); - } - return trackers; + const trackers = []; + for (let index = 0; index < n; index += 1) { + const tracker = new Tracker(index, `Tracker ${index}`); + tracker.setPos(0, 0, 0); + tracker.setSpeed(0, 0, 0); + tracker.setOri(0, 0, 0); + tracker.setAccel(0, 0, 0); + tracker.setTrgtPos(0, 0, 0); + tracker.setStatus(1.0); + tracker.setTimestamp(Date.now()); + trackers.push(tracker); + } + return trackers; } function benchmark(trackerCount, iterations) { - const benchmarkResults = { - data: {}, - info: {}, - }; - const trackers = getNTrackers(trackerCount); - console.log( - `processing ${trackers.length} tracker${trackers.length > 1 ? 's' : ''} ${iterations} time${ - iterations > 1 ? 's' : '' - }` - ); + const benchmarkResults = { + data: {}, + info: {}, + }; + const trackers = getNTrackers(trackerCount); + console.log( + `processing ${trackers.length} tracker${trackers.length > 1 ? 's' : ''} ${iterations} time${ + iterations > 1 ? 's' : '' + }` + ); - let latestEncodedPackets; + let latestEncodedPackets; - // DATA - const dataEncoderStart = performance.now(); - for (let index = 0; index < iterations; index += 1) { - latestEncodedPackets = encoder.getDataPackets(Date.now(), trackers); - } - benchmarkResults.data.encode = performance.now() - dataEncoderStart; + // DATA + const dataEncoderStart = performance.now(); + for (let index = 0; index < iterations; index += 1) { + latestEncodedPackets = encoder.getDataPackets(Date.now(), trackers); + } + benchmarkResults.data.encode = performance.now() - dataEncoderStart; - const dataDecodedStart = performance.now(); - for (let index = 0; index < iterations; index += 1) { - latestEncodedPackets.forEach((packet) => { - decoder.decode(packet); - }); - } - benchmarkResults.data.decode = performance.now() - dataDecodedStart; + const dataDecodedStart = performance.now(); + for (let index = 0; index < iterations; index += 1) { + latestEncodedPackets.forEach((packet) => { + decoder.decode(packet); + }); + } + benchmarkResults.data.decode = performance.now() - dataDecodedStart; - // INFO - const infoEncoderStart = performance.now(); - for (let index = 0; index < iterations; index += 1) { - latestEncodedPackets = encoder.getInfoPackets(Date.now(), trackers); - } - benchmarkResults.info.encode = performance.now() - infoEncoderStart; + // INFO + const infoEncoderStart = performance.now(); + for (let index = 0; index < iterations; index += 1) { + latestEncodedPackets = encoder.getInfoPackets(Date.now(), trackers); + } + benchmarkResults.info.encode = performance.now() - infoEncoderStart; - const infoDecodeStart = performance.now(); - for (let index = 0; index < iterations; index += 1) { - latestEncodedPackets.forEach((packet) => { - decoder.decode(packet); - }); - } - benchmarkResults.info.decode = performance.now() - infoDecodeStart; + const infoDecodeStart = performance.now(); + for (let index = 0; index < iterations; index += 1) { + latestEncodedPackets.forEach((packet) => { + decoder.decode(packet); + }); + } + benchmarkResults.info.decode = performance.now() - infoDecodeStart; - console.log(benchmarkResults); + console.log(benchmarkResults); } testSizes.forEach((iterations) => { - testSizes.forEach((trackerCount) => { - benchmark(trackerCount, iterations); - }); + testSizes.forEach((trackerCount) => { + benchmark(trackerCount, iterations); + }); }); diff --git a/biome.json b/biome.json index 676d4ce..3269655 100644 --- a/biome.json +++ b/biome.json @@ -20,7 +20,8 @@ }, "javascript": { "formatter": { - "quoteStyle": "double" + "quoteStyle": "single", + "trailingCommas": "es5" } }, "assist": { diff --git a/examples/decode.js b/examples/decode.js index efca077..99f1458 100644 --- a/examples/decode.js +++ b/examples/decode.js @@ -3,14 +3,17 @@ const { Decoder } = require('../dist/cjs'); const decoder = new Decoder(); const infoPacketBuffer = new Uint8Array([ - 0x56, 0x67, 0x34, 0x80, 0x00, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x01, - 0x01, 0x01, 0x00, 0x0b, 0x00, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x02, 0x00, 0x11, - 0x80, 0x01, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x09, 0x00, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x72, 0x20, 0x31, + 0x56, 0x67, 0x34, 0x80, 0x00, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x03, 0x01, 0x01, 0x01, 0x00, 0x0b, 0x00, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x02, 0x00, 0x11, 0x80, + 0x01, 0x00, 0x0d, 0x80, 0x00, 0x00, 0x09, 0x00, 0x54, 0x72, 0x61, 0x63, 0x6b, + 0x65, 0x72, 0x20, 0x31, ]); const dataPacketBuffer = new Uint8Array([ - 0x55, 0x67, 0x28, 0x80, 0x00, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x01, - 0x01, 0x01, 0x00, 0x14, 0x80, 0x01, 0x00, 0x10, 0x80, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, - 0x80, 0x3f, 0x00, 0x00, 0x80, 0x3f, + 0x55, 0x67, 0x28, 0x80, 0x00, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x03, 0x01, 0x01, 0x01, 0x00, 0x14, 0x80, 0x01, 0x00, + 0x10, 0x80, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x80, + 0x3f, 0x00, 0x00, 0x80, 0x3f, ]); decoder.decode(infoPacketBuffer); diff --git a/examples/encode.js b/examples/encode.js index 9f2760e..590b809 100644 --- a/examples/encode.js +++ b/examples/encode.js @@ -16,11 +16,11 @@ const dataPackets = encoder.getDataPackets(timestamp, trackers); const infoPackets = encoder.getInfoPackets(timestamp, trackers); dataPackets.forEach((dataPacket) => { - console.log('send packet somehow'); - console.log(dataPacket); + console.log('send packet somehow'); + console.log(dataPacket); }); infoPackets.forEach((infoPacket) => { - console.log('send packet somehow'); - console.log(infoPacket); + console.log('send packet somehow'); + console.log(infoPacket); }); diff --git a/examples/psn_client.js b/examples/psn_client.js index 8c13fcd..9d691fc 100644 --- a/examples/psn_client.js +++ b/examples/psn_client.js @@ -6,51 +6,61 @@ const client = dgram.createSocket('udp4'); const decoder = new Decoder(); client.on('listening', () => { - client.addMembership('236.10.10.10'); + client.addMembership('236.10.10.10'); }); client.on('message', (buffer) => { - decoder.decode(buffer); + decoder.decode(buffer); }); client.bind(56565, '0.0.0.0'); setInterval(() => { - if (decoder.system_name) { - console.log(`System Name: ${decoder.system_name}`); - } - if (Object.keys(decoder.trackers).length > 0) { - console.log(`Tracker Count: ${Object.keys(decoder.trackers).length}`); - } + if (decoder.system_name) { + console.log(`System Name: ${decoder.system_name}`); + } + if (Object.keys(decoder.trackers).length > 0) { + console.log(`Tracker Count: ${Object.keys(decoder.trackers).length}`); + } - Object.entries(decoder.trackers).forEach(([trackerId, tracker]) => { - const trackerName = decoder.trackers[trackerId]?.name; - console.log(`Tracker - id: ${trackerId} | name: ${trackerName || ''}`); - if (tracker.pos) { - console.log(`\tpos: ${tracker.pos.x}, ${tracker.pos.x}, ${tracker.pos.x}`); - } + Object.entries(decoder.trackers).forEach(([trackerId, tracker]) => { + const trackerName = decoder.trackers[trackerId]?.name; + console.log(`Tracker - id: ${trackerId} | name: ${trackerName || ''}`); + if (tracker.pos) { + console.log( + `\tpos: ${tracker.pos.x}, ${tracker.pos.x}, ${tracker.pos.x}` + ); + } - if (tracker.speed) { - console.log(`\tspeed: ${tracker.speed.x}, ${tracker.speed.y}, ${tracker.speed.z}`); - } + if (tracker.speed) { + console.log( + `\tspeed: ${tracker.speed.x}, ${tracker.speed.y}, ${tracker.speed.z}` + ); + } - if (tracker.ori) { - console.log(`\tori: ${tracker.ori.x}, ${tracker.ori.y}, ${tracker.ori.z}`); - } + if (tracker.ori) { + console.log( + `\tori: ${tracker.ori.x}, ${tracker.ori.y}, ${tracker.ori.z}` + ); + } - if (tracker.status) { - console.log(`\tstatus: ${tracker.status.validity}`); - } + if (tracker.status) { + console.log(`\tstatus: ${tracker.status.validity}`); + } - if (tracker.accel) { - console.log(`\taccel: ${tracker.accel.x}, ${tracker.accel.y}, ${tracker.accel.z}`); - } + if (tracker.accel) { + console.log( + `\taccel: ${tracker.accel.x}, ${tracker.accel.y}, ${tracker.accel.z}` + ); + } - if (tracker.trgtpos) { - console.log(`\ttrgtpos: ${tracker.trgtpos.x}, ${tracker.trgtpos.y}, ${tracker.trgtpos.z}`); - } + if (tracker.trgtpos) { + console.log( + `\ttrgtpos: ${tracker.trgtpos.x}, ${tracker.trgtpos.y}, ${tracker.trgtpos.z}` + ); + } - if (tracker.timestamp) { - console.log(`\ttimestamp: ${tracker.timestamp}`); - } - }); + if (tracker.timestamp) { + console.log(`\ttimestamp: ${tracker.timestamp}`); + } + }); }, 1000); diff --git a/examples/psn_server.js b/examples/psn_server.js index a07c682..7222a70 100644 --- a/examples/psn_server.js +++ b/examples/psn_server.js @@ -19,38 +19,40 @@ trackers.push(new Tracker(8, 'Neptune')); trackers.push(new Tracker(9, 'Pluto')); const orbits = [1.0, 88.0, 224.7, 365.2, 687, 4332, 10760, 30700, 60200, 90600]; -const distFromSun = [0, 0.58, 1.08, 1.5, 2.28, 7.78, 14.29, 28.71, 45.04, 59.13]; +const distFromSun = [ + 0, 0.58, 1.08, 1.5, 2.28, 7.78, 14.29, 28.71, 45.04, 59.13, +]; let timestamp = 0; setInterval(() => { - orbits.forEach((orbit, index) => { - const a = 1.0 / orbits[index]; - const b = distFromSun[index]; - const x = timestamp; - const cb = Math.cos(a * x) * b; - const sb = Math.sin(a * x) * b; + orbits.forEach((orbit, index) => { + const a = 1.0 / orbits[index]; + const b = distFromSun[index]; + const x = timestamp; + const cb = Math.cos(a * x) * b; + const sb = Math.sin(a * x) * b; - trackers[index].setPos(sb, 0, cb); - trackers[index].setSpeed(a * cb, 0, -a * sb); - trackers[index].setOri(0, x / 1000.0, 0); - trackers[index].setAccel(-a * a * sb, 0, -a * a * cb); - trackers[index].setTrgtPos(3, 14, 16); - trackers[index].setStatus(index / 10.0); - trackers[index].setTimestamp(timestamp); - }); + trackers[index].setPos(sb, 0, cb); + trackers[index].setSpeed(a * cb, 0, -a * sb); + trackers[index].setOri(0, x / 1000.0, 0); + trackers[index].setAccel(-a * a * sb, 0, -a * a * cb); + trackers[index].setTrgtPos(3, 14, 16); + trackers[index].setStatus(index / 10.0); + trackers[index].setTimestamp(timestamp); + }); - console.log(`Sending Data Packets`); - const dataPackets = encoder.getDataPackets(timestamp, trackers); - dataPackets.forEach((packet) => { - client.send(packet, 56565, '236.10.10.10'); - }); - timestamp += 1; + console.log(`Sending Data Packets`); + const dataPackets = encoder.getDataPackets(timestamp, trackers); + dataPackets.forEach((packet) => { + client.send(packet, 56565, '236.10.10.10'); + }); + timestamp += 1; }, 5); setInterval(() => { - console.log(`Sending Info Packets`); - const infoPackets = encoder.getInfoPackets(timestamp, trackers); - infoPackets.forEach((packet) => { - client.send(packet, 56565, '236.10.10.10'); - }); + console.log(`Sending Info Packets`); + const infoPackets = encoder.getInfoPackets(timestamp, trackers); + infoPackets.forEach((packet) => { + client.send(packet, 56565, '236.10.10.10'); + }); }, 500); diff --git a/package.json b/package.json index de707b2..159f274 100644 --- a/package.json +++ b/package.json @@ -1,47 +1,47 @@ { - "name": "@jwetzell/posistagenet", - "version": "2.1.2", - "description": "", - "main": "./dist/index.cjs", - "module": "./dist/index.mjs", - "types": "./dist/index.d.cts", - "exports": { - ".": { - "import": "./dist/index.mjs", - "require": "./dist/index.cjs" - }, - "./package.json": "./package.json" - }, - "scripts": { - "prebuild": "rimraf dist", - "build": "tsdown", - "example:client": "node examples/psn_client.js", - "example:server": "node examples/psn_server.js", - "prepublishOnly": "npm run build", - "lint:check": "biome lint", - "lint:write": "biome lint --write", - "format:check": "biome format", - "format:write": "biome format --write", - "pretest": "npm run build", - "test": "node --test --experimental-test-coverage" - }, - "files": [ - "dist" - ], - "author": { - "name": "Joel Wetzell", - "email": "me@jwetzell.com", - "url": "https://jwetzell.com" - }, - "repository": "https://github.com/jwetzell/psn-js", - "license": "MIT", - "devDependencies": { - "@biomejs/biome": "2.5.3", - "@eslint/js": "10.0.1", - "@types/node": "24.7.2", - "globals": "17.7.0", - "rimraf": "6.1.3", - "tsdown": "0.22.7", - "typescript": "6.0.3" - } -} \ No newline at end of file + "name": "@jwetzell/posistagenet", + "version": "2.1.2", + "description": "", + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "types": "./dist/index.d.cts", + "exports": { + ".": { + "import": "./dist/index.mjs", + "require": "./dist/index.cjs" + }, + "./package.json": "./package.json" + }, + "scripts": { + "prebuild": "rimraf dist", + "build": "tsdown", + "example:client": "node examples/psn_client.js", + "example:server": "node examples/psn_server.js", + "prepublishOnly": "npm run build", + "lint:check": "biome lint", + "lint:write": "biome lint --write", + "format:check": "biome format", + "format:write": "biome format --write", + "pretest": "npm run build", + "test": "node --test --experimental-test-coverage" + }, + "files": [ + "dist" + ], + "author": { + "name": "Joel Wetzell", + "email": "me@jwetzell.com", + "url": "https://jwetzell.com" + }, + "repository": "https://github.com/jwetzell/psn-js", + "license": "MIT", + "devDependencies": { + "@biomejs/biome": "2.5.3", + "@eslint/js": "10.0.1", + "@types/node": "24.7.2", + "globals": "17.7.0", + "rimraf": "6.1.3", + "tsdown": "0.22.7", + "typescript": "6.0.3" + } +} diff --git a/src/constants.ts b/src/constants.ts index 8e7ec16..984456d 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,5 +1,5 @@ export class Constants { - static readonly PACKET_HEADER_SIZE = 16; - static readonly MAX_UDP_PACKET_SIZE = 1500; - static readonly CHUNK_HEADER_SIZE = 4; + static readonly PACKET_HEADER_SIZE = 16; + static readonly MAX_UDP_PACKET_SIZE = 1500; + static readonly CHUNK_HEADER_SIZE = 4; } diff --git a/src/decoder.ts b/src/decoder.ts index 24bd59f..71f0044 100644 --- a/src/decoder.ts +++ b/src/decoder.ts @@ -1,119 +1,133 @@ import { Decoders } from './index.js'; import { - type DataPacketChunk, - type InfoPacketChunk, - Tracker, - TrackerFromData, - TrackerFromInfo, + type DataPacketChunk, + type InfoPacketChunk, + Tracker, + TrackerFromData, + TrackerFromInfo, } from './models/index.js'; export class Decoder { - infoPacketFrames: { [key: number]: InfoPacketChunk[] } = {}; + infoPacketFrames: { [key: number]: InfoPacketChunk[] } = {}; - dataPacketFrames: { [key: number]: DataPacketChunk[] } = {}; + dataPacketFrames: { [key: number]: DataPacketChunk[] } = {}; - trackers: { [key: string]: Tracker } = {}; + trackers: { [key: string]: Tracker } = {}; - systemName: string = ''; - constructor() {} + systemName: string = ''; + constructor() {} - updateInfo(framePackets: InfoPacketChunk[]) { - framePackets.forEach((packet) => { - if (packet.data.systemName?.data) { - this.systemName = packet.data.systemName?.data.systemName; - } + updateInfo(framePackets: InfoPacketChunk[]) { + framePackets.forEach((packet) => { + if (packet.data.systemName?.data) { + this.systemName = packet.data.systemName?.data.systemName; + } - if (packet.data.trackerList?.data) { - packet.data.trackerList.data.trackers.forEach((infoTrackerChunk) => { - if (!this.trackers[infoTrackerChunk.chunk.header.id]) { - const tracker = TrackerFromInfo(infoTrackerChunk); - if (tracker) { - this.trackers[infoTrackerChunk.chunk.header.id] = tracker; - } - } - const tracker = this.trackers[infoTrackerChunk.chunk.header.id]; - tracker.updateInfo(infoTrackerChunk); - }); - } - }); - } + if (packet.data.trackerList?.data) { + packet.data.trackerList.data.trackers.forEach((infoTrackerChunk) => { + if (!this.trackers[infoTrackerChunk.chunk.header.id]) { + const tracker = TrackerFromInfo(infoTrackerChunk); + if (tracker) { + this.trackers[infoTrackerChunk.chunk.header.id] = tracker; + } + } + const tracker = this.trackers[infoTrackerChunk.chunk.header.id]; + tracker.updateInfo(infoTrackerChunk); + }); + } + }); + } - updateData(framePackets: DataPacketChunk[]) { - framePackets.forEach((packet) => { - if (packet.data.trackerList) { - packet.data.trackerList?.data.trackers.forEach((dataTrackerChunk) => { - if (!this.trackers[dataTrackerChunk.chunk.header.id]) { - const tracker = TrackerFromData(dataTrackerChunk); - if (tracker) { - this.trackers[dataTrackerChunk.chunk.header.id] = tracker; - } - } - const tracker = this.trackers[dataTrackerChunk.chunk.header.id]; - tracker.updateData(dataTrackerChunk); - }); - } - }); - } + updateData(framePackets: DataPacketChunk[]) { + framePackets.forEach((packet) => { + if (packet.data.trackerList) { + packet.data.trackerList?.data.trackers.forEach((dataTrackerChunk) => { + if (!this.trackers[dataTrackerChunk.chunk.header.id]) { + const tracker = TrackerFromData(dataTrackerChunk); + if (tracker) { + this.trackers[dataTrackerChunk.chunk.header.id] = tracker; + } + } + const tracker = this.trackers[dataTrackerChunk.chunk.header.id]; + tracker.updateData(dataTrackerChunk); + }); + } + }); + } - // TODO(jwetzell): add invalid frame id decoding. Scenario where a frame id is reused before one is complete - decode(packetBuf: Uint8Array) { - const packet = Decoders.Chunk(packetBuf); - if (packet === undefined) { - return packet; - } + // TODO(jwetzell): add invalid frame id decoding. Scenario where a frame id is reused before one is complete + decode(packetBuf: Uint8Array) { + const packet = Decoders.Chunk(packetBuf); + if (packet === undefined) { + return packet; + } - if (packet.header.id === 0x6756) { - const infoPacket = Decoders.InfoPacketChunk(packetBuf); - if (infoPacket && infoPacket.chunk.header.hasSubchunks) { - const currentInfoPacketHeader = infoPacket.data.packetHeader; - if (!currentInfoPacketHeader) { - // NOTE(jwetzell): not sure that info packets without a header subchunk are valid? - throw new Error('malformed packet'); - } + if (packet.header.id === 0x6756) { + const infoPacket = Decoders.InfoPacketChunk(packetBuf); + if (infoPacket && infoPacket.chunk.header.hasSubchunks) { + const currentInfoPacketHeader = infoPacket.data.packetHeader; + if (!currentInfoPacketHeader) { + // NOTE(jwetzell): not sure that info packets without a header subchunk are valid? + throw new Error('malformed packet'); + } - const systemSubChunk = infoPacket.data.systemName; - if (!systemSubChunk) { - // NOTE(jwetzell): not sure that info packets without a system subchunk are valid? - throw new Error('malformed packet'); - } - if (currentInfoPacketHeader.data.frameId) { - if (this.infoPacketFrames[currentInfoPacketHeader.data.frameId] === undefined) { - this.infoPacketFrames[currentInfoPacketHeader.data.frameId] = []; - } - this.infoPacketFrames[currentInfoPacketHeader.data.frameId].push(infoPacket); + const systemSubChunk = infoPacket.data.systemName; + if (!systemSubChunk) { + // NOTE(jwetzell): not sure that info packets without a system subchunk are valid? + throw new Error('malformed packet'); + } + if (currentInfoPacketHeader.data.frameId) { + if ( + this.infoPacketFrames[currentInfoPacketHeader.data.frameId] === + undefined + ) { + this.infoPacketFrames[currentInfoPacketHeader.data.frameId] = []; + } + this.infoPacketFrames[currentInfoPacketHeader.data.frameId].push( + infoPacket + ); - if ( - this.infoPacketFrames[currentInfoPacketHeader.data.frameId].length === - currentInfoPacketHeader.data.framePacketCount - ) { - this.updateInfo(this.infoPacketFrames[currentInfoPacketHeader.data.frameId]); - delete this.infoPacketFrames[currentInfoPacketHeader.data.frameId]; - } - } - } - } else if (packet.header.id === 0x6755) { - const dataPacket = Decoders.DataPacketChunk(packetBuf); - if (dataPacket.chunk.header.hasSubchunks) { - const currentDataPacketHeader = dataPacket.data.packetHeader; - if (!currentDataPacketHeader) { - // NOTE(jwetzell): not sure that info packets without a header subchunk are valid? - throw new Error('malformed packet'); - } + if ( + this.infoPacketFrames[currentInfoPacketHeader.data.frameId] + .length === currentInfoPacketHeader.data.framePacketCount + ) { + this.updateInfo( + this.infoPacketFrames[currentInfoPacketHeader.data.frameId] + ); + delete this.infoPacketFrames[currentInfoPacketHeader.data.frameId]; + } + } + } + } else if (packet.header.id === 0x6755) { + const dataPacket = Decoders.DataPacketChunk(packetBuf); + if (dataPacket.chunk.header.hasSubchunks) { + const currentDataPacketHeader = dataPacket.data.packetHeader; + if (!currentDataPacketHeader) { + // NOTE(jwetzell): not sure that info packets without a header subchunk are valid? + throw new Error('malformed packet'); + } - if (currentDataPacketHeader.data.frameId) { - if (this.dataPacketFrames[currentDataPacketHeader.data.frameId] === undefined) { - this.dataPacketFrames[currentDataPacketHeader.data.frameId] = []; - } - this.dataPacketFrames[currentDataPacketHeader.data.frameId].push(dataPacket); - if ( - this.dataPacketFrames[currentDataPacketHeader.data.frameId].length === - currentDataPacketHeader.data.framePacketCount - ) { - this.updateData(this.dataPacketFrames[currentDataPacketHeader.data.frameId]); - delete this.dataPacketFrames[currentDataPacketHeader.data.frameId]; - } - } - } - } - } + if (currentDataPacketHeader.data.frameId) { + if ( + this.dataPacketFrames[currentDataPacketHeader.data.frameId] === + undefined + ) { + this.dataPacketFrames[currentDataPacketHeader.data.frameId] = []; + } + this.dataPacketFrames[currentDataPacketHeader.data.frameId].push( + dataPacket + ); + if ( + this.dataPacketFrames[currentDataPacketHeader.data.frameId] + .length === currentDataPacketHeader.data.framePacketCount + ) { + this.updateData( + this.dataPacketFrames[currentDataPacketHeader.data.frameId] + ); + delete this.dataPacketFrames[currentDataPacketHeader.data.frameId]; + } + } + } + } + } } diff --git a/src/decoders/chunk.ts b/src/decoders/chunk.ts index 5dbb371..c0d8e65 100644 --- a/src/decoders/chunk.ts +++ b/src/decoders/chunk.ts @@ -1,29 +1,31 @@ import type { Chunk } from '../models/chunk.js'; export default (buffer: Uint8Array): Chunk => { - if (buffer.length < 4) { - throw new Error('Chunk buffer must be at least 4 bytes'); - } + if (buffer.length < 4) { + throw new Error('Chunk buffer must be at least 4 bytes'); + } - const id = (buffer[1] << 8) + buffer[0]; + const id = (buffer[1] << 8) + buffer[0]; - // NOTE(jwetzell): this data is split up as 1 bit for hasSubchunks and 15 bits for the dataLen - const combinedLengthAndFlag = (buffer[3] << 8) + buffer[2]; - const hasSubchunks = combinedLengthAndFlag > 32768; - const dataLen = hasSubchunks ? combinedLengthAndFlag - 32768 : combinedLengthAndFlag; + // NOTE(jwetzell): this data is split up as 1 bit for hasSubchunks and 15 bits for the dataLen + const combinedLengthAndFlag = (buffer[3] << 8) + buffer[2]; + const hasSubchunks = combinedLengthAndFlag > 32768; + const dataLen = hasSubchunks + ? combinedLengthAndFlag - 32768 + : combinedLengthAndFlag; - const header = { - id, - dataLen, - hasSubchunks, - }; + const header = { + id, + dataLen, + hasSubchunks, + }; - const chunkData = buffer.subarray(4, 4 + header.dataLen); + const chunkData = buffer.subarray(4, 4 + header.dataLen); - const chunk = { - chunkData, - header, - }; + const chunk = { + chunkData, + header, + }; - return chunk; + return chunk; }; diff --git a/src/decoders/data/data-packet-chunk.ts b/src/decoders/data/data-packet-chunk.ts index 3310172..c9bfa04 100644 --- a/src/decoders/data/data-packet-chunk.ts +++ b/src/decoders/data/data-packet-chunk.ts @@ -1,39 +1,48 @@ import { Constants } from '../../constants.js'; -import type { DataPacketChunk, DataPacketChunkData } from '../../models/data/data-packet-chunk.js'; +import type { + DataPacketChunk, + DataPacketChunkData, +} from '../../models/data/data-packet-chunk.js'; import { Decoders } from '../index.js'; export default (buffer: Uint8Array): DataPacketChunk => { - const chunk = Decoders.Chunk(buffer); + const chunk = Decoders.Chunk(buffer); - const data: DataPacketChunkData = {}; + const data: DataPacketChunkData = {}; - if (chunk.header.hasSubchunks && chunk.chunkData && chunk.header.dataLen) { - let offset = 0; - while (offset < chunk.header.dataLen) { - const chunkId = (chunk.chunkData.subarray(offset)[1] << 8) + chunk.chunkData.subarray(offset)[0]; - switch (chunkId) { - case 0x0000: - data.packetHeader = Decoders.PacketHeaderChunk(chunk.chunkData.subarray(offset)); - offset += Constants.CHUNK_HEADER_SIZE; - if (data.packetHeader.chunk.header.dataLen) { - offset += data.packetHeader.chunk.header.dataLen; - } - break; - case 0x0001: - data.trackerList = Decoders.DataTrackerListChunk(chunk.chunkData.subarray(offset)); - offset += Constants.CHUNK_HEADER_SIZE; - if (data.trackerList.chunk.header.dataLen) { - offset += data.trackerList.chunk.header.dataLen; - } - break; - default: - break; - } - } - } + if (chunk.header.hasSubchunks && chunk.chunkData && chunk.header.dataLen) { + let offset = 0; + while (offset < chunk.header.dataLen) { + const chunkId = + (chunk.chunkData.subarray(offset)[1] << 8) + + chunk.chunkData.subarray(offset)[0]; + switch (chunkId) { + case 0x0000: + data.packetHeader = Decoders.PacketHeaderChunk( + chunk.chunkData.subarray(offset) + ); + offset += Constants.CHUNK_HEADER_SIZE; + if (data.packetHeader.chunk.header.dataLen) { + offset += data.packetHeader.chunk.header.dataLen; + } + break; + case 0x0001: + data.trackerList = Decoders.DataTrackerListChunk( + chunk.chunkData.subarray(offset) + ); + offset += Constants.CHUNK_HEADER_SIZE; + if (data.trackerList.chunk.header.dataLen) { + offset += data.trackerList.chunk.header.dataLen; + } + break; + default: + break; + } + } + } - return { - chunk, - data, - }; + return { + chunk, + data, + }; }; diff --git a/src/decoders/data/data-tracker-chunk.ts b/src/decoders/data/data-tracker-chunk.ts index 6b0b478..efe5d89 100644 --- a/src/decoders/data/data-tracker-chunk.ts +++ b/src/decoders/data/data-tracker-chunk.ts @@ -1,46 +1,65 @@ import { Constants } from '../../constants.js'; -import type { DataTrackerChunk, DataTrackerChunkData } from '../../models/data/data-tracker-chunk.js'; +import type { + DataTrackerChunk, + DataTrackerChunkData, +} from '../../models/data/data-tracker-chunk.js'; import { Decoders } from '../index.js'; export default (buffer: Uint8Array): DataTrackerChunk => { - const chunk = Decoders.Chunk(buffer); - const data: DataTrackerChunkData = {}; - if (chunk.chunkData && chunk.header.dataLen) { - let offset = 0; - while (offset < chunk.header.dataLen) { - const trackerFieldChunk = Decoders.Chunk(chunk.chunkData.subarray(offset)); - switch (trackerFieldChunk.header.id) { - case 0x0000: - data.pos = Decoders.DataTrackerXYZChunk(chunk.chunkData.subarray(offset)); - break; - case 0x0001: - data.speed = Decoders.DataTrackerXYZChunk(chunk.chunkData.subarray(offset)); - break; - case 0x0002: - data.ori = Decoders.DataTrackerXYZChunk(chunk.chunkData.subarray(offset)); - break; - case 0x0003: - data.status = Decoders.DataTrackerStatusChunk(chunk.chunkData.subarray(offset)); - break; - case 0x0004: - data.accel = Decoders.DataTrackerXYZChunk(chunk.chunkData.subarray(offset)); - break; - case 0x0005: - data.trgtpos = Decoders.DataTrackerXYZChunk(chunk.chunkData.subarray(offset)); - break; - case 0x0006: - data.timestamp = Decoders.DataTrackerTimestampChunk(chunk.chunkData.subarray(offset)); - break; - default: - break; - } - offset += Constants.CHUNK_HEADER_SIZE; - offset += trackerFieldChunk.header.dataLen; - } - } + const chunk = Decoders.Chunk(buffer); + const data: DataTrackerChunkData = {}; + if (chunk.chunkData && chunk.header.dataLen) { + let offset = 0; + while (offset < chunk.header.dataLen) { + const trackerFieldChunk = Decoders.Chunk( + chunk.chunkData.subarray(offset) + ); + switch (trackerFieldChunk.header.id) { + case 0x0000: + data.pos = Decoders.DataTrackerXYZChunk( + chunk.chunkData.subarray(offset) + ); + break; + case 0x0001: + data.speed = Decoders.DataTrackerXYZChunk( + chunk.chunkData.subarray(offset) + ); + break; + case 0x0002: + data.ori = Decoders.DataTrackerXYZChunk( + chunk.chunkData.subarray(offset) + ); + break; + case 0x0003: + data.status = Decoders.DataTrackerStatusChunk( + chunk.chunkData.subarray(offset) + ); + break; + case 0x0004: + data.accel = Decoders.DataTrackerXYZChunk( + chunk.chunkData.subarray(offset) + ); + break; + case 0x0005: + data.trgtpos = Decoders.DataTrackerXYZChunk( + chunk.chunkData.subarray(offset) + ); + break; + case 0x0006: + data.timestamp = Decoders.DataTrackerTimestampChunk( + chunk.chunkData.subarray(offset) + ); + break; + default: + break; + } + offset += Constants.CHUNK_HEADER_SIZE; + offset += trackerFieldChunk.header.dataLen; + } + } - return { - chunk, - data, - }; + return { + chunk, + data, + }; }; diff --git a/src/decoders/data/data-tracker-list-chunk.ts b/src/decoders/data/data-tracker-list-chunk.ts index 2958135..3448930 100644 --- a/src/decoders/data/data-tracker-list-chunk.ts +++ b/src/decoders/data/data-tracker-list-chunk.ts @@ -1,33 +1,38 @@ import { Constants } from '../../constants.js'; -import type { DataTrackerListChunk, DataTrackerListChunkData } from '../../models/data/data-tracker-list-chunk.js'; +import type { + DataTrackerListChunk, + DataTrackerListChunkData, +} from '../../models/data/data-tracker-list-chunk.js'; import type { DataTrackerChunk } from '../../models/index.js'; import { Decoders } from '../index.js'; export default (buffer: Uint8Array): DataTrackerListChunk => { - const chunk = Decoders.Chunk(buffer); - const trackers: DataTrackerChunk[] = []; + const chunk = Decoders.Chunk(buffer); + const trackers: DataTrackerChunk[] = []; - // TODO(jwetzell): add error handling - if (chunk.chunkData) { - let offset = 0; - while (offset < chunk.chunkData.length) { - const trackerChunk = Decoders.DataTrackerChunk(chunk.chunkData.subarray(offset)); - offset += Constants.CHUNK_HEADER_SIZE; - if (trackerChunk.chunk.header.dataLen) { - offset += trackerChunk.chunk.header.dataLen; - } - if (trackerChunk.chunk.header.id !== undefined) { - trackers.push(trackerChunk); - } - } - } + // TODO(jwetzell): add error handling + if (chunk.chunkData) { + let offset = 0; + while (offset < chunk.chunkData.length) { + const trackerChunk = Decoders.DataTrackerChunk( + chunk.chunkData.subarray(offset) + ); + offset += Constants.CHUNK_HEADER_SIZE; + if (trackerChunk.chunk.header.dataLen) { + offset += trackerChunk.chunk.header.dataLen; + } + if (trackerChunk.chunk.header.id !== undefined) { + trackers.push(trackerChunk); + } + } + } - const data: DataTrackerListChunkData = { - trackers, - }; + const data: DataTrackerListChunkData = { + trackers, + }; - return { - chunk, - data, - }; + return { + chunk, + data, + }; }; diff --git a/src/decoders/data/data-tracker-status-chunk.ts b/src/decoders/data/data-tracker-status-chunk.ts index 666430d..9956d76 100644 --- a/src/decoders/data/data-tracker-status-chunk.ts +++ b/src/decoders/data/data-tracker-status-chunk.ts @@ -1,21 +1,25 @@ import type { - DataTrackerStatusChunk, - DataTrackerStatusChunkData, + DataTrackerStatusChunk, + DataTrackerStatusChunkData, } from '../../models/data/data-tracker-status-chunk.js'; import { Decoders } from '../index.js'; export default (buffer: Uint8Array): DataTrackerStatusChunk => { - const chunk = Decoders.Chunk(buffer); + const chunk = Decoders.Chunk(buffer); - const view = new DataView(chunk.chunkData.buffer, chunk.chunkData.byteOffset, chunk.chunkData.byteLength); - const validity = view.getFloat32(0, true); + const view = new DataView( + chunk.chunkData.buffer, + chunk.chunkData.byteOffset, + chunk.chunkData.byteLength + ); + const validity = view.getFloat32(0, true); - const data: DataTrackerStatusChunkData = { - validity, - }; + const data: DataTrackerStatusChunkData = { + validity, + }; - return { - chunk, - data, - }; + return { + chunk, + data, + }; }; diff --git a/src/decoders/data/data-tracker-timestamp-chunk.ts b/src/decoders/data/data-tracker-timestamp-chunk.ts index f9cc3f6..7374218 100644 --- a/src/decoders/data/data-tracker-timestamp-chunk.ts +++ b/src/decoders/data/data-tracker-timestamp-chunk.ts @@ -1,21 +1,25 @@ import type { - DataTrackerTimestampChunk, - DataTrackerTimestampChunkData, + DataTrackerTimestampChunk, + DataTrackerTimestampChunkData, } from '../../models/data/data-tracker-timestamp-chunk.js'; import { Decoders } from '../index.js'; export default (buffer: Uint8Array): DataTrackerTimestampChunk => { - const chunk = Decoders.Chunk(buffer); + const chunk = Decoders.Chunk(buffer); - const view = new DataView(chunk.chunkData.buffer, chunk.chunkData.byteOffset, chunk.chunkData.byteLength); - const timestamp = view.getBigUint64(0, true); + const view = new DataView( + chunk.chunkData.buffer, + chunk.chunkData.byteOffset, + chunk.chunkData.byteLength + ); + const timestamp = view.getBigUint64(0, true); - const data: DataTrackerTimestampChunkData = { - timestamp, - }; + const data: DataTrackerTimestampChunkData = { + timestamp, + }; - return { - chunk, - data, - }; + return { + chunk, + data, + }; }; diff --git a/src/decoders/data/data-tracker-xyz-chunk.ts b/src/decoders/data/data-tracker-xyz-chunk.ts index 55b0e0d..1ca009e 100644 --- a/src/decoders/data/data-tracker-xyz-chunk.ts +++ b/src/decoders/data/data-tracker-xyz-chunk.ts @@ -1,20 +1,27 @@ -import type { DataTrackerXYZChunk, DataTrackerXYZChunkData } from '../../models/data/data-tracker-xyz-chunk.js'; +import type { + DataTrackerXYZChunk, + DataTrackerXYZChunkData, +} from '../../models/data/data-tracker-xyz-chunk.js'; import { Decoders } from '../index.js'; export default (buffer: Uint8Array): DataTrackerXYZChunk => { - const chunk = Decoders.Chunk(buffer); + const chunk = Decoders.Chunk(buffer); - // TODO(jwetzell): add error handling - const view = new DataView(chunk.chunkData.buffer, chunk.chunkData.byteOffset, chunk.chunkData.byteLength); + // TODO(jwetzell): add error handling + const view = new DataView( + chunk.chunkData.buffer, + chunk.chunkData.byteOffset, + chunk.chunkData.byteLength + ); - const data: DataTrackerXYZChunkData = { - x: view.getFloat32(0, true), - y: view.getFloat32(4, true), - z: view.getFloat32(8, true), - }; + const data: DataTrackerXYZChunkData = { + x: view.getFloat32(0, true), + y: view.getFloat32(4, true), + z: view.getFloat32(8, true), + }; - return { - chunk, - data, - }; + return { + chunk, + data, + }; }; diff --git a/src/decoders/index.ts b/src/decoders/index.ts index 8553de1..e673146 100644 --- a/src/decoders/index.ts +++ b/src/decoders/index.ts @@ -15,17 +15,17 @@ import InfoTrackerListChunk from './info/info-tracker-list-chunk.js'; import InfoTrackerNameChunk from './info/info-tracker-name-chunk.js'; export const Decoders = { - Chunk, - PacketHeaderChunk, - DataPacketChunk, - DataTrackerChunk, - DataTrackerXYZChunk, - DataTrackerStatusChunk, - DataTrackerTimestampChunk, - DataTrackerListChunk, - InfoPacketChunk, - InfoSystemNameChunk, - InfoTrackerChunk, - InfoTrackerListChunk, - InfoTrackerNameChunk, + Chunk, + PacketHeaderChunk, + DataPacketChunk, + DataTrackerChunk, + DataTrackerXYZChunk, + DataTrackerStatusChunk, + DataTrackerTimestampChunk, + DataTrackerListChunk, + InfoPacketChunk, + InfoSystemNameChunk, + InfoTrackerChunk, + InfoTrackerListChunk, + InfoTrackerNameChunk, }; diff --git a/src/decoders/info/info-packet-chunk.ts b/src/decoders/info/info-packet-chunk.ts index 3c28dfc..7414233 100644 --- a/src/decoders/info/info-packet-chunk.ts +++ b/src/decoders/info/info-packet-chunk.ts @@ -1,46 +1,57 @@ import { Constants } from '../../constants.js'; -import type { InfoPacketChunk, InfoPacketChunkData } from '../../models/info/info-packet-chunk.js'; +import type { + InfoPacketChunk, + InfoPacketChunkData, +} from '../../models/info/info-packet-chunk.js'; import { Decoders } from '../index.js'; export default (buffer: Uint8Array): InfoPacketChunk => { - const chunk = Decoders.Chunk(buffer); + const chunk = Decoders.Chunk(buffer); - const data: InfoPacketChunkData = {}; + const data: InfoPacketChunkData = {}; - if (chunk.header.hasSubchunks && chunk.chunkData && chunk.header.dataLen) { - let offset = 0; - while (offset < chunk.header.dataLen) { - const chunkId = (chunk.chunkData.subarray(offset)[1] << 8) + chunk.chunkData.subarray(offset)[0]; - switch (chunkId) { - case 0x0000: - data.packetHeader = Decoders.PacketHeaderChunk(chunk.chunkData.subarray(offset)); - offset += Constants.CHUNK_HEADER_SIZE; - if (data.packetHeader?.chunk.header.dataLen) { - offset += data.packetHeader.chunk.header.dataLen; - } - break; - case 0x0001: - data.systemName = Decoders.InfoSystemNameChunk(chunk.chunkData.subarray(offset)); - offset += Constants.CHUNK_HEADER_SIZE; - if (data.systemName?.chunk.header.dataLen) { - offset += data.systemName?.chunk.header.dataLen; - } - break; - case 0x0002: - data.trackerList = Decoders.InfoTrackerListChunk(chunk.chunkData.subarray(offset)); - offset += Constants.CHUNK_HEADER_SIZE; - if (data.trackerList?.chunk.header.dataLen) { - offset += data.trackerList.chunk.header.dataLen; - } - break; - default: - break; - } - } - } + if (chunk.header.hasSubchunks && chunk.chunkData && chunk.header.dataLen) { + let offset = 0; + while (offset < chunk.header.dataLen) { + const chunkId = + (chunk.chunkData.subarray(offset)[1] << 8) + + chunk.chunkData.subarray(offset)[0]; + switch (chunkId) { + case 0x0000: + data.packetHeader = Decoders.PacketHeaderChunk( + chunk.chunkData.subarray(offset) + ); + offset += Constants.CHUNK_HEADER_SIZE; + if (data.packetHeader?.chunk.header.dataLen) { + offset += data.packetHeader.chunk.header.dataLen; + } + break; + case 0x0001: + data.systemName = Decoders.InfoSystemNameChunk( + chunk.chunkData.subarray(offset) + ); + offset += Constants.CHUNK_HEADER_SIZE; + if (data.systemName?.chunk.header.dataLen) { + offset += data.systemName?.chunk.header.dataLen; + } + break; + case 0x0002: + data.trackerList = Decoders.InfoTrackerListChunk( + chunk.chunkData.subarray(offset) + ); + offset += Constants.CHUNK_HEADER_SIZE; + if (data.trackerList?.chunk.header.dataLen) { + offset += data.trackerList.chunk.header.dataLen; + } + break; + default: + break; + } + } + } - return { - chunk, - data, - }; + return { + chunk, + data, + }; }; diff --git a/src/decoders/info/info-system-name-chunk.ts b/src/decoders/info/info-system-name-chunk.ts index 29a0675..e2f5a1d 100644 --- a/src/decoders/info/info-system-name-chunk.ts +++ b/src/decoders/info/info-system-name-chunk.ts @@ -1,16 +1,21 @@ -import type { InfoSystemNameChunk, InfoSystemNameChunkData } from '../../models/info/info-system-name-chunk.js'; +import type { + InfoSystemNameChunk, + InfoSystemNameChunkData, +} from '../../models/info/info-system-name-chunk.js'; import { Decoders } from '../index.js'; const nameDecoder = new TextDecoder(); export default (buffer: Uint8Array): InfoSystemNameChunk => { - const chunk = Decoders.Chunk(buffer); + const chunk = Decoders.Chunk(buffer); - const data: InfoSystemNameChunkData = { - systemName: nameDecoder.decode(chunk.chunkData.subarray(0, chunk.header.dataLen)), - }; + const data: InfoSystemNameChunkData = { + systemName: nameDecoder.decode( + chunk.chunkData.subarray(0, chunk.header.dataLen) + ), + }; - return { - chunk, - data, - }; + return { + chunk, + data, + }; }; diff --git a/src/decoders/info/info-tracker-chunk.ts b/src/decoders/info/info-tracker-chunk.ts index 022f423..fbaf741 100644 --- a/src/decoders/info/info-tracker-chunk.ts +++ b/src/decoders/info/info-tracker-chunk.ts @@ -1,35 +1,42 @@ import { Constants } from '../../constants.js'; -import type { InfoTrackerChunk, InfoTrackerChunkData } from '../../models/info/info-tracker-chunk.js'; +import type { + InfoTrackerChunk, + InfoTrackerChunkData, +} from '../../models/info/info-tracker-chunk.js'; import { Decoders } from '../index.js'; export default (buffer: Uint8Array): InfoTrackerChunk => { - const chunk = Decoders.Chunk(buffer); + const chunk = Decoders.Chunk(buffer); - if (chunk.header.hasSubchunks && chunk.chunkData && chunk.header.dataLen) { - let offset = 0; - while (offset < chunk.header.dataLen) { - const chunkId = (chunk.chunkData.subarray(offset)[1] << 8) + chunk.chunkData.subarray(offset)[0]; - switch (chunkId) { - case 0x0000: { - const data: InfoTrackerChunkData = { - trackerName: Decoders.InfoTrackerNameChunk(chunk.chunkData.subarray(offset)), - }; - offset += Constants.CHUNK_HEADER_SIZE; - if (data.trackerName.chunk.header.dataLen) { - offset += data.trackerName.chunk.header.dataLen; - } - return { - chunk, - data, - }; - } - default: - break; - } - } - } + if (chunk.header.hasSubchunks && chunk.chunkData && chunk.header.dataLen) { + let offset = 0; + while (offset < chunk.header.dataLen) { + const chunkId = + (chunk.chunkData.subarray(offset)[1] << 8) + + chunk.chunkData.subarray(offset)[0]; + switch (chunkId) { + case 0x0000: { + const data: InfoTrackerChunkData = { + trackerName: Decoders.InfoTrackerNameChunk( + chunk.chunkData.subarray(offset) + ), + }; + offset += Constants.CHUNK_HEADER_SIZE; + if (data.trackerName.chunk.header.dataLen) { + offset += data.trackerName.chunk.header.dataLen; + } + return { + chunk, + data, + }; + } + default: + break; + } + } + } - return { - chunk, - }; + return { + chunk, + }; }; diff --git a/src/decoders/info/info-tracker-list-chunk.ts b/src/decoders/info/info-tracker-list-chunk.ts index 80d9594..86157dd 100644 --- a/src/decoders/info/info-tracker-list-chunk.ts +++ b/src/decoders/info/info-tracker-list-chunk.ts @@ -1,33 +1,38 @@ import { Constants } from '../../constants.js'; import type { InfoTrackerChunk } from '../../models/info/info-tracker-chunk.js'; -import type { InfoTrackerListChunk, InfoTrackerListChunkData } from '../../models/info/info-tracker-list-chunk.js'; +import type { + InfoTrackerListChunk, + InfoTrackerListChunkData, +} from '../../models/info/info-tracker-list-chunk.js'; import { Decoders } from '../index.js'; export default (buffer: Uint8Array): InfoTrackerListChunk => { - const chunk = Decoders.Chunk(buffer); + const chunk = Decoders.Chunk(buffer); - const trackers: InfoTrackerChunk[] = []; + const trackers: InfoTrackerChunk[] = []; - if (chunk.header.hasSubchunks && chunk.chunkData) { - let offset = 0; - if (chunk.header.dataLen) { - while (offset < chunk.header.dataLen) { - const trackerChunk = Decoders.InfoTrackerChunk(chunk.chunkData.subarray(offset)); - offset += Constants.CHUNK_HEADER_SIZE; - if (trackerChunk.chunk.header.dataLen) { - offset += trackerChunk.chunk.header.dataLen; - } - if (trackerChunk.chunk.header.id !== undefined) { - trackers.push(trackerChunk); - } - } - } - } - const data: InfoTrackerListChunkData = { - trackers, - }; - return { - chunk, - data, - }; + if (chunk.header.hasSubchunks && chunk.chunkData) { + let offset = 0; + if (chunk.header.dataLen) { + while (offset < chunk.header.dataLen) { + const trackerChunk = Decoders.InfoTrackerChunk( + chunk.chunkData.subarray(offset) + ); + offset += Constants.CHUNK_HEADER_SIZE; + if (trackerChunk.chunk.header.dataLen) { + offset += trackerChunk.chunk.header.dataLen; + } + if (trackerChunk.chunk.header.id !== undefined) { + trackers.push(trackerChunk); + } + } + } + } + const data: InfoTrackerListChunkData = { + trackers, + }; + return { + chunk, + data, + }; }; diff --git a/src/decoders/info/info-tracker-name-chunk.ts b/src/decoders/info/info-tracker-name-chunk.ts index 1e93e16..8efcef8 100644 --- a/src/decoders/info/info-tracker-name-chunk.ts +++ b/src/decoders/info/info-tracker-name-chunk.ts @@ -1,16 +1,21 @@ -import type { InfoTrackerNameChunk, InfoTrackerNameChunkData } from '../../models/info/info-tracker-name-chunk.js'; +import type { + InfoTrackerNameChunk, + InfoTrackerNameChunkData, +} from '../../models/info/info-tracker-name-chunk.js'; import { Decoders } from '../index.js'; const nameDecoder = new TextDecoder(); export default (buffer: Uint8Array): InfoTrackerNameChunk => { - const chunk = Decoders.Chunk(buffer); + const chunk = Decoders.Chunk(buffer); - const data: InfoTrackerNameChunkData = { - trackerName: nameDecoder.decode(chunk.chunkData.subarray(0, chunk.header.dataLen)), - }; + const data: InfoTrackerNameChunkData = { + trackerName: nameDecoder.decode( + chunk.chunkData.subarray(0, chunk.header.dataLen) + ), + }; - return { - chunk, - data, - }; + return { + chunk, + data, + }; }; diff --git a/src/decoders/packet-header-chunk.ts b/src/decoders/packet-header-chunk.ts index c083921..48536cc 100644 --- a/src/decoders/packet-header-chunk.ts +++ b/src/decoders/packet-header-chunk.ts @@ -1,27 +1,30 @@ -import type { PacketHeaderChunk, PacketHeaderChunkData } from '../models/packet-header-chunk.js'; +import type { + PacketHeaderChunk, + PacketHeaderChunkData, +} from '../models/packet-header-chunk.js'; import { Decoders } from './index.js'; export default (buffer: Uint8Array): PacketHeaderChunk => { - const chunk = Decoders.Chunk(buffer); + const chunk = Decoders.Chunk(buffer); - let packetTimestamp = BigInt(chunk.chunkData[7]) << BigInt(56); - packetTimestamp += BigInt(chunk.chunkData[6]) << BigInt(48); - packetTimestamp += BigInt(chunk.chunkData[5]) << BigInt(40); - packetTimestamp += BigInt(chunk.chunkData[4]) << BigInt(32); - packetTimestamp += BigInt(chunk.chunkData[3]) << BigInt(24); - packetTimestamp += BigInt(chunk.chunkData[2]) << BigInt(16); - packetTimestamp += BigInt(chunk.chunkData[1]) << BigInt(8); - packetTimestamp += BigInt(chunk.chunkData[0]); - const data: PacketHeaderChunkData = { - packetTimestamp, - versionHigh: chunk.chunkData[8], - versionLow: chunk.chunkData[9], - frameId: chunk.chunkData[10], - framePacketCount: chunk.chunkData[11], - }; + let packetTimestamp = BigInt(chunk.chunkData[7]) << BigInt(56); + packetTimestamp += BigInt(chunk.chunkData[6]) << BigInt(48); + packetTimestamp += BigInt(chunk.chunkData[5]) << BigInt(40); + packetTimestamp += BigInt(chunk.chunkData[4]) << BigInt(32); + packetTimestamp += BigInt(chunk.chunkData[3]) << BigInt(24); + packetTimestamp += BigInt(chunk.chunkData[2]) << BigInt(16); + packetTimestamp += BigInt(chunk.chunkData[1]) << BigInt(8); + packetTimestamp += BigInt(chunk.chunkData[0]); + const data: PacketHeaderChunkData = { + packetTimestamp, + versionHigh: chunk.chunkData[8], + versionLow: chunk.chunkData[9], + frameId: chunk.chunkData[10], + framePacketCount: chunk.chunkData[11], + }; - return { - chunk, - data, - }; + return { + chunk, + data, + }; }; diff --git a/src/encoder.ts b/src/encoder.ts index a58a55f..de67401 100644 --- a/src/encoder.ts +++ b/src/encoder.ts @@ -2,131 +2,156 @@ import { Constants } from './constants.js'; import { Encoders, Tracker } from './index.js'; export class Encoder { - private systemName: string; - private versionHigh: number; - private versionLow: number; - dataFrameId: number = 1; - infoFrameId: number = 1; - constructor(systemName: string, versionHigh: number = 2, versionLow: number = 3) { - this.systemName = systemName; - this.versionHigh = versionHigh; - this.versionLow = versionLow; - } + private systemName: string; + private versionHigh: number; + private versionLow: number; + dataFrameId: number = 1; + infoFrameId: number = 1; + constructor( + systemName: string, + versionHigh: number = 2, + versionLow: number = 3 + ) { + this.systemName = systemName; + this.versionHigh = versionHigh; + this.versionLow = versionLow; + } - setSystemName(systemName: string) { - this.systemName = systemName; - } - setVersionHigh(versionHigh: number) { - this.versionHigh = versionHigh; - } + setSystemName(systemName: string) { + this.systemName = systemName; + } + setVersionHigh(versionHigh: number) { + this.versionHigh = versionHigh; + } - setVersionLow(versionLow: number) { - this.versionLow = versionLow; - } + setVersionLow(versionLow: number) { + this.versionLow = versionLow; + } - resetDataFrameId() { - this.dataFrameId = 1; - } + resetDataFrameId() { + this.dataFrameId = 1; + } - resetInfoFrameId() { - this.infoFrameId = 1; - } + resetInfoFrameId() { + this.infoFrameId = 1; + } - getInfoPackets(timestamp: bigint, trackers: Tracker[], frameId?: number) { - if (frameId !== undefined) { - if (!Number.isInteger(frameId)) { - throw new Error('frame id must be an integer'); - } + getInfoPackets(timestamp: bigint, trackers: Tracker[], frameId?: number) { + if (frameId !== undefined) { + if (!Number.isInteger(frameId)) { + throw new Error('frame id must be an integer'); + } - if (frameId > 255 || frameId < 0) { - throw new Error('frame id must be >= 0 and <= 255'); - } - } + if (frameId > 255 || frameId < 0) { + throw new Error('frame id must be >= 0 and <= 255'); + } + } - const systemNameChunk = Encoders.InfoSystemNameChunk(this.systemName); + const systemNameChunk = Encoders.InfoSystemNameChunk(this.systemName); - const trackerChunks = trackers.map((tracker: Tracker) => tracker.getInfoChunk()); + const trackerChunks = trackers.map((tracker: Tracker) => + tracker.getInfoChunk() + ); - const infoPackets: Uint8Array[] = []; + const infoPackets: Uint8Array[] = []; - const trackerChunksLists: Uint8Array[][] = []; - let currentTrackerList: Uint8Array[] = []; + const trackerChunksLists: Uint8Array[][] = []; + let currentTrackerList: Uint8Array[] = []; - let currentInfoPacketSize = Constants.PACKET_HEADER_SIZE + systemNameChunk.length + Constants.CHUNK_HEADER_SIZE; + let currentInfoPacketSize = + Constants.PACKET_HEADER_SIZE + + systemNameChunk.length + + Constants.CHUNK_HEADER_SIZE; - trackerChunks.forEach((trackerChunk: Uint8Array) => { - if (currentInfoPacketSize + trackerChunk.length > Constants.MAX_UDP_PACKET_SIZE) { - trackerChunksLists.push(currentTrackerList); - currentTrackerList = []; - currentInfoPacketSize = 0; - } - currentTrackerList.push(trackerChunk); - currentInfoPacketSize += trackerChunk.length; - }); - trackerChunksLists.push(currentTrackerList); - const header = Encoders.PacketHeaderChunk( - timestamp, - this.versionHigh, - this.versionLow, - frameId ? frameId : this.infoFrameId, - trackerChunksLists.length - ); - trackerChunksLists.forEach((trackerChunkList) => { - infoPackets.push( - Encoders.InfoPacketChunk(header, systemNameChunk, Encoders.InfoTrackerListChunk(trackerChunkList)) - ); - }); - this.infoFrameId += 1; - if (this.infoFrameId > 255) { - this.infoFrameId = 0; - } - return infoPackets; - } + trackerChunks.forEach((trackerChunk: Uint8Array) => { + if ( + currentInfoPacketSize + trackerChunk.length > + Constants.MAX_UDP_PACKET_SIZE + ) { + trackerChunksLists.push(currentTrackerList); + currentTrackerList = []; + currentInfoPacketSize = 0; + } + currentTrackerList.push(trackerChunk); + currentInfoPacketSize += trackerChunk.length; + }); + trackerChunksLists.push(currentTrackerList); + const header = Encoders.PacketHeaderChunk( + timestamp, + this.versionHigh, + this.versionLow, + frameId ? frameId : this.infoFrameId, + trackerChunksLists.length + ); + trackerChunksLists.forEach((trackerChunkList) => { + infoPackets.push( + Encoders.InfoPacketChunk( + header, + systemNameChunk, + Encoders.InfoTrackerListChunk(trackerChunkList) + ) + ); + }); + this.infoFrameId += 1; + if (this.infoFrameId > 255) { + this.infoFrameId = 0; + } + return infoPackets; + } - getDataPackets(timestamp: bigint, trackers: Tracker[], frameId?: number) { - if (frameId !== undefined) { - if (!Number.isInteger(frameId)) { - throw new Error('frame id must be an integer'); - } + getDataPackets(timestamp: bigint, trackers: Tracker[], frameId?: number) { + if (frameId !== undefined) { + if (!Number.isInteger(frameId)) { + throw new Error('frame id must be an integer'); + } - if (frameId > 255 || frameId < 0) { - throw new Error('frame id must be >= 0 and <= 255'); - } - } + if (frameId > 255 || frameId < 0) { + throw new Error('frame id must be >= 0 and <= 255'); + } + } - const allTrackerChunks = trackers.map((tracker) => tracker.getDataChunk()); - const dataPackets: Uint8Array[] = []; + const allTrackerChunks = trackers.map((tracker) => tracker.getDataChunk()); + const dataPackets: Uint8Array[] = []; - const trackerChunksLists: Uint8Array[][] = []; - let currentTrackerList: Uint8Array[] = []; + const trackerChunksLists: Uint8Array[][] = []; + let currentTrackerList: Uint8Array[] = []; - let currentDataPacketSize = Constants.PACKET_HEADER_SIZE + Constants.CHUNK_HEADER_SIZE; + let currentDataPacketSize = + Constants.PACKET_HEADER_SIZE + Constants.CHUNK_HEADER_SIZE; - allTrackerChunks.forEach((trackerChunk) => { - if (currentDataPacketSize + trackerChunk.length > Constants.MAX_UDP_PACKET_SIZE) { - trackerChunksLists.push(currentTrackerList); - currentTrackerList = []; - currentDataPacketSize = 0; - } - currentTrackerList.push(trackerChunk); - currentDataPacketSize += trackerChunk.length; - }); - trackerChunksLists.push(currentTrackerList); + allTrackerChunks.forEach((trackerChunk) => { + if ( + currentDataPacketSize + trackerChunk.length > + Constants.MAX_UDP_PACKET_SIZE + ) { + trackerChunksLists.push(currentTrackerList); + currentTrackerList = []; + currentDataPacketSize = 0; + } + currentTrackerList.push(trackerChunk); + currentDataPacketSize += trackerChunk.length; + }); + trackerChunksLists.push(currentTrackerList); - const header = Encoders.PacketHeaderChunk( - timestamp, - this.versionHigh, - this.versionLow, - frameId ? frameId : this.dataFrameId, - trackerChunksLists.length - ); - trackerChunksLists.forEach((trackerChunks) => { - dataPackets.push(Encoders.DataPacketChunk(header, Encoders.DataTrackerListChunk(trackerChunks))); - }); - this.dataFrameId += 1; - if (this.dataFrameId > 255) { - this.dataFrameId = 0; - } - return dataPackets; - } + const header = Encoders.PacketHeaderChunk( + timestamp, + this.versionHigh, + this.versionLow, + frameId ? frameId : this.dataFrameId, + trackerChunksLists.length + ); + trackerChunksLists.forEach((trackerChunks) => { + dataPackets.push( + Encoders.DataPacketChunk( + header, + Encoders.DataTrackerListChunk(trackerChunks) + ) + ); + }); + this.dataFrameId += 1; + if (this.dataFrameId > 255) { + this.dataFrameId = 0; + } + return dataPackets; + } } diff --git a/src/encoders/chunk.ts b/src/encoders/chunk.ts index 252cd60..1a783b3 100644 --- a/src/encoders/chunk.ts +++ b/src/encoders/chunk.ts @@ -1,25 +1,29 @@ const header = new DataView(new ArrayBuffer(4)); -export default (id: number, chunkData: Uint8Array, hasSubchunks: boolean): Uint8Array => { - if (!Number.isInteger(id)) { - throw new Error('chunk id must be an integer'); - } +export default ( + id: number, + chunkData: Uint8Array, + hasSubchunks: boolean +): Uint8Array => { + if (!Number.isInteger(id)) { + throw new Error('chunk id must be an integer'); + } - if (id > 0xffff || id < 0) { - throw new Error('chunk id must be >= 0 and <= 65535'); - } + if (id > 0xffff || id < 0) { + throw new Error('chunk id must be >= 0 and <= 65535'); + } - if (chunkData.length > 0x7fff) { - throw new Error('chunkData can not be greater than 32767 bytes'); - } + if (chunkData.length > 0x7fff) { + throw new Error('chunkData can not be greater than 32767 bytes'); + } - header.setUint16(0, id, true); - const hasSubChunksBit = (hasSubchunks ? 1 : 0) << 15; - header.setUint16(2, hasSubChunksBit + chunkData.length, true); + header.setUint16(0, id, true); + const hasSubChunksBit = (hasSubchunks ? 1 : 0) << 15; + header.setUint16(2, hasSubChunksBit + chunkData.length, true); - const headerBytes = new Uint8Array(header.buffer); + const headerBytes = new Uint8Array(header.buffer); - const bytes = new Uint8Array(headerBytes.length + chunkData.length); - bytes.set(headerBytes); - bytes.set(chunkData, headerBytes.length); - return bytes; + const bytes = new Uint8Array(headerBytes.length + chunkData.length); + bytes.set(headerBytes); + bytes.set(chunkData, headerBytes.length); + return bytes; }; diff --git a/src/encoders/data/data-packet-chunk.ts b/src/encoders/data/data-packet-chunk.ts index e22d828..0c06a82 100644 --- a/src/encoders/data/data-packet-chunk.ts +++ b/src/encoders/data/data-packet-chunk.ts @@ -1,7 +1,12 @@ import chunk from '../chunk.js'; -export default (packetHeaderChunk: Uint8Array, trackerListChunk: Uint8Array): Uint8Array => { - const chunkData = new Uint8Array(packetHeaderChunk.length + trackerListChunk.length); - chunkData.set(packetHeaderChunk); - chunkData.set(trackerListChunk, packetHeaderChunk.length); - return chunk(0x6755, chunkData, true); +export default ( + packetHeaderChunk: Uint8Array, + trackerListChunk: Uint8Array +): Uint8Array => { + const chunkData = new Uint8Array( + packetHeaderChunk.length + trackerListChunk.length + ); + chunkData.set(packetHeaderChunk); + chunkData.set(trackerListChunk, packetHeaderChunk.length); + return chunk(0x6755, chunkData, true); }; diff --git a/src/encoders/data/data-tracker-accel-chunk.ts b/src/encoders/data/data-tracker-accel-chunk.ts index 620d2f6..44b6f46 100644 --- a/src/encoders/data/data-tracker-accel-chunk.ts +++ b/src/encoders/data/data-tracker-accel-chunk.ts @@ -2,8 +2,8 @@ import chunk from '../chunk.js'; const floatArray = new Float32Array(3); export default (x: number, y: number, z: number): Uint8Array => { - floatArray[0] = x; - floatArray[1] = y; - floatArray[2] = z; - return chunk(0x0004, new Uint8Array(floatArray.buffer), false); + floatArray[0] = x; + floatArray[1] = y; + floatArray[2] = z; + return chunk(0x0004, new Uint8Array(floatArray.buffer), false); }; diff --git a/src/encoders/data/data-tracker-chunk.ts b/src/encoders/data/data-tracker-chunk.ts index cc4ba69..fc0621b 100644 --- a/src/encoders/data/data-tracker-chunk.ts +++ b/src/encoders/data/data-tracker-chunk.ts @@ -1,20 +1,20 @@ import chunk from '../chunk.js'; export default (trackerId: number, fieldChunks: Uint8Array[]): Uint8Array => { - let fieldChunksTotalLength = 0; + let fieldChunksTotalLength = 0; - fieldChunks.forEach((fieldChunk) => { - fieldChunksTotalLength += fieldChunk.length; - }); + fieldChunks.forEach((fieldChunk) => { + fieldChunksTotalLength += fieldChunk.length; + }); - const fieldChunksBytes = new Uint8Array(fieldChunksTotalLength); + const fieldChunksBytes = new Uint8Array(fieldChunksTotalLength); - let offset = 0; + let offset = 0; - fieldChunks.forEach((fieldChunk) => { - fieldChunksBytes.set(fieldChunk, offset); - offset += fieldChunk.length; - }); + fieldChunks.forEach((fieldChunk) => { + fieldChunksBytes.set(fieldChunk, offset); + offset += fieldChunk.length; + }); - return chunk(trackerId, fieldChunksBytes, fieldChunks.length > 0); + return chunk(trackerId, fieldChunksBytes, fieldChunks.length > 0); }; diff --git a/src/encoders/data/data-tracker-list-chunk.ts b/src/encoders/data/data-tracker-list-chunk.ts index 5281af1..16ceca3 100644 --- a/src/encoders/data/data-tracker-list-chunk.ts +++ b/src/encoders/data/data-tracker-list-chunk.ts @@ -1,20 +1,20 @@ import chunk from '../chunk.js'; export default (trackerChunks: Uint8Array[]) => { - let trackerChunksTotalLength = 0; + let trackerChunksTotalLength = 0; - trackerChunks.forEach((trackerChunk) => { - trackerChunksTotalLength += trackerChunk.length; - }); + trackerChunks.forEach((trackerChunk) => { + trackerChunksTotalLength += trackerChunk.length; + }); - const trackerChunksBytes = new Uint8Array(trackerChunksTotalLength); + const trackerChunksBytes = new Uint8Array(trackerChunksTotalLength); - let offset = 0; + let offset = 0; - trackerChunks.forEach((trackerChunk) => { - trackerChunksBytes.set(trackerChunk, offset); - offset += trackerChunk.length; - }); + trackerChunks.forEach((trackerChunk) => { + trackerChunksBytes.set(trackerChunk, offset); + offset += trackerChunk.length; + }); - return chunk(0x0001, trackerChunksBytes, true); + return chunk(0x0001, trackerChunksBytes, true); }; diff --git a/src/encoders/data/data-tracker-ori-chunk.ts b/src/encoders/data/data-tracker-ori-chunk.ts index 88aad14..9f8a333 100644 --- a/src/encoders/data/data-tracker-ori-chunk.ts +++ b/src/encoders/data/data-tracker-ori-chunk.ts @@ -2,8 +2,8 @@ import chunk from '../chunk.js'; const floatArray = new Float32Array(3); export default (x: number, y: number, z: number): Uint8Array => { - floatArray[0] = x; - floatArray[1] = y; - floatArray[2] = z; - return chunk(0x0002, new Uint8Array(floatArray.buffer), false); + floatArray[0] = x; + floatArray[1] = y; + floatArray[2] = z; + return chunk(0x0002, new Uint8Array(floatArray.buffer), false); }; diff --git a/src/encoders/data/data-tracker-pos-chunk.ts b/src/encoders/data/data-tracker-pos-chunk.ts index db46723..c562da3 100644 --- a/src/encoders/data/data-tracker-pos-chunk.ts +++ b/src/encoders/data/data-tracker-pos-chunk.ts @@ -2,9 +2,9 @@ import chunk from '../chunk.js'; const floatArray = new Float32Array(3); export default (x: number, y: number, z: number): Uint8Array => { - floatArray[0] = x; - floatArray[1] = y; - floatArray[2] = z; + floatArray[0] = x; + floatArray[1] = y; + floatArray[2] = z; - return chunk(0x0000, new Uint8Array(floatArray.buffer), false); + return chunk(0x0000, new Uint8Array(floatArray.buffer), false); }; diff --git a/src/encoders/data/data-tracker-speed-chunk.ts b/src/encoders/data/data-tracker-speed-chunk.ts index bc0d4bc..58ad1c3 100644 --- a/src/encoders/data/data-tracker-speed-chunk.ts +++ b/src/encoders/data/data-tracker-speed-chunk.ts @@ -2,9 +2,9 @@ import chunk from '../chunk.js'; const floatArray = new Float32Array(3); export default (x: number, y: number, z: number): Uint8Array => { - floatArray[0] = x; - floatArray[1] = y; - floatArray[2] = z; + floatArray[0] = x; + floatArray[1] = y; + floatArray[2] = z; - return chunk(0x0001, new Uint8Array(floatArray.buffer), false); + return chunk(0x0001, new Uint8Array(floatArray.buffer), false); }; diff --git a/src/encoders/data/data-tracker-status-chunk.ts b/src/encoders/data/data-tracker-status-chunk.ts index de090c9..837aa86 100644 --- a/src/encoders/data/data-tracker-status-chunk.ts +++ b/src/encoders/data/data-tracker-status-chunk.ts @@ -2,6 +2,6 @@ import chunk from '../chunk.js'; const floatArray = new Float32Array(1); export default (validity: number): Uint8Array => { - floatArray[0] = validity; - return chunk(0x0003, new Uint8Array(floatArray.buffer), false); + floatArray[0] = validity; + return chunk(0x0003, new Uint8Array(floatArray.buffer), false); }; diff --git a/src/encoders/data/data-tracker-timestamp-chunk.ts b/src/encoders/data/data-tracker-timestamp-chunk.ts index 1c50d7a..097ea32 100644 --- a/src/encoders/data/data-tracker-timestamp-chunk.ts +++ b/src/encoders/data/data-tracker-timestamp-chunk.ts @@ -2,6 +2,6 @@ import chunk from '../chunk.js'; const buf = new DataView(new ArrayBuffer(8)); export default (timestamp: bigint): Uint8Array => { - buf.setBigUint64(0, BigInt(timestamp), true); - return chunk(0x0006, new Uint8Array(buf.buffer), false); + buf.setBigUint64(0, BigInt(timestamp), true); + return chunk(0x0006, new Uint8Array(buf.buffer), false); }; diff --git a/src/encoders/data/data-tracker-trgtpos-chunk.ts b/src/encoders/data/data-tracker-trgtpos-chunk.ts index 4609afb..7f4304c 100644 --- a/src/encoders/data/data-tracker-trgtpos-chunk.ts +++ b/src/encoders/data/data-tracker-trgtpos-chunk.ts @@ -2,9 +2,9 @@ import chunk from '../chunk.js'; const floatArray = new Float32Array(3); export default (x: number, y: number, z: number): Uint8Array => { - floatArray[0] = x; - floatArray[1] = y; - floatArray[2] = z; + floatArray[0] = x; + floatArray[1] = y; + floatArray[2] = z; - return chunk(0x0005, new Uint8Array(floatArray.buffer), false); + return chunk(0x0005, new Uint8Array(floatArray.buffer), false); }; diff --git a/src/encoders/index.ts b/src/encoders/index.ts index d20bad0..818f7c4 100644 --- a/src/encoders/index.ts +++ b/src/encoders/index.ts @@ -18,21 +18,21 @@ import InfoTrackerListChunk from './info/info-tracker-list-chunk.js'; import InfoTrackerNameChunk from './info/info-tracker-name-chunk.js'; export const Encoders = { - DataPacketChunk, - DataTrackerAccelChunk, - DataTrackerChunk, - DataTrackerListChunk, - DataTrackerOriChunk, - DataTrackerPosChunk, - DataTrackerSpeedChunk, - DataTrackerStatusChunk, - DataTrackerTimestampChunk, - DataTrackerTrgtposChunk, - InfoPacketChunk, - InfoSystemNameChunk, - InfoTrackerChunk, - InfoTrackerListChunk, - InfoTrackerNameChunk, - PacketHeaderChunk, - Chunk, + DataPacketChunk, + DataTrackerAccelChunk, + DataTrackerChunk, + DataTrackerListChunk, + DataTrackerOriChunk, + DataTrackerPosChunk, + DataTrackerSpeedChunk, + DataTrackerStatusChunk, + DataTrackerTimestampChunk, + DataTrackerTrgtposChunk, + InfoPacketChunk, + InfoSystemNameChunk, + InfoTrackerChunk, + InfoTrackerListChunk, + InfoTrackerNameChunk, + PacketHeaderChunk, + Chunk, }; diff --git a/src/encoders/info/info-packet-chunk.ts b/src/encoders/info/info-packet-chunk.ts index 98dac52..67b3251 100644 --- a/src/encoders/info/info-packet-chunk.ts +++ b/src/encoders/info/info-packet-chunk.ts @@ -1,14 +1,19 @@ import chunk from '../chunk.js'; export default ( - packetHeaderChunk: Uint8Array, - systemNameChunk: Uint8Array, - trackerListChunk: Uint8Array + packetHeaderChunk: Uint8Array, + systemNameChunk: Uint8Array, + trackerListChunk: Uint8Array ): Uint8Array => { - const chunkData = new Uint8Array(packetHeaderChunk.length + systemNameChunk.length + trackerListChunk.length); + const chunkData = new Uint8Array( + packetHeaderChunk.length + systemNameChunk.length + trackerListChunk.length + ); - chunkData.set(packetHeaderChunk); - chunkData.set(systemNameChunk, packetHeaderChunk.length); - chunkData.set(trackerListChunk, packetHeaderChunk.length + systemNameChunk.length); - return chunk(0x6756, chunkData, true); + chunkData.set(packetHeaderChunk); + chunkData.set(systemNameChunk, packetHeaderChunk.length); + chunkData.set( + trackerListChunk, + packetHeaderChunk.length + systemNameChunk.length + ); + return chunk(0x6756, chunkData, true); }; diff --git a/src/encoders/info/info-system-name-chunk.ts b/src/encoders/info/info-system-name-chunk.ts index b4be55f..e495aff 100644 --- a/src/encoders/info/info-system-name-chunk.ts +++ b/src/encoders/info/info-system-name-chunk.ts @@ -1,3 +1,4 @@ import chunk from '../chunk.js'; const nameEncoder = new TextEncoder(); -export default (systemName: string): Uint8Array => chunk(0x0001, nameEncoder.encode(systemName), false); +export default (systemName: string): Uint8Array => + chunk(0x0001, nameEncoder.encode(systemName), false); diff --git a/src/encoders/info/info-tracker-chunk.ts b/src/encoders/info/info-tracker-chunk.ts index 0236efa..4d0ae23 100644 --- a/src/encoders/info/info-tracker-chunk.ts +++ b/src/encoders/info/info-tracker-chunk.ts @@ -1,4 +1,4 @@ import chunk from '../chunk.js'; export default (trackerId: number, trackerNameChunk: Uint8Array): Uint8Array => - chunk(trackerId, trackerNameChunk, true); + chunk(trackerId, trackerNameChunk, true); diff --git a/src/encoders/info/info-tracker-list-chunk.ts b/src/encoders/info/info-tracker-list-chunk.ts index e1958f7..29b23c0 100644 --- a/src/encoders/info/info-tracker-list-chunk.ts +++ b/src/encoders/info/info-tracker-list-chunk.ts @@ -1,19 +1,19 @@ import chunk from '../chunk.js'; export default (trackerChunks: Uint8Array[]): Uint8Array => { - let trackerChunksTotalLength = 0; + let trackerChunksTotalLength = 0; - trackerChunks.forEach((trackerChunk) => { - trackerChunksTotalLength += trackerChunk.length; - }); + trackerChunks.forEach((trackerChunk) => { + trackerChunksTotalLength += trackerChunk.length; + }); - const trackerChunksBytes = new Uint8Array(trackerChunksTotalLength); + const trackerChunksBytes = new Uint8Array(trackerChunksTotalLength); - let offset = 0; + let offset = 0; - trackerChunks.forEach((trackerChunk) => { - trackerChunksBytes.set(trackerChunk, offset); - offset += trackerChunk.length; - }); - return chunk(0x0002, trackerChunksBytes, true); + trackerChunks.forEach((trackerChunk) => { + trackerChunksBytes.set(trackerChunk, offset); + offset += trackerChunk.length; + }); + return chunk(0x0002, trackerChunksBytes, true); }; diff --git a/src/encoders/info/info-tracker-name-chunk.ts b/src/encoders/info/info-tracker-name-chunk.ts index 298d57e..655a6b1 100644 --- a/src/encoders/info/info-tracker-name-chunk.ts +++ b/src/encoders/info/info-tracker-name-chunk.ts @@ -1,4 +1,5 @@ import chunk from '../chunk.js'; const nameEncoder = new TextEncoder(); -export default (trackerName: string) => chunk(0x0000, nameEncoder.encode(trackerName), false); +export default (trackerName: string) => + chunk(0x0000, nameEncoder.encode(trackerName), false); diff --git a/src/encoders/packet-header-chunk.ts b/src/encoders/packet-header-chunk.ts index ba06a1d..f140d69 100644 --- a/src/encoders/packet-header-chunk.ts +++ b/src/encoders/packet-header-chunk.ts @@ -2,43 +2,43 @@ import chunk from './chunk.js'; const packetHeader = new DataView(new ArrayBuffer(12)); export default ( - timestamp: bigint, - versionHigh: number, - versionLow: number, - frameId: number, - framePacketCount: number + timestamp: bigint, + versionHigh: number, + versionLow: number, + frameId: number, + framePacketCount: number ): Uint8Array => { - if (!Number.isInteger(versionHigh)) { - throw new Error('version high must be an integer'); - } - if (!Number.isInteger(versionLow)) { - throw new Error('version low must be an integer'); - } - if (!Number.isInteger(frameId)) { - throw new Error('frame id must be an integer'); - } - if (!Number.isInteger(framePacketCount)) { - throw new Error('frame packet count must be an integer'); - } + if (!Number.isInteger(versionHigh)) { + throw new Error('version high must be an integer'); + } + if (!Number.isInteger(versionLow)) { + throw new Error('version low must be an integer'); + } + if (!Number.isInteger(frameId)) { + throw new Error('frame id must be an integer'); + } + if (!Number.isInteger(framePacketCount)) { + throw new Error('frame packet count must be an integer'); + } - if (versionHigh > 255 || versionHigh < 0) { - throw new Error('version high must be >= 0 and <= 255'); - } - if (versionLow > 255 || versionLow < 0) { - throw new Error('version low must be >= 0 and <= 255'); - } - if (frameId > 255 || frameId < 0) { - throw new Error('frame id must be >= 0 and <= 255'); - } - if (framePacketCount > 255 || framePacketCount < 0) { - throw new Error('frame packet count must be >= 0 and <= 255'); - } + if (versionHigh > 255 || versionHigh < 0) { + throw new Error('version high must be >= 0 and <= 255'); + } + if (versionLow > 255 || versionLow < 0) { + throw new Error('version low must be >= 0 and <= 255'); + } + if (frameId > 255 || frameId < 0) { + throw new Error('frame id must be >= 0 and <= 255'); + } + if (framePacketCount > 255 || framePacketCount < 0) { + throw new Error('frame packet count must be >= 0 and <= 255'); + } - packetHeader.setBigUint64(0, BigInt(timestamp), true); - packetHeader.setUint8(8, versionHigh); - packetHeader.setUint8(9, versionLow); - packetHeader.setUint8(10, frameId); - packetHeader.setUint8(11, framePacketCount); + packetHeader.setBigUint64(0, BigInt(timestamp), true); + packetHeader.setUint8(8, versionHigh); + packetHeader.setUint8(9, versionLow); + packetHeader.setUint8(10, frameId); + packetHeader.setUint8(11, framePacketCount); - return chunk(0x0000, new Uint8Array(packetHeader.buffer), false); + return chunk(0x0000, new Uint8Array(packetHeader.buffer), false); }; diff --git a/src/models/chunk.ts b/src/models/chunk.ts index f3ba498..19977e6 100644 --- a/src/models/chunk.ts +++ b/src/models/chunk.ts @@ -1,10 +1,10 @@ export interface ChunkHeader { - id: number; - dataLen: number; - hasSubchunks: boolean; + id: number; + dataLen: number; + hasSubchunks: boolean; } export interface Chunk { - chunkData: Uint8Array; - header: ChunkHeader; + chunkData: Uint8Array; + header: ChunkHeader; } diff --git a/src/models/data/data-packet-chunk.ts b/src/models/data/data-packet-chunk.ts index c4430ae..ec1fb85 100644 --- a/src/models/data/data-packet-chunk.ts +++ b/src/models/data/data-packet-chunk.ts @@ -3,11 +3,11 @@ import type { PacketHeaderChunk } from '../packet-header-chunk.js'; import type { DataTrackerListChunk } from './data-tracker-list-chunk.js'; export interface DataPacketChunkData { - packetHeader?: PacketHeaderChunk; - trackerList?: DataTrackerListChunk; + packetHeader?: PacketHeaderChunk; + trackerList?: DataTrackerListChunk; } export interface DataPacketChunk { - chunk: Chunk; - data: DataPacketChunkData; + chunk: Chunk; + data: DataPacketChunkData; } diff --git a/src/models/data/data-tracker-chunk.ts b/src/models/data/data-tracker-chunk.ts index 090e00b..d684489 100644 --- a/src/models/data/data-tracker-chunk.ts +++ b/src/models/data/data-tracker-chunk.ts @@ -4,16 +4,16 @@ import type { DataTrackerTimestampChunk } from './data-tracker-timestamp-chunk.j import type { DataTrackerXYZChunk } from './data-tracker-xyz-chunk.js'; export interface DataTrackerChunkData { - pos?: DataTrackerXYZChunk; - speed?: DataTrackerXYZChunk; - ori?: DataTrackerXYZChunk; - status?: DataTrackerStatusChunk; - accel?: DataTrackerXYZChunk; - trgtpos?: DataTrackerXYZChunk; - timestamp?: DataTrackerTimestampChunk; + pos?: DataTrackerXYZChunk; + speed?: DataTrackerXYZChunk; + ori?: DataTrackerXYZChunk; + status?: DataTrackerStatusChunk; + accel?: DataTrackerXYZChunk; + trgtpos?: DataTrackerXYZChunk; + timestamp?: DataTrackerTimestampChunk; } export interface DataTrackerChunk { - chunk: Chunk; - data: DataTrackerChunkData; + chunk: Chunk; + data: DataTrackerChunkData; } diff --git a/src/models/data/data-tracker-list-chunk.ts b/src/models/data/data-tracker-list-chunk.ts index 4bd8f52..81c6baf 100644 --- a/src/models/data/data-tracker-list-chunk.ts +++ b/src/models/data/data-tracker-list-chunk.ts @@ -2,10 +2,10 @@ import type { Chunk } from '../chunk.js'; import type { DataTrackerChunk } from './data-tracker-chunk.js'; export interface DataTrackerListChunkData { - trackers: DataTrackerChunk[]; + trackers: DataTrackerChunk[]; } export interface DataTrackerListChunk { - chunk: Chunk; - data: DataTrackerListChunkData; + chunk: Chunk; + data: DataTrackerListChunkData; } diff --git a/src/models/data/data-tracker-status-chunk.ts b/src/models/data/data-tracker-status-chunk.ts index dd3d0e8..8e65ee5 100644 --- a/src/models/data/data-tracker-status-chunk.ts +++ b/src/models/data/data-tracker-status-chunk.ts @@ -1,10 +1,10 @@ import type { Chunk } from '../chunk.js'; export interface DataTrackerStatusChunkData { - validity: number; + validity: number; } export interface DataTrackerStatusChunk { - chunk: Chunk; - data: DataTrackerStatusChunkData; + chunk: Chunk; + data: DataTrackerStatusChunkData; } diff --git a/src/models/data/data-tracker-timestamp-chunk.ts b/src/models/data/data-tracker-timestamp-chunk.ts index 459740f..e4f3a28 100644 --- a/src/models/data/data-tracker-timestamp-chunk.ts +++ b/src/models/data/data-tracker-timestamp-chunk.ts @@ -1,10 +1,10 @@ import type { Chunk } from '../chunk.js'; export interface DataTrackerTimestampChunkData { - timestamp: bigint; + timestamp: bigint; } export interface DataTrackerTimestampChunk { - chunk: Chunk; - data: DataTrackerTimestampChunkData; + chunk: Chunk; + data: DataTrackerTimestampChunkData; } diff --git a/src/models/data/data-tracker-xyz-chunk.ts b/src/models/data/data-tracker-xyz-chunk.ts index 21df4a1..7b9ef8c 100644 --- a/src/models/data/data-tracker-xyz-chunk.ts +++ b/src/models/data/data-tracker-xyz-chunk.ts @@ -1,12 +1,12 @@ import type { Chunk } from '../chunk.js'; export interface DataTrackerXYZChunkData { - x: number; - y: number; - z: number; + x: number; + y: number; + z: number; } export interface DataTrackerXYZChunk { - chunk: Chunk; - data: DataTrackerXYZChunkData; + chunk: Chunk; + data: DataTrackerXYZChunkData; } diff --git a/src/models/info/info-packet-chunk.ts b/src/models/info/info-packet-chunk.ts index 0b15fd4..b872a23 100644 --- a/src/models/info/info-packet-chunk.ts +++ b/src/models/info/info-packet-chunk.ts @@ -4,11 +4,11 @@ import type { InfoSystemNameChunk } from './info-system-name-chunk.js'; import type { InfoTrackerListChunk } from './info-tracker-list-chunk.js'; export interface InfoPacketChunkData { - packetHeader?: PacketHeaderChunk; - systemName?: InfoSystemNameChunk; - trackerList?: InfoTrackerListChunk; + packetHeader?: PacketHeaderChunk; + systemName?: InfoSystemNameChunk; + trackerList?: InfoTrackerListChunk; } export interface InfoPacketChunk { - chunk: Chunk; - data: InfoPacketChunkData; + chunk: Chunk; + data: InfoPacketChunkData; } diff --git a/src/models/info/info-system-name-chunk.ts b/src/models/info/info-system-name-chunk.ts index 62383e3..3a69c58 100644 --- a/src/models/info/info-system-name-chunk.ts +++ b/src/models/info/info-system-name-chunk.ts @@ -1,10 +1,10 @@ import type { Chunk } from '../chunk.js'; export interface InfoSystemNameChunkData { - systemName: string; + systemName: string; } export interface InfoSystemNameChunk { - chunk: Chunk; - data: InfoSystemNameChunkData; + chunk: Chunk; + data: InfoSystemNameChunkData; } diff --git a/src/models/info/info-tracker-chunk.ts b/src/models/info/info-tracker-chunk.ts index 9da27ec..fe5ba34 100644 --- a/src/models/info/info-tracker-chunk.ts +++ b/src/models/info/info-tracker-chunk.ts @@ -2,10 +2,10 @@ import type { Chunk } from '../chunk.js'; import type { InfoTrackerNameChunk } from './info-tracker-name-chunk.js'; export interface InfoTrackerChunkData { - trackerName: InfoTrackerNameChunk; + trackerName: InfoTrackerNameChunk; } export interface InfoTrackerChunk { - chunk: Chunk; - data?: InfoTrackerChunkData; + chunk: Chunk; + data?: InfoTrackerChunkData; } diff --git a/src/models/info/info-tracker-list-chunk.ts b/src/models/info/info-tracker-list-chunk.ts index 66428c7..91c609d 100644 --- a/src/models/info/info-tracker-list-chunk.ts +++ b/src/models/info/info-tracker-list-chunk.ts @@ -2,10 +2,10 @@ import type { Chunk } from '../chunk.js'; import type { InfoTrackerChunk } from './info-tracker-chunk.js'; export interface InfoTrackerListChunkData { - trackers: InfoTrackerChunk[]; + trackers: InfoTrackerChunk[]; } export interface InfoTrackerListChunk { - chunk: Chunk; - data: InfoTrackerListChunkData; + chunk: Chunk; + data: InfoTrackerListChunkData; } diff --git a/src/models/info/info-tracker-name-chunk.ts b/src/models/info/info-tracker-name-chunk.ts index ea527b2..afb694b 100644 --- a/src/models/info/info-tracker-name-chunk.ts +++ b/src/models/info/info-tracker-name-chunk.ts @@ -1,10 +1,10 @@ import type { Chunk } from '../chunk.js'; export interface InfoTrackerNameChunkData { - trackerName: string; + trackerName: string; } export interface InfoTrackerNameChunk { - chunk: Chunk; - data: InfoTrackerNameChunkData; + chunk: Chunk; + data: InfoTrackerNameChunkData; } diff --git a/src/models/packet-header-chunk.ts b/src/models/packet-header-chunk.ts index 96b4154..8fab222 100644 --- a/src/models/packet-header-chunk.ts +++ b/src/models/packet-header-chunk.ts @@ -1,14 +1,14 @@ import type { Chunk } from './chunk.js'; export interface PacketHeaderChunkData { - packetTimestamp: bigint; - versionHigh: number; - versionLow: number; - frameId: number; - framePacketCount: number; + packetTimestamp: bigint; + versionHigh: number; + versionLow: number; + frameId: number; + framePacketCount: number; } export interface PacketHeaderChunk { - chunk: Chunk; - data: PacketHeaderChunkData; + chunk: Chunk; + data: PacketHeaderChunkData; } diff --git a/src/models/tracker.ts b/src/models/tracker.ts index edc4392..0446d8e 100644 --- a/src/models/tracker.ts +++ b/src/models/tracker.ts @@ -12,211 +12,228 @@ import type { DataTrackerChunk } from './data/data-tracker-chunk.js'; import type { InfoTrackerChunk } from './info/info-tracker-chunk.js'; export type XYZData = { - x: number; - y: number; - z: number; + x: number; + y: number; + z: number; }; export class Tracker { - id: number; - name: string; - pos?: XYZData; - speed?: XYZData; - ori?: XYZData; - validity?: number; - accel?: XYZData; - trgtpos?: XYZData; - timestamp?: bigint; + id: number; + name: string; + pos?: XYZData; + speed?: XYZData; + ori?: XYZData; + validity?: number; + accel?: XYZData; + trgtpos?: XYZData; + timestamp?: bigint; - constructor(id: number, name: string) { - this.id = id; - this.name = name; - this.pos = undefined; - this.speed = undefined; - this.ori = undefined; - this.validity = undefined; - this.accel = undefined; - this.trgtpos = undefined; - this.timestamp = undefined; - } + constructor(id: number, name: string) { + this.id = id; + this.name = name; + this.pos = undefined; + this.speed = undefined; + this.ori = undefined; + this.validity = undefined; + this.accel = undefined; + this.trgtpos = undefined; + this.timestamp = undefined; + } - setPos(x: number, y: number, z: number) { - if (this.pos === undefined) { - this.pos = { - x, - y, - z, - }; - } else { - this.pos.x = x; - this.pos.y = y; - this.pos.z = z; - } - } + setPos(x: number, y: number, z: number) { + if (this.pos === undefined) { + this.pos = { + x, + y, + z, + }; + } else { + this.pos.x = x; + this.pos.y = y; + this.pos.z = z; + } + } - setSpeed(x: number, y: number, z: number) { - if (this.speed === undefined) { - this.speed = { - x, - y, - z, - }; - } else { - this.speed.x = x; - this.speed.y = y; - this.speed.z = z; - } - } + setSpeed(x: number, y: number, z: number) { + if (this.speed === undefined) { + this.speed = { + x, + y, + z, + }; + } else { + this.speed.x = x; + this.speed.y = y; + this.speed.z = z; + } + } - setOri(x: number, y: number, z: number) { - if (this.ori === undefined) { - this.ori = { - x, - y, - z, - }; - } else { - this.ori.x = x; - this.ori.y = y; - this.ori.z = z; - } - } + setOri(x: number, y: number, z: number) { + if (this.ori === undefined) { + this.ori = { + x, + y, + z, + }; + } else { + this.ori.x = x; + this.ori.y = y; + this.ori.z = z; + } + } - setStatus(validity: number) { - this.validity = validity; - } + setStatus(validity: number) { + this.validity = validity; + } - setAccel(x: number, y: number, z: number) { - if (this.accel === undefined) { - this.accel = { - x, - y, - z, - }; - } else { - this.accel.x = x; - this.accel.y = y; - this.accel.z = z; - } - } + setAccel(x: number, y: number, z: number) { + if (this.accel === undefined) { + this.accel = { + x, + y, + z, + }; + } else { + this.accel.x = x; + this.accel.y = y; + this.accel.z = z; + } + } - setTrgtPos(x: number, y: number, z: number) { - if (this.trgtpos === undefined) { - this.trgtpos = { - x, - y, - z, - }; - } else { - this.trgtpos.x = x; - this.trgtpos.y = y; - this.trgtpos.z = z; - } - } + setTrgtPos(x: number, y: number, z: number) { + if (this.trgtpos === undefined) { + this.trgtpos = { + x, + y, + z, + }; + } else { + this.trgtpos.x = x; + this.trgtpos.y = y; + this.trgtpos.z = z; + } + } - setTimestamp(timestamp: bigint) { - this.timestamp = timestamp; - } + setTimestamp(timestamp: bigint) { + this.timestamp = timestamp; + } - getDataChunk() { - const fieldChunks: Uint8Array[] = []; + getDataChunk() { + const fieldChunks: Uint8Array[] = []; - if (this.pos) { - fieldChunks.push(dataTrackerPosChunk(this.pos.x, this.pos.y, this.pos.z)); - } + if (this.pos) { + fieldChunks.push(dataTrackerPosChunk(this.pos.x, this.pos.y, this.pos.z)); + } - if (this.speed) { - fieldChunks.push(dataTrackerSpeedChunk(this.speed.x, this.speed.y, this.speed.z)); - } + if (this.speed) { + fieldChunks.push( + dataTrackerSpeedChunk(this.speed.x, this.speed.y, this.speed.z) + ); + } - if (this.ori) { - fieldChunks.push(dataTrackerOriChunk(this.ori.x, this.ori.y, this.ori.z)); - } + if (this.ori) { + fieldChunks.push(dataTrackerOriChunk(this.ori.x, this.ori.y, this.ori.z)); + } - if (this.validity) { - fieldChunks.push(dataTrackerStatusChunk(this.validity)); - } + if (this.validity) { + fieldChunks.push(dataTrackerStatusChunk(this.validity)); + } - if (this.accel) { - fieldChunks.push(dataTrackerAccelChunk(this.accel.x, this.accel.y, this.accel.z)); - } + if (this.accel) { + fieldChunks.push( + dataTrackerAccelChunk(this.accel.x, this.accel.y, this.accel.z) + ); + } - if (this.trgtpos) { - fieldChunks.push(dataTrackerTrgtposChunk(this.trgtpos.x, this.trgtpos.y, this.trgtpos.z)); - } + if (this.trgtpos) { + fieldChunks.push( + dataTrackerTrgtposChunk(this.trgtpos.x, this.trgtpos.y, this.trgtpos.z) + ); + } - if (this.timestamp) { - fieldChunks.push(dataTrackerTimestampChunk(this.timestamp)); - } + if (this.timestamp) { + fieldChunks.push(dataTrackerTimestampChunk(this.timestamp)); + } - return dataTrackerChunk(this.id, fieldChunks); - } + return dataTrackerChunk(this.id, fieldChunks); + } - getInfoChunk() { - return infoTrackerChunk(this.id, infoTrackerNameChunk(this.name)); - } + getInfoChunk() { + return infoTrackerChunk(this.id, infoTrackerNameChunk(this.name)); + } - updateInfo(infoTrackerChunk: InfoTrackerChunk) { - if (infoTrackerChunk.data) { - this.name = infoTrackerChunk.data.trackerName.data.trackerName; - } - } + updateInfo(infoTrackerChunk: InfoTrackerChunk) { + if (infoTrackerChunk.data) { + this.name = infoTrackerChunk.data.trackerName.data.trackerName; + } + } - updateData(dataTrackerChunk: DataTrackerChunk) { - if (dataTrackerChunk.data.pos) { - this.setPos(dataTrackerChunk.data.pos.data.x, dataTrackerChunk.data.pos.data.y, dataTrackerChunk.data.pos.data.z); - } + updateData(dataTrackerChunk: DataTrackerChunk) { + if (dataTrackerChunk.data.pos) { + this.setPos( + dataTrackerChunk.data.pos.data.x, + dataTrackerChunk.data.pos.data.y, + dataTrackerChunk.data.pos.data.z + ); + } - if (dataTrackerChunk.data.speed) { - this.setSpeed( - dataTrackerChunk.data.speed.data.x, - dataTrackerChunk.data.speed.data.y, - dataTrackerChunk.data.speed.data.z - ); - } + if (dataTrackerChunk.data.speed) { + this.setSpeed( + dataTrackerChunk.data.speed.data.x, + dataTrackerChunk.data.speed.data.y, + dataTrackerChunk.data.speed.data.z + ); + } - if (dataTrackerChunk.data.ori) { - this.setOri(dataTrackerChunk.data.ori.data.x, dataTrackerChunk.data.ori.data.y, dataTrackerChunk.data.ori.data.z); - } + if (dataTrackerChunk.data.ori) { + this.setOri( + dataTrackerChunk.data.ori.data.x, + dataTrackerChunk.data.ori.data.y, + dataTrackerChunk.data.ori.data.z + ); + } - if (dataTrackerChunk.data.status) { - this.setStatus(dataTrackerChunk.data.status.data.validity); - } + if (dataTrackerChunk.data.status) { + this.setStatus(dataTrackerChunk.data.status.data.validity); + } - if (dataTrackerChunk.data.accel) { - this.setAccel( - dataTrackerChunk.data.accel.data.x, - dataTrackerChunk.data.accel.data.y, - dataTrackerChunk.data.accel.data.z - ); - } + if (dataTrackerChunk.data.accel) { + this.setAccel( + dataTrackerChunk.data.accel.data.x, + dataTrackerChunk.data.accel.data.y, + dataTrackerChunk.data.accel.data.z + ); + } - if (dataTrackerChunk.data.trgtpos) { - this.setTrgtPos( - dataTrackerChunk.data.trgtpos.data.x, - dataTrackerChunk.data.trgtpos.data.y, - dataTrackerChunk.data.trgtpos.data.z - ); - } + if (dataTrackerChunk.data.trgtpos) { + this.setTrgtPos( + dataTrackerChunk.data.trgtpos.data.x, + dataTrackerChunk.data.trgtpos.data.y, + dataTrackerChunk.data.trgtpos.data.z + ); + } - if (dataTrackerChunk.data.timestamp) { - this.setTimestamp(dataTrackerChunk.data.timestamp.data.timestamp); - } - } + if (dataTrackerChunk.data.timestamp) { + this.setTimestamp(dataTrackerChunk.data.timestamp.data.timestamp); + } + } } export function TrackerFromInfo(infoTrackerChunk: InfoTrackerChunk) { - if (infoTrackerChunk.data) { - return new Tracker(infoTrackerChunk.chunk.header.id, infoTrackerChunk.data.trackerName.data.trackerName); - } - return undefined; + if (infoTrackerChunk.data) { + return new Tracker( + infoTrackerChunk.chunk.header.id, + infoTrackerChunk.data.trackerName.data.trackerName + ); + } + return undefined; } export function TrackerFromData(dataTrackerChunk: DataTrackerChunk) { - if (dataTrackerChunk.data) { - const tracker = new Tracker(dataTrackerChunk.chunk.header.id, ''); - tracker.updateData(dataTrackerChunk); - return tracker; - } - return undefined; + if (dataTrackerChunk.data) { + const tracker = new Tracker(dataTrackerChunk.chunk.header.id, ''); + tracker.updateData(dataTrackerChunk); + return tracker; + } + return undefined; } diff --git a/tests/decode.test.mjs b/tests/decode.test.mjs index 134b590..5a021e8 100644 --- a/tests/decode.test.mjs +++ b/tests/decode.test.mjs @@ -3,645 +3,736 @@ import { deepEqual, throws } from 'assert'; import { describe, it } from 'node:test'; const goodTests = [ - { - description: 'DataTrackerPosChunk', - bytes: new Uint8Array([0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - expected: { - chunk: { - chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - header: { dataLen: 12, id: 0, hasSubchunks: false }, - }, - data: { - x: 1.0, - y: 2.0, - z: 3.0, - }, - }, - decoder: Decoders.DataTrackerXYZChunk, - }, - { - description: 'DataTrackerSpeedChunk', - bytes: new Uint8Array([1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - expected: { - chunk: { - chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - header: { dataLen: 12, id: 1, hasSubchunks: false }, - }, - data: { - x: 1.0, - y: 2.0, - z: 3.0, - }, - }, - decoder: Decoders.DataTrackerXYZChunk, - }, - { - description: 'DataTrackerOriChunk', - bytes: new Uint8Array([2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - expected: { - chunk: { - chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - header: { dataLen: 12, id: 2, hasSubchunks: false }, - }, - data: { - x: 1.0, - y: 2.0, - z: 3.0, - }, - }, - decoder: Decoders.DataTrackerXYZChunk, - }, - { - description: 'DataTrackerStatusChunk', - bytes: new Uint8Array([3, 0, 4, 0, 0, 0, 128, 63]), - expected: { - chunk: { - chunkData: new Uint8Array([0, 0, 128, 63]), - header: { dataLen: 4, id: 3, hasSubchunks: false }, - }, - data: { - validity: 1.0, - }, - }, - decoder: Decoders.DataTrackerStatusChunk, - }, - { - description: 'DataTrackerAccelChunk', - bytes: new Uint8Array([4, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - expected: { - chunk: { - chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - header: { dataLen: 12, id: 4, hasSubchunks: false }, - }, - data: { - x: 1.0, - y: 2.0, - z: 3.0, - }, - }, - decoder: Decoders.DataTrackerXYZChunk, - }, - { - description: 'DataTrackerTrgtPosChunk', - bytes: new Uint8Array([5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - expected: { - chunk: { - chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - header: { dataLen: 12, id: 5, hasSubchunks: false }, - }, - data: { - x: 1.0, - y: 2.0, - z: 3.0, - }, - }, - decoder: Decoders.DataTrackerXYZChunk, - }, - { - description: 'DataTrackerTimestampChunk', - bytes: new Uint8Array([6, 0, 8, 0, 210, 2, 150, 73, 0, 0, 0, 0]), - expected: { - chunk: { - chunkData: new Uint8Array([210, 2, 150, 73, 0, 0, 0, 0]), - header: { dataLen: 8, id: 6, hasSubchunks: false }, - }, - data: { - timestamp: 1234567890n, - }, - }, - decoder: Decoders.DataTrackerTimestampChunk, - }, - { - description: 'DataTrackerChunk', - bytes: new Uint8Array([ - 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, - 0, 64, 64, 2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, 12, 0, 0, 0, - 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, 0, 210, 2, - 150, 73, 0, 0, 0, 0, - ]), - expected: { - chunk: { - chunkData: new Uint8Array([ - 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, - 2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, 12, 0, 0, 0, 128, 63, - 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, 0, 210, 2, 150, 73, - 0, 0, 0, 0, - ]), - header: { dataLen: 100, id: 1, hasSubchunks: true }, - }, - data: { - pos: { - chunk: { - chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - header: { dataLen: 12, id: 0, hasSubchunks: false }, - }, - data: { - x: 1.0, - y: 2.0, - z: 3.0, - }, - }, - speed: { - chunk: { - chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - header: { dataLen: 12, id: 1, hasSubchunks: false }, - }, - data: { - x: 1.0, - y: 2.0, - z: 3.0, - }, - }, - ori: { - chunk: { - chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - header: { dataLen: 12, id: 2, hasSubchunks: false }, - }, - data: { - x: 1.0, - y: 2.0, - z: 3.0, - }, - }, - status: { - chunk: { - chunkData: new Uint8Array([0, 0, 128, 63]), - header: { dataLen: 4, id: 3, hasSubchunks: false }, - }, - data: { - validity: 1.0, - }, - }, - accel: { - chunk: { - chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - header: { dataLen: 12, id: 4, hasSubchunks: false }, - }, - data: { - x: 1.0, - y: 2.0, - z: 3.0, - }, - }, - trgtpos: { - chunk: { - chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - header: { dataLen: 12, id: 5, hasSubchunks: false }, - }, - data: { - x: 1.0, - y: 2.0, - z: 3.0, - }, - }, - timestamp: { - chunk: { - chunkData: new Uint8Array([210, 2, 150, 73, 0, 0, 0, 0]), - header: { dataLen: 8, id: 6, hasSubchunks: false }, - }, - data: { - timestamp: 1234567890n, - }, - }, - }, - }, - decoder: Decoders.DataTrackerChunk, - }, - { - description: 'DataTrackerListChunk', - bytes: new Uint8Array([ - 1, 0, 104, 128, 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, - 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, - 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, - 0, 210, 2, 150, 73, 0, 0, 0, 0, - ]), - expected: { - chunk: { - chunkData: new Uint8Array([ - 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, - 64, 0, 0, 64, 64, 2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, 12, - 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, - 0, 210, 2, 150, 73, 0, 0, 0, 0, - ]), - header: { dataLen: 104, id: 1, hasSubchunks: true }, - }, - data: { - trackers: [ - { - chunk: { - chunkData: new Uint8Array([ - 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, - 64, 64, 2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, 12, 0, - 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, - 8, 0, 210, 2, 150, 73, 0, 0, 0, 0, - ]), - header: { dataLen: 100, id: 1, hasSubchunks: true }, - }, - data: { - pos: { - chunk: { - chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - header: { dataLen: 12, id: 0, hasSubchunks: false }, - }, - data: { - x: 1.0, - y: 2.0, - z: 3.0, - }, - }, - speed: { - chunk: { - chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - header: { dataLen: 12, id: 1, hasSubchunks: false }, - }, - data: { - x: 1.0, - y: 2.0, - z: 3.0, - }, - }, - ori: { - chunk: { - chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - header: { dataLen: 12, id: 2, hasSubchunks: false }, - }, - data: { - x: 1.0, - y: 2.0, - z: 3.0, - }, - }, - status: { - chunk: { - chunkData: new Uint8Array([0, 0, 128, 63]), - header: { dataLen: 4, id: 3, hasSubchunks: false }, - }, - data: { - validity: 1.0, - }, - }, - accel: { - chunk: { - chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - header: { dataLen: 12, id: 4, hasSubchunks: false }, - }, - data: { - x: 1.0, - y: 2.0, - z: 3.0, - }, - }, - trgtpos: { - chunk: { - chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - header: { dataLen: 12, id: 5, hasSubchunks: false }, - }, - data: { - x: 1.0, - y: 2.0, - z: 3.0, - }, - }, - timestamp: { - chunk: { - chunkData: new Uint8Array([210, 2, 150, 73, 0, 0, 0, 0]), - header: { dataLen: 8, id: 6, hasSubchunks: false }, - }, - data: { - timestamp: 1234567890n, - }, - }, - }, - }, - ], - }, - }, - decoder: Decoders.DataTrackerListChunk, - }, - { - description: 'DataPacketChunk', - bytes: new Uint8Array([ - 85, 103, 124, 128, 0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123, 1, 0, 104, 128, 1, 0, 100, 128, 0, 0, - 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, 12, - 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, - 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, 0, 210, 2, 150, 73, 0, 0, 0, 0, - ]), - expected: { - chunk: { - chunkData: new Uint8Array([ - 0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123, 1, 0, 104, 128, 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, - 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, 12, 0, 0, 0, - 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, - 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, 0, 210, 2, 150, 73, 0, 0, 0, 0, - ]), - header: { dataLen: 124, id: 26453, hasSubchunks: true }, - }, - data: { - packetHeader: { - chunk: { - chunkData: new Uint8Array([210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123]), - header: { dataLen: 12, id: 0, hasSubchunks: false }, - }, - data: { - packetTimestamp: 1234567890n, - versionHigh: 2, - versionLow: 3, - frameId: 1, - framePacketCount: 123, - }, - }, - trackerList: { - chunk: { - chunkData: new Uint8Array([ - 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, - 0, 64, 0, 0, 64, 64, 2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, - 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, - 6, 0, 8, 0, 210, 2, 150, 73, 0, 0, 0, 0, - ]), - header: { dataLen: 104, id: 1, hasSubchunks: true }, - }, - data: { - trackers: [ - { - chunk: { - chunkData: new Uint8Array([ - 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, - 0, 64, 64, 2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, - 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, - 64, 6, 0, 8, 0, 210, 2, 150, 73, 0, 0, 0, 0, - ]), - header: { dataLen: 100, id: 1, hasSubchunks: true }, - }, - data: { - pos: { - chunk: { - chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - header: { dataLen: 12, id: 0, hasSubchunks: false }, - }, - data: { - x: 1.0, - y: 2.0, - z: 3.0, - }, - }, - speed: { - chunk: { - chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - header: { dataLen: 12, id: 1, hasSubchunks: false }, - }, - data: { - x: 1.0, - y: 2.0, - z: 3.0, - }, - }, - ori: { - chunk: { - chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - header: { dataLen: 12, id: 2, hasSubchunks: false }, - }, - data: { - x: 1.0, - y: 2.0, - z: 3.0, - }, - }, - status: { - chunk: { - chunkData: new Uint8Array([0, 0, 128, 63]), - header: { dataLen: 4, id: 3, hasSubchunks: false }, - }, - data: { - validity: 1.0, - }, - }, - accel: { - chunk: { - chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - header: { dataLen: 12, id: 4, hasSubchunks: false }, - }, - data: { - x: 1.0, - y: 2.0, - z: 3.0, - }, - }, - trgtpos: { - chunk: { - chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - header: { dataLen: 12, id: 5, hasSubchunks: false }, - }, - data: { - x: 1.0, - y: 2.0, - z: 3.0, - }, - }, - timestamp: { - chunk: { - chunkData: new Uint8Array([210, 2, 150, 73, 0, 0, 0, 0]), - header: { dataLen: 8, id: 6, hasSubchunks: false }, - }, - data: { - timestamp: 1234567890n, - }, - }, - }, - }, - ], - }, - }, - }, - }, - decoder: Decoders.DataPacketChunk, - }, - { - description: 'InfoTrackerNameChunk', - bytes: new Uint8Array([0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49]), - expected: { - chunk: { - chunkData: new Uint8Array([84, 114, 97, 99, 107, 101, 114, 32, 49]), - header: { dataLen: 9, id: 0, hasSubchunks: false }, - }, - data: { - trackerName: 'Tracker 1', - }, - }, - decoder: Decoders.InfoTrackerNameChunk, - }, - { - description: 'InfoSystemNameChunk', - bytes: new Uint8Array([1, 0, 10, 0, 80, 83, 78, 32, 83, 101, 114, 118, 101, 114]), - expected: { - chunk: { - chunkData: new Uint8Array([80, 83, 78, 32, 83, 101, 114, 118, 101, 114]), - header: { dataLen: 10, id: 1, hasSubchunks: false }, - }, - data: { - systemName: 'PSN Server', - }, - }, - decoder: Decoders.InfoSystemNameChunk, - }, - { - description: 'InfoTrackerChunk', - bytes: new Uint8Array([1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49]), - expected: { - chunk: { - chunkData: new Uint8Array([0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49]), - header: { dataLen: 13, id: 1, hasSubchunks: true }, - }, - data: { - trackerName: { - chunk: { - chunkData: new Uint8Array([84, 114, 97, 99, 107, 101, 114, 32, 49]), - header: { dataLen: 9, id: 0, hasSubchunks: false }, - }, - data: { - trackerName: 'Tracker 1', - }, - }, - }, - }, - decoder: Decoders.InfoTrackerChunk, - }, - { - description: 'InfoTrackerListChunk', - bytes: new Uint8Array([2, 0, 17, 128, 1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49]), - expected: { - chunk: { - chunkData: new Uint8Array([1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49]), - header: { dataLen: 17, id: 2, hasSubchunks: true }, - }, - data: { - trackers: [ - { - chunk: { - chunkData: new Uint8Array([0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49]), - header: { dataLen: 13, id: 1, hasSubchunks: true }, - }, - data: { - trackerName: { - chunk: { - chunkData: new Uint8Array([84, 114, 97, 99, 107, 101, 114, 32, 49]), - header: { dataLen: 9, id: 0, hasSubchunks: false }, - }, - data: { - trackerName: 'Tracker 1', - }, - }, - }, - }, - ], - }, - }, - decoder: Decoders.InfoTrackerListChunk, - }, - { - description: 'PacketHeaderChunk', - bytes: new Uint8Array([0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123]), - expected: { - chunk: { - chunkData: new Uint8Array([210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123]), - header: { dataLen: 12, id: 0, hasSubchunks: false }, - }, - data: { - packetTimestamp: 1234567890n, - versionHigh: 2, - versionLow: 3, - frameId: 1, - framePacketCount: 123, - }, - }, - decoder: Decoders.PacketHeaderChunk, - }, - { - description: 'InfoPacketChunk', - bytes: new Uint8Array([ - 86, 103, 51, 128, 0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123, 1, 0, 10, 0, 80, 83, 78, 32, 83, 101, - 114, 118, 101, 114, 2, 0, 17, 128, 1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49, - ]), - expected: { - chunk: { - chunkData: new Uint8Array([ - 0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123, 1, 0, 10, 0, 80, 83, 78, 32, 83, 101, 114, 118, 101, - 114, 2, 0, 17, 128, 1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49, - ]), - header: { dataLen: 51, id: 26454, hasSubchunks: true }, - }, - data: { - packetHeader: { - chunk: { - chunkData: new Uint8Array([210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123]), - header: { dataLen: 12, id: 0, hasSubchunks: false }, - }, - data: { - packetTimestamp: 1234567890n, - versionHigh: 2, - versionLow: 3, - frameId: 1, - framePacketCount: 123, - }, - }, - systemName: { - chunk: { - chunkData: new Uint8Array([80, 83, 78, 32, 83, 101, 114, 118, 101, 114]), - header: { dataLen: 10, id: 1, hasSubchunks: false }, - }, - data: { - systemName: 'PSN Server', - }, - }, - trackerList: { - chunk: { - chunkData: new Uint8Array([1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49]), - header: { dataLen: 17, id: 2, hasSubchunks: true }, - }, - data: { - trackers: [ - { - chunk: { - chunkData: new Uint8Array([0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49]), - header: { dataLen: 13, id: 1, hasSubchunks: true }, - }, - data: { - trackerName: { - chunk: { - chunkData: new Uint8Array([84, 114, 97, 99, 107, 101, 114, 32, 49]), - header: { dataLen: 9, id: 0, hasSubchunks: false }, - }, - data: { - trackerName: 'Tracker 1', - }, - }, - }, - }, - ], - }, - }, - }, - }, - decoder: Decoders.InfoPacketChunk, - }, + { + description: 'DataTrackerPosChunk', + bytes: new Uint8Array([ + 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, + ]), + expected: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + header: { dataLen: 12, id: 0, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + decoder: Decoders.DataTrackerXYZChunk, + }, + { + description: 'DataTrackerSpeedChunk', + bytes: new Uint8Array([ + 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, + ]), + expected: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + header: { dataLen: 12, id: 1, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + decoder: Decoders.DataTrackerXYZChunk, + }, + { + description: 'DataTrackerOriChunk', + bytes: new Uint8Array([ + 2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, + ]), + expected: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + header: { dataLen: 12, id: 2, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + decoder: Decoders.DataTrackerXYZChunk, + }, + { + description: 'DataTrackerStatusChunk', + bytes: new Uint8Array([3, 0, 4, 0, 0, 0, 128, 63]), + expected: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63]), + header: { dataLen: 4, id: 3, hasSubchunks: false }, + }, + data: { + validity: 1.0, + }, + }, + decoder: Decoders.DataTrackerStatusChunk, + }, + { + description: 'DataTrackerAccelChunk', + bytes: new Uint8Array([ + 4, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, + ]), + expected: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + header: { dataLen: 12, id: 4, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + decoder: Decoders.DataTrackerXYZChunk, + }, + { + description: 'DataTrackerTrgtPosChunk', + bytes: new Uint8Array([ + 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, + ]), + expected: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + header: { dataLen: 12, id: 5, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + decoder: Decoders.DataTrackerXYZChunk, + }, + { + description: 'DataTrackerTimestampChunk', + bytes: new Uint8Array([6, 0, 8, 0, 210, 2, 150, 73, 0, 0, 0, 0]), + expected: { + chunk: { + chunkData: new Uint8Array([210, 2, 150, 73, 0, 0, 0, 0]), + header: { dataLen: 8, id: 6, hasSubchunks: false }, + }, + data: { + timestamp: 1234567890n, + }, + }, + decoder: Decoders.DataTrackerTimestampChunk, + }, + { + description: 'DataTrackerChunk', + bytes: new Uint8Array([ + 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, + 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, 12, 0, 0, 0, + 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, 12, + 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, + 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, 0, 210, 2, 150, 73, 0, 0, 0, 0, + ]), + expected: { + chunk: { + chunkData: new Uint8Array([ + 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, + 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, 12, 0, 0, 0, 128, 63, 0, + 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, 12, 0, 0, 0, + 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, + 0, 64, 0, 0, 64, 64, 6, 0, 8, 0, 210, 2, 150, 73, 0, 0, 0, 0, + ]), + header: { dataLen: 100, id: 1, hasSubchunks: true }, + }, + data: { + pos: { + chunk: { + chunkData: new Uint8Array([ + 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, + ]), + header: { dataLen: 12, id: 0, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + speed: { + chunk: { + chunkData: new Uint8Array([ + 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, + ]), + header: { dataLen: 12, id: 1, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + ori: { + chunk: { + chunkData: new Uint8Array([ + 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, + ]), + header: { dataLen: 12, id: 2, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + status: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63]), + header: { dataLen: 4, id: 3, hasSubchunks: false }, + }, + data: { + validity: 1.0, + }, + }, + accel: { + chunk: { + chunkData: new Uint8Array([ + 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, + ]), + header: { dataLen: 12, id: 4, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + trgtpos: { + chunk: { + chunkData: new Uint8Array([ + 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, + ]), + header: { dataLen: 12, id: 5, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + timestamp: { + chunk: { + chunkData: new Uint8Array([210, 2, 150, 73, 0, 0, 0, 0]), + header: { dataLen: 8, id: 6, hasSubchunks: false }, + }, + data: { + timestamp: 1234567890n, + }, + }, + }, + }, + decoder: Decoders.DataTrackerChunk, + }, + { + description: 'DataTrackerListChunk', + bytes: new Uint8Array([ + 1, 0, 104, 128, 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, + 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, + 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, + 63, 4, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, + 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, 0, 210, 2, 150, 73, 0, 0, + 0, 0, + ]), + expected: { + chunk: { + chunkData: new Uint8Array([ + 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, + 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, 12, 0, 0, + 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, + 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, + 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, 0, 210, 2, 150, 73, 0, 0, + 0, 0, + ]), + header: { dataLen: 104, id: 1, hasSubchunks: true }, + }, + data: { + trackers: [ + { + chunk: { + chunkData: new Uint8Array([ + 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, + 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, 12, 0, 0, 0, + 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, + 4, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, + 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, 0, 210, 2, + 150, 73, 0, 0, 0, 0, + ]), + header: { dataLen: 100, id: 1, hasSubchunks: true }, + }, + data: { + pos: { + chunk: { + chunkData: new Uint8Array([ + 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, + ]), + header: { dataLen: 12, id: 0, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + speed: { + chunk: { + chunkData: new Uint8Array([ + 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, + ]), + header: { dataLen: 12, id: 1, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + ori: { + chunk: { + chunkData: new Uint8Array([ + 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, + ]), + header: { dataLen: 12, id: 2, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + status: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63]), + header: { dataLen: 4, id: 3, hasSubchunks: false }, + }, + data: { + validity: 1.0, + }, + }, + accel: { + chunk: { + chunkData: new Uint8Array([ + 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, + ]), + header: { dataLen: 12, id: 4, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + trgtpos: { + chunk: { + chunkData: new Uint8Array([ + 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, + ]), + header: { dataLen: 12, id: 5, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + timestamp: { + chunk: { + chunkData: new Uint8Array([210, 2, 150, 73, 0, 0, 0, 0]), + header: { dataLen: 8, id: 6, hasSubchunks: false }, + }, + data: { + timestamp: 1234567890n, + }, + }, + }, + }, + ], + }, + }, + decoder: Decoders.DataTrackerListChunk, + }, + { + description: 'DataPacketChunk', + bytes: new Uint8Array([ + 85, 103, 124, 128, 0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123, + 1, 0, 104, 128, 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, + 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, + 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, + 63, 4, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, + 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, 0, 210, 2, 150, 73, 0, 0, + 0, 0, + ]), + expected: { + chunk: { + chunkData: new Uint8Array([ + 0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123, 1, 0, 104, + 128, 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, + 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, + 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, + 128, 63, 4, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, + 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, 0, 210, 2, + 150, 73, 0, 0, 0, 0, + ]), + header: { dataLen: 124, id: 26453, hasSubchunks: true }, + }, + data: { + packetHeader: { + chunk: { + chunkData: new Uint8Array([ + 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123, + ]), + header: { dataLen: 12, id: 0, hasSubchunks: false }, + }, + data: { + packetTimestamp: 1234567890n, + versionHigh: 2, + versionLow: 3, + frameId: 1, + framePacketCount: 123, + }, + }, + trackerList: { + chunk: { + chunkData: new Uint8Array([ + 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, + 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, + 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, + 128, 63, 4, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, + 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, 0, + 210, 2, 150, 73, 0, 0, 0, 0, + ]), + header: { dataLen: 104, id: 1, hasSubchunks: true }, + }, + data: { + trackers: [ + { + chunk: { + chunkData: new Uint8Array([ + 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, + 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, 12, + 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, + 0, 128, 63, 4, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, + 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, + 64, 6, 0, 8, 0, 210, 2, 150, 73, 0, 0, 0, 0, + ]), + header: { dataLen: 100, id: 1, hasSubchunks: true }, + }, + data: { + pos: { + chunk: { + chunkData: new Uint8Array([ + 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, + ]), + header: { dataLen: 12, id: 0, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + speed: { + chunk: { + chunkData: new Uint8Array([ + 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, + ]), + header: { dataLen: 12, id: 1, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + ori: { + chunk: { + chunkData: new Uint8Array([ + 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, + ]), + header: { dataLen: 12, id: 2, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + status: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63]), + header: { dataLen: 4, id: 3, hasSubchunks: false }, + }, + data: { + validity: 1.0, + }, + }, + accel: { + chunk: { + chunkData: new Uint8Array([ + 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, + ]), + header: { dataLen: 12, id: 4, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + trgtpos: { + chunk: { + chunkData: new Uint8Array([ + 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, + ]), + header: { dataLen: 12, id: 5, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + timestamp: { + chunk: { + chunkData: new Uint8Array([210, 2, 150, 73, 0, 0, 0, 0]), + header: { dataLen: 8, id: 6, hasSubchunks: false }, + }, + data: { + timestamp: 1234567890n, + }, + }, + }, + }, + ], + }, + }, + }, + }, + decoder: Decoders.DataPacketChunk, + }, + { + description: 'InfoTrackerNameChunk', + bytes: new Uint8Array([0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49]), + expected: { + chunk: { + chunkData: new Uint8Array([84, 114, 97, 99, 107, 101, 114, 32, 49]), + header: { dataLen: 9, id: 0, hasSubchunks: false }, + }, + data: { + trackerName: 'Tracker 1', + }, + }, + decoder: Decoders.InfoTrackerNameChunk, + }, + { + description: 'InfoSystemNameChunk', + bytes: new Uint8Array([ + 1, 0, 10, 0, 80, 83, 78, 32, 83, 101, 114, 118, 101, 114, + ]), + expected: { + chunk: { + chunkData: new Uint8Array([ + 80, 83, 78, 32, 83, 101, 114, 118, 101, 114, + ]), + header: { dataLen: 10, id: 1, hasSubchunks: false }, + }, + data: { + systemName: 'PSN Server', + }, + }, + decoder: Decoders.InfoSystemNameChunk, + }, + { + description: 'InfoTrackerChunk', + bytes: new Uint8Array([ + 1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49, + ]), + expected: { + chunk: { + chunkData: new Uint8Array([ + 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49, + ]), + header: { dataLen: 13, id: 1, hasSubchunks: true }, + }, + data: { + trackerName: { + chunk: { + chunkData: new Uint8Array([84, 114, 97, 99, 107, 101, 114, 32, 49]), + header: { dataLen: 9, id: 0, hasSubchunks: false }, + }, + data: { + trackerName: 'Tracker 1', + }, + }, + }, + }, + decoder: Decoders.InfoTrackerChunk, + }, + { + description: 'InfoTrackerListChunk', + bytes: new Uint8Array([ + 2, 0, 17, 128, 1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, + 32, 49, + ]), + expected: { + chunk: { + chunkData: new Uint8Array([ + 1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49, + ]), + header: { dataLen: 17, id: 2, hasSubchunks: true }, + }, + data: { + trackers: [ + { + chunk: { + chunkData: new Uint8Array([ + 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49, + ]), + header: { dataLen: 13, id: 1, hasSubchunks: true }, + }, + data: { + trackerName: { + chunk: { + chunkData: new Uint8Array([ + 84, 114, 97, 99, 107, 101, 114, 32, 49, + ]), + header: { dataLen: 9, id: 0, hasSubchunks: false }, + }, + data: { + trackerName: 'Tracker 1', + }, + }, + }, + }, + ], + }, + }, + decoder: Decoders.InfoTrackerListChunk, + }, + { + description: 'PacketHeaderChunk', + bytes: new Uint8Array([ + 0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123, + ]), + expected: { + chunk: { + chunkData: new Uint8Array([210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123]), + header: { dataLen: 12, id: 0, hasSubchunks: false }, + }, + data: { + packetTimestamp: 1234567890n, + versionHigh: 2, + versionLow: 3, + frameId: 1, + framePacketCount: 123, + }, + }, + decoder: Decoders.PacketHeaderChunk, + }, + { + description: 'InfoPacketChunk', + bytes: new Uint8Array([ + 86, 103, 51, 128, 0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123, + 1, 0, 10, 0, 80, 83, 78, 32, 83, 101, 114, 118, 101, 114, 2, 0, 17, 128, + 1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49, + ]), + expected: { + chunk: { + chunkData: new Uint8Array([ + 0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123, 1, 0, 10, 0, + 80, 83, 78, 32, 83, 101, 114, 118, 101, 114, 2, 0, 17, 128, 1, 0, 13, + 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49, + ]), + header: { dataLen: 51, id: 26454, hasSubchunks: true }, + }, + data: { + packetHeader: { + chunk: { + chunkData: new Uint8Array([ + 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123, + ]), + header: { dataLen: 12, id: 0, hasSubchunks: false }, + }, + data: { + packetTimestamp: 1234567890n, + versionHigh: 2, + versionLow: 3, + frameId: 1, + framePacketCount: 123, + }, + }, + systemName: { + chunk: { + chunkData: new Uint8Array([ + 80, 83, 78, 32, 83, 101, 114, 118, 101, 114, + ]), + header: { dataLen: 10, id: 1, hasSubchunks: false }, + }, + data: { + systemName: 'PSN Server', + }, + }, + trackerList: { + chunk: { + chunkData: new Uint8Array([ + 1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49, + ]), + header: { dataLen: 17, id: 2, hasSubchunks: true }, + }, + data: { + trackers: [ + { + chunk: { + chunkData: new Uint8Array([ + 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49, + ]), + header: { dataLen: 13, id: 1, hasSubchunks: true }, + }, + data: { + trackerName: { + chunk: { + chunkData: new Uint8Array([ + 84, 114, 97, 99, 107, 101, 114, 32, 49, + ]), + header: { dataLen: 9, id: 0, hasSubchunks: false }, + }, + data: { + trackerName: 'Tracker 1', + }, + }, + }, + }, + ], + }, + }, + }, + }, + decoder: Decoders.InfoPacketChunk, + }, ]; describe('PSN Bytes Decoding', () => { - goodTests.forEach((bytesTest) => { - it(bytesTest.description, () => { - const decoded = bytesTest.decoder(bytesTest.bytes); - deepEqual(decoded, bytesTest.expected); - }); - }); + goodTests.forEach((bytesTest) => { + it(bytesTest.description, () => { + const decoded = bytesTest.decoder(bytesTest.bytes); + deepEqual(decoded, bytesTest.expected); + }); + }); }); // TODO(jwetzell): add error tests const badTests = []; describe('PSN Bytes Decoding Throws', () => { - badTests.forEach((bytesTest) => { - it(bytesTest.description, () => { - throws(() => { - bytesTest.decoder(bytesTest.bytes); - }, bytesTest.throwsMessage); - }); - }); + badTests.forEach((bytesTest) => { + it(bytesTest.description, () => { + throws(() => { + bytesTest.decoder(bytesTest.bytes); + }, bytesTest.throwsMessage); + }); + }); }); diff --git a/tests/encode.test.mjs b/tests/encode.test.mjs index 400e825..5bf7403 100644 --- a/tests/encode.test.mjs +++ b/tests/encode.test.mjs @@ -3,150 +3,191 @@ import { deepEqual, throws } from 'assert'; import { describe, it } from 'node:test'; const goodTests = [ - { - description: 'DataTrackerPosChunk', - expected: new Uint8Array([0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - bytes: Encoders.DataTrackerPosChunk(1.0, 2.0, 3.0), - }, - { - description: 'DataTrackerSpeedChunk', - expected: new Uint8Array([1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - bytes: Encoders.DataTrackerSpeedChunk(1.0, 2.0, 3.0), - }, - { - description: 'DataTrackerOriChunk', - expected: new Uint8Array([2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - bytes: Encoders.DataTrackerOriChunk(1.0, 2.0, 3.0), - }, - { - description: 'DataTrackerStatusChunk', - expected: new Uint8Array([3, 0, 4, 0, 0, 0, 128, 63]), - bytes: Encoders.DataTrackerStatusChunk(1.0), - }, - { - description: 'DataTrackerAccelChunk', - expected: new Uint8Array([4, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - bytes: Encoders.DataTrackerAccelChunk(1.0, 2.0, 3.0), - }, - { - description: 'DataTrackerTrgtposChunk', - expected: new Uint8Array([5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - bytes: Encoders.DataTrackerTrgtposChunk(1.0, 2.0, 3.0), - }, - { - description: 'DataTrackerTimestampChunk', - expected: new Uint8Array([6, 0, 8, 0, 210, 2, 150, 73, 0, 0, 0, 0]), - bytes: Encoders.DataTrackerTimestampChunk(1234567890n), - }, - { - description: 'DataTrackerChunk', - expected: new Uint8Array([ - 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, - 0, 64, 64, 2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, 12, 0, 0, 0, - 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, 0, 210, 2, - 150, 73, 0, 0, 0, 0, - ]), - bytes: Encoders.DataTrackerChunk(1, [ - new Uint8Array([0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - new Uint8Array([1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - new Uint8Array([2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - new Uint8Array([3, 0, 4, 0, 0, 0, 128, 63]), - new Uint8Array([4, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - new Uint8Array([5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), - new Uint8Array([6, 0, 8, 0, 210, 2, 150, 73, 0, 0, 0, 0]), - ]), - }, - { - description: 'DataTrackerListChunk', - expected: new Uint8Array([ - 1, 0, 104, 128, 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, - 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, - 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, - 0, 210, 2, 150, 73, 0, 0, 0, 0, - ]), - bytes: Encoders.DataTrackerListChunk([ - new Uint8Array([ - 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, - 0, 0, 64, 64, 2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, 12, 0, 0, - 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, 0, 210, - 2, 150, 73, 0, 0, 0, 0, - ]), - ]), - }, - { - description: 'DataPacketChunk', - expected: new Uint8Array([ - 85, 103, 124, 128, 0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123, 1, 0, 104, 128, 1, 0, 100, 128, 0, 0, - 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, 12, - 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, - 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, 0, 210, 2, 150, 73, 0, 0, 0, 0, - ]), - bytes: Encoders.DataPacketChunk( - new Uint8Array([0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123]), - new Uint8Array([ - 1, 0, 104, 128, 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, - 63, 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, - 4, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, - 0, 8, 0, 210, 2, 150, 73, 0, 0, 0, 0, - ]) - ), - }, - { - description: 'InfoTrackerNameChunk', - expected: new Uint8Array([0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49]), - bytes: Encoders.InfoTrackerNameChunk('Tracker 1'), - }, - { - description: 'InfoSystemNameChunk', - expected: new Uint8Array([1, 0, 10, 0, 80, 83, 78, 32, 83, 101, 114, 118, 101, 114]), - bytes: Encoders.InfoSystemNameChunk('PSN Server'), - }, - { - description: 'InfoTrackerChunk', - expected: new Uint8Array([1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49]), - bytes: Encoders.InfoTrackerChunk(1, new Uint8Array([0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49])), - }, - { - description: 'InfoTrackerListChunk', - expected: new Uint8Array([2, 0, 17, 128, 1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49]), - bytes: Encoders.InfoTrackerListChunk([ - new Uint8Array([1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49]), - ]), - }, - { - description: 'PacketHeaderChunk', - expected: new Uint8Array([0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123]), - bytes: Encoders.PacketHeaderChunk(1234567890n, 2, 3, 1, 123), - }, - { - description: 'InfoPacketChunk', - expected: new Uint8Array([ - 86, 103, 51, 128, 0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123, 1, 0, 10, 0, 80, 83, 78, 32, 83, 101, - 114, 118, 101, 114, 2, 0, 17, 128, 1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49, - ]), - bytes: Encoders.InfoPacketChunk( - new Uint8Array([0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123]), - new Uint8Array([1, 0, 10, 0, 80, 83, 78, 32, 83, 101, 114, 118, 101, 114]), - new Uint8Array([2, 0, 17, 128, 1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49]) - ), - }, + { + description: 'DataTrackerPosChunk', + expected: new Uint8Array([ + 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, + ]), + bytes: Encoders.DataTrackerPosChunk(1.0, 2.0, 3.0), + }, + { + description: 'DataTrackerSpeedChunk', + expected: new Uint8Array([ + 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, + ]), + bytes: Encoders.DataTrackerSpeedChunk(1.0, 2.0, 3.0), + }, + { + description: 'DataTrackerOriChunk', + expected: new Uint8Array([ + 2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, + ]), + bytes: Encoders.DataTrackerOriChunk(1.0, 2.0, 3.0), + }, + { + description: 'DataTrackerStatusChunk', + expected: new Uint8Array([3, 0, 4, 0, 0, 0, 128, 63]), + bytes: Encoders.DataTrackerStatusChunk(1.0), + }, + { + description: 'DataTrackerAccelChunk', + expected: new Uint8Array([ + 4, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, + ]), + bytes: Encoders.DataTrackerAccelChunk(1.0, 2.0, 3.0), + }, + { + description: 'DataTrackerTrgtposChunk', + expected: new Uint8Array([ + 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, + ]), + bytes: Encoders.DataTrackerTrgtposChunk(1.0, 2.0, 3.0), + }, + { + description: 'DataTrackerTimestampChunk', + expected: new Uint8Array([6, 0, 8, 0, 210, 2, 150, 73, 0, 0, 0, 0]), + bytes: Encoders.DataTrackerTimestampChunk(1234567890n), + }, + { + description: 'DataTrackerChunk', + expected: new Uint8Array([ + 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, + 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, 12, 0, 0, 0, + 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, 12, + 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, + 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, 0, 210, 2, 150, 73, 0, 0, 0, 0, + ]), + bytes: Encoders.DataTrackerChunk(1, [ + new Uint8Array([0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + new Uint8Array([1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + new Uint8Array([2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + new Uint8Array([3, 0, 4, 0, 0, 0, 128, 63]), + new Uint8Array([4, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + new Uint8Array([5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + new Uint8Array([6, 0, 8, 0, 210, 2, 150, 73, 0, 0, 0, 0]), + ]), + }, + { + description: 'DataTrackerListChunk', + expected: new Uint8Array([ + 1, 0, 104, 128, 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, + 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, + 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, + 63, 4, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, + 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, 0, 210, 2, 150, 73, 0, 0, + 0, 0, + ]), + bytes: Encoders.DataTrackerListChunk([ + new Uint8Array([ + 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, + 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, 12, 0, 0, + 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, + 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, + 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, 0, 210, 2, 150, 73, 0, 0, 0, 0, + ]), + ]), + }, + { + description: 'DataPacketChunk', + expected: new Uint8Array([ + 85, 103, 124, 128, 0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123, + 1, 0, 104, 128, 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, + 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, + 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, + 63, 4, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, + 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, 0, 210, 2, 150, 73, 0, 0, + 0, 0, + ]), + bytes: Encoders.DataPacketChunk( + new Uint8Array([0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123]), + new Uint8Array([ + 1, 0, 104, 128, 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, + 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 2, + 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, + 128, 63, 4, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, + 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, 0, 210, 2, + 150, 73, 0, 0, 0, 0, + ]) + ), + }, + { + description: 'InfoTrackerNameChunk', + expected: new Uint8Array([ + 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49, + ]), + bytes: Encoders.InfoTrackerNameChunk('Tracker 1'), + }, + { + description: 'InfoSystemNameChunk', + expected: new Uint8Array([ + 1, 0, 10, 0, 80, 83, 78, 32, 83, 101, 114, 118, 101, 114, + ]), + bytes: Encoders.InfoSystemNameChunk('PSN Server'), + }, + { + description: 'InfoTrackerChunk', + expected: new Uint8Array([ + 1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49, + ]), + bytes: Encoders.InfoTrackerChunk( + 1, + new Uint8Array([0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49]) + ), + }, + { + description: 'InfoTrackerListChunk', + expected: new Uint8Array([ + 2, 0, 17, 128, 1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, + 32, 49, + ]), + bytes: Encoders.InfoTrackerListChunk([ + new Uint8Array([ + 1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49, + ]), + ]), + }, + { + description: 'PacketHeaderChunk', + expected: new Uint8Array([ + 0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123, + ]), + bytes: Encoders.PacketHeaderChunk(1234567890n, 2, 3, 1, 123), + }, + { + description: 'InfoPacketChunk', + expected: new Uint8Array([ + 86, 103, 51, 128, 0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123, + 1, 0, 10, 0, 80, 83, 78, 32, 83, 101, 114, 118, 101, 114, 2, 0, 17, 128, + 1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49, + ]), + bytes: Encoders.InfoPacketChunk( + new Uint8Array([0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123]), + new Uint8Array([ + 1, 0, 10, 0, 80, 83, 78, 32, 83, 101, 114, 118, 101, 114, + ]), + new Uint8Array([ + 2, 0, 17, 128, 1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, + 114, 32, 49, + ]) + ), + }, ]; describe('PSN Message Encoding', () => { - goodTests.forEach((messageTest) => { - it(messageTest.description, () => { - deepEqual(messageTest.bytes, messageTest.expected); - }); - }); + goodTests.forEach((messageTest) => { + it(messageTest.description, () => { + deepEqual(messageTest.bytes, messageTest.expected); + }); + }); }); //TODO(jwetzell): add tests that handle errors const badTests = []; describe('PSN Message Encoding Throws', () => { - badTests.forEach((messageTest) => { - it(messageTest.description, () => { - throws(() => {}, messageTest.throwsMessage); - }); - }); + badTests.forEach((messageTest) => { + it(messageTest.description, () => { + throws(() => {}, messageTest.throwsMessage); + }); + }); }); diff --git a/tsconfig.json b/tsconfig.json index 77b838a..dcd404d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,20 +1,20 @@ { - "compilerOptions": { - "target": "esnext", - "lib": ["es2023"], - "moduleDetection": "force", - "module": "preserve", - "moduleResolution": "bundler", - "resolveJsonModule": true, - "types": ["node"], - "strict": true, - "noUnusedLocals": true, - "declaration": true, - "emitDeclarationOnly": true, - "esModuleInterop": true, - "isolatedModules": true, - "verbatimModuleSyntax": true, - "skipLibCheck": true - }, - "include": ["src"] + "compilerOptions": { + "target": "esnext", + "lib": ["es2023"], + "moduleDetection": "force", + "module": "preserve", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "types": ["node"], + "strict": true, + "noUnusedLocals": true, + "declaration": true, + "emitDeclarationOnly": true, + "esModuleInterop": true, + "isolatedModules": true, + "verbatimModuleSyntax": true, + "skipLibCheck": true + }, + "include": ["src"] } diff --git a/tsdown.config.ts b/tsdown.config.ts index 82aa151..3cce556 100644 --- a/tsdown.config.ts +++ b/tsdown.config.ts @@ -1,10 +1,10 @@ -import { defineConfig } from 'tsdown' +import { defineConfig } from 'tsdown'; export default defineConfig({ - entry: 'src/index.ts', - exports: true, - format: { - esm: {}, - cjs: {}, - }, -}) \ No newline at end of file + entry: 'src/index.ts', + exports: true, + format: { + esm: {}, + cjs: {}, + }, +});