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.
- package/lib/activities/base/api/consts.d.ts +2 -0
- package/lib/activities/base/api/consts.js +6 -0
- package/lib/activities/base/api/fitconvert.d.ts +8 -0
- package/lib/activities/base/api/fitconvert.js +57 -0
- package/lib/activities/base/api/index.d.ts +1 -0
- package/lib/activities/base/api/index.js +17 -0
- package/lib/activities/base/convert/converter.d.ts +6 -0
- package/lib/activities/base/convert/converter.js +28 -0
- package/lib/activities/base/convert/factory.d.ts +8 -0
- package/lib/activities/base/convert/factory.js +89 -0
- package/lib/activities/base/convert/fit/index.d.ts +1 -0
- package/lib/activities/base/convert/fit/index.js +17 -0
- package/lib/activities/base/convert/fit/remote-fit.d.ts +13 -0
- package/lib/activities/base/convert/fit/remote-fit.js +61 -0
- package/lib/activities/base/convert/index.d.ts +4 -0
- package/lib/activities/base/convert/index.js +20 -0
- package/lib/activities/base/convert/tcx/index.d.ts +1 -0
- package/lib/activities/base/convert/tcx/index.js +17 -0
- package/lib/activities/base/convert/tcx/tcx.d.ts +12 -0
- package/lib/activities/base/convert/tcx/tcx.js +87 -0
- package/lib/activities/base/convert/types.d.ts +7 -0
- package/lib/activities/base/convert/types.js +9 -0
- package/lib/activities/base/index.d.ts +2 -0
- package/lib/activities/base/index.js +2 -0
- package/lib/activities/base/model/index.d.ts +16 -16
- package/lib/activities/base/repo/db.js +3 -3
- package/lib/activities/index.d.ts +1 -0
- package/lib/activities/index.js +1 -0
- package/lib/activities/ride/service.d.ts +1 -3
- package/lib/activities/ride/service.js +22 -35
- package/lib/activities/upload/index.d.ts +2 -0
- package/lib/activities/upload/index.js +18 -0
- package/lib/activities/upload/types.d.ts +8 -0
- package/lib/activities/upload/types.js +2 -0
- package/lib/activities/upload/velohero.d.ts +23 -0
- package/lib/activities/upload/velohero.js +225 -0
- package/lib/api/appInfo/index.d.ts +3 -0
- package/lib/api/bindings/index.d.ts +4 -0
- package/lib/api/bindings/secret/index.d.ts +3 -0
- package/lib/api/bindings/secret/index.js +2 -0
- package/lib/api/form/index.d.ts +6 -0
- package/lib/api/form/index.js +2 -0
- package/lib/api/repository/json/index.d.ts +2 -1
- package/lib/api/repository/types.d.ts +1 -3
- package/lib/api/rest/ApiClient.d.ts +18 -0
- package/lib/api/rest/ApiClient.js +77 -0
- package/lib/api/rest/IncyclistRestApiClient.d.ts +5 -0
- package/lib/api/rest/IncyclistRestApiClient.js +87 -0
- package/lib/api/rest/RestApiClient.d.ts +7 -0
- package/lib/api/rest/RestApiClient.js +15 -0
- package/lib/api/rest/api.d.ts +15 -0
- package/lib/api/rest/api.js +69 -0
- package/lib/api/rest/incyclist.d.ts +7 -0
- package/lib/api/rest/incyclist.js +36 -0
- package/lib/api/rest/index.d.ts +3 -18
- package/lib/api/rest/index.js +16 -76
- package/lib/api/rest/types.d.ts +1 -1
- package/lib/apps/base/api/velohero/api.d.ts +20 -0
- package/lib/apps/base/api/velohero/api.js +134 -0
- package/lib/apps/base/api/velohero/types.d.ts +12 -0
- package/lib/apps/base/api/velohero/types.js +2 -0
- package/lib/devices/access/service.js +11 -11
- package/lib/devices/configuration/service.js +1 -1
- package/lib/devices/pairing/service.js +9 -9
- package/lib/devices/ride/service.js +4 -4
- package/lib/i18n/countries/index.js +1 -1
- package/lib/routes/base/api/index.js +2 -2
- package/lib/routes/base/model/route.d.ts +1 -0
- package/lib/routes/base/model/route.js +4 -0
- package/lib/routes/base/parsers/gpx.js +1 -1
- package/lib/routes/base/parsers/multixml.d.ts +1 -1
- package/lib/routes/base/parsers/multixml.js +1 -1
- package/lib/routes/base/parsers/utils.d.ts +2 -1
- package/lib/routes/base/parsers/xml.d.ts +2 -2
- package/lib/routes/base/parsers/xml.js +4 -4
- package/lib/routes/base/utils/route.d.ts +1 -1
- package/lib/routes/base/utils/route.js +4 -2
- package/lib/routes/base/utils/xml.d.ts +3 -1
- package/lib/routes/download/service.js +1 -1
- package/lib/routes/list/cards/RouteCard.js +1 -1
- package/lib/routes/list/loaders/DBLoader.js +1 -1
- package/lib/routes/list/loaders/api.js +2 -2
- package/lib/routes/list/loaders/db.js +3 -3
- package/lib/routes/list/service.js +2 -2
- package/lib/utils/formatting.d.ts +1 -0
- package/lib/utils/formatting.js +11 -1
- package/lib/utils/index.d.ts +1 -0
- package/lib/utils/index.js +1 -0
- package/lib/utils/xml.d.ts +17 -0
- package/lib/utils/xml.js +109 -0
- package/lib/workouts/base/api/index.js +1 -1
- package/lib/workouts/base/parsers/zwo.js +1 -1
- package/lib/workouts/list/cards/WorkoutCard.js +2 -2
- package/lib/workouts/list/loaders/db.js +2 -2
- package/package.json +10 -5
|
@@ -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,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,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;
|
|
@@ -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
|
|
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
|
|
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(
|
|
78
|
-
return __awaiter(this,
|
|
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)
|
package/lib/activities/index.js
CHANGED
|
@@ -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,
|
|
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;
|