nakarte

Source code of https://map.sikmir.ru (fork)
git clone git://git.sikmir.ru/nakarte
Log | Files | Refs | LICENSE

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:
Msrc/lib/leaflet.control.track-list/lib/endomondo.js | 7++++---
Msrc/lib/leaflet.control.track-list/lib/geo_file_formats.js | 60++++++++++++++++++++++++++++++------------------------------
Msrc/lib/leaflet.control.track-list/lib/gpsies.js | 9+++++----
Msrc/lib/leaflet.control.track-list/lib/nktk.js | 13+++++++++----
Msrc/lib/leaflet.control.track-list/lib/strava.js | 11+++++++----
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