6cclab-ibt-telemetry
Version:
iRacing ibt parser
86 lines • 4.16 kB
JavaScript
;
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