incyclist-services 1.2.2 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/lib/activities/base/api/consts.d.ts +2 -0
  2. package/lib/activities/base/api/consts.js +6 -0
  3. package/lib/activities/base/api/fitconvert.d.ts +8 -0
  4. package/lib/activities/base/api/fitconvert.js +57 -0
  5. package/lib/activities/base/api/index.d.ts +1 -0
  6. package/lib/activities/base/api/index.js +17 -0
  7. package/lib/activities/base/convert/converter.d.ts +6 -0
  8. package/lib/activities/base/convert/converter.js +28 -0
  9. package/lib/activities/base/convert/factory.d.ts +8 -0
  10. package/lib/activities/base/convert/factory.js +89 -0
  11. package/lib/activities/base/convert/fit/index.d.ts +1 -0
  12. package/lib/activities/base/convert/fit/index.js +17 -0
  13. package/lib/activities/base/convert/fit/remote-fit.d.ts +13 -0
  14. package/lib/activities/base/convert/fit/remote-fit.js +61 -0
  15. package/lib/activities/base/convert/index.d.ts +4 -0
  16. package/lib/activities/base/convert/index.js +20 -0
  17. package/lib/activities/base/convert/tcx/index.d.ts +1 -0
  18. package/lib/activities/base/convert/tcx/index.js +17 -0
  19. package/lib/activities/base/convert/tcx/tcx.d.ts +12 -0
  20. package/lib/activities/base/convert/tcx/tcx.js +87 -0
  21. package/lib/activities/base/convert/types.d.ts +7 -0
  22. package/lib/activities/base/convert/types.js +9 -0
  23. package/lib/activities/base/index.d.ts +2 -0
  24. package/lib/activities/base/index.js +2 -0
  25. package/lib/activities/base/model/index.d.ts +16 -16
  26. package/lib/activities/base/repo/db.js +3 -3
  27. package/lib/activities/index.d.ts +1 -0
  28. package/lib/activities/index.js +1 -0
  29. package/lib/activities/ride/service.d.ts +1 -3
  30. package/lib/activities/ride/service.js +22 -35
  31. package/lib/activities/upload/index.d.ts +2 -0
  32. package/lib/activities/upload/index.js +18 -0
  33. package/lib/activities/upload/types.d.ts +8 -0
  34. package/lib/activities/upload/types.js +2 -0
  35. package/lib/activities/upload/velohero.d.ts +23 -0
  36. package/lib/activities/upload/velohero.js +225 -0
  37. package/lib/api/appInfo/index.d.ts +3 -0
  38. package/lib/api/bindings/index.d.ts +4 -0
  39. package/lib/api/bindings/secret/index.d.ts +3 -0
  40. package/lib/api/bindings/secret/index.js +2 -0
  41. package/lib/api/form/index.d.ts +6 -0
  42. package/lib/api/form/index.js +2 -0
  43. package/lib/api/repository/json/index.d.ts +2 -1
  44. package/lib/api/repository/types.d.ts +1 -3
  45. package/lib/api/rest/ApiClient.d.ts +18 -0
  46. package/lib/api/rest/ApiClient.js +77 -0
  47. package/lib/api/rest/IncyclistRestApiClient.d.ts +5 -0
  48. package/lib/api/rest/IncyclistRestApiClient.js +87 -0
  49. package/lib/api/rest/RestApiClient.d.ts +7 -0
  50. package/lib/api/rest/RestApiClient.js +15 -0
  51. package/lib/api/rest/api.d.ts +15 -0
  52. package/lib/api/rest/api.js +69 -0
  53. package/lib/api/rest/incyclist.d.ts +7 -0
  54. package/lib/api/rest/incyclist.js +36 -0
  55. package/lib/api/rest/index.d.ts +3 -18
  56. package/lib/api/rest/index.js +16 -76
  57. package/lib/api/rest/types.d.ts +1 -1
  58. package/lib/apps/base/api/velohero/api.d.ts +20 -0
  59. package/lib/apps/base/api/velohero/api.js +134 -0
  60. package/lib/apps/base/api/velohero/types.d.ts +12 -0
  61. package/lib/apps/base/api/velohero/types.js +2 -0
  62. package/lib/devices/access/service.js +11 -11
  63. package/lib/devices/configuration/service.js +1 -1
  64. package/lib/devices/pairing/service.js +9 -9
  65. package/lib/devices/ride/service.js +4 -4
  66. package/lib/i18n/countries/index.js +1 -1
  67. package/lib/routes/base/api/index.js +2 -2
  68. package/lib/routes/base/model/route.d.ts +1 -0
  69. package/lib/routes/base/model/route.js +4 -0
  70. package/lib/routes/base/parsers/gpx.js +1 -1
  71. package/lib/routes/base/parsers/multixml.d.ts +1 -1
  72. package/lib/routes/base/parsers/multixml.js +1 -1
  73. package/lib/routes/base/parsers/utils.d.ts +2 -1
  74. package/lib/routes/base/parsers/xml.d.ts +2 -2
  75. package/lib/routes/base/parsers/xml.js +4 -4
  76. package/lib/routes/base/utils/route.d.ts +1 -1
  77. package/lib/routes/base/utils/route.js +4 -2
  78. package/lib/routes/base/utils/xml.d.ts +3 -1
  79. package/lib/routes/download/service.js +1 -1
  80. package/lib/routes/list/cards/RouteCard.js +1 -1
  81. package/lib/routes/list/loaders/DBLoader.js +1 -1
  82. package/lib/routes/list/loaders/api.js +2 -2
  83. package/lib/routes/list/loaders/db.js +3 -3
  84. package/lib/routes/list/service.js +2 -2
  85. package/lib/utils/formatting.d.ts +1 -0
  86. package/lib/utils/formatting.js +11 -1
  87. package/lib/utils/index.d.ts +1 -0
  88. package/lib/utils/index.js +1 -0
  89. package/lib/utils/xml.d.ts +17 -0
  90. package/lib/utils/xml.js +109 -0
  91. package/lib/workouts/base/api/index.js +1 -1
  92. package/lib/workouts/base/parsers/zwo.js +1 -1
  93. package/lib/workouts/list/cards/WorkoutCard.js +2 -2
  94. package/lib/workouts/list/loaders/db.js +2 -2
  95. package/package.json +10 -5
