Whether a power channel was recorded.
Whether the activity carries GPS positions (a map; otherwise indoor / GPS-off).
Session metadata — id, name, sport, start, totals.
Power best efforts at the canonical durations (+ W/kg if weightKg); []
when no power.
Total moving / elapsed / distance, quantity-typed.
Distance best efforts — fastest time over each canonical distance window
(400 m … marathon), with avg HR. Needs a time axis; [] otherwise.
Optionaldistances: number[]Device-recorded laps as Sections (empty if the source recorded none).
Power summary (NP, IF, TSS, distribution, zones, curve) at the given FTP —
undefined when no power was recorded. elapsedSeconds drives TSS.
Mean-maximal power curve; [] when no power.
Optionaldurations: number[]The prepared per-sample columns + derived series — for consumers still on the functional path (e.g. the chart) while they migrate to the façade.
The full journey summary (totals, channels, polyline, splits, laps).
The canonical pond series (the escape hatch to the functional/pond layer).
Bind an athlete Profile for the analytics that need FTP / body
weight / zone definitions — power summary, time-in-zone, W/kg. Returns a
ProfiledActivity whose slices (splits / range / laps) stay
bound to the same profile (turtles all the way down). The bare Activity
keeps only the profile-agnostic methods.
Channels re-bucketed over a distance window [startMeters, endMeters] — the
chart-zoom resolution path, finer than the whole-activity profile from
summary. The façade home for the functional windowChannels.
StaticfromBuild from an imported activity (streams + metadata + optional laps) — the
Strava / fixture path. fromFit / fromGpx / fromTcx land with ingest.
The activity façade. Construct from an imported activity (
fromStreams); read the canonical series (timeSeries), slice it (splits/laps/range), sample it (at), and run analytics (power/powerCurve/bestEfforts/hrZones). Immutable; derived results memoize on first call.