UNPKG

6cclab-ibt-telemetry

Version:

iRacing ibt parser

86 lines 4.16 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const fs_1 = require("fs"); const js_yaml_1 = require("js-yaml"); const rxjs_1 = require("rxjs"); const ramda_1 = require("ramda"); const read_file_to_buffer_1 = require("./utils/read-file-to-buffer"); const telemetry_header_1 = require("./headers/telemetry-header"); const disk_sub_header_1 = require("./headers/disk-sub-header"); const var_header_1 = require("./headers/var-header"); const telemetry_sample_1 = require("./telemetry-sample"); const openDataFile = (dataFile) => new Promise((resolve, reject) => { fs_1.open(dataFile, 'r', (err, fd) => { err ? reject(err) : resolve(fd); }); }); const telemetryHeaderFromFileDescriptor = async (fd) => read_file_to_buffer_1.readFileToBuffer(fd, 0, telemetry_header_1.SIZE_IN_BYTES) .then(telemetry_header_1.TelemetryHeader.fromBuffer); const diskSubHeaderFromFileDescriptor = async (fd) => read_file_to_buffer_1.readFileToBuffer(fd, disk_sub_header_1.SIZE_IN_BYTES, telemetry_header_1.SIZE_IN_BYTES) .then(disk_sub_header_1.DiskSubHeader.fromBuffer); const sessionInfoStringFromFileDescriptor = async (fd, telemetryHeader) => read_file_to_buffer_1.readFileToBuffer(fd, telemetryHeader.sessionInfoOffset, telemetryHeader.sessionInfoLength) .then(x => x.toString('ascii')); const varHeadersFromFileDescriptor = async (fd, telemetryHeader) => { const numberOfVariables = telemetryHeader.numVars; const startPosition = telemetryHeader.varHeaderOffset; const fullBufferSize = numberOfVariables * var_header_1.SIZE_IN_BYTES; return read_file_to_buffer_1.readFileToBuffer(fd, startPosition, fullBufferSize) .then(buffer => { return ramda_1.range(0, numberOfVariables).map(count => { const start = count * var_header_1.SIZE_IN_BYTES; const end = start + var_header_1.SIZE_IN_BYTES; return var_header_1.VarHeader.fromBuffer(buffer.slice(start, end)); }); }); }; class Telemetry { constructor(telemetryHeader, diskSubHeader, sessionInfoYaml, varHeaders, fd) { this.telemetryHeader = telemetryHeader; this.diskSubHeader = diskSubHeader; this.sessionInfoYaml = sessionInfoYaml; this.varHeaders = varHeaders; this.fd = fd; this.sessionInfo = js_yaml_1.safeLoad(sessionInfoYaml); } static async fromFile(file) { const fd = await openDataFile(file); const resolvedHeaders = await Promise.all([ telemetryHeaderFromFileDescriptor(fd), diskSubHeaderFromFileDescriptor(fd) ]); const telemetryHeader = resolvedHeaders[0]; const diskSubHeader = resolvedHeaders[1]; const [sessionInfo, varHeaders] = await Promise.all([ sessionInfoStringFromFileDescriptor(fd, telemetryHeader), varHeadersFromFileDescriptor(fd, telemetryHeader) ]); return new Telemetry(telemetryHeader, diskSubHeader, sessionInfo, varHeaders, fd); } uniqueId() { const accountId = this.sessionInfo.DriverInfo.Drivers[this.sessionInfo.DriverInfo.DriverCarIdx].UserID; const sessionId = this.sessionInfo.WeekendInfo.SessionID; const subSessionId = this.sessionInfo.WeekendInfo.SubSessionID; return `${accountId}-${sessionId}-${subSessionId}`; } sampleStream() { return new rxjs_1.Observable(subscriber => { let hasSample = true; let count = 0; const length = this.telemetryHeader.bufLen; const buffer = Buffer.alloc(length); while (hasSample) { const start = this.telemetryHeader.bufOffset + (count++ * length); const bytesRead = fs_1.readSync(this.fd, buffer, 0, length, start); if (bytesRead !== length) { hasSample = false; } else { subscriber.next(new telemetry_sample_1.TelemetrySample(buffer, this.varHeaders)); } } subscriber.complete(); }); } } exports.Telemetry = Telemetry; //# sourceMappingURL=telemetry.js.map