@@ -0,0 +1,2 @@
1
+ export declare const FITCONVERT_API = "FITCONVERT_API";
2
+ export declare const DEFAULT_FIT_API = "https://dlws.incyclist.com/api/v1/fit/convert";
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_FIT_API = exports.FITCONVERT_API = void 0;
4
+ const DEFAULT_FIT_API_PROD = 'https://dlws.incyclist.com/api/v1/fit/convert';
5
+ exports.FITCONVERT_API = 'FITCONVERT_API';
6
+ exports.DEFAULT_FIT_API = DEFAULT_FIT_API_PROD;
@@ -0,0 +1,8 @@
1
+ import { AxiosInstance } from "axios";
2
+ import { FitExportActivity } from "../model";
3
+ export declare class IncyclistFitConvertApi {
4
+ protected api: AxiosInstance;
5
+ convertToFit(data: FitExportActivity): Promise<ArrayBuffer>;
6
+ protected getApi(): AxiosInstance;
7
+ protected getBaseUrl(): string;
8
+ }
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.IncyclistFitConvertApi = void 0;
13
+ const settings_1 = require("../../../settings");
14
+ const consts_1 = require("./consts");
15
+ const utils_1 = require("../../../utils");
16
+ const api_1 = require("../../../api");
17
+ class IncyclistFitConvertApi {
18
+ convertToFit(data) {
19
+ return __awaiter(this, void 0, void 0, function* () {
20
+ let url;
21
+ try {
22
+ const baseUrl = this.getBaseUrl();
23
+ const requestUrl = `${baseUrl}/activity/${data.id}`;
24
+ const response = yield this.getApi().post(requestUrl, data);
25
+ url = response.data;
26
+ }
27
+ catch (error) {
28
+ throw new Error(`convert failed: (phase convert), reason: ${error.message}`);
29
+ }
30
+ try {
31
+ const response = yield this.getApi().get(url, { responseType: 'arraybuffer' });
32
+ return response.data;
33
+ }
34
+ catch (error) {
35
+ throw new Error(`convert failed: (phase download), reason: ${error.message}`);
36
+ }
37
+ });
38
+ }
39
+ getApi() {
40
+ if (!this.api) {
41
+ this.api = api_1.IncyclistRestApiClient.getClient();
42
+ return this.api;
43
+ }
44
+ return this.api;
45
+ }
46
+ getBaseUrl() {
47
+ let baseUrl;
48
+ try {
49
+ baseUrl = (0, settings_1.useUserSettings)().get(consts_1.FITCONVERT_API, consts_1.DEFAULT_FIT_API);
50
+ }
51
+ catch (_a) {
52
+ baseUrl = consts_1.DEFAULT_FIT_API;
53
+ }
54
+ return (0, utils_1.trimTrailingChars)(baseUrl, '/');
55
+ }
56
+ }
57
+ exports.IncyclistFitConvertApi = IncyclistFitConvertApi;
@@ -0,0 +1 @@
1
+ export * from './fitconvert';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./fitconvert"), exports);
@@ -0,0 +1,6 @@
1
+ import { ActivityDetails } from "../model";
2
+ import { ActivityConverterFactory } from "./factory";
3
+ export declare class ActivityConverter {
4
+ static factory?: ActivityConverterFactory;
5
+ static convert(activity: ActivityDetails, format: string): Promise<unknown>;
6
+ }
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ActivityConverter = void 0;
13
+ const factory_1 = require("./factory");
14
+ const fit_1 = require("./fit");
15
+ const tcx_1 = require("./tcx");
16
+ class ActivityConverter {
17
+ static convert(activity, format) {
18
+ return __awaiter(this, void 0, void 0, function* () {
19
+ if (!ActivityConverter.factory) {
20
+ ActivityConverter.factory = new factory_1.ActivityConverterFactory();
21
+ ActivityConverter.factory.add('fit', new fit_1.RemoteFitConverter());
22
+ ActivityConverter.factory.add('tcx', new tcx_1.TcxConverter());
23
+ }
24
+ return yield ActivityConverter.factory.convert(activity, format);
25
+ });
26
+ }
27
+ }
28
+ exports.ActivityConverter = ActivityConverter;
@@ -0,0 +1,8 @@
1
+ import { ActivityDetails } from "../model";
2
+ import { IActivityConverter } from "./types";
3
+ export declare class ActivityConverterFactory {
4
+ protected converters: Record<string, IActivityConverter>;
5
+ constructor();
6
+ add(format: string, converter: IActivityConverter): void;
7
+ convert(activity: ActivityDetails, targetFormat: string): Promise<any>;
8
+ }
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
3
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
4
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
5
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
6
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
7
+ var _, done = false;
8
+ for (var i = decorators.length - 1; i >= 0; i--) {
9
+ var context = {};
10
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
11
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
12
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
13
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
14
+ if (kind === "accessor") {
15
+ if (result === void 0) continue;
16
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
17
+ if (_ = accept(result.get)) descriptor.get = _;
18
+ if (_ = accept(result.set)) descriptor.set = _;
19
+ if (_ = accept(result.init)) initializers.unshift(_);
20
+ }
21
+ else if (_ = accept(result)) {
22
+ if (kind === "field") initializers.unshift(_);
23
+ else descriptor[key] = _;
24
+ }
25
+ }
26
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
27
+ done = true;
28
+ };
29
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
30
+ var useValue = arguments.length > 2;
31
+ for (var i = 0; i < initializers.length; i++) {
32
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
33
+ }
34
+ return useValue ? value : void 0;
35
+ };
36
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
37
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
38
+ return new (P || (P = Promise))(function (resolve, reject) {
39
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
40
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
41
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
42
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
43
+ });
44
+ };
45
+ var __setFunctionName = (this && this.__setFunctionName) || function (f, name, prefix) {
46
+ if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : "";
47
+ return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });
48
+ };
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ exports.ActivityConverterFactory = void 0;
51
+ const types_1 = require("../../../base/types");
52
+ let ActivityConverterFactory = (() => {
53
+ let _classDecorators = [types_1.Singleton];
54
+ let _classDescriptor;
55
+ let _classExtraInitializers = [];
56
+ let _classThis;
57
+ var ActivityConverterFactory = _classThis = class {
58
+ constructor() {
59
+ this.converters = {};
60
+ }
61
+ add(format, converter) {
62
+ if (!format || !converter)
63
+ return;
64
+ this.converters[format.toLowerCase()] = converter;
65
+ }
66
+ convert(activity, targetFormat) {
67
+ return __awaiter(this, void 0, void 0, function* () {
68
+ if (!activity || !targetFormat)
69
+ throw new Error('illegal use: activity and format need to be specified');
70
+ const format = targetFormat.toLowerCase();
71
+ const converter = this.converters[format];
72
+ if (!converter)
73
+ throw new Error(`unknown format: ${targetFormat}`);
74
+ const res = yield converter.convert(activity);
75
+ return res;
76
+ });
77
+ }
78
+ };
79
+ __setFunctionName(_classThis, "ActivityConverterFactory");
80
+ (() => {
81
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
82
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
83
+ ActivityConverterFactory = _classThis = _classDescriptor.value;
84
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
85
+ __runInitializers(_classThis, _classExtraInitializers);
86
+ })();
87
+ return ActivityConverterFactory = _classThis;
88
+ })();
89
+ exports.ActivityConverterFactory = ActivityConverterFactory;
@@ -0,0 +1 @@
1
+ export * from './remote-fit';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./remote-fit"), exports);
@@ -0,0 +1,13 @@
1
+ import { EventLogger } from 'gd-eventlog';
2
+ import { IncyclistFitConvertApi } from '../../api/fitconvert';
3
+ import { ActivityDetails, ActivityLogRecord, FitExportActivity, FitLogEntry } from '../../model';
4
+ export declare class RemoteFitConverter {
5
+ protected logger: EventLogger;
6
+ protected api: IncyclistFitConvertApi;
7
+ constructor();
8
+ convert(activity: ActivityDetails): Promise<ArrayBuffer>;
9
+ protected getApi(): IncyclistFitConvertApi;
10
+ protected getFitActivity(activity: ActivityDetails): FitExportActivity;
11
+ protected mapLogToFit(log: ActivityLogRecord): FitLogEntry;
12
+ protected getUserSettings(): import("../../../../settings").UserSettingsService;
13
+ }
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.RemoteFitConverter = void 0;
13
+ const gd_eventlog_1 = require("gd-eventlog");
14
+ const fitconvert_1 = require("../../api/fitconvert");
15
+ const settings_1 = require("../../../../settings");
16
+ class RemoteFitConverter {
17
+ constructor() {
18
+ this.logger = new gd_eventlog_1.EventLogger('RemoteFitExporter');
19
+ }
20
+ convert(activity) {
21
+ return __awaiter(this, void 0, void 0, function* () {
22
+ try {
23
+ this.logger.logEvent({ message: 'convert start', format: 'FIT' });
24
+ const content = this.getFitActivity(activity);
25
+ const data = yield this.getApi().convertToFit(content);
26
+ this.logger.logEvent({ message: 'convert success', format: 'FIT' });
27
+ return data;
28
+ }
29
+ catch (err) {
30
+ this.logger.logEvent({ message: 'convert result', format: 'FIT', result: 'error', reason: err.message });
31
+ throw err;
32
+ }
33
+ });
34
+ }
35
+ getApi() {
36
+ if (!this.api)
37
+ this.api = new fitconvert_1.IncyclistFitConvertApi();
38
+ return this.api;
39
+ }
40
+ getFitActivity(activity) {
41
+ const { id, title, time, timeTotal, timePause, distance } = activity;
42
+ const status = 'created';
43
+ const startTime = new Date(activity.startTime).toISOString();
44
+ const logs = activity.logs.map(this.mapLogToFit.bind(this));
45
+ const screenshots = [];
46
+ const laps = [];
47
+ const user = {
48
+ id: this.getUserSettings().get('uuid', undefined),
49
+ weight: activity.user.weight
50
+ };
51
+ return { id, title, status, logs, laps, startTime, time, timeTotal, timePause, distance, user, screenshots };
52
+ }
53
+ mapLogToFit(log) {
54
+ const { time, speed, slope, cadence, heartrate, distance, power, lat, lng, elevation } = log;
55
+ return { time, speed, slope, cadence, heartrate, distance, power, lat, lon: lng, elevation };
56
+ }
57
+ getUserSettings() {
58
+ return (0, settings_1.useUserSettings)();
59
+ }
60
+ }
61
+ exports.RemoteFitConverter = RemoteFitConverter;
@@ -0,0 +1,4 @@
1
+ export * from './factory';
2
+ export * from './tcx';
3
+ export * from './fit';
4
+ export * from './converter';
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./factory"), exports);
18
+ __exportStar(require("./tcx"), exports);
19
+ __exportStar(require("./fit"), exports);
20
+ __exportStar(require("./converter"), exports);
@@ -0,0 +1 @@
1
+ export * from './tcx';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./tcx"), exports);
@@ -0,0 +1,12 @@
1
+ import { EventLogger } from 'gd-eventlog';
2
+ import { TrackPoint, ActivityLap } from 'tcx-builder';
3
+ import { IActivityConverter } from '../types';
4
+ import { ActivityDetails } from '../../model';
5
+ export declare class TcxConverter implements IActivityConverter {
6
+ protected logger: EventLogger;
7
+ constructor();
8
+ convert(activity: ActivityDetails): Promise<string>;
9
+ protected createLaps(startTime: Date, activity: ActivityDetails, trackPoints: TrackPoint[]): ActivityLap[];
10
+ protected creatTrackPoints(activity: ActivityDetails, startTime: Date): TrackPoint[];
11
+ protected getRideService(): import("../../../ride").ActivityRideService;
12
+ }
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.TcxConverter = void 0;
13
+ const gd_eventlog_1 = require("gd-eventlog");
14
+ const tcx_builder_1 = require("tcx-builder");
15
+ const ride_1 = require("../../../ride");
16
+ class TcxConverter {
17
+ constructor() {
18
+ this.logger = new gd_eventlog_1.EventLogger('TcxExporter');
19
+ }
20
+ convert(activity) {
21
+ return __awaiter(this, void 0, void 0, function* () {
22
+ this.logger.logEvent({ message: 'convert start', format: 'TCX' });
23
+ try {
24
+ const startTime = new Date(activity.startTime);
25
+ const trackPoints = this.creatTrackPoints(activity, startTime);
26
+ const laps = this.createLaps(startTime, activity, trackPoints);
27
+ const tcxActivity = new tcx_builder_1.Activity('Biking', { Id: startTime, Notes: 'Incyclist Ride', Laps: laps });
28
+ const activityList = new tcx_builder_1.ActivityList({ activity: [tcxActivity] });
29
+ const tcxObj = new tcx_builder_1.TrainingCenterDatabase({ activities: activityList });
30
+ const xml = tcxObj.toXml();
31
+ this.logger.logEvent({ message: 'convert success', format: 'TCX' });
32
+ return xml;
33
+ }
34
+ catch (err) {
35
+ this.logger.logEvent({ message: 'convert result', format: 'TCX', result: 'error', error: err.message });
36
+ throw err;
37
+ }
38
+ });
39
+ }
40
+ createLaps(startTime, activity, trackPoints) {
41
+ var _a, _b, _c, _d, _e, _f, _g, _h;
42
+ const lap = new tcx_builder_1.ActivityLap(startTime, {
43
+ Calories: 0,
44
+ DistanceMeters: activity.distance,
45
+ Intensity: 'Active',
46
+ TotalTimeSeconds: activity.time,
47
+ TriggerMethod: 'Distance',
48
+ MaximumSpeed: ((_b = (_a = activity.stats) === null || _a === void 0 ? void 0 : _a.speed) === null || _b === void 0 ? void 0 : _b.max) || 0,
49
+ MaximumHeartRateBpm: ((_c = activity.stats) === null || _c === void 0 ? void 0 : _c.hrm) ? new tcx_builder_1.HeartRateInBeatsPerMinute({ value: (_d = activity.stats.hrm) === null || _d === void 0 ? void 0 : _d.max }) : undefined,
50
+ AverageHeartRateBpm: ((_e = activity.stats) === null || _e === void 0 ? void 0 : _e.hrm) ? new tcx_builder_1.HeartRateInBeatsPerMinute({ value: (_f = activity.stats.hrm) === null || _f === void 0 ? void 0 : _f.avg }) : undefined,
51
+ Cadence: (_h = (_g = activity.stats) === null || _g === void 0 ? void 0 : _g.cadence) === null || _h === void 0 ? void 0 : _h.avg,
52
+ Track: new tcx_builder_1.Track({ trackPoints })
53
+ });
54
+ return [lap];
55
+ }
56
+ creatTrackPoints(activity, startTime) {
57
+ return activity.logs.map((log) => {
58
+ const tp = new tcx_builder_1.TrackPoint({
59
+ time: log ? new Date(startTime.valueOf() + log.time * 1000) : undefined,
60
+ altitudeMeters: log === null || log === void 0 ? void 0 : log.elevation,
61
+ distanceMeters: log === null || log === void 0 ? void 0 : log.distance,
62
+ heartRateBpm: (log === null || log === void 0 ? void 0 : log.heartrate) ? new tcx_builder_1.HeartRateBpm(log.heartrate) : undefined,
63
+ cadence: log === null || log === void 0 ? void 0 : log.cadence,
64
+ sensorState: 'Present',
65
+ extensions: new tcx_builder_1.TrackPointExtensions({
66
+ Speed: log === null || log === void 0 ? void 0 : log.speed,
67
+ Watts: log === null || log === void 0 ? void 0 : log.power,
68
+ }),
69
+ });
70
+ const lat = log === null || log === void 0 ? void 0 : log.lat;
71
+ let lng;
72
+ if ((activity === null || activity === void 0 ? void 0 : activity.type) === 'IncyclistActivity') {
73
+ lng = log === null || log === void 0 ? void 0 : log.lng;
74
+ }
75
+ else {
76
+ lng = log === null || log === void 0 ? void 0 : log.lon;
77
+ }
78
+ if (!isNaN(Number(lat !== null && lat !== void 0 ? lat : 'XX')) && !isNaN(Number(lng !== null && lng !== void 0 ? lng : 'XX')))
79
+ tp.Position = new tcx_builder_1.Position(lat, lng);
80
+ return tp;
81
+ });
82
+ }
83
+ getRideService() {
84
+ return (0, ride_1.useActivityRide)();
85
+ }
86
+ }
87
+ exports.TcxConverter = TcxConverter;
@@ -0,0 +1,7 @@
1
+ import { ActivityDetails } from "../model";
2
+ export interface IActivityConverter {
3
+ convert(activity: ActivityDetails): any;
4
+ }
5
+ export declare class ActivityConverter implements IActivityConverter {
6
+ convert(activity?: ActivityDetails): void;
7
+ }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ActivityConverter = void 0;
4
+ class ActivityConverter {
5
+ convert(activity) {
6
+ throw new Error("Method not implemented.");
7
+ }
8
+ }
9
+ exports.ActivityConverter = ActivityConverter;
@@ -1,3 +1,5 @@
1
1
  export * from './repo';
