workouts-transfer
Version:
Workouts transfer between services as inversify modules.
75 lines (74 loc) • 2.63 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const luxon_1 = require("luxon");
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
const xml2js_1 = __importDefault(require("xml2js"));
const parser = new xml2js_1.default.Parser();
function parse(data) {
return new Promise((resolve, reject) => {
// eslint-disable-next-line promise/prefer-await-to-callbacks
parser.parseString(data, (err, result) => {
if (err) {
reject(err);
}
resolve(result);
});
});
}
const gpxExtension = 'gpxtpx:TrackPointExtension';
const trackExtension = 'ns3:TrackPointExtension';
function getCadence(point) {
const { extensions } = point;
if (!extensions) {
return;
}
if (extensions[0][trackExtension] && extensions[0][trackExtension][0]['ns3:cad']) {
return Number(extensions[0][trackExtension][0]['ns3:cad'][0]);
}
if (extensions[0][gpxExtension] && extensions[0]['gpxtpx:TrackPointExtension'][0]['gpxtpx:cad']) {
return Number(extensions[0][gpxExtension][0]['gpxtpx:cad'][0]);
}
}
function getTemperature(point) {
const { extensions } = point;
if (!extensions) {
return;
}
if (extensions[0][trackExtension] && extensions[0][trackExtension][0]['ns3:atemp']) {
return Number(extensions[0][trackExtension][0]['ns3:atemp'][0]);
}
}
function getHr(point) {
const { extensions } = point;
if (!extensions) {
return;
}
if (extensions[0][gpxExtension] && extensions[0][gpxExtension][0]['gpxtpx:hr']) {
return Number(extensions[0][gpxExtension][0]['gpxtpx:hr'][0]);
}
if (extensions[0][trackExtension] && extensions[0][trackExtension][0]['ns3:hr']) {
return Number(extensions[0][trackExtension][0]['ns3:hr'][0]);
}
}
async function gpx(data) {
const parsedData = await parse(data);
if (!parsedData.gpx.trk[0].trkseg[0].trkpt) {
return null;
}
return parsedData.gpx.trk[0].trkseg[0].trkpt.map((point) => {
return {
time: luxon_1.DateTime.fromISO(point.time[0]),
latitude: Number(point.$.lat),
longitude: Number(point.$.lon),
altitude: point.ele && point.ele[0] ? Number(point.ele[0]) : undefined,
cadence: getCadence(point),
hr: getHr(point),
temperature: getTemperature(point),
};
});
}
exports.default = gpx;