trackswap
Version:
A powerful and flexible GPX parser and encoder library for Node.js and TypeScript. TrackSwap provides comprehensive support for GPX 1.1 format with advanced features like plugin system, middleware support, and optimized performance.
512 lines (511 loc) • 14.8 kB
TypeScript
import { IProcessingContext } from "../core/base.js";
export interface FITFileType {
fileIdMesgs?: FileIdMesgType[];
fileCreatorMesgs?: FileCreatorMesgType[];
eventMesgs?: EventMesgType[];
deviceInfoMesgs?: DeviceInfoMesgType[];
deviceSettingsMesgs?: DeviceSettingsMesgType[];
userProfileMesgs?: UserProfileMesgType[];
sessionMesgs?: SessionMesgType[];
courseMesgs?: any[];
}
export type FITDecoderMesgs = {
fileIdMesgs?: FileIdMesgType[];
fileCreatorMesgs?: FileCreatorMesgType[];
eventMesgs?: EventMesgType[];
deviceInfoMesgs?: DeviceInfoMesgType[];
deviceSettingsMesgs?: DeviceSettingsMesgType[];
userProfileMesgs?: UserProfileMesgType[];
sessionMesgs?: Omit<SessionMesgType, "lapMesgs">[];
lapMesgs?: Omit<LapMesgType, "recordMesgs">[];
recordMesgs?: RecordMesgType[];
lengthMesgs?: LengthMesgType[];
courseMesgs?: any[];
[key: string]: any[] | undefined;
};
export interface FileIdMesgType {
serialNumber?: number;
timeCreated?: string;
manufacturer?: string;
product?: number;
type?: string;
garminProduct?: string;
}
export interface FileCreatorMesgType {
softwareVersion?: number;
}
export interface EventMesgType {
timestamp?: Date;
data?: number;
event?: string;
eventType?: string;
eventGroup?: number;
timerTrigger?: string;
}
export interface DeviceInfoMesgType {
timestamp?: string;
serialNumber?: number;
manufacturer?: string;
product?: number;
softwareVersion?: number;
deviceIndex?: string;
deviceType?: number;
garminProduct?: string;
}
export interface DeviceSettingsMesgType {
utcOffset?: number;
timeOffset?: number;
activeTimeZone?: number;
timeMode?: string;
timeZoneOffset?: number;
backlightMode?: string;
}
export interface UserProfileMesgType {
friendlyName?: string;
weight?: number;
gender?: string;
age?: number;
height?: number;
language?: string;
elevSetting?: string;
weightSetting?: string;
defaultMaxBikingHeartRate?: number;
defaultMaxHeartRate?: number;
hrSetting?: string;
speedSetting?: string;
distSetting?: string;
powerSetting?: string;
activityClass?: number;
positionSetting?: string;
temperatureSetting?: string;
}
export interface SessionMesgType {
messageIndex?: number;
timestamp: Date;
event: string;
eventType: string;
startTime: Date;
startPositionLat?: number;
startPositionLong?: number;
sport?: string;
subSport?: string;
totalElapsedTime?: number;
totalTimerTime?: number;
totalDistance?: number;
totalCycles?: number;
totalStrides?: number;
totalStrokes?: number;
totalCalories?: number;
totalFatCalories?: number;
avgSpeed?: number;
enhancedAvgSpeed?: number;
maxSpeed?: number;
enhancedMaxSpeed?: number;
avgHeartRate?: number;
maxHeartRate?: number;
avgCadence?: number;
avgRunningCadence?: number;
maxCadence?: number;
maxRunningCadence?: number;
avgPower?: number;
maxPower?: number;
totalAscent?: number;
totalDescent?: number;
totalTrainingEffect?: number;
firstLapIndex?: number;
numLaps?: number;
eventGroup?: number;
trigger?: string;
necLat?: number;
necLong?: number;
swcLat?: number;
swcLong?: number;
numLengths?: number;
normalizedPower?: number;
trainingStressScore?: number;
intensityFactor?: number;
leftRightBalance?: number;
endPositionLat?: number;
endPositionLong?: number;
avgStrokeCount?: number;
avgStrokeDistance?: number;
swimStroke?: string;
poolLength?: number;
thresholdPower?: number;
poolLengthUnit?: string;
numActiveLengths?: number;
totalWork?: number;
avgAltitude?: number;
enhancedAvgAltitude?: number;
maxAltitude?: number;
enhancedMaxAltitude?: number;
gpsAccuracy?: number;
avgGrade?: number;
avgPosGrade?: number;
avgNegGrade?: number;
maxPosGrade?: number;
maxNegGrade?: number;
avgTemperature?: number;
maxTemperature?: number;
minTemperature?: number;
totalMovingTime?: number;
avgPosVerticalSpeed?: number;
avgNegVerticalSpeed?: number;
maxPosVerticalSpeed?: number;
maxNegVerticalSpeed?: number;
minHeartRate?: number;
timeInHrZone?: number[];
timeInSpeedZone?: number[];
timeInCadenceZone?: number[];
timeInPowerZone?: number[];
avgLapTime?: number;
bestLapIndex?: number;
minAltitude?: number;
enhancedMinAltitude?: number;
playerScore?: number;
opponentScore?: number;
opponentName?: string;
strokeCount?: number[];
zoneCount?: number[];
maxBallSpeed?: number;
avgBallSpeed?: number;
avgVerticalOscillation?: number;
avgStanceTimePercent?: number;
avgStanceTime?: number;
avgFractionalCadence?: number;
maxFractionalCadence?: number;
totalFractionalCycles?: number;
avgTotalHemoglobinConc?: number;
minTotalHemoglobinConc?: number;
maxTotalHemoglobinConc?: number;
avgSaturatedHemoglobinPercent?: number;
minSaturatedHemoglobinPercent?: number;
maxSaturatedHemoglobinPercent?: number;
avgLeftTorqueEffectiveness?: number;
avgRightTorqueEffectiveness?: number;
avgLeftPedalSmoothness?: number;
avgRightPedalSmoothness?: number;
avgCombinedPedalSmoothness?: number;
sportProfileName?: string;
sportIndex?: number;
timeStanding?: number;
standCount?: number;
avgLeftPco?: number;
avgRightPco?: number;
avgLeftPowerPhase?: number[];
avgLeftPowerPhasePeak?: number[];
avgRightPowerPhase?: number[];
avgRightPowerPhasePeak?: number[];
avgPowerPosition?: number[];
maxPowerPosition?: number[];
avgCadencePosition?: number[];
maxCadencePosition?: number[];
avgLevMotorPower?: number;
maxLevMotorPower?: number;
levBatteryConsumption?: number;
avgVerticalRatio?: number;
avgStanceTimeBalance?: number;
avgStepLength?: number;
totalAnaerobicTrainingEffect?: number;
avgVam?: number;
avgDepth?: number;
maxDepth?: number;
surfaceInterval?: number;
startCns?: number;
endCns?: number;
startN2?: number;
endN2?: number;
avgRespirationRate?: number;
maxRespirationRate?: number;
minRespirationRate?: number;
enhancedAvgRespirationRate?: number;
enhancedMaxRespirationRate?: number;
enhancedMinRespirationRate?: number;
o2Toxicity?: number;
diveNumber?: number;
trainingLoadPeak?: number;
totalGrit?: number;
totalFlow?: number;
jumpCount?: number;
avgGrit?: number;
avgFlow?: number;
workoutFeel?: number;
workoutRpe?: number;
avgSpo2?: number;
avgStress?: number;
sdrrHrv?: number;
rmssdHrv?: number;
totalFractionalAscent?: number;
totalFractionalDescent?: number;
avgCoreTemperature?: number;
minCoreTemperature?: number;
maxCoreTemperature?: number;
lapMesgs?: LapMesgType[];
}
export interface RecordMesgType {
timestamp: Date;
positionLat?: number;
positionLong?: number;
altitude?: number;
enhancedAltitude?: number;
heartRate?: number;
cadence?: number;
distance?: number;
speed?: number;
enhancedSpeed?: number;
power?: number;
compressedSpeedDistance?: Uint8Array;
grade?: number;
resistance?: number;
timeFromCourse?: number;
cycleLength?: number;
temperature?: number;
speed1s?: number;
cycles?: number;
totalCycles?: number;
compressedAccumulatedPower?: number;
accumulatedPower?: number;
leftRightBalance?: number;
gpsAccuracy?: number;
verticalSpeed?: number;
calories?: number;
verticalOscillation?: number;
stanceTimePercent?: number;
stanceTime?: number;
activityType?: string;
leftTorqueEffectiveness?: number;
rightTorqueEffectiveness?: number;
leftPedalSmoothness?: number;
rightPedalSmoothness?: number;
combinedPedalSmoothness?: number;
time128?: number;
strokeType?: string;
zone?: number;
ballSpeed?: number;
cadence256?: number;
fractionalCadence?: number;
totalHemoglobinConc?: number;
totalHemoglobinConcMin?: number;
totalHemoglobinConcMax?: number;
saturatedHemoglobinPercent?: number;
saturatedHemoglobinPercentMin?: number;
saturatedHemoglobinPercentMax?: number;
deviceIndex?: number;
leftPco?: number;
rightPco?: number;
leftPowerPhase?: number;
leftPowerPhasePeak?: number;
rightPowerPhase?: number;
rightPowerPhasePeak?: number;
batterySoc?: number;
motorPower?: number;
verticalRatio?: number;
stanceTimeBalance?: number;
stepLength?: number;
cycleLength16?: number;
absolutePressure?: number;
depth?: number;
nextStopDepth?: number;
nextStopTime?: number;
timeToSurface?: number;
ndlTime?: number;
cnsLoad?: number;
n2Load?: number;
respirationRate?: number;
enhancedRespirationRate?: number;
grit?: number;
flow?: number;
currentStress?: number;
ebikeTravelRange?: number;
ebikeBatteryLevel?: number;
ebikeAssistMode?: number;
ebikeAssistLevelPercent?: number;
airTimeRemaining?: number;
pressureSac?: number;
volumeSac?: number;
rmv?: number;
ascentRate?: number;
po2?: number;
coreTemperature?: number;
}
export interface LengthMesgType {
timestamp: Date;
messageIndex: number;
event?: string;
eventType?: string;
startTime?: Date;
totalElapsedTime?: number;
totalTimerTime?: number;
totalStrokes?: number;
avgSpeed?: number;
swimStroke?: "breaststroke" | "freestyle" | "backstroke" | "butterfly" | "drill" | "mixed" | "im" | "invalid";
avgSwimmingCadence?: number;
eventGroup?: number;
totalCalories?: number;
lengthType?: "active" | "idle";
playerScore?: number;
opponentScore?: number;
strokeCount?: number;
zoneCount?: number;
enhancedAvgRespirationRate?: number;
enHancedMaxRespirationRate?: number;
avgRespirationRate?: number;
maxRespirationRate?: number;
}
export interface LapMesgType {
messageIndex: number;
timestamp?: Date;
event?: string;
eventType?: string;
startTime?: Date;
startPositionLat?: number;
startPositionLong?: number;
endPositionLat?: number;
endPositionLong?: number;
totalElapsedTime?: number;
totalTimerTime?: number;
totalDistance?: number;
totalCycles?: number;
totalStrides?: number;
totalStrokes?: number;
totalCalories?: number;
totalFatCalories?: number;
avgSpeed?: number;
enhancedAvgSpeed?: number;
maxSpeed?: number;
enhancedMaxSpeed?: number;
avgHeartRate?: number;
maxHeartRate?: number;
avgCadence?: number;
avgRunningCadence?: number;
maxCadence?: number;
maxRunningCadence?: number;
avgPower?: number;
maxPower?: number;
totalAscent?: number;
totalDescent?: number;
intensity?: string;
lapTrigger?: string;
sport?: string;
eventGroup?: number;
numLengths?: number;
normalizedPower?: number;
leftRightBalance?: number;
firstLengthIndex?: number;
avgStrokeDistance?: number;
swimStroke?: string;
subSport?: string;
numActiveLengths?: number;
totalWork?: number;
avgAltitude?: number;
enhancedAvgAltitude?: number;
maxAltitude?: number;
enhancedMaxAltitude?: number;
gpsAccuracy?: number;
avgGrade?: number;
avgPosGrade?: number;
avgNegGrade?: number;
maxPosGrade?: number;
maxNegGrade?: number;
avgTemperature?: number;
maxTemperature?: number;
totalMovingTime?: number;
avgPosVerticalSpeed?: number;
avgNegVerticalSpeed?: number;
maxPosVerticalSpeed?: number;
maxNegVerticalSpeed?: number;
minHeartRate?: number;
timeInHrZone?: number[];
timeInSpeedZone?: number[];
timeInCadenceZone?: number[];
timeInPowerZone?: number[];
repetitionNum?: number;
minAltitude?: number;
enhancedMinAltitude?: number;
wktStepIndex?: number;
opponentScore?: number;
strokeCount?: number[];
zoneCount?: number[];
avgVerticalOscillation?: number;
avgStanceTimePercent?: number;
avgStanceTime?: number;
avgFractionalCadence?: number;
maxFractionalCadence?: number;
totalFractionalCycles?: number;
playerScore?: number;
avgTotalHemoglobinConc?: number;
minTotalHemoglobinConc?: number;
maxTotalHemoglobinConc?: number;
avgSaturatedHemoglobinPercent?: number;
minSaturatedHemoglobinPercent?: number;
maxSaturatedHemoglobinPercent?: number;
avgLeftTorqueEffectiveness?: number;
avgRightTorqueEffectiveness?: number;
avgLeftPedalSmoothness?: number;
avgRightPedalSmoothness?: number;
avgCombinedPedalSmoothness?: number;
timeStanding?: number;
standCount?: number;
avgLeftPco?: number;
avgRightPco?: number;
avgLeftPowerPhase?: number[];
avgLeftPowerPhasePeak?: number[];
avgRightPowerPhase?: number[];
avgRightPowerPhasePeak?: number[];
avgPowerPosition?: number[];
maxPowerPosition?: number[];
avgCadencePosition?: number[];
maxCadencePosition?: number[];
avgLevMotorPower?: number;
maxLevMotorPower?: number;
levBatteryConsumption?: number;
avgVerticalRatio?: number;
avgStanceTimeBalance?: number;
avgStepLength?: number;
avgVam?: number;
avgDepth?: number;
maxDepth?: number;
minTemperature?: number;
enhancedAvgRespirationRate?: number;
enhancedMaxRespirationRate?: number;
avgRespirationRate?: number;
maxRespirationRate?: number;
totalGrit?: number;
totalFlow?: number;
jumpCount?: number;
avgGrit?: number;
avgFlow?: number;
totalFractionalAscent?: number;
totalFractionalDescent?: number;
avgCoreTemperature?: number;
minCoreTemperature?: number;
maxCoreTemperature?: number;
recordMesgs?: RecordMesgType[];
lengthMesgs?: LengthMesgType[];
}
export interface ActivityMesgType {
timestamp?: Date;
totalTimerTime?: number;
numSessions?: number;
type?: string;
event?: string;
eventType?: string;
[key: string]: number | string | undefined | any;
}
export interface FITContext extends IProcessingContext {
rawData?: Buffer;
rawMessages?: FITDecoderMesgs;
result?: FITFileType;
fileHeader?: {
type?: string;
manufacturer?: string;
product?: number;
};
performance: {
startTime: number;
parseTime?: number;
extractTime?: number;
structureTime?: number;
endTime?: number;
};
}