2
2
  export * from './model';
3
3
  export * from './utils';
4
+ export * from './convert';
5
+ export * from './api/fitconvert';
@@ -17,3 +17,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./repo"), exports);
18
18
  __exportStar(require("./model"), exports);
19
19
  __exportStar(require("./utils"), exports);
20
+ __exportStar(require("./convert"), exports);
21
+ __exportStar(require("./api/fitconvert"), exports);
@@ -2,7 +2,7 @@ import { RoutePoint } from "../../../routes/base/types";
2
2
  export type ActivityUser = {
3
3
  uuid?: string;
4
4
  weight: number;
5
- ftp: number;
5
+ ftp?: number;
6
6
  };
7
7
  export type ActivityRoute = {
8
8
  id?: string;
@@ -18,20 +18,6 @@ export type ActivityStatsRecord = {
18
18
  minAllowed?: number;
19
19
  weighted?: number;
20
20
  };
21
- export type ActivityLogRecord = {
22
- time: number;
23
- timeDelta: number;
24
- speed: number;
25
- slope?: number;
26
- cadence: number;
27
- heartrate?: number;
28
- distance?: number;
29
- power: number;
30
- lat?: number;
31
- lon?: number;
32
- lng?: number;
33
- elevation?: number;
34
- };
35
21
  export type ActivityStats = {
36
22
  hrm?: ActivityStatsRecord;
37
23
  cadence?: ActivityStatsRecord;
@@ -124,7 +110,7 @@ export type FitExportActivity = {
124
110
  logs: Array<FitLogEntry>;
125
111
  laps: Array<FitLapEntry>;
126
112
  startTime: string;
127
- stopTime: string;
113
+ stopTime?: string;
128
114
  time: number;
129
115
  timeTotal: number;
130
116
  distance: number;
@@ -162,6 +148,20 @@ export interface ActivityDetails {
162
148
  fitFileName?: string;
163
149
  links?: ActivityAppLinks;
164
150
  }
151
+ export type ActivityLogRecord = {
152
+ time: number;
153
+ timeDelta: number;
154
+ speed: number;
155
+ slope?: number;
156
+ cadence: number;
157
+ heartrate?: number;
158
+ distance?: number;
159
+ power: number;
160
+ lat?: number;
161
+ lng?: number;
162
+ elevation?: number;
163
+ lon?: number;
164
+ };
165
165
  export type ActivityInfo = {
166
166
  summary: ActivitySummary;
167
167
  details?: ActivityDetails;
@@ -74,8 +74,8 @@ let ActivitiesRepository = (() => {
74
74
  stopLoad() {
75
75
  this.emitDone();
76
76
  }
77
- save(activity, writeDetails = true) {
78
- return __awaiter(this, void 0, void 0, function* () {
77
+ save(activity_1) {
78
+ return __awaiter(this, arguments, void 0, function* (activity, writeDetails = true) {
79
79
  const stringify = (json) => { try {
80
80
  JSON.stringify(json);
81
81
  }
@@ -321,8 +321,8 @@ let ActivitiesRepository = (() => {
321
321
  });
322
322
  }
323
323
  scanForNewActivities() {
324
- var _a;
325
324
  return __awaiter(this, void 0, void 0, function* () {
325
+ var _a;
326
326
  try {
327
327
  let names = yield this.listActivities();
328
328
  if (!names)
@@ -1,3 +1,4 @@
1
1
  export * from './base';
2
2
  export * from './list';
3
3
  export * from './ride';
4
+ export * from './upload';
@@ -17,3 +17,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./base"), exports);
18
18
  __exportStar(require("./list"), exports);
19
19
  __exportStar(require("./ride"), exports);
20
+ __exportStar(require("./upload"), exports);
@@ -3,7 +3,7 @@ import { IncyclistService } from "../../base/service";
3
3
  import { Observer } from "../../base/types/observer";
4
4
  import { DeviceData } from "incyclist-devices";
5
5
  import { ExtendedIncyclistCapability, HealthStatus } from "../../devices";
6
- import { ActivitiesRepository, ActivityDetails, ActivityLogRecord, ActivityRouteType, FitExportActivity, FitLogEntry, ScreenShotInfo } from "../base";
6
+ import { ActivitiesRepository, ActivityDetails, ActivityLogRecord, ActivityRouteType, ScreenShotInfo } from "../base";
7
7
  import { FreeRideStartSettings } from "../../routes/list/types";
8
8
  import { RoutePoint } from "../../routes/base/types";
9
9
  import { ActivityState } from "./types";
@@ -53,8 +53,6 @@ export declare class ActivityRideService extends IncyclistService {
53
53
  getDashboardDisplayProperties(): any[];
54
54
  getActivitySummaryDisplayProperties(): void;
55
55
  getActivity(): ActivityDetails;
56
- protected mapLogToFit(log: ActivityLogRecord): FitLogEntry;
57
- getFitActivity(): FitExportActivity;
58
56
  save(): Promise<void>;
59
57
  getObserver(): Observer;
60
58
  addSceenshot(screenshot: ScreenShotInfo): void;