commit e2bc83772c5a99cc3873fcb61922e8fb232c3a33
parent 7e01a2fc74577a5f7a10f65b40770e9971f3cda2
Author: Sergej Orlov <wladimirych@gmail.com>
Date: Mon, 19 Nov 2018 22:02:43 +0100
[tracks] refactor special parsers
* rename *XhrOptions to *RequestOptions
* add extra param to pass from request options getter to parser
Diffstat:
5 files changed, 55 insertions(+), 45 deletions(-)
diff --git a/src/lib/leaflet.control.track-list/lib/endomondo.js b/src/lib/leaflet.control.track-list/lib/endomondo.js
@@ -9,7 +9,7 @@ function isEndomondoUrl(url) {
return regexps[0].test(url) || regexps[1].test(url);
}
-function endomonXhrOptions(url) {
+function endomondoRequestOptions(url) {
let m = regexps[0].exec(url);
let userId, trackId;
if (m) {
@@ -21,10 +21,11 @@ function endomonXhrOptions(url) {
}
[trackId, userId] = [m[1], m[2]];
}
- return [{
+ const requestOptions = [{
url: urlViaCorsProxy(`https://www.endomondo.com/rest/v1/users/${userId}/workouts/${trackId}`),
options: {responseType: 'binarystring'}
}];
+ return {requestOptions};
}
function endomondoParser(name, responses) {
@@ -62,4 +63,4 @@ function endomondoParser(name, responses) {
}
-export {isEndomondoUrl, endomonXhrOptions, endomondoParser}
+export {isEndomondoUrl, endomondoRequestOptions, endomondoParser}
diff --git a/src/lib/leaflet.control.track-list/lib/geo_file_formats.js b/src/lib/leaflet.control.track-list/lib/geo_file_formats.js
@@ -5,10 +5,10 @@ import stripBom from 'lib/stripBom';
import {decode as utf8_decode} from 'utf8';
import {fetch} from 'lib/xhr-promise';
import urlViaCorsProxy from 'lib/CORSProxy';
-import {isGpsiesUrl, gpsiesXhrOptions, gpsiesParser} from './gpsies';
-import {isStravaUrl, stravaXhrOptions, stravaParser} from './strava';
-import {isEndomondoUrl, endomonXhrOptions, endomondoParser} from './endomondo';
-import {parseTrackUrlData, parseNakarteUrl, isNakarteLinkUrl, nakarteLinkXhrOptions, nakarteLinkParser} from './nktk';
+import {isGpsiesUrl, gpsiesRequestOptions, gpsiesParser} from './gpsies';
+import {isStravaUrl, stravaRequestOptions, stravaParser} from './strava';
+import {isEndomondoUrl, endomondoRequestOptions, endomondoParser} from './endomondo';
+import {parseTrackUrlData, parseNakarteUrl, isNakarteLinkUrl, nakarteLinkRequestOptions, nakarteLinkParser} from './nktk';
import {stringToArrayBuffer, arrayBufferToString} from 'lib/binary-strings';
function xmlGetNodeText(node) {
@@ -610,50 +610,50 @@ function simpleTrackParser(name, responses) {
}
-function loadFromUrl(url) {
+async function loadFromUrl(url) {
let geodata;
geodata = parseGeoFile('', url);
if (geodata.length === 0 || geodata.length > 1 || geodata[0].error !== 'UNSUPPORTED') {
return Promise.resolve(geodata);
}
- let urlToRequest = simpleTrackFetchOptions;
+ let requestOptionsGetter = simpleTrackFetchOptions;
let parser = simpleTrackParser;
if (isGpsiesUrl(url)) {
- urlToRequest = gpsiesXhrOptions;
+ requestOptionsGetter = gpsiesRequestOptions;
parser = gpsiesParser;
} else if (isEndomondoUrl(url)) {
- urlToRequest = endomonXhrOptions;
+ requestOptionsGetter = endomondoRequestOptions;
parser = endomondoParser;
} else if (isStravaUrl(url)) {
- urlToRequest = stravaXhrOptions;
+ requestOptionsGetter = stravaRequestOptions;
parser = stravaParser;
} else if (isNakarteLinkUrl(url)) {
- urlToRequest = nakarteLinkXhrOptions;
+ requestOptionsGetter = nakarteLinkRequestOptions;
parser = nakarteLinkParser;
}
- const requests = urlToRequest(url);
- return Promise.all(requests.map((request) => fetch(request.url, request.options)))
- .then(
- (responses) => {
- let responseURL = responses[0].responseURL;
- try {
- responseURL = decodeURIComponent(responseURL);
- } catch (e) {
- }
-
- let name = responseURL
- .split('#')[0]
- .split('?')[0]
- .replace(/\/*$/, '')
- .split('/')
- .pop();
- return parser(name, responses);
- },
- () => [{name: url, error: 'NETWORK'}]
- );
+ const {requestOptions, extra} = requestOptionsGetter(url);
+ let responses;
+ try {
+ const requests = requestOptions.map((it) => fetch(it.url, it.options));
+ responses = await Promise.all(requests);
+ } catch (e) {
+ return [{name: url, error: 'NETWORK'}];
+ }
+ let responseURL = responses[0].responseURL;
+ try {
+ responseURL = decodeURIComponent(responseURL);
+ } catch (e) {
+ }
+ let name = responseURL
+ .split('#')[0]
+ .split('?')[0]
+ .replace(/\/*$/, '')
+ .split('/')
+ .pop();
+ return parser(name, responses, extra);
}
diff --git a/src/lib/leaflet.control.track-list/lib/gpsies.js b/src/lib/leaflet.control.track-list/lib/gpsies.js
@@ -11,14 +11,14 @@ function isGpsiesUrl(url) {
return re.test(url);
}
-function gpsiesXhrOptions(url) {
+function gpsiesRequestOptions(url) {
const m = re.exec(url);
if (!m) {
throw new Error('Invalid gpsies url');
}
const trackId = m[1];
const newUrl = urlViaCorsProxy('https://www.gpsies.com/download.do');
- return [{
+ const requestOptions = [{
url: newUrl,
options: {
method: 'POST',
@@ -35,6 +35,7 @@ function gpsiesXhrOptions(url) {
responseType: 'binarystring'
}
}];
+ return {requestOptions};
}
@@ -45,4 +46,4 @@ function gpsiesParser(name, responses) {
return parseGpx(responses[0].responseBinaryText, name, true);
}
-export {gpsiesXhrOptions, isGpsiesUrl, gpsiesParser}
-\ No newline at end of file
+export {gpsiesRequestOptions, isGpsiesUrl, gpsiesParser}
+\ No newline at end of file
diff --git a/src/lib/leaflet.control.track-list/lib/nktk.js b/src/lib/leaflet.control.track-list/lib/nktk.js
@@ -370,13 +370,17 @@ function isNakarteLinkUrl(url) {
}
-function nakarteLinkXhrOptions(url) {
+function nakarteLinkRequestOptions(url) {
const m = nakarteLinkRe.exec(url);
if (!m) {
throw new Error('Invalid nakarteLink url');
}
const trackId = m[1];
- return [{url: (`${config.tracksStorageServer}/track/${trackId}`), options: {responseType: 'binarystring'}}]
+ const requestOptions = [{
+ url: (`${config.tracksStorageServer}/track/${trackId}`),
+ options: {responseType: 'binarystring'}}
+ ];
+ return {requestOptions}
}
function nakarteLinkParser(_, responses) {
@@ -386,4 +390,5 @@ function nakarteLinkParser(_, responses) {
return parseNktkSequence(responses[0].responseBinaryText);
}
-export {saveNktk, parseTrackUrlData, parseNakarteUrl, isNakarteLinkUrl, nakarteLinkXhrOptions, nakarteLinkParser, parseNktkSequence};
-\ No newline at end of file
+export {saveNktk, parseTrackUrlData, parseNakarteUrl, isNakarteLinkUrl, nakarteLinkRequestOptions,
+ nakarteLinkParser, parseNktkSequence};
+\ No newline at end of file
diff --git a/src/lib/leaflet.control.track-list/lib/strava.js b/src/lib/leaflet.control.track-list/lib/strava.js
@@ -7,13 +7,13 @@ function isStravaUrl(url) {
return re.test(url);
}
-function stravaXhrOptions(url) {
+function stravaRequestOptions(url) {
const m = re.exec(url);
if (!m) {
throw new Error('Invalid strava url');
}
const trackId = m[1];
- return [
+ const requestOptions = [
{
url: urlViaCorsProxy(`https://www.strava.com/activities/${trackId}?hl=en-GB`),
options: {responseType: 'binarystring'}
@@ -22,6 +22,9 @@ function stravaXhrOptions(url) {
url: urlViaCorsProxy(`https://www.strava.com/stream/${trackId}?streams%5B%5D=latlng`),
options: {responseType: 'binarystring'}
}];
+ return {
+ requestOptions,
+ }
}
@@ -63,4 +66,4 @@ function stravaParser(name, responses) {
}
-export {isStravaUrl, stravaXhrOptions, stravaParser}
-\ No newline at end of file
+export {isStravaUrl, stravaRequestOptions, stravaParser}
+\ No newline at end